123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- ////////////////////////////////////////////////////////////////////////////////
- //
- // Copyright 2016 RWS Inc, All Rights Reserved
- //
- // This program is free software; you can redistribute it and/or modify
- // it under the terms of version 2 of the GNU General Public License as published by
- // the Free Software Foundation
- //
- // This program is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
- //
- // You should have received a copy of the GNU General Public License along
- // with this program; if not, write to the Free Software Foundation, Inc.,
- // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- //
- ///////////////////////////////////////////////////////////////
- // PIPELINE - History
- ///////////////////////////////////////////////////////////////
- //
- // 07/23/97 JRD Added support for generating shadows. Currently
- // all shadows are hard coded to be cast upon the
- // plane y = 0, based on postal needs.
- //
- ///////////////////////////////////////////////////////////////
- // This is the highest level considered actually part of the 3d engine.
- // It is the highest level control -> it decides how 3d pts map to 2d.
- // You can customize 3d efects by instantiating your own versions of the 3d pipeline!
- //
- #ifndef PIPELINE_H
- #define PIPELINE_H
- //==================================================
- #include "System.h"
- #ifdef PATHS_IN_INCLUDES
- #include "ORANGE/QuickMath/VectorMath.h"
- #include "GREEN/3D/types3d.h"
- #include "GREEN/3D/zbuffer.h"
- #include "GREEN/3D/render.h"
- #include "ORANGE/color/colormatch.h"
- #else
- #include "vectormath.h"
- #include "types3d.h"
- #include "zbuffer.h"
- #include "render.h"
- #include "ColorMatch.h"
- #endif
- //==================================================
- // The point of this class is to hold configurable
- // scratch space for doing trsnaformations
- //
- class RPipeLine
- {
- public:
- //-------------------------------------
- RPipeLine();
- ~RPipeLine();
- short Create(long lScratchSpace=0,short sZBufWidth=0);
- short CreateShadow(short sAngleY,double dTanDeclension,short sBufSize = -1);
- void Destroy(); // will NOT kill transform scratch space
- void Init();
- //-------------------------------------
- short NotCulled(RP3d *p1,RP3d *p2,RP3d *p3);
- void Transform(RSop* pPts,RTransform& tObj);
- void TransformShadow(RSop* pPts,RTransform& tObj,
- short sHeight = 0,short *psOffX = NULL,short *psOffY = NULL);
- // Do NOT use a z-buffer. Return offset to current position to
- // draw the image m_pimShadowBuf
- void RenderShadow(RImage* pimDst,RMesh* pMesh,UCHAR ucColor); // Unicolored!
- void Render(RImage* pimDst,short sDstX,short sDstY,
- RMesh* pMesh,UCHAR ucColor); // wire frame!
- // Flat shaded
- void Render(RImage* pimDst,short sDstX,short sDstY,
- RMesh* pMesh,RZBuffer* pZB,RTexture* pColors,
- short sOffsetX = 0, // In: 2D offset for pimDst and pZB.
- short sOffsetY = 0); // In: 2D offset for pimDst and pZB.
- // Note that pFog must be 256 x # of colors.
- // the offset value moves the fog towards
- // the front of the z-buffer
- //
- void Render(RImage* pimDst,short sDstX,short sDstY,
- RMesh* pMesh,RZBuffer* pZB,RTexture* pColors,
- short sFogOffset,RAlpha* pFog,
- short sOffsetX = 0, // In: 2D offset for pimDst and pZB.
- short sOffsetY = 0); // In: 2D offset for pimDst and pZB.
- // WARNING: May be inhomogeneous!
- void GetScreenXF(RTransform& tDst)
- {
- tDst.Make1();
- tDst.Mul(m_tScreen.T,m_tView.T);
- }
- // Strictly for convenience:
- //
- void ClearClipBuffer();
- void ClearShadowBuffer();
- // Project a point onto a screen.
- void PointToScreen(RTransform& tObj,RP3d& v3d,short &sDstX,short &sDstY)
- {
- RTransform tFull;
- RP3d ptDst;
- tFull.Make1();
- tFull.Mul(m_tView.T,tObj.T);
- tFull.PreMulBy(m_tScreen.T);
- tFull.TransformInto(v3d,ptDst);
- sDstX = short(ptDst.x);
- sDstY = short(ptDst.y);
- }
-
- // THIS WILL CHANGE WITH TIME:
- // Currently the bounding sphere is described by two points:
- //
- void BoundingSphereToScreen(RP3d& ptCenter, RP3d& ptRadius,
- RTransform& tObj);
- //-------------------------------------
- // Configurable by instance:
- RZBuffer* m_pZB;
- RImage* m_pimClipBuf; // For clipping (2 pass rendering)
- RTransform m_tScreen; // map to window
- RTransform m_tView; // lens
- RImage* m_pimShadowBuf; // For drawing shadows
- RTransform m_tShadow; // Turn it into a shadow
- double m_dShadowScale;// Needed extra parameter
- //-------------------------------------
- // WARNING: THIS WILL LIKELY CHANGE:
- // store a transformed bounding rect for object being rendered:
- // These are screend coordinates relative to the center of
- // the zbuf square / clipping square
- short m_sX; // far cube point
- short m_sY;
- short m_sZ;
- short m_sW;
- short m_sH;
- short m_sD;
- short m_sCenX; // for convenience - the cube center
- short m_sCenY; // in 3d screen coordinates
- short m_sCenZ;
- // TRUE of FALSE
- short m_sUseBoundingRect;
- //-------------------------------------
- // static storage:
- // Transformation buffer:
- static long ms_lNumPts;
- static RP3d* ms_pPts;
- static long ms_lNumPipes; // used to free ms_pPts
- };
- //==================================================
- //==================================================
- //==================================================
- #endif
|