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 "Graphics/PrimitiveRenderer/PrimitiveDrawRequest.h"
00027 #include "Graphics/Renderer/RenderingDevice.h"
00028 #include "Graphics/System/LampGraphics.h"
00029
00030 namespace Lamp{
00031
00032
00033
00034 PrimitiveDrawRequest::PrimitiveDrawRequest(){
00035 data_ = new Data();
00036 }
00037
00038
00039 PrimitiveDrawRequest::PrimitiveDrawRequest(const PrimitiveDrawRequest& copy){
00040 data_ = copy.data_;
00041 data_->addReference();
00042 }
00043
00044
00045 PrimitiveDrawRequest& PrimitiveDrawRequest::operator =(
00046 const PrimitiveDrawRequest& copy){
00047
00048 if(this == ©){ return *this; }
00049
00050 removeReference();
00051
00052 data_ = copy.data_;
00053 data_->addReference();
00054 return *this;
00055 }
00056
00057
00058 PrimitiveDrawRequest::~PrimitiveDrawRequest(){
00059
00060 removeReference();
00061 }
00062
00063
00064 int PrimitiveDrawRequest::removeReference(){
00065 int referenceCount = data_->removeReference();
00066 Assert(referenceCount >= 0);
00067 if(referenceCount == 0){ SafeDelete(data_); }
00068 return referenceCount;
00069 }
00070
00071
00072
00073
00074 void PrimitiveDrawRequest::setVertexCount(int vertexCount){
00075 Assert(vertexCount >= 0);
00076 if(data_->vertexCount_ == vertexCount){ return; }
00077 bool useColor = hasColor();
00078 data_->vertexCount_ = vertexCount;
00079
00080 SafeRelease(data_->vertexBuffer_);
00081 SafeArrayDelete(data_->colors_);
00082 SafeArrayDelete(data_->positions_);
00083 if(vertexCount == 0){ return; }
00084 data_->positions_ = new Vector3[vertexCount];
00085 if(useColor){ data_->colors_ = new Color4c[vertexCount]; }
00086
00087 SafeRelease(data_->vertexBuffer_);
00088 }
00089
00090
00091
00092
00093 void PrimitiveDrawRequest::enableColor(bool colorFlag){
00094 if(hasColor() == colorFlag){ return; }
00095
00096 SafeRelease(data_->vertexBuffer_);
00097 SafeArrayDelete(data_->colors_);
00098 Assert(data_->vertexCount_ != 0);
00099 if(colorFlag){ data_->colors_ = new Color4c[data_->vertexCount_]; }
00100
00101 SafeRelease(data_->vertexBuffer_);
00102 }
00103
00104
00105
00106
00107 void PrimitiveDrawRequest::setVertexIndexCount(int vertexIndexCount){
00108 SafeRelease(data_->indexBuffer_);
00109 SafeArrayDelete(data_->vertexIndices_);
00110 data_->vertexIndexCount_ = vertexIndexCount;
00111 if(vertexIndexCount == 0){ return; }
00112 data_->vertexIndices_ = new u_short[vertexIndexCount];
00113
00114 SafeRelease(data_->indexBuffer_);
00115 }
00116
00117
00118
00119
00120 Direct3DVertexBuffer* PrimitiveDrawRequest::getVertexBuffer(){
00121 RenderingDevice* device = RenderingDevice::getInstance();
00122 int bufferSize = getVertexCount() * getVertexSize();
00123
00124 if(data_->vertexBuffer_ == NULL){
00125 data_->vertexBuffer_ = device->createDynamicVertexBuffer(bufferSize);
00126 data_->vertexBufferChanged_ = true;
00127 }
00128
00129 if(data_->vertexBufferChanged_){
00130 Assert(data_->vertexBuffer_ != NULL);
00131 device->writeDynamicVertexBuffer(data_->vertexBuffer_, bufferSize,
00132 getVertexCount(), data_->positions_, 0, NULL, 0, NULL, NULL,
00133 getColorArray(), 0, NULL, NULL);
00134 data_->vertexBufferChanged_ = false;
00135 }
00136 return data_->vertexBuffer_;
00137 }
00138
00139
00140 Direct3DIndexBuffer* PrimitiveDrawRequest::getIndexBuffer(){
00141 Assert(hasVertexIndices());
00142 RenderingDevice* device = RenderingDevice::getInstance();
00143 int bufferSize = getVertexIndexCount() * sizeof(u_short);
00144
00145 if(data_->indexBuffer_ == NULL){
00146 data_->indexBuffer_ = device->createDynamicIndexBuffer(bufferSize);
00147 data_->indexBufferChanged_ = true;
00148 }
00149
00150 if(data_->indexBufferChanged_){
00151 Assert(data_->indexBuffer_ != NULL);
00152 device->writeDynamicIndexBuffer(
00153 data_->indexBuffer_, getVertexIndexArray(), bufferSize);
00154 data_->indexBufferChanged_ = false;
00155 }
00156 return data_->indexBuffer_;
00157 }
00158
00159
00160
00161
00162 PrimitiveDrawRequest::Data::Data() : vertexCount_(0), positions_(NULL),
00163 colors_(NULL), vertexIndexCount_(0), vertexIndices_(NULL),
00164 vertexBuffer_(NULL), indexBuffer_(NULL), referenceCount_(1),
00165 vertexBufferChanged_(true), indexBufferChanged_(true){
00166 LampGraphics::addDeviceObjectHolder(this);
00167 }
00168
00169
00170 PrimitiveDrawRequest::Data::~Data(){
00171 Assert(referenceCount_ == 0);
00172 LampGraphics::removeDeviceObjectHolder(this);
00173 invalidateGraphicsDeviceObjects();
00174 SafeArrayDelete(vertexIndices_);
00175 SafeArrayDelete(colors_);
00176 SafeArrayDelete(positions_);
00177 }
00178
00179 }
00180