123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- /* Copyright (c) 2002-2012 Croteam Ltd.
- 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. */
- #ifndef SE_INCL_DRAWPORT_H
- #define SE_INCL_DRAWPORT_H
- #ifdef PRAGMA_ONCE
- #pragma once
- #endif
- #include <Engine/Base/Lists.h>
- class ENGINE_API CDrawPort {
- // implementation:
- public:
- CListNode dp_NodeInRaster; // for linking in list of clones
- public:
- class CRaster *dp_Raster; // pointer to the Raster this refers to
- class CFontData *dp_FontData; // pointer to the current text font
- PIX dp_Width, dp_Height; // width, height in pixels
- PIX dp_MinI, dp_MinJ; // I,J coord of the upper left edge in the Raster
- PIX dp_MaxI, dp_MaxJ; // I,J coord of the lower right edge in the Raster
- PIX dp_ScissorMinI, dp_ScissorMinJ; // I,J coord of the upper left edge in the Raster
- PIX dp_ScissorMaxI, dp_ScissorMaxJ; // I,J coord of the lower right edge in the Raster
- PIX dp_pixTextCharSpacing; // space between chars in text
- PIX dp_pixTextLineSpacing; // space between lines in text
- FLOAT dp_fTextScaling; // scaling factor for font size
- FLOAT dp_fTextAspect; // aspect ratio for font (x/y)
- INDEX dp_iTextMode; // text output mode (-1 = print special codes, 0 = ignore special codes, 1 = parse special codes)
- FLOAT dp_fWideAdjustment; // for wide (16:9 or 16:10) screen support (needed in some calculations) = 1.0f or >1 (10/12 perhaps)
- BOOL dp_bRenderingOverlay; // set when scene renderer requires overlay mode (don't clear z-buffer)
- // dimensions and position relative to the raster size
- double dp_SizeIOverRasterSizeI, dp_SizeJOverRasterSizeJ;
- double dp_MinIOverRasterSizeI, dp_MinJOverRasterSizeJ;
- // adjust this during frame to be used for screen blending
- ULONG dp_ulBlendingRA, dp_ulBlendingGA, dp_ulBlendingBA; // r*a, g*a, b*a
- ULONG dp_ulBlendingA;
- // set cloned drawport dimensions
- void InitCloned(CDrawPort *pdpBase, double rMinI,double rMinJ, double rSizeI,double rSizeJ);
- // Recalculate pixel dimensions from relative dimensions and raster size
- void RecalculateDimensions(void);
- // set orthogonal projection
- void SetOrtho(void) const;
- // set given projection
- void SetProjection(CAnyProjection3D &apr) const;
- //interface:
- // Create a drawport for full raster
- CDrawPort( CRaster *praBase=NULL);
- // Clone a drawport
- CDrawPort( CDrawPort *pdpBase, double rMinI,double rMinJ, double rSizeI,double rSizeJ);
- CDrawPort( CDrawPort *pdpBase, const PIXaabbox2D &box);
- // dualhead cloning
- CDrawPort( CDrawPort *pdpBase, BOOL bLeft);
- // wide-screen cloning
- void MakeWideScreen(CDrawPort *pdp);
- // check if a drawport is dualhead
- BOOL IsDualHead(void);
- // check if a drawport is wide screen
- BOOL IsWideScreen(void);
- // set/get rendering in overlay mode
- inline void SetOverlappedRendering(BOOL bOverlay) { dp_bRenderingOverlay = bOverlay; };
- inline BOOL IsOverlappedRendering(void) const { return dp_bRenderingOverlay; };
- // returns unique drawport number
- ULONG GetID(void);
- // Get dimensions and location of drawport
- inline PIX GetWidth( void) const { return dp_Width; };
- inline PIX GetHeight(void) const { return dp_Height; };
- // text manipulation
- void SetFont( CFontData *pfd); // WARNING: this resets text variables
- inline void SetTextCharSpacing( PIX pixSpacing) { dp_pixTextCharSpacing = pixSpacing; };
- inline void SetTextLineSpacing( PIX pixSpacing) { dp_pixTextLineSpacing = pixSpacing; };
- inline void SetTextScaling( FLOAT fScalingFactor) { dp_fTextScaling = fScalingFactor; };
- inline void SetTextAspect( FLOAT fAspectRatio) { dp_fTextAspect = fAspectRatio; };
- inline void SetTextMode( INDEX iMode) { dp_iTextMode = iMode; };
- // returns width of entire text string (with scale included)
- ULONG GetTextWidth( const CTString &strText) const;
-
- // writes text string on drawport (left-aligned)
- void PutText( const CTString &strText, PIX pixX0, PIX pixY0, const COLOR colBlend=0xFFFFFFFF) const;
- // writes text string on drawport (centered arround X)
- void PutTextC( const CTString &strText, PIX pixX0, PIX pixY0, const COLOR colBlend=0xFFFFFFFF) const;
- // writes text string on drawport (centered arround X and Y)
- void PutTextCXY( const CTString &strText, PIX pixX0, PIX pixY0, const COLOR colBlend=0xFFFFFFFF) const;
- // writes text string on drawport (right-aligned)
- void PutTextR( const CTString &strText, PIX pixX0, PIX pixY0, const COLOR colBlend=0xFFFFFFFF) const;
- // plain texture display
- void PutTexture( class CTextureObject *pTO, const PIXaabbox2D &boxScreen,
- const COLOR colBlend=0xFFFFFFFF) const;
- void PutTexture( class CTextureObject *pTO, const PIXaabbox2D &boxScreen,
- const COLOR colUL, const COLOR colUR, const COLOR colDL, const COLOR colDR) const;
- void PutTexture( class CTextureObject *pTO, const PIXaabbox2D &boxScreen,
- const MEXaabbox2D &boxTexture, const COLOR colBlend=0xFFFFFFFF) const;
- void PutTexture( class CTextureObject *pTO, const PIXaabbox2D &boxScreen, const MEXaabbox2D &boxTexture,
- const COLOR colUL, const COLOR colUR, const COLOR colDL, const COLOR colDR) const;
- // advanced texture display
- void InitTexture( class CTextureObject *pTO, const BOOL bClamp=FALSE) const; // prepares texture and rendering arrays
- // adds one full texture to rendering queue
- void AddTexture( const FLOAT fI0, const FLOAT fJ0, const FLOAT fI1, const FLOAT fJ1, const COLOR col) const;
- // adds one part of texture to rendering queue
- void AddTexture( const FLOAT fI0, const FLOAT fJ0, const FLOAT fI1, const FLOAT fJ1,
- const FLOAT fU0, const FLOAT fV0, const FLOAT fU1, const FLOAT fV1, const COLOR col) const;
- // adds one textured quad to rendering queue (up-left start, counter-clockwise)
- void AddTexture( const FLOAT fI0, const FLOAT fJ0, const FLOAT fU0, const FLOAT fV0, const COLOR col0,
- const FLOAT fI1, const FLOAT fJ1, const FLOAT fU1, const FLOAT fV1, const COLOR col1,
- const FLOAT fI2, const FLOAT fJ2, const FLOAT fU2, const FLOAT fV2, const COLOR col2,
- const FLOAT fI3, const FLOAT fJ3, const FLOAT fU3, const FLOAT fV3, const COLOR col3) const;
- // adds one flat triangle rendering queue (up-left start, counter-clockwise)
- void AddTriangle( const FLOAT fI0, const FLOAT fJ0, const FLOAT fI1, const FLOAT fJ1,
- const FLOAT fI2, const FLOAT fJ2, const COLOR col) const;
- // renders all textures from rendering queue and flushed rendering arrays
- void FlushRenderingQueue(void) const;
- // lock and unlock raster thru drawport functions
- BOOL Lock(void);
- void Unlock(void);
- // draw point (can be several pixels - depends on radius)
- void DrawPoint( PIX pixI, PIX pixJ, COLOR col, PIX pixRadius=1) const;
- void DrawPoint3D( FLOAT3D v, COLOR col, FLOAT fRadius=1.0f) const; // in 3D
- // draw line
- void DrawLine( PIX pixI0, PIX pixJ0, PIX pixI1, PIX pixJ1, COLOR col, ULONG typ=_FULL_) const;
- void DrawLine3D( FLOAT3D v0, FLOAT3D v1, COLOR col) const; // in 3D
- // draw border
- void DrawBorder( PIX pixI, PIX pixJ, PIX pixWidth, PIX pixHeight, COLOR col, ULONG typ=_FULL_) const;
- // fill with blending part of a drawport with a given color
- void Fill( PIX pixI, PIX pixJ, PIX pixWidth, PIX pixHeight, COLOR col) const;
- // fill with blending part of a drawport with a four corner colors
- void Fill( PIX pixI, PIX pixJ, PIX pixWidth, PIX pixHeight,
- COLOR colUL, COLOR colUR, COLOR colDL, COLOR colDR) const;
- // fill a part of Z-Buffer with a given value
- void FillZBuffer( PIX pixI, PIX pixJ, PIX pixWidth, PIX pixHeight, FLOAT zval) const;
- // fill without blending an entire drawport with a given color
- void Fill( COLOR col) const;
- // fill an entire Z-Buffer with a given value
- void FillZBuffer( FLOAT zval) const;
- // grab screen (iGrabZBuffer: 0=no, 1=if allowed, 2=yes)
- void GrabScreen( class CImageInfo &iiGrabbedImage, INDEX iGrabZBuffer=0) const;
- // functions for getting depth of points on drawport
- BOOL IsPointVisible( PIX pixI, PIX pixJ, FLOAT fOoK, INDEX iID, INDEX iMirrorLevel=0) const;
- // render one lens flare
- void RenderLensFlare( CTextureObject *pto, FLOAT fI, FLOAT fJ,
- FLOAT fSizeI, FLOAT fSizeJ, ANGLE aRotation, COLOR colLight) const;
- // blend entire drawport with accumulated colors
- void BlendScreen(void);
- };
- enum ParticleBlendType {
- PBT_BLEND,
- PBT_ADD,
- PBT_MULTIPLY,
- PBT_ADDALPHA,
- PBT_FLEX, // premultiplied alpha (ONE + [1-SRC_ALPHA])
- PBT_TRANSPARENT,
- };
- void ENGINE_API Particle_PrepareSystem( CDrawPort *pdpDrawPort, CAnyProjection3D &prProjection);
- void ENGINE_API Particle_PrepareEntity( FLOAT fMipFactor, BOOL bHasFog, BOOL bHasHaze, CEntity *penViewer);
- void ENGINE_API Particle_EndSystem( BOOL bRestoreOrtho=TRUE);
- FLOAT ENGINE_API Particle_GetMipFactor(void);
- INDEX ENGINE_API Particle_GetDrawPortID(void);
- ENGINE_API CEntity *Particle_GetViewer(void);
- ENGINE_API CProjection3D *Particle_GetProjection(void);
- void ENGINE_API Particle_PrepareTexture( CTextureObject *pto, enum ParticleBlendType pbt);
- void ENGINE_API Particle_SetTexturePart( MEX mexWidth, MEX mexHeight, INDEX iCol, INDEX iRow);
- void ENGINE_API Particle_RenderSquare( const FLOAT3D &vPos, FLOAT fSize, ANGLE aRotation, COLOR col, FLOAT fYRatio=1.0f);
- void ENGINE_API Particle_RenderQuad3D( const FLOAT3D &vPos0, const FLOAT3D &vPos1, const FLOAT3D &vPos2,
- const FLOAT3D &vPos3, COLOR col);
- void ENGINE_API Particle_RenderLine( const FLOAT3D &vPos0, const FLOAT3D &vPos1, FLOAT fWidth, COLOR col);
- void ENGINE_API Particle_Sort( BOOL b3D=FALSE);
- void ENGINE_API Particle_Flush(void);
- #endif /* include-once check. */
|