diff options
-rw-r--r-- | source/gameengine/Converter/BL_BlenderDataConversion.cpp | 27 | ||||
-rw-r--r-- | source/gameengine/GameLogic/SCA_KeyboardSensor.cpp | 17 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_Scene.cpp | 4 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_Scene.h | 2 | ||||
-rw-r--r-- | source/gameengine/Rasterizer/RAS_BucketManager.cpp | 4 | ||||
-rw-r--r-- | source/gameengine/Rasterizer/RAS_BucketManager.h | 2 |
6 files changed, 38 insertions, 18 deletions
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index 743aabcd821..8ae287a494c 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -883,6 +883,7 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools* Material* ma = 0; bool polyvisible = true; RAS_IPolyMaterial* polymat = NULL; + BL_Material *bl_mat; if(converter->GetMaterials()) { @@ -891,7 +892,7 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools* else ma = give_current_material(blenderobj, 1); - BL_Material *bl_mat = ConvertMaterial(mesh, ma, tface, mface, mmcol, lightlayer, blenderobj, layers); + bl_mat = ConvertMaterial(mesh, ma, tface, mface, mmcol, lightlayer, blenderobj, layers); // set the index were dealing with bl_mat->material_index = (int)mface->mat_nr; @@ -899,7 +900,6 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools* collider = ((bl_mat->ras_mode & COLLIDER)!=0); polymat = new KX_BlenderMaterial(scene, bl_mat, skinMesh, lightlayer, blenderobj ); - converter->RegisterBlenderMaterial(bl_mat); unsigned int rgb[4]; bl_mat->GetConversionRGB(rgb); @@ -921,8 +921,6 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools* if (mface->v4) tan3 = tangent[mface->v4]; } - // this is needed to free up memory afterwards - converter->RegisterPolyMaterial(polymat); } else { @@ -1029,12 +1027,27 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools* polymat->m_specular = MT_Vector3(0.0f,0.0f,0.0f); polymat->m_shininess = 35.0; } + } + + // see if a bucket was reused or a new one was created + // this way only one KX_BlenderMaterial object has to exist per bucket + bool bucketCreated; + RAS_MaterialBucket* bucket = scene->FindBucket(polymat, bucketCreated); + if (bucketCreated) { // this is needed to free up memory afterwards converter->RegisterPolyMaterial(polymat); - + if(converter->GetMaterials()) { + converter->RegisterBlenderMaterial(bl_mat); + } + } else { + // delete the material objects since they are no longer needed + // from now on, use the polygon material from the material bucket + delete polymat; + if(converter->GetMaterials()) { + delete bl_mat; + } + polymat = bucket->GetPolyMaterial(); } - - RAS_MaterialBucket* bucket = scene->FindBucket(polymat); int nverts = mface->v4?4:3; int vtxarray = meshobj->FindVertexArray(nverts,polymat); diff --git a/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp b/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp index 4898dbed95f..c276f42e0ff 100644 --- a/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp +++ b/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp @@ -137,17 +137,22 @@ bool SCA_KeyboardSensor::Evaluate(CValue* eventval) { bool justactivated = false; bool justreleased = false; + bool active = false; for (int i=SCA_IInputDevice::KX_BEGINKEY ; i< SCA_IInputDevice::KX_ENDKEY;i++) { const SCA_InputEvent & inevent = inputdev->GetEventValue((SCA_IInputDevice::KX_EnumInputs) i); - if (inevent.m_status == SCA_InputEvent::KX_JUSTACTIVATED) - { + switch (inevent.m_status) + { + case SCA_InputEvent::KX_JUSTACTIVATED: justactivated = true; - } - if (inevent.m_status == SCA_InputEvent::KX_JUSTRELEASED) - { + break; + case SCA_InputEvent::KX_JUSTRELEASED: justreleased = true; + break; + case SCA_InputEvent::KX_ACTIVE: + active = true; + break; } } @@ -159,7 +164,7 @@ bool SCA_KeyboardSensor::Evaluate(CValue* eventval) { if (justreleased) { - m_val=0; + m_val=(active)?1:0; result = true; } } diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index 2d86e23f5ce..b2557a69527 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -1212,9 +1212,9 @@ void KX_Scene::UpdateParents(double curtime) -RAS_MaterialBucket* KX_Scene::FindBucket(class RAS_IPolyMaterial* polymat) +RAS_MaterialBucket* KX_Scene::FindBucket(class RAS_IPolyMaterial* polymat, bool &bucketCreated) { - return m_bucketmanager->RAS_BucketManagerFindBucket(polymat); + return m_bucketmanager->RAS_BucketManagerFindBucket(polymat, bucketCreated); } diff --git a/source/gameengine/Ketsji/KX_Scene.h b/source/gameengine/Ketsji/KX_Scene.h index 58120d49dc4..b5de483e8f0 100644 --- a/source/gameengine/Ketsji/KX_Scene.h +++ b/source/gameengine/Ketsji/KX_Scene.h @@ -286,7 +286,7 @@ public: ~KX_Scene(); RAS_BucketManager* GetBucketManager(); - RAS_MaterialBucket* FindBucket(RAS_IPolyMaterial* polymat); + RAS_MaterialBucket* FindBucket(RAS_IPolyMaterial* polymat, bool &bucketCreated); void RenderBuckets(const MT_Transform& cameratransform, RAS_IRasterizer* rasty, RAS_IRenderTools* rendertools); diff --git a/source/gameengine/Rasterizer/RAS_BucketManager.cpp b/source/gameengine/Rasterizer/RAS_BucketManager.cpp index 999a79546a1..9c28aedd994 100644 --- a/source/gameengine/Rasterizer/RAS_BucketManager.cpp +++ b/source/gameengine/Rasterizer/RAS_BucketManager.cpp @@ -156,8 +156,9 @@ void RAS_BucketManager::Renderbuckets( RAS_MaterialBucket::EndFrame(); } -RAS_MaterialBucket* RAS_BucketManager::RAS_BucketManagerFindBucket(RAS_IPolyMaterial * material) +RAS_MaterialBucket* RAS_BucketManager::RAS_BucketManagerFindBucket(RAS_IPolyMaterial * material, bool &bucketCreated) { + bucketCreated = false; BucketList::iterator it; for (it = m_MaterialBuckets.begin(); it != m_MaterialBuckets.end(); it++) { @@ -172,6 +173,7 @@ RAS_MaterialBucket* RAS_BucketManager::RAS_BucketManagerFindBucket(RAS_IPolyMate } RAS_MaterialBucket *bucket = new RAS_MaterialBucket(material); + bucketCreated = true; if (bucket->IsTransparant()) m_AlphaBuckets.push_back(bucket); else diff --git a/source/gameengine/Rasterizer/RAS_BucketManager.h b/source/gameengine/Rasterizer/RAS_BucketManager.h index 59144f1e175..11633f555ea 100644 --- a/source/gameengine/Rasterizer/RAS_BucketManager.h +++ b/source/gameengine/Rasterizer/RAS_BucketManager.h @@ -61,7 +61,7 @@ public: RAS_IRasterizer* rasty, class RAS_IRenderTools* rendertools); - RAS_MaterialBucket* RAS_BucketManagerFindBucket(RAS_IPolyMaterial * material); + RAS_MaterialBucket* RAS_BucketManagerFindBucket(RAS_IPolyMaterial * material, bool &bucketCreated); private: |