Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

ASprite.cpp File Reference


Detailed Description

Implements sprite_ function is AEngine.h and ASharedFunc.h.

Definition in file ASprite.cpp.

#include "AEngine.h"
#include "AState.h"
#include "AUtil.h"

Include dependency graph for ASprite.cpp:

Include dependency graph

Go to the source code of this file.

Compounds

class  SpriteRequestEntryComparer
 so we can sort mesh rendering request entries More...


Functions

void sprite_init ()
void sprite_add (ATexture tex, int blendMode, Vec3D pos, Vec4D multiplier, FLOAT size)
void sprite_flush ()
void sprite_process ()

Variables

const int MAX_SPRITE_COUNT = 4096


Function Documentation

void sprite_add ATexture    tex,
int    blendMode,
Vec3D    pos,
Vec4D    multiplier,
FLOAT    size
 

Definition at line 57 of file ASprite.cpp.

Referenced by BattleGroup::render(), BattleEntry::renderEnvironment(), and renderParticleList().

00058 {
00059         AS.sprite_renderList.push_back( SpriteRenderRequestEntry(tex,blendMode,pos,multiplier,size) );
00060 }

void sprite_flush  
 

Definition at line 62 of file ASprite.cpp.

Referenced by flushRenderRequests().

00063 {
00064         AS.sprite_renderList.resize(0);
00065 }

void sprite_init  
 

Definition at line 43 of file ASprite.cpp.

References MAX_SPRITE_COUNT, util_loadPixelShader(), and util_loadVertexShader().

Referenced by sys_go().

00044 {
00045         int vbByteSize = MAX_SPRITE_COUNT * sizeof(SpriteVertex);
00046         if( FAILED( AS.pDevice->CreateVertexBuffer( vbByteSize, D3DUSAGE_WRITEONLY|D3DUSAGE_DYNAMIC|D3DUSAGE_POINTS,
00047                                                                         0, D3DPOOL_DEFAULT, &AS.sprite_vb ) ))
00048                 throw Error("Can't create spriteVB");
00049 
00050         AS.sprite_renderList.resize(0);
00051         AS.sprite_startRenderingIndex = 0;
00052 
00053         AS.vshader_sprite = util_loadVertexShader( "shaders\\sprite.vso", dwSpriteVertexDecl );
00054         AS.pshader_sprite = util_loadPixelShader(  "shaders\\sprite.pso" );
00055 }

void sprite_process  
 

Definition at line 67 of file ASprite.cpp.

References ATexture, SpriteVertex::colorMultiplier, device_setPixelShader(), device_setRenderState(), device_setRenderStateBlendMode(), device_setStreamSource(), device_setTexture(), device_setTextureStageState(), device_setVertexShader(), Matx, MAX_SPRITE_COUNT, SpriteVertex::pos, and SpriteVertex::size.

Referenced by processRenderRequests().

