diff options
-rw-r--r-- | source/gameengine/Converter/BL_BlenderDataConversion.cpp | 2 | ||||
-rw-r--r-- | source/gameengine/Converter/CMakeLists.txt | 2 | ||||
-rw-r--r-- | source/gameengine/Ketsji/BL_Action.cpp | 29 | ||||
-rw-r--r-- | source/gameengine/Ketsji/CMakeLists.txt | 2 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_IpoConvert.cpp (renamed from source/gameengine/Converter/KX_IpoConvert.cpp) | 213 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_IpoConvert.h (renamed from source/gameengine/Converter/KX_IpoConvert.h) | 49 |
6 files changed, 119 insertions, 178 deletions
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index f7726ebaf78..1c160097e2c 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -2233,8 +2233,6 @@ static void bl_ConvertBlenderObject_Single( gameobj->NodeSetLocalScale(scale); gameobj->NodeUpdateGS(0); - BL_ConvertMaterialIpos(blenderobject, gameobj, converter); - sumolist->Add(gameobj->AddRef()); BL_ConvertProperties(blenderobject,gameobj,timemgr,kxscene,isInActiveLayer); diff --git a/source/gameengine/Converter/CMakeLists.txt b/source/gameengine/Converter/CMakeLists.txt index 38c0d71d24d..f18646c1de0 100644 --- a/source/gameengine/Converter/CMakeLists.txt +++ b/source/gameengine/Converter/CMakeLists.txt @@ -82,7 +82,6 @@ set(SRC KX_ConvertControllers.cpp KX_ConvertProperties.cpp KX_ConvertSensors.cpp - KX_IpoConvert.cpp KX_LibLoadStatus.cpp KX_SoftBodyDeformer.cpp @@ -105,7 +104,6 @@ set(SRC KX_ConvertControllers.h KX_ConvertProperties.h KX_ConvertSensors.h - KX_IpoConvert.h KX_LibLoadStatus.h KX_SoftBodyDeformer.h ) diff --git a/source/gameengine/Ketsji/BL_Action.cpp b/source/gameengine/Ketsji/BL_Action.cpp index f55d1120a50..ff1f800a626 100644 --- a/source/gameengine/Ketsji/BL_Action.cpp +++ b/source/gameengine/Ketsji/BL_Action.cpp @@ -43,6 +43,10 @@ extern "C" { #include "BKE_action.h" #include "RNA_access.h" #include "RNA_define.h" + +// Needed for material IPOs +#include "BKE_material.h" +#include "DNA_material_types.h" } BL_Action::BL_Action(class KX_GameObject* gameobj) @@ -169,6 +173,31 @@ bool BL_Action::Play(const char* name, sg_contr->SetObject(m_obj->GetSGNode()); } + // Now try materials + if (m_obj->GetBlenderObject()->totcol==1) { + Material *mat = give_current_material(m_obj->GetBlenderObject(), 1); + sg_contr = BL_CreateMaterialIpo(m_action, mat, 0, m_obj, kxscene->GetSceneConverter()); + if (sg_contr) { + m_sg_contr_list.push_back(sg_contr); + m_obj->GetSGNode()->AddSGController(sg_contr); + sg_contr->SetObject(m_obj->GetSGNode()); + } + } else { + Material *mat; + STR_HashedString matname; + + for (int matidx = 1; matidx <= m_obj->GetBlenderObject()->totcol; ++matidx) { + mat = give_current_material(m_obj->GetBlenderObject(), matidx); + matname = mat->id.name; + sg_contr = BL_CreateMaterialIpo(m_action, mat, matname.hash(), m_obj, kxscene->GetSceneConverter()); + if (sg_contr) { + m_sg_contr_list.push_back(sg_contr); + m_obj->GetSGNode()->AddSGController(sg_contr); + sg_contr->SetObject(m_obj->GetSGNode()); + } + } + } + // Extra controllers if (m_obj->GetGameObjectType() == SCA_IObject::OBJ_LIGHT) { diff --git a/source/gameengine/Ketsji/CMakeLists.txt b/source/gameengine/Ketsji/CMakeLists.txt index fc322d80cd0..7f748013648 100644 --- a/source/gameengine/Ketsji/CMakeLists.txt +++ b/source/gameengine/Ketsji/CMakeLists.txt @@ -84,6 +84,7 @@ set(SRC KX_FontObject.cpp KX_GameActuator.cpp KX_GameObject.cpp + KX_IpoConvert.cpp KX_IPO_SGController.cpp KX_IPhysicsController.cpp KX_IpoActuator.cpp @@ -161,6 +162,7 @@ set(SRC KX_GameActuator.h KX_GameObject.h KX_IInterpolator.h + KX_IpoConvert.h KX_IPOTransform.h KX_IPO_SGController.h KX_IPhysicsController.h diff --git a/source/gameengine/Converter/KX_IpoConvert.cpp b/source/gameengine/Ketsji/KX_IpoConvert.cpp index 0b0ee132a42..9ec354ec840 100644 --- a/source/gameengine/Converter/KX_IpoConvert.cpp +++ b/source/gameengine/Ketsji/KX_IpoConvert.cpp @@ -187,21 +187,6 @@ SG_Controller *BL_CreateObColorIPO(struct bAction *action, KX_GameObject* gameob return ipocontr_obcol; } -void BL_ConvertIpos(struct Object* blenderobject,KX_GameObject* gameobj,KX_BlenderSceneConverter *converter) -{ - if (blenderobject->adt) { - SG_Controller *ipocontr = BL_CreateIPO(blenderobject->adt->action, gameobj, converter); - gameobj->GetSGNode()->AddSGController(ipocontr); - ipocontr->SetObject(gameobj->GetSGNode()); - - SG_Controller *ipocontr_obcol = BL_CreateObColorIPO(blenderobject->adt->action, gameobj, converter); - if (ipocontr_obcol) { - gameobj->GetSGNode()->AddSGController(ipocontr_obcol); - ipocontr_obcol->SetObject(gameobj->GetSGNode()); - } - } -} - SG_Controller *BL_CreateLampIPO(struct bAction *action, KX_GameObject* lightobj, KX_BlenderSceneConverter *converter) { KX_LightIpoSGController* ipocontr = new KX_LightIpoSGController(); @@ -245,19 +230,6 @@ SG_Controller *BL_CreateLampIPO(struct bAction *action, KX_GameObject* lightobj return ipocontr; } -void BL_ConvertLampIpos(struct Lamp* blenderlamp, KX_GameObject *lightobj,KX_BlenderSceneConverter *converter) -{ - - if (blenderlamp->adt) { - - SG_Controller* ipocontr = BL_CreateLampIPO(blenderlamp->adt->action, lightobj, converter); - lightobj->GetSGNode()->AddSGController(ipocontr); - ipocontr->SetObject(lightobj->GetSGNode()); - - - } -} - SG_Controller *BL_CreateCameraIPO(struct bAction *action, KX_GameObject* cameraobj, KX_BlenderSceneConverter *converter) { KX_CameraIpoSGController* ipocontr = new KX_CameraIpoSGController(); @@ -297,17 +269,6 @@ SG_Controller *BL_CreateCameraIPO(struct bAction *action, KX_GameObject* camera return ipocontr; } -void BL_ConvertCameraIpos(struct Camera* blendercamera, KX_GameObject *cameraobj,KX_BlenderSceneConverter *converter) -{ - - if (blendercamera->adt) { - SG_Controller* ipocontr = BL_CreateCameraIPO(blendercamera->adt->action, cameraobj, converter); - cameraobj->GetSGNode()->AddSGController(ipocontr); - ipocontr->SetObject(cameraobj->GetSGNode()); - } -} - - void BL_ConvertWorldIpos(struct World* blenderworld,KX_BlenderSceneConverter *converter) { @@ -356,141 +317,97 @@ void BL_ConvertWorldIpos(struct World* blenderworld,KX_BlenderSceneConverter *co } } -static void ConvertMaterialIpos( +SG_Controller *BL_CreateMaterialIpo( + struct bAction *action, Material* blendermaterial, dword matname_hash, KX_GameObject* gameobj, KX_BlenderSceneConverter *converter ) { - if (blendermaterial->adt) { - KX_MaterialIpoController* ipocontr = new KX_MaterialIpoController(matname_hash); - gameobj->GetSGNode()->AddSGController(ipocontr); - ipocontr->SetObject(gameobj->GetSGNode()); - - BL_InterpolatorList *adtList= GetAdtList(blendermaterial->adt->action, converter); + KX_MaterialIpoController* ipocontr = NULL; + BL_InterpolatorList *adtList= GetAdtList(action, converter); + KX_IInterpolator *interpolator; + KX_IScalarInterpolator *sinterp; - ipocontr->m_rgba[0] = blendermaterial->r; - ipocontr->m_rgba[1] = blendermaterial->g; - ipocontr->m_rgba[2] = blendermaterial->b; - ipocontr->m_rgba[3] = blendermaterial->alpha; - - ipocontr->m_specrgb[0] = blendermaterial->specr; - ipocontr->m_specrgb[1] = blendermaterial->specg; - ipocontr->m_specrgb[2] = blendermaterial->specb; - - ipocontr->m_hard = blendermaterial->har; - ipocontr->m_spec = blendermaterial->spec; - ipocontr->m_ref = blendermaterial->ref; - ipocontr->m_emit = blendermaterial->emit; - ipocontr->m_alpha = blendermaterial->alpha; - - KX_IInterpolator *interpolator; - KX_IScalarInterpolator *sinterp; - - // -- - for (int i=0; i<3; i++) { - if ((sinterp = adtList->GetScalarInterpolator("diffuse_color", i))) { - if (!ipocontr) { - ipocontr = new KX_MaterialIpoController(matname_hash); - gameobj->GetSGNode()->AddSGController(ipocontr); - ipocontr->SetObject(gameobj->GetSGNode()); - } - interpolator= new KX_ScalarInterpolator(&ipocontr->m_rgba[i], sinterp); - ipocontr->AddInterpolator(interpolator); - } - } - - if ((sinterp = adtList->GetScalarInterpolator("alpha", 0))) { + // -- + for (int i=0; i<3; i++) { + if ((sinterp = adtList->GetScalarInterpolator("diffuse_color", i))) { if (!ipocontr) { ipocontr = new KX_MaterialIpoController(matname_hash); - gameobj->GetSGNode()->AddSGController(ipocontr); - ipocontr->SetObject(gameobj->GetSGNode()); } - interpolator= new KX_ScalarInterpolator(&ipocontr->m_rgba[3], sinterp); + interpolator= new KX_ScalarInterpolator(&ipocontr->m_rgba[i], sinterp); ipocontr->AddInterpolator(interpolator); } + } - for (int i=0; i<3; i++) { - if ((sinterp = adtList->GetScalarInterpolator("specular_color", i))) { - if (!ipocontr) { - ipocontr = new KX_MaterialIpoController(matname_hash); - gameobj->GetSGNode()->AddSGController(ipocontr); - ipocontr->SetObject(gameobj->GetSGNode()); - } - interpolator= new KX_ScalarInterpolator(&ipocontr->m_specrgb[i], sinterp); - ipocontr->AddInterpolator(interpolator); - } - } - - if ((sinterp = adtList->GetScalarInterpolator("specular_hardness", 0))) { - if (!ipocontr) { - ipocontr = new KX_MaterialIpoController(matname_hash); - gameobj->GetSGNode()->AddSGController(ipocontr); - ipocontr->SetObject(gameobj->GetSGNode()); - } - interpolator= new KX_ScalarInterpolator(&ipocontr->m_hard, sinterp); - ipocontr->AddInterpolator(interpolator); + if ((sinterp = adtList->GetScalarInterpolator("alpha", 0))) { + if (!ipocontr) { + ipocontr = new KX_MaterialIpoController(matname_hash); } + interpolator= new KX_ScalarInterpolator(&ipocontr->m_rgba[3], sinterp); + ipocontr->AddInterpolator(interpolator); + } - if ((sinterp = adtList->GetScalarInterpolator("specularity", 0))) { + for (int i=0; i<3; i++) { + if ((sinterp = adtList->GetScalarInterpolator("specular_color", i))) { if (!ipocontr) { ipocontr = new KX_MaterialIpoController(matname_hash); - gameobj->GetSGNode()->AddSGController(ipocontr); - ipocontr->SetObject(gameobj->GetSGNode()); } - interpolator= new KX_ScalarInterpolator(&ipocontr->m_spec, sinterp); + interpolator= new KX_ScalarInterpolator(&ipocontr->m_specrgb[i], sinterp); ipocontr->AddInterpolator(interpolator); } - - if ((sinterp = adtList->GetScalarInterpolator("diffuse_reflection", 0))) { - if (!ipocontr) { - ipocontr = new KX_MaterialIpoController(matname_hash); - gameobj->GetSGNode()->AddSGController(ipocontr); - ipocontr->SetObject(gameobj->GetSGNode()); - } - interpolator= new KX_ScalarInterpolator(&ipocontr->m_ref, sinterp); - ipocontr->AddInterpolator(interpolator); + } + + if ((sinterp = adtList->GetScalarInterpolator("specular_hardness", 0))) { + if (!ipocontr) { + ipocontr = new KX_MaterialIpoController(matname_hash); } - - if ((sinterp = adtList->GetScalarInterpolator("emit", 0))) { - if (!ipocontr) { - ipocontr = new KX_MaterialIpoController(matname_hash); - gameobj->GetSGNode()->AddSGController(ipocontr); - ipocontr->SetObject(gameobj->GetSGNode()); - } - interpolator= new KX_ScalarInterpolator(&ipocontr->m_emit, sinterp); - ipocontr->AddInterpolator(interpolator); + interpolator= new KX_ScalarInterpolator(&ipocontr->m_hard, sinterp); + ipocontr->AddInterpolator(interpolator); + } + + if ((sinterp = adtList->GetScalarInterpolator("specularity", 0))) { + if (!ipocontr) { + ipocontr = new KX_MaterialIpoController(matname_hash); } + interpolator= new KX_ScalarInterpolator(&ipocontr->m_spec, sinterp); + ipocontr->AddInterpolator(interpolator); } -} -void BL_ConvertMaterialIpos( - struct Object* blenderobject, - KX_GameObject* gameobj, - KX_BlenderSceneConverter *converter - ) -{ - if (blenderobject->totcol==1) - { - Material *mat = give_current_material(blenderobject, 1); - // if there is only one material attached to the mesh then set material_index in BL_ConvertMaterialIpos to NULL - // --> this makes the UpdateMaterialData function in KX_GameObject.cpp use the old hack of using SetObjectColor - // because this yields a better performance as not all the vertex colors need to be edited - if (mat) ConvertMaterialIpos(mat, 0, gameobj, converter); + if ((sinterp = adtList->GetScalarInterpolator("diffuse_reflection", 0))) { + if (!ipocontr) { + ipocontr = new KX_MaterialIpoController(matname_hash); + } + interpolator= new KX_ScalarInterpolator(&ipocontr->m_ref, sinterp); + ipocontr->AddInterpolator(interpolator); } - else - { - for (int material_index=1; material_index <= blenderobject->totcol; material_index++) - { - Material *mat = give_current_material(blenderobject, material_index); - STR_HashedString matname; - if (mat) { - matname= mat->id.name; // who is using this name? can we remove the MA here? - ConvertMaterialIpos(mat, matname.hash(), gameobj, converter); - } + + if ((sinterp = adtList->GetScalarInterpolator("emit", 0))) { + if (!ipocontr) { + ipocontr = new KX_MaterialIpoController(matname_hash); } + interpolator= new KX_ScalarInterpolator(&ipocontr->m_emit, sinterp); + ipocontr->AddInterpolator(interpolator); } -} + if (ipocontr) { + ipocontr->m_rgba[0] = blendermaterial->r; + ipocontr->m_rgba[1] = blendermaterial->g; + ipocontr->m_rgba[2] = blendermaterial->b; + ipocontr->m_rgba[3] = blendermaterial->alpha; + + ipocontr->m_specrgb[0] = blendermaterial->specr; + ipocontr->m_specrgb[1] = blendermaterial->specg; + ipocontr->m_specrgb[2] = blendermaterial->specb; + + ipocontr->m_hard = blendermaterial->har; + ipocontr->m_spec = blendermaterial->spec; + ipocontr->m_ref = blendermaterial->ref; + ipocontr->m_emit = blendermaterial->emit; + ipocontr->m_alpha = blendermaterial->alpha; + } + + return ipocontr; +} diff --git a/source/gameengine/Converter/KX_IpoConvert.h b/source/gameengine/Ketsji/KX_IpoConvert.h index 044993a31e6..1f4e1bea96d 100644 --- a/source/gameengine/Converter/KX_IpoConvert.h +++ b/source/gameengine/Ketsji/KX_IpoConvert.h @@ -33,39 +33,36 @@ #define __KX_IPOCONVERT_H__ struct Object; +struct bAction; +class SG_Controller; +class KX_GameObject; +class KX_BlenderSceneConverter; -class SG_Controller *BL_CreateIPO(struct bAction *action, - class KX_GameObject* gameobj, - class KX_BlenderSceneConverter *converter); -class SG_Controller *BL_CreateObColorIPO(struct bAction *action, - class KX_GameObject* gameobj, - class KX_BlenderSceneConverter *converter); -void BL_ConvertIpos(struct Object* blenderobject, - class KX_GameObject* gameobj, - class KX_BlenderSceneConverter *converter); +SG_Controller *BL_CreateIPO(bAction *action, + KX_GameObject* gameobj, + KX_BlenderSceneConverter *converter); -class SG_Controller *BL_CreateLampIPO(struct bAction *action, - class KX_GameObject* lightobj, - class KX_BlenderSceneConverter *converter); +SG_Controller *BL_CreateObColorIPO(bAction *action, + KX_GameObject* gameobj, + KX_BlenderSceneConverter *converter); -void BL_ConvertLampIpos(struct Lamp* blenderlight, - class KX_GameObject* lightobj, - class KX_BlenderSceneConverter *converter); +SG_Controller *BL_CreateLampIPO(bAction *action, + KX_GameObject* lightobj, + KX_BlenderSceneConverter *converter); void BL_ConvertWorldIpos(struct World* blenderworld, - class KX_BlenderSceneConverter *converter); + KX_BlenderSceneConverter *converter); -class SG_Controller *BL_CreateCameraIPO(struct bAction *action, - class KX_GameObject* cameraobj, - class KX_BlenderSceneConverter *converter); +SG_Controller *BL_CreateCameraIPO(bAction *action, + KX_GameObject* cameraobj, + KX_BlenderSceneConverter *converter); -void BL_ConvertCameraIpos(struct Camera* blendercamera, - class KX_GameObject* cameraobj, - class KX_BlenderSceneConverter *converter); - -void BL_ConvertMaterialIpos(struct Object* blenderobject, - class KX_GameObject* materialobj, - class KX_BlenderSceneConverter *converter); +SG_Controller *BL_CreateMaterialIpo( + bAction *action, + class Material* blendermaterial, + dword matname_hash, + KX_GameObject* gameobj, + KX_BlenderSceneConverter *converter); #endif /* __KX_IPOCONVERT_H__ */ |