1023
void KX_Scene::ReplaceMesh(class CValue* obj,void* meshobj)
1020
void KX_Scene::ReplaceMesh(class CValue* obj,void* meshobj, bool use_gfx, bool use_phys)
1025
1022
KX_GameObject* gameobj = static_cast<KX_GameObject*>(obj);
1026
1023
RAS_MeshObject* mesh = static_cast<RAS_MeshObject*>(meshobj);
1028
if(!gameobj || !mesh)
1030
std::cout << "warning: invalid object, mesh will not be replaced" << std::endl;
1026
std::cout << "KX_Scene::ReplaceMesh Warning: invalid object, doing nothing" << std::endl;
1034
gameobj->RemoveMeshes();
1035
gameobj->AddMesh(mesh);
1037
if (gameobj->m_isDeformable)
1039
BL_DeformableGameObject* newobj = static_cast<BL_DeformableGameObject*>( gameobj );
1030
if(use_gfx && mesh != NULL)
1032
gameobj->RemoveMeshes();
1033
gameobj->AddMesh(mesh);
1041
if (newobj->GetDeformer())
1043
delete newobj->GetDeformer();
1044
newobj->SetDeformer(NULL);
1047
if (mesh->IsDeformed())
1049
// we must create a new deformer but which one?
1050
KX_GameObject* parentobj = newobj->GetParent();
1051
// this always return the original game object (also for replicate)
1052
Object* blendobj = newobj->GetBlenderObject();
1053
// object that owns the new mesh
1054
Object* oldblendobj = static_cast<struct Object*>(m_logicmgr->FindBlendObjByGameMeshName(mesh->GetName()));
1055
Mesh* blendmesh = mesh->GetMesh();
1057
bool bHasModifier = BL_ModifierDeformer::HasCompatibleDeformer(blendobj);
1058
bool bHasShapeKey = blendmesh->key != NULL && blendmesh->key->type==KEY_RELATIVE;
1059
bool bHasDvert = blendmesh->dvert != NULL;
1061
parentobj && // current parent is armature
1062
parentobj->GetGameObjectType() == SCA_IObject::OBJ_ARMATURE &&
1063
oldblendobj && // needed for mesh deform
1064
blendobj->parent && // original object had armature (not sure this test is needed)
1065
blendobj->parent->type == OB_ARMATURE &&
1066
blendobj->partype==PARSKEL &&
1067
blendmesh->dvert!=NULL; // mesh has vertex group
1068
bool releaseParent = true;
1071
if (oldblendobj==NULL) {
1072
std::cout << "warning: ReplaceMesh() new mesh is not used in an object from the current scene, you will get incorrect behavior" << std::endl;
1073
bHasShapeKey= bHasDvert= bHasArmature=bHasModifier= false;
1078
BL_ModifierDeformer* modifierDeformer;
1079
if (bHasShapeKey || bHasArmature)
1081
modifierDeformer = new BL_ModifierDeformer(
1083
oldblendobj, blendobj,
1084
static_cast<BL_SkinMeshObject*>(mesh),
1086
static_cast<BL_ArmatureObject*>( parentobj )
1088
releaseParent= false;
1089
modifierDeformer->LoadShapeDrivers(blendobj->parent);
1093
modifierDeformer = new BL_ModifierDeformer(
1095
oldblendobj, blendobj,
1096
static_cast<BL_SkinMeshObject*>(mesh),
1101
newobj->SetDeformer(modifierDeformer);
1103
else if (bHasShapeKey)
1105
BL_ShapeDeformer* shapeDeformer;
1108
shapeDeformer = new BL_ShapeDeformer(
1110
oldblendobj, blendobj,
1111
static_cast<BL_SkinMeshObject*>(mesh),
1114
static_cast<BL_ArmatureObject*>( parentobj )
1116
releaseParent= false;
1117
shapeDeformer->LoadShapeDrivers(blendobj->parent);
1121
shapeDeformer = new BL_ShapeDeformer(
1123
oldblendobj, blendobj,
1124
static_cast<BL_SkinMeshObject*>(mesh),
1130
newobj->SetDeformer( shapeDeformer);
1132
else if (bHasArmature)
1134
BL_SkinDeformer* skinDeformer = new BL_SkinDeformer(
1136
oldblendobj, blendobj,
1137
static_cast<BL_SkinMeshObject*>(mesh),
1140
static_cast<BL_ArmatureObject*>( parentobj )
1142
releaseParent= false;
1143
newobj->SetDeformer(skinDeformer);
1147
BL_MeshDeformer* meshdeformer = new BL_MeshDeformer(
1148
newobj, oldblendobj, static_cast<BL_SkinMeshObject*>(mesh)
1150
newobj->SetDeformer(meshdeformer);
1153
// release parent reference if its not being used
1154
if( releaseParent && parentobj)
1155
parentobj->Release();
1159
gameobj->AddMeshUser();
1035
if (gameobj->m_isDeformable)
1037
BL_DeformableGameObject* newobj = static_cast<BL_DeformableGameObject*>( gameobj );
1039
if (newobj->GetDeformer())
1041
delete newobj->GetDeformer();
1042
newobj->SetDeformer(NULL);
1045
if (mesh->IsDeformed())
1047
// we must create a new deformer but which one?
1048
KX_GameObject* parentobj = newobj->GetParent();
1049
// this always return the original game object (also for replicate)
1050
Object* blendobj = newobj->GetBlenderObject();
1051
// object that owns the new mesh
1052
Object* oldblendobj = static_cast<struct Object*>(m_logicmgr->FindBlendObjByGameMeshName(mesh->GetName()));
1053
Mesh* blendmesh = mesh->GetMesh();
1055
bool bHasModifier = BL_ModifierDeformer::HasCompatibleDeformer(blendobj);
1056
bool bHasShapeKey = blendmesh->key != NULL && blendmesh->key->type==KEY_RELATIVE;
1057
bool bHasDvert = blendmesh->dvert != NULL;
1059
parentobj && // current parent is armature
1060
parentobj->GetGameObjectType() == SCA_IObject::OBJ_ARMATURE &&
1061
oldblendobj && // needed for mesh deform
1062
blendobj->parent && // original object had armature (not sure this test is needed)
1063
blendobj->parent->type == OB_ARMATURE &&
1064
blendobj->partype==PARSKEL &&
1065
blendmesh->dvert!=NULL; // mesh has vertex group
1066
bool releaseParent = true;
1069
if (oldblendobj==NULL) {
1070
std::cout << "warning: ReplaceMesh() new mesh is not used in an object from the current scene, you will get incorrect behavior" << std::endl;
1071
bHasShapeKey= bHasDvert= bHasArmature=bHasModifier= false;
1076
BL_ModifierDeformer* modifierDeformer;
1077
if (bHasShapeKey || bHasArmature)
1079
modifierDeformer = new BL_ModifierDeformer(
1081
oldblendobj, blendobj,
1082
static_cast<BL_SkinMeshObject*>(mesh),
1084
static_cast<BL_ArmatureObject*>( parentobj )
1086
releaseParent= false;
1087
modifierDeformer->LoadShapeDrivers(blendobj->parent);
1091
modifierDeformer = new BL_ModifierDeformer(
1093
oldblendobj, blendobj,
1094
static_cast<BL_SkinMeshObject*>(mesh),
1099
newobj->SetDeformer(modifierDeformer);
1101
else if (bHasShapeKey)
1103
BL_ShapeDeformer* shapeDeformer;
1106
shapeDeformer = new BL_ShapeDeformer(
1108
oldblendobj, blendobj,
1109
static_cast<BL_SkinMeshObject*>(mesh),
1112
static_cast<BL_ArmatureObject*>( parentobj )
1114
releaseParent= false;
1115
shapeDeformer->LoadShapeDrivers(blendobj->parent);
1119
shapeDeformer = new BL_ShapeDeformer(
1121
oldblendobj, blendobj,
1122
static_cast<BL_SkinMeshObject*>(mesh),
1128
newobj->SetDeformer( shapeDeformer);
1130
else if (bHasArmature)
1132
BL_SkinDeformer* skinDeformer = new BL_SkinDeformer(
1134
oldblendobj, blendobj,
1135
static_cast<BL_SkinMeshObject*>(mesh),
1138
static_cast<BL_ArmatureObject*>( parentobj )
1140
releaseParent= false;
1141
newobj->SetDeformer(skinDeformer);
1145
BL_MeshDeformer* meshdeformer = new BL_MeshDeformer(
1146
newobj, oldblendobj, static_cast<BL_SkinMeshObject*>(mesh)
1148
newobj->SetDeformer(meshdeformer);
1151
// release parent reference if its not being used
1152
if( releaseParent && parentobj)
1153
parentobj->Release();
1157
gameobj->AddMeshUser();
1160
if(use_phys) { /* update the new assigned mesh with the physics mesh */
1161
KX_ReInstanceBulletShapeFromMesh(gameobj, NULL, use_gfx?NULL:mesh);
1162
1165
KX_Camera* KX_Scene::FindCamera(KX_Camera* cam)