📄 shapebase.cc
字号:
polyList.mPlaneList[2].set(objBox.max,VectorF(1,0,0));
polyList.mPlaneList[3].set(objBox.min,VectorF(0,-1,0));
polyList.mPlaneList[4].set(objBox.min,VectorF(0,0,-1));
polyList.mPlaneList[5].set(objBox.max,VectorF(0,0,1));
for (U32 i = 0; i < 6; i++)
{
PlaneF temp;
mTransformPlane(mat, Point3F(1, 1, 1), polyList.mPlaneList[i], &temp);
polyList.mPlaneList[i] = temp;
}
if (gServerContainer.buildPolyList(wBox, InteriorObjectType | StaticShapeObjectType, &polyList))
return false;
return true;
}
ConsoleMethod(ShapeBaseData, getDeployTransform, const char *, 4, 4, "(Point3F pos, Point3F normal)")
{
Point3F normal;
Point3F position;
dSscanf(argv[2], "%g %g %g", &position.x, &position.y, &position.z);
dSscanf(argv[3], "%g %g %g", &normal.x, &normal.y, &normal.z);
normal.normalize();
VectorF xAxis;
if( mFabs(normal.z) > mFabs(normal.x) && mFabs(normal.z) > mFabs(normal.y))
mCross( VectorF( 0, 1, 0 ), normal, &xAxis );
else
mCross( VectorF( 0, 0, 1 ), normal, &xAxis );
VectorF yAxis;
mCross( normal, xAxis, &yAxis );
MatrixF testMat(true);
testMat.setColumn( 0, xAxis );
testMat.setColumn( 1, yAxis );
testMat.setColumn( 2, normal );
testMat.setPosition( position );
char *returnBuffer = Con::getReturnBuffer(256);
Point3F pos;
testMat.getColumn(3,&pos);
AngAxisF aa(testMat);
dSprintf(returnBuffer,256,"%g %g %g %g %g %g %g",
pos.x,pos.y,pos.z,aa.axis.x,aa.axis.y,aa.axis.z,aa.angle);
return returnBuffer;
}
void ShapeBaseData::packData(BitStream* stream)
{
Parent::packData(stream);
if(stream->writeFlag(computeCRC))
stream->write(mCRC);
stream->writeString(shapeName);
stream->writeString(cloakTexName);
if(stream->writeFlag(mass != gShapeBaseDataProto.mass))
stream->write(mass);
if(stream->writeFlag(drag != gShapeBaseDataProto.drag))
stream->write(drag);
if(stream->writeFlag(density != gShapeBaseDataProto.density))
stream->write(density);
if(stream->writeFlag(maxEnergy != gShapeBaseDataProto.maxEnergy))
stream->write(maxEnergy);
#ifdef TGE_RPG /// TGE_Move
if(stream->writeFlag(cameraDefaultDist != gShapeBaseDataProto.cameraDefaultDist))
stream->write(cameraDefaultDist);
#endif
if(stream->writeFlag(cameraMaxDist != gShapeBaseDataProto.cameraMaxDist))
stream->write(cameraMaxDist);
if(stream->writeFlag(cameraMinDist != gShapeBaseDataProto.cameraMinDist))
stream->write(cameraMinDist);
#ifdef TGE_RPG /// TGE_Move
cameraDefaultPitch = mClampF(cameraDefaultPitch, ms_fCameraMinPitch, ms_fCameraMaxPitch);
if(stream->writeFlag(cameraDefaultPitch != gShapeBaseDataProto.cameraDefaultPitch))
stream->write(cameraDefaultPitch);
cameraDefaultYaw = mFmod(cameraDefaultYaw, 360.f);
if(stream->writeFlag(cameraDefaultYaw != gShapeBaseDataProto.cameraDefaultYaw))
stream->write(cameraDefaultYaw);
#endif
cameraDefaultFov = mClampF(cameraDefaultFov, cameraMinFov, cameraMaxFov);
if(stream->writeFlag(cameraDefaultFov != gShapeBaseDataProto.cameraDefaultFov))
stream->write(cameraDefaultFov);
if(stream->writeFlag(cameraMinFov != gShapeBaseDataProto.cameraMinFov))
stream->write(cameraMinFov);
if(stream->writeFlag(cameraMaxFov != gShapeBaseDataProto.cameraMaxFov))
stream->write(cameraMaxFov);
stream->writeString( debrisShapeName );
stream->writeFlag(observeThroughObject);
if( stream->writeFlag( debris != NULL ) )
{
stream->writeRangedU32(packed? SimObjectId(debris):
debris->getId(),DataBlockObjectIdFirst,DataBlockObjectIdLast);
}
stream->writeFlag(emap);
stream->writeFlag(isInvincible);
stream->writeFlag(renderWhenDestroyed);
if( stream->writeFlag( explosion != NULL ) )
{
stream->writeRangedU32( explosion->getId(), DataBlockObjectIdFirst, DataBlockObjectIdLast );
}
if( stream->writeFlag( underwaterExplosion != NULL ) )
{
stream->writeRangedU32( underwaterExplosion->getId(), DataBlockObjectIdFirst, DataBlockObjectIdLast );
}
stream->writeFlag(inheritEnergyFromMount);
stream->writeFlag(firstPersonOnly);
stream->writeFlag(useEyePoint);
}
void ShapeBaseData::unpackData(BitStream* stream)
{
Parent::unpackData(stream);
computeCRC = stream->readFlag();
if(computeCRC)
stream->read(&mCRC);
shapeName = stream->readSTString();
cloakTexName = stream->readSTString();
if(stream->readFlag())
stream->read(&mass);
else
mass = gShapeBaseDataProto.mass;
if(stream->readFlag())
stream->read(&drag);
else
drag = gShapeBaseDataProto.drag;
if(stream->readFlag())
stream->read(&density);
else
density = gShapeBaseDataProto.density;
if(stream->readFlag())
stream->read(&maxEnergy);
else
maxEnergy = gShapeBaseDataProto.maxEnergy;
#ifdef TGE_RPG /// TGE_Move cameraDefaultDist
if(stream->readFlag())
stream->read(&cameraDefaultDist);
else
cameraDefaultDist = gShapeBaseDataProto.cameraDefaultDist;
#endif
if(stream->readFlag())
stream->read(&cameraMaxDist);
else
cameraMaxDist = gShapeBaseDataProto.cameraMaxDist;
if(stream->readFlag())
stream->read(&cameraMinDist);
else
cameraMinDist = gShapeBaseDataProto.cameraMinDist;
#ifdef TGE_RPG /// TGE_Move
if(stream->readFlag())
stream->read(&cameraDefaultPitch);
else
cameraDefaultPitch = gShapeBaseDataProto.cameraDefaultPitch;
if(stream->readFlag())
stream->read(&cameraDefaultYaw);
else
cameraDefaultYaw = gShapeBaseDataProto.cameraDefaultYaw;
#endif
if(stream->readFlag())
stream->read(&cameraDefaultFov);
else
cameraDefaultFov = gShapeBaseDataProto.cameraDefaultFov;
if(stream->readFlag())
stream->read(&cameraMinFov);
else
cameraMinFov = gShapeBaseDataProto.cameraMinFov;
if(stream->readFlag())
stream->read(&cameraMaxFov);
else
cameraMaxFov = gShapeBaseDataProto.cameraMaxFov;
debrisShapeName = stream->readSTString();
observeThroughObject = stream->readFlag();
if( stream->readFlag() )
{
debrisID = stream->readRangedU32( DataBlockObjectIdFirst, DataBlockObjectIdLast );
}
emap = stream->readFlag();
isInvincible = stream->readFlag();
renderWhenDestroyed = stream->readFlag();
if( stream->readFlag() )
{
explosionID = stream->readRangedU32( DataBlockObjectIdFirst, DataBlockObjectIdLast );
}
if( stream->readFlag() )
{
underwaterExplosionID = stream->readRangedU32( DataBlockObjectIdFirst, DataBlockObjectIdLast );
}
inheritEnergyFromMount = stream->readFlag();
firstPersonOnly = stream->readFlag();
useEyePoint = stream->readFlag();
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
Chunker<ShapeBase::CollisionTimeout> sTimeoutChunker;
ShapeBase::CollisionTimeout* ShapeBase::sFreeTimeoutList = 0;
//----------------------------------------------------------------------------
IMPLEMENT_CO_NETOBJECT_V1(ShapeBase);
ShapeBase::ShapeBase()
{
mTypeMask |= ShapeBaseObjectType;
mDrag = 0;
mBuoyancy = 0;
mWaterCoverage = 0;
mLiquidType = 0;
mLiquidHeight = 0.0f;
//mControllingClient = 0;
mControllingObject = 0;
mGravityMod = 1.0;
mAppliedForce.set(0, 0, 0);
mTimeoutList = 0;
mDataBlock = NULL;
mShapeInstance = 0;
mShadow = 0;
mGenerateShadow = false;
mEnergy = 0;
mRechargeRate = 0;
mDamage = 0;
mRepairRate = 0;
mRepairReserve = 0;
mDamageState = Enabled;
mDamageThread = 0;
mHulkThread = 0;
mLastRenderFrame = 0;
mLastRenderDistance = 0;
mCloaked = false;
mCloakLevel = 0.0;
mMount.object = 0;
mMount.link = 0;
mMount.list = 0;
mHidden = false;
for (int a = 0; a < MaxSoundThreads; a++) {
mSoundThread[a].play = false;
mSoundThread[a].profile = 0;
mSoundThread[a].sound = 0;
}
S32 i;
for (i = 0; i < MaxScriptThreads; i++) {
mScriptThread[i].sequence = -1;
mScriptThread[i].thread = 0;
mScriptThread[i].sound = 0;
mScriptThread[i].state = Thread::Stop;
mScriptThread[i].atEnd = false;
mScriptThread[i].forward = true;
}
for (i = 0; i < MaxTriggerKeys; i++)
mTrigger[i] = false;
mDamageFlash = 0.0;
mWhiteOut = 0.0;
mInvincibleEffect = 0.0f;
mInvincibleDelta = 0.0f;
mInvincibleCount = 0.0f;
mInvincibleSpeed = 0.0f;
mInvincibleTime = 0.0f;
mInvincibleFade = 0.1;
mInvincibleOn = false;
mIsControlled = false;
mConvexList = new Convex;
#ifdef TGE_RPG /// TGE_Move
m_fCameraDist = 15.f;
m_rotCamera.x = 35.f;
m_rotCamera.z = 0;
#endif
mCameraFov = 90.f;
mShieldNormal.set(0, 0, 1);
mFadeOut = true;
mFading = false;
mFadeVal = 1.0;
mFadeTime = 1.0;
mFadeElapsedTime = 0.0;
mFadeDelay = 0.0;
mFlipFadeVal = false;
mLightTime = 0;
damageDir.set(0, 0, 1);
//mSkinModMaskBits = 0;//Skin modifier
}
ShapeBase::~ShapeBase()
{
delete mConvexList;
mConvexList = NULL;
AssertFatal(mMount.link == 0,"ShapeBase::~ShapeBase: An object is still mounted");
if( mShapeInstance && (mShapeInstance->getDebrisRefCount() == 0) )
{
delete mShapeInstance;
}
delete mShadow;
CollisionTimeout* ptr = mTimeoutList;
while (ptr) {
CollisionTimeout* cur = ptr;
ptr = ptr->next;
cur->next = sFreeTimeoutList;
sFreeTimeoutList = cur;
}
}
//----------------------------------------------------------------------------
bool ShapeBase::onAdd()
{
if(!Parent::onAdd())
return false;
// Resolve sounds that arrived in the initial update
S32 i;
for (i = 0; i < MaxSoundThreads; i++)
updateAudioState(mSoundThread[i]);
for (i = 0; i < MaxScriptThreads; i++)
{
Thread& st = mScriptThread[i];
if(st.thread)
updateThread(st);
}
if (isClientObject())
{
if(mDataBlock->cloakTexName != StringTable->insert(""))
mCloakTexture = TextureHandle(mDataBlock->cloakTexName, MeshTexture, false);
//one of the mounted images must have a light source...
for (S32 i = 0; i < MaxMountedImages; i++)
{
ShapeBaseImageData* imageData = getMountedImage(i);
if (imageData != NULL && imageData->lightType != ShapeBaseImageData::NoLight)
{
Sim::getLightSet()->addObject(this);
break;
}
}
}
return true;
}
void ShapeBase::onRemove()
{
mConvexList->nukeList();
unmount();
Parent::onRemove();
// Stop any running sounds on the client
if (isGhost())
for (S32 i = 0; i < MaxSoundThreads; i++)
stopAudio(i);
}
void ShapeBase::onSceneRemove()
{
mConvexList->nukeList();
Parent::onSceneRemove();
}
bool ShapeBase::onNewDataBlock(GameBaseData* dptr)
{
if (Parent::onNewDataBlock(dptr) == false)
return false;
mDataBlock = dynamic_cast<ShapeBaseData*>(dptr);
if (!mDataBlock)
return false;
#ifdef TGE_RPG /// TGE_Move
m_fCameraDist = mDataBlock->cameraDefaultDist;
m_rotCamera.x = mDataBlock->cameraDefaultPitch;
m_rotCamera.z = mDataBlock->cameraDefaultYaw;
#endif
setMaskBits(DamageMask);
mDamageThread = 0;
mHulkThread = 0;
// Even if loadShape succeeds, there may not actually be
// a shape assigned to this object.
if (bool(mDataBlock->shape)) {
delete mShapeInstance;
mShapeInstance = new TSShapeInstance(mDataBlock->shape, isClientObject());
//skin modifier
m_skinMan.SetShapeInstance(mShapeInstance);
if (isClientObject())
mShapeInstance->cloneMaterialList();
mObjBox = mDataBlock->shape->bounds;
resetWorldBox();
// Initialize the threads
for (U32 i = 0; i < MaxScriptThreads; i++) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -