/* * Copyright (C) 2006-2010 - Frictional Games * * This file is part of Penumbra Overture. * * Penumbra Overture is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Penumbra Overture is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Penumbra Overture. If not, see . */ #include "SaveTypes.h" #include "GlobalInit.h" #include "PlayerState_Interact.h" #include "Player.h" ////////////////////////////////////////////////////////////////////////// // BODY ////////////////////////////////////////////////////////////////////////// void cEngineBody_SaveData::FromBody(iPhysicsBody *pBody) { mbActive = pBody->IsActive(); mbCollideCharacter = pBody->GetCollideCharacter(); mvLinearVelocity = pBody->GetLinearVelocity(); mvAngularVelocity = pBody->GetAngularVelocity(); m_mtxTransform = pBody->GetWorldMatrix(); if( gpInit->mpPlayer->GetState() == ePlayerState_Grab && gpInit->mpPlayer->GetPushBody()== pBody && gpInit->mpPlayer->mbUseNormalMass==false) { mfMass = pBody->GetMass() * cPlayerState_Grab::mfMassDiv; } else { mfMass = pBody->GetMass(); } } void cEngineBody_SaveData::ToBody(iPhysicsBody *pBody) { pBody->SetActive(mbActive); pBody->SetMass(mfMass); pBody->SetCollideCharacter(mbCollideCharacter); pBody->SetAngularVelocity(mvAngularVelocity); pBody->SetLinearVelocity(mvLinearVelocity); pBody->SetMatrix(m_mtxTransform); } kBeginSerializeBase(cEngineBody_SaveData) kSerializeVar(mfMass,eSerializeType_Float32) kSerializeVar(mbActive,eSerializeType_Bool) kSerializeVar(mbCollideCharacter,eSerializeType_Bool) kSerializeVar(mvLinearVelocity,eSerializeType_Vector3f) kSerializeVar(mvAngularVelocity,eSerializeType_Vector3f) kSerializeVar(m_mtxTransform,eSerializeType_Matrixf) kEndSerialize() ////////////////////////////////////////////////////////////////////////// // JOINT ////////////////////////////////////////////////////////////////////////// //------------------------------------------------------------------------ void cEngineJoint_SaveData::FromJoint(iPhysicsJoint *apJoint) { msName = apJoint->GetName(); /////////////////////////////// //Callback cScriptJointCallback *pCallback = static_cast(apJoint->GetCallback()); if(pCallback) { msOnMaxCallback = pCallback->msMaxFunc; msOnMinCallback = pCallback->msMinFunc; } else { msOnMaxCallback = ""; msOnMinCallback = ""; } /////////////////////////////// //Controllers cPhysicsControllerIterator ctrlIt = apJoint->GetControllerIterator(); while(ctrlIt.HasNext()) { iPhysicsController *pCtrl = ctrlIt.Next(); cEngineJointController_SaveData saveCtrl; saveCtrl.msName = pCtrl->GetName(); saveCtrl.mfDestValue = pCtrl->GetDestValue(); saveCtrl.mbActive = pCtrl->IsActive(); mvControllers.Add(saveCtrl); } /////////////////////////////// //Type specific switch(apJoint->GetType()) { case ePhysicsJointType_Ball: { iPhysicsJointBall *pBallJoint = static_cast(apJoint); mfMaxLimit = pBallJoint->GetMaxConeAngle(); mfMinLimit = pBallJoint->GetMaxTwistAngle(); break; } case ePhysicsJointType_Hinge: { iPhysicsJointHinge *pHingeJoint = static_cast(apJoint); mfMaxLimit = pHingeJoint->GetMaxAngle(); mfMinLimit = pHingeJoint->GetMinAngle(); break; } case ePhysicsJointType_Screw: { iPhysicsJointScrew *pScrewJoint = static_cast(apJoint); mfMinLimit = pScrewJoint->GetMinDistance(); mfMaxLimit = pScrewJoint->GetMaxDistance(); break; } case ePhysicsJointType_Slider: { iPhysicsJointSlider *pSliderJoint = static_cast(apJoint); mfMinLimit = pSliderJoint->GetMinDistance(); mfMaxLimit = pSliderJoint->GetMaxDistance(); break; } } } //------------------------------------------------------------------------ void cEngineJoint_SaveData::ToJoint(iPhysicsJoint *apJoint) { /////////////////////////////// //Callback cScriptJointCallback *pCallback = static_cast(apJoint->GetCallback()); if(pCallback==NULL) { pCallback = hplNew( cScriptJointCallback, (gpInit->mpGame->GetScene()) ); apJoint->SetCallback(pCallback,true); if(msOnMaxCallback!="" || msOnMinCallback!="") { pCallback->msMaxFunc = msOnMaxCallback; pCallback->msMinFunc = msOnMinCallback; } } else { pCallback->msMaxFunc = msOnMaxCallback; pCallback->msMinFunc = msOnMinCallback; } /////////////////////////////// //Controllers for(int i =0; i< (int)mvControllers.Size(); ++i) { iPhysicsController *pCtrl = apJoint->GetController(mvControllers[i].msName); pCtrl->SetDestValue(mvControllers[i].mfDestValue); pCtrl->SetActive(mvControllers[i].mbActive); } /////////////////////////////// //Type specific switch(apJoint->GetType()) { case ePhysicsJointType_Ball: { iPhysicsJointBall *pBallJoint = static_cast(apJoint); pBallJoint->SetConeLimits(pBallJoint->GetConePin(), mfMaxLimit,mfMinLimit); break; } case ePhysicsJointType_Hinge: { iPhysicsJointHinge *pHingeJoint = static_cast(apJoint); pHingeJoint->SetMaxAngle(mfMaxLimit); pHingeJoint->SetMinAngle(mfMinLimit); break; } case ePhysicsJointType_Screw: { iPhysicsJointScrew *pScrewJoint = static_cast(apJoint); pScrewJoint->SetMinDistance(mfMinLimit); pScrewJoint->SetMaxDistance(mfMaxLimit); break; } case ePhysicsJointType_Slider: { iPhysicsJointSlider *pSliderJoint = static_cast(apJoint); pSliderJoint->SetMinDistance(mfMinLimit); pSliderJoint->SetMaxDistance(mfMaxLimit); break; } } } //------------------------------------------------------------------------ kBeginSerializeBase(cEngineJointController_SaveData) kSerializeVar(msName,eSerializeType_String) kSerializeVar(mfDestValue,eSerializeType_Float32) kSerializeVar(mbActive,eSerializeType_Bool) kEndSerialize() kBeginSerializeBase(cEngineJoint_SaveData) kSerializeVar(msName,eSerializeType_String) kSerializeVar(mfMinLimit,eSerializeType_Float32) kSerializeVar(mfMaxLimit,eSerializeType_Float32) kSerializeVar(msOnMinCallback,eSerializeType_String) kSerializeVar(msOnMaxCallback,eSerializeType_String) kSerializeClassContainer(mvControllers,cEngineJointController_SaveData,eSerializeType_Class) kEndSerialize() //------------------------------------------------------------------------ ////////////////////////////////////////////////////////////////////////// // PS ////////////////////////////////////////////////////////////////////////// //---------------------------------------------------------- void cEnginePS_SaveData::FromPS(cParticleSystem3D *apPS) { if(apPS) { msName = apPS->GetName(); msType = apPS->GetDataName(); mvSize = apPS->GetDataSize(); m_mtxTransform = apPS->GetWorldMatrix(); mvEmitterActive.Resize(apPS->GetEmitterNum()); for(int i=0; i< apPS->GetEmitterNum(); ++i) { iParticleEmitter *pEmitter = apPS->GetEmitter(i); if(pEmitter->IsDying() || pEmitter->IsDead()) mvEmitterActive[i].mbActive = false; else mvEmitterActive[i].mbActive = true; } } else { msName = "NULL"; msType = ""; mvEmitterActive.Clear(); } } void cEnginePS_SaveData::ToPS(cParticleSystem3D *apPS) { if(apPS==NULL) return; for(size_t i=0; i< mvEmitterActive.Size(); ++i) { iParticleEmitter *pEmitter = apPS->GetEmitter((int)i); if(mvEmitterActive[i].mbActive==false) { pEmitter->KillInstantly(); } } } //---------------------------------------------------------- kBeginSerializeBase(cEnginePSEmitter_SaveData) kSerializeVar(mbActive,eSerializeType_Bool) kEndSerialize() kBeginSerializeBase(cEnginePS_SaveData) kSerializeVar(msName,eSerializeType_String) kSerializeVar(msType,eSerializeType_String) kSerializeVar(mvSize,eSerializeType_Vector3f) kSerializeVar(m_mtxTransform,eSerializeType_Matrixf) kSerializeClassContainer(mvEmitterActive,cEnginePSEmitter_SaveData,eSerializeType_Class) kEndSerialize() //---------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // BEAM ////////////////////////////////////////////////////////////////////////// //---------------------------------------------------------- void cEngineBeam_SaveData::FromBeam(cBeam *apBeam) { msName = apBeam->GetName(); msFile = apBeam->GetFileName(); mvStartPos = apBeam->GetLocalPosition(); mvEndPos = apBeam->GetEnd()->GetLocalPosition(); } void cEngineBeam_SaveData::ToBeam(cBeam *apBeam) { apBeam->LoadXMLProperties(msFile); apBeam->SetPosition(mvStartPos); apBeam->GetEnd()->SetPosition(mvEndPos); } //---------------------------------------------------------- kBeginSerializeBase(cEngineBeam_SaveData) kSerializeVar(msName,eSerializeType_String) kSerializeVar(msFile,eSerializeType_String) kSerializeVar(mvStartPos,eSerializeType_Vector3f) kSerializeVar(mvEndPos,eSerializeType_Vector3f) kEndSerialize() //---------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // SOUND ////////////////////////////////////////////////////////////////////////// void cEngineSound_SaveData::FromSound(cSoundEntity* apSound) { msName = apSound->GetName(); mbActive = apSound->IsActive(); mbStopped = apSound->IsStopped(); } void cEngineSound_SaveData::ToSound(cSoundEntity* apSound) { apSound->SetActive(mbActive); if(mbStopped) apSound->Stop(false); } kBeginSerializeBase(cEngineSound_SaveData) kSerializeVar(msName,eSerializeType_String) kSerializeVar(mbActive,eSerializeType_Bool) kSerializeVar(mbStopped,eSerializeType_Bool) kEndSerialize() ////////////////////////////////////////////////////////////////////////// // LIGHT ////////////////////////////////////////////////////////////////////////// kBeginSerializeBase(cEngineLightAttachBB_SaveData) kSerializeVar(msName,eSerializeType_String) kEndSerialize() void cEngineLight_SaveData::FromLight(iLight3D *apLight) { msName = apLight->GetName(); if(apLight->IsFading() && apLight->GetFlickerActive()==false) { apLight->SetDiffuseColor(apLight->GetDestColor()); apLight->SetFarAttenuation(apLight->GetDestRadius()); } mbActive = apLight->IsActive(); mbVisible = apLight->IsVisible(); if(apLight->GetFlickerActive()) { mDiffuseColor = apLight->GetFlickerOnColor(); mfFarAttenuation = apLight->GetFlickerOnRadius(); } else { mDiffuseColor = apLight->GetDiffuseColor(); mfFarAttenuation = apLight->GetFarAttenuation(); } std::vector* pBillboardVec = apLight->GetBillboardVec(); for(size_t i=0; i < pBillboardVec->size(); ++i) { cBillboard *pBillboard = (*pBillboardVec)[i]; cEngineLightAttachBB_SaveData attachedBB; attachedBB.msName = pBillboard->GetName(); mvBillboards.Add(attachedBB); } mbFlickering = apLight->GetFlickerActive(); msFlickerOffSound = apLight->GetFlickerOffSound(); msFlickerOnSound = apLight->GetFlickerOnSound(); msFlickerOffPS = apLight->GetFlickerOffPS(); msFlickerOnPS = apLight->GetFlickerOnPS(); mfFlickerOnMinLength = apLight->GetFlickerOnMinLength(); mfFlickerOffMinLength = apLight->GetFlickerOffMinLength(); mfFlickerOnMaxLength = apLight->GetFlickerOnMaxLength(); mfFlickerOffMaxLength = apLight->GetFlickerOffMaxLength(); mFlickerOffColor = apLight->GetFlickerOffColor(); mfFlickerOffRadius = apLight->GetFlickerOffRadius(); mbFlickerFade = apLight->GetFlickerFade(); mfFlickerOnFadeLength = apLight->GetFlickerOnFadeLength(); mfFlickerOffFadeLength = apLight->GetFlickerOffFadeLength(); } void cEngineLight_SaveData::ToLight(iLight3D *apLight) { apLight->SetActive(mbActive); apLight->SetVisible(mbVisible); apLight->SetDiffuseColor(mDiffuseColor); apLight->SetFarAttenuation(mfFarAttenuation); cWorld3D *pWorld = gpInit->mpGame->GetScene()->GetWorld3D(); for(size_t i=0; i < mvBillboards.Size(); ++i) { cBillboard *pBillboard = pWorld->GetBillboard(mvBillboards[i].msName); if(pBillboard) apLight->AttachBillboard(pBillboard); else Warning("Could not find billboard %s\n",mvBillboards[i].msName.c_str()); } apLight->SetFlickerActive(mbFlickering); apLight->SetFlicker(mFlickerOffColor,mfFlickerOffRadius, mfFlickerOnMinLength,mfFlickerOnMaxLength, msFlickerOnSound,msFlickerOnPS, mfFlickerOffMinLength,mfFlickerOffMaxLength, msFlickerOffSound,msFlickerOffPS, mbFlickerFade,mfFlickerOnFadeLength,mfFlickerOffFadeLength); } kBeginSerializeBase(cEngineLight_SaveData) kSerializeVar(msName,eSerializeType_String) kSerializeVar(mbActive,eSerializeType_Bool) kSerializeVar(mbVisible,eSerializeType_Bool) kSerializeVar(mDiffuseColor, eSerializeType_Color) kSerializeVar(mfFarAttenuation, eSerializeType_Float32) kSerializeClassContainer(mvBillboards,cEngineLightAttachBB_SaveData,eSerializeType_Class) kSerializeVar(mbFlickering,eSerializeType_Bool) kSerializeVar(msFlickerOffSound,eSerializeType_String) kSerializeVar(msFlickerOnSound,eSerializeType_String) kSerializeVar(msFlickerOffPS,eSerializeType_String) kSerializeVar(msFlickerOnPS,eSerializeType_String) kSerializeVar(mfFlickerOnMinLength, eSerializeType_Float32) kSerializeVar(mfFlickerOffMinLength, eSerializeType_Float32) kSerializeVar(mfFlickerOnMaxLength, eSerializeType_Float32) kSerializeVar(mfFlickerOffMaxLength, eSerializeType_Float32) kSerializeVar(mFlickerOffColor, eSerializeType_Color) kSerializeVar(mfFlickerOffRadius, eSerializeType_Float32) kSerializeVar(mbFlickerFade,eSerializeType_Bool) kSerializeVar(mfFlickerOnFadeLength, eSerializeType_Float32) kSerializeVar(mfFlickerOffFadeLength, eSerializeType_Float32) kEndSerialize()