00068 {
00069         int renderCount = (int) AS.sprite_renderList.size();
00070         if(renderCount==0) return;
00071 
00072         sort( AS.sprite_renderList.begin(), AS.sprite_renderList.end(), SpriteRequestEntryComparer() );
00073         
00074         SpriteVertex *pVertex;
00075 
00076         // check if there's enough space in current VB
00077         HRESULT res;
00078         if( AS.sprite_startRenderingIndex + renderCount < MAX_SPRITE_COUNT )
00079         {
00080                 res = AS.sprite_vb->Lock( AS.sprite_startRenderingIndex*sizeof(SpriteVertex),
00081                                                                   renderCount*sizeof(SpriteVertex),
00082                                                                   (BYTE**)&pVertex, D3DLOCK_NOOVERWRITE );
00083         if( FAILED(res)) throw Error("Can't Lock spriteVB");
00084         }
00085         else                    // renew VB
00086         {
00087                 AS.sprite_startRenderingIndex = 0;
00088                 res = AS.sprite_vb->Lock( AS.sprite_startRenderingIndex*sizeof(SpriteVertex),
00089                                                                   renderCount*sizeof(SpriteVertex),
00090                                                                   (BYTE**)&pVertex, D3DLOCK_DISCARD );
00091         if( FAILED(res)) throw Error("Can't Lock/Renew spriteVB");
00092         }
00093 
00094         // copy content to VB
00095         for( int i=0; i<renderCount; i++ )
00096         {
00097                 pVertex[i].pos                     = AS.sprite_renderList[i].pos;
00098                 pVertex[i].colorMultiplier = AS.sprite_renderList[i].multiplier;
00099                 pVertex[i].size                    = AS.sprite_renderList[i].size;
00100         }
00101         AS.sprite_vb->Unlock();
00102 
00103         // set rendering flags
00104         device_setVertexShader( AS.vshader_sprite );
00105         device_setPixelShader(  AS.pshader_sprite );
00106         device_setStreamSource( 0, AS.sprite_vb, sizeof(SpriteVertex) );
00107 
00108         Matx matx;
00109         FLOAT sizeCalcConst[4] = { 3.0f, 640.0f, 0.0f, 0.0f };
00110         D3DXMatrixTranspose( &matx, &AS.camera_world2projMatrix);
00111         AS.pDevice->SetVertexShaderConstant( 0, &matx, 4 );                     // world->proj matrix
00112         AS.pDevice->SetVertexShaderConstant( 4, &AS.camera_pos[0], 1 );         // camera pos
00113         AS.pDevice->SetVertexShaderConstant( 5, &sizeCalcConst, 1 );            // constants
00114 
00115         //device_setRenderState( D3DRS_ZENABLE, FALSE );
00116         device_setRenderState( D3DRS_ZWRITEENABLE, FALSE );
00117         device_setRenderState( D3DRS_POINTSPRITEENABLE, TRUE );
00118         device_setTextureStageState( 3, D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
00119         device_setTextureStageState( 3, D3DTSS_MINFILTER, D3DTEXF_LINEAR );
00120         device_setTextureStageState( 3, D3DTSS_MIPFILTER, D3DTEXF_POINT );
00121         
00122         // render, one texture type at a time
00123         ATexture currentTex  = AS.sprite_renderList[0].tex;
00124         int currentBlend     = AS.sprite_renderList[0].blendMode;
00125 
00126         int start = 0;
00127         for( int i=0; i<renderCount; i++ )
00128         {
00129                 ATexture newTex = AS.sprite_renderList[i].tex;
00130                 int newBlend    = AS.sprite_renderList[i].blendMode;
00131                 if( newTex!=currentTex || newBlend!=currentBlend )
00132                 {                       
00133                         device_setTexture( 3, AS.res_textures[ currentTex ] );
00134                         device_setRenderStateBlendMode(currentBlend);
00135 
00136                         // render (start)..(i-1)
00137                         AS.pDevice->DrawPrimitive( D3DPT_POINTLIST, AS.sprite_startRenderingIndex+start, (i-1)-start+1 );
00138                         
00139                         start = i;
00140                         currentTex = newTex;
00141                         currentBlend = newBlend;
00142                 }
00143         }
00144 
00145         // render last remaining set
00146         // render (start)..(renderCount-1)
00147         device_setTexture( 3, AS.res_textures[ currentTex ] );
00148         device_setRenderStateBlendMode(currentBlend);
00149         AS.pDevice->DrawPrimitive( D3DPT_POINTLIST, AS.sprite_startRenderingIndex+start, (renderCount-1)-start+1 );
00150 
00151         AS.sprite_startRenderingIndex += renderCount;
00152         device_setRenderState( D3DRS_POINTSPRITEENABLE, FALSE );
00153 }


Variable Documentation

const int MAX_SPRITE_COUNT = 4096
 

Definition at line 26 of file ASprite.cpp.

Referenced by sprite_init(), and sprite_process().


Generated on Wed Apr 23 05:50:33 2003 for Modern Warfare by doxygen1.3-rc2