00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "LampBasic.h"
00026 #include "Graphics2D/Renderer/SpriteRenderer.h"
00027 #include "Graphics2D/Renderer/SpriteGraphicsBuffer.h"
00028 #include "Graphics2D/Renderer/SpriteRenderState.h"
00029 #include "Graphics2D/Renderer/SpriteRequest.h"
00030 #include "Graphics/Renderer/RenderingDevice.h"
00031
00032 #include "Graphics2D/SpriteState/ColorSpriteState.h"
00033 #include "Graphics2D/SpriteState/AddressModeSpriteState.h"
00034 #include "Graphics2D/SpriteState/BlendSpriteState.h"
00035 #include "Graphics2D/SpriteState/ViewportSpriteState.h"
00036
00037 namespace Lamp{
00038
00039
00040
00041
00042
00043 SpriteRenderer::SpriteRenderer(int maxPriority, int defaultPriority) :
00044 maxPriority_(maxPriority){
00045 Assert(maxPriority_ > 0);
00046 setDefaultPriority(defaultPriority);
00047 requests_ = new ArrayList<SpriteRequest*>[maxPriority_];
00048 graphicsBuffer_ = new SpriteGraphicsBuffer();
00049 }
00050
00051
00052 SpriteRenderer::~SpriteRenderer(){
00053 SafeDelete(graphicsBuffer_);
00054 SafeArrayDelete(requests_);
00055 }
00056
00057
00058
00059
00060 void SpriteRenderer::request(SpriteRequest* spriteRequest, int priority){
00061 Assert((priority >= 0) && (priority < maxPriority_));
00062 requests_[priority].add(spriteRequest);
00063 }
00064
00065
00066 void SpriteRenderer::requestDefaultState(int priority){
00067 request(&ColorSpriteState::defaultState, priority);
00068 request(&AddressModeSpriteState::defaultState, priority);
00069 request(&BlendSpriteState::defaultState, priority);
00070 request(&ViewportSpriteState::defaultState, priority);
00071 }
00072
00073
00074 void SpriteRenderer::applyDefaultState(SpriteRenderState* renderState){
00075 ((ColorSpriteState*)(&ColorSpriteState::defaultState))->
00076 render(renderState);
00077 ((AddressModeSpriteState*)(&AddressModeSpriteState::defaultState))->
00078 render(renderState);
00079 ((BlendSpriteState*)(&BlendSpriteState::defaultState))->
00080 render(renderState);
00081 ((ViewportSpriteState*)(&ViewportSpriteState::defaultState))->
00082 render(renderState);
00083 }
00084
00085
00086
00087
00088 void SpriteRenderer::render(int startPriority, int endPriority){
00089 Assert(startPriority <= endPriority);
00090 Assert((startPriority >= 0) && (endPriority < maxPriority_));
00091 RenderingDevice* device = RenderingDevice::getInstance();
00092 SpriteRenderState renderState(graphicsBuffer_);
00093
00094
00095 device->applyDefaultStateBlock();
00096
00097
00098 graphicsBuffer_->setup();
00099
00100
00101 applyRendererState();
00102
00103
00104 applyDefaultState(&renderState);
00105
00106
00107 if(device->beginScene()){
00108
00109 for(int i = startPriority; i <= endPriority; i++){
00110
00111 int count = requests_[i].getCount();
00112 for(int j = 0; j < count; j++){
00113 SpriteRequest* request = requests_[i].get(j);
00114 request->render(&renderState);
00115 }
00116
00117 requests_[i].clear();
00118 }
00119
00120 graphicsBuffer_->render();
00121 device->endScene();
00122 }
00123
00124
00125 device->applyDefaultStateBlock();
00126 }
00127
00128
00129 void SpriteRenderer::applyRendererState(){
00130
00131 RenderingDevice* device = RenderingDevice::getInstance();
00132
00133
00134
00135
00136
00137 device->setRenderState(D3DRS_LIGHTING, false);
00138
00139 device->setRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
00140
00141 device->setRenderState(D3DRS_ZWRITEENABLE, false);
00142
00143 device->setZTest(false);
00144
00145
00146 device->setTextureState(0, D3DTSS_COLOROP, D3DTOP_MODULATE4X);
00147 device->setTextureState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
00148 device->setTextureState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE);
00149
00150 device->setTextureState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
00151 device->setTextureState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR);
00152 device->setTextureState(0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);
00153
00154
00155 device->setSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
00156 device->setSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
00157 device->setSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
00158
00159
00160 device->setRenderState(D3DRS_ALPHATESTENABLE, true);
00161 device->setRenderState(D3DRS_ALPHAREF, 1);
00162 device->setRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
00163
00164
00165
00166
00167
00168 DimensionF renderTargetSize;
00169 renderTargetSize.set(device->getRenderTargetSize());
00170
00171
00172 Matrix44 projectionMatrix;
00173 float nearZ = 1.f;
00174 float farZ = 10001.f;
00175 projectionMatrix.set(
00176 2.f / renderTargetSize.width, 0.f, 0.f, 0.f,
00177 0.f, 2.f / renderTargetSize.height, 0.f, 0.f,
00178 0.f, 0.f, 1.f / (nearZ - farZ), nearZ / (nearZ - farZ),
00179 0.f, 0.f, 0.f, 1.f);
00180 device->setProjectionMatrix(projectionMatrix);
00181
00182
00183 Matrix44 viewMatrix;
00184 Vector3 viewPosition(renderTargetSize.width * 0.5f,
00185 renderTargetSize.height * 0.5f, (farZ - nearZ) * 0.5f + nearZ);
00186 viewMatrix.setTranslation(-viewPosition);
00187 viewMatrix.addScale(Vector3(1.f, -1.f, 1.f));
00188 device->setViewMatrix(viewMatrix);
00189
00190 }
00191
00192 }
00193