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/Material/Material.h"
00027 #include "Graphics/Material/MaterialManager.h"
00028 #include "Graphics/Texture/Texture.h"
00029 #include "Graphics/Renderer/RenderingDevice.h"
00030 #include "Graphics/Renderer/DrawRequest.h"
00031
00032 namespace Lamp{
00033
00034
00035 const String Material::blendModeStringTable[] = {
00036 "Disable",
00037 "Add",
00038 "Subtract",
00039 "InverseSubtract",
00040 "Minimum",
00041 "Maximum",
00042 };
00043
00044
00045 const String Material::blendStateStringTable[] = {
00046 "Zero",
00047 "One",
00048 "SourceColor",
00049 "InverseSourceColor",
00050 "SourceAlpha",
00051 "InverseSourceAlpha",
00052 "SourceAlphaSaturate",
00053 "DestinationColor",
00054 "InverseDestinationColor",
00055 "DestinationAlpha",
00056 "InverseDestinationAlpha",
00057 };
00058
00059
00060 const String Material::fogOptionStringTable[] = {
00061 "None",
00062 "Disable",
00063 "Black",
00064 };
00065
00066
00067
00068 Material::Material(const String& name, Scene* scene) :
00069 SceneObject(name, scene), startStateBlock_(NULL), endStateBlock_(NULL),
00070 priority_(0), blendMode_(blendModeDisable),
00071 blendSource_(blendStateSourceAlpha),
00072 blendDestination_(blendStateInverseSourceAlpha), alpha_(1.f),
00073 fogOption_(fogOptionNone), lightMask_(1), pipelineMode_(pipelineModeNone),
00074 alphaBlend_(false), zWrite_(true), zTest_(true), hasStateChanged_(true){
00075 }
00076
00077
00078 Material::~Material(){
00079 releaseStateBlock();
00080 }
00081
00082
00083 void Material::copyMaterialValue(Material* destination) const{
00084 destination->setPriority(priority_);
00085 destination->setBlendMode(blendMode_);
00086 destination->setBlendSource(blendSource_);
00087 destination->setBlendDestination(blendDestination_);
00088 destination->setAlpha(alpha_);
00089 destination->setFogOption(fogOption_);
00090 destination->setLightMask(lightMask_);
00091 destination->setZWrite(zWrite_);
00092 destination->setZTest(zTest_);
00093 }
00094
00095
00096 int Material::recursiveDestroy(Material* material){
00097 Assert(material != NULL);
00098 int result = 0;
00099
00100 if(material->getReferenceCount() == 0){
00101 result += material->destroyChildren();
00102 }
00103
00104 MaterialManager* manager = material->getScene()->getMaterialManager();
00105 if(manager->destroy(material) == 0){
00106 result++;
00107 }
00108 return result;
00109 }
00110
00111
00112 void Material::drawStart(){
00113
00114 if(hasStateChanged_){
00115 releaseStateBlock();
00116 buildStateBlock(&startStateBlock_, &endStateBlock_);
00117 hasStateChanged_ = false;
00118 }
00119
00120 if(startStateBlock_ != NULL){
00121 RenderingDevice::getInstance()->applyStateBlock(startStateBlock_);
00122 }
00123 }
00124
00125
00126 void Material::drawEnd(){
00127
00128 if(hasStateChanged_){
00129 releaseStateBlock();
00130 buildStateBlock(&startStateBlock_, &endStateBlock_);
00131 hasStateChanged_ = false;
00132 }
00133
00134 if(endStateBlock_ != NULL){
00135 RenderingDevice::getInstance()->applyStateBlock(endStateBlock_);
00136 }
00137 }
00138
00139
00140 void Material::drawSetup(DrawRequest* request){
00141
00142 if(request->isMaterialChanged()){
00143
00144 Material* preMaterial = request->getPreMaterial();
00145 if(preMaterial != NULL){ preMaterial->drawEnd(); }
00146
00147 drawStart();
00148 }
00149 }
00150
00151
00152
00153
00154 const String& Material::blendModeToString(BlendMode blendMode){
00155 Assert(blendMode >= 0);
00156 Assert(blendMode < blendModeMax);
00157 return blendModeStringTable[blendMode];
00158 }
00159
00160
00161 Material::BlendMode Material::blendModeFromString(
00162 const String& blendModeString){
00163 for(int i = 0; i < blendModeMax; i++){
00164 if(blendModeStringTable[i].equals(blendModeString)){
00165 return BlendMode(i);
00166 }
00167 }
00168 ErrorOut("Material::blendModeFromString() " + blendModeString);
00169 return blendModeMax;
00170 }
00171
00172
00173 const String& Material::blendStateToString(BlendState blendState){
00174 Assert(blendState >= 0);
00175 Assert(blendState < blendStateMax);
00176 return blendStateStringTable[blendState];
00177 }
00178
00179
00180 Material::BlendState Material::blendStateFromString(
00181 const String& blendStateString){
00182 for(int i = 0; i < blendStateMax; i++){
00183 if(blendStateStringTable[i].equals(blendStateString)){
00184 return BlendState(i);
00185 }
00186 }
00187 ErrorOut("Material::blendStateFromString() " + blendStateString);
00188 return blendStateMax;
00189 }
00190
00191
00192 const String& Material::fogOptionToString(FogOption fogOption){
00193 Assert(fogOption >= 0);
00194 Assert(fogOption < fogOptionMax);
00195 return fogOptionStringTable[fogOption];
00196 }
00197
00198
00199 Material::FogOption Material::fogOptionFromString(
00200 const String& fogOptionString){
00201 for(int i = 0; i < fogOptionMax; i++){
00202 if(fogOptionStringTable[i].equals(fogOptionString)){
00203 return FogOption(i);
00204 }
00205 }
00206 ErrorOut("Material::fogOptionFromString() " + fogOptionString);
00207 return fogOptionMax;
00208 }
00209
00210
00211
00212
00213 Texture* Material::setTextureReferense(
00214 Texture* nowTexture, Texture* newTexture){
00215 if(nowTexture != NULL){ nowTexture->removeReference(this); }
00216 if(newTexture != NULL){ newTexture->addReference(this); }
00217 stateChanged();
00218 return newTexture;
00219 }
00220
00221 }
00222