//----------------------------------------------------------------------------- // Torque Game Engine // Copyright (C) GarageGames.com, Inc. //----------------------------------------------------------------------------- #include "platform/platform.h" #include "dgl/dgl.h" #include "core/dnet.h" #include "core/bitStream.h" #include "game/game.h" #include "math/mMath.h" #include "console/simBase.h" #include "console/console.h" #include "console/consoleTypes.h" #include "game/moveManager.h" #include "ts/tsShapeInstance.h" #include "core/resManager.h" #include "game/staticShape.h" #include "math/mathIO.h" #include "game/shadow.h" extern void wireCube(F32 size,Point3F pos); static const U32 sgAllowedDynamicTypes = 0xffffff; //---------------------------------------------------------------------------- IMPLEMENT_CO_DATABLOCK_V1(StaticShapeData); StaticShapeData::StaticShapeData() { dynamicTypeField = 0; genericShadowLevel = StaticShape_GenericShadowLevel; noShadowLevel = StaticShape_NoShadowLevel; noIndividualDamage = false; } void StaticShapeData::initPersistFields() { Parent::initPersistFields(); addField("noIndividualDamage", TypeBool, Offset(noIndividualDamage, StaticShapeData)); addField("dynamicType", TypeS32, Offset(dynamicTypeField, StaticShapeData)); } void StaticShapeData::packData(BitStream* stream) { Parent::packData(stream); stream->writeFlag(noIndividualDamage); stream->write(dynamicTypeField); } void StaticShapeData::unpackData(BitStream* stream) { Parent::unpackData(stream); noIndividualDamage = stream->readFlag(); stream->read(&dynamicTypeField); } //---------------------------------------------------------------------------- IMPLEMENT_CO_NETOBJECT_V1(StaticShape); StaticShape::StaticShape() { mTypeMask |= StaticShapeObjectType | StaticObjectType; mDataBlock = 0; } StaticShape::~StaticShape() { } //---------------------------------------------------------------------------- bool StaticShape::onAdd() { if(!Parent::onAdd() || !mDataBlock) return false; // We need to modify our type mask based on what our datablock says... mTypeMask |= (mDataBlock->dynamicTypeField & sgAllowedDynamicTypes); addToScene(); if (isServerObject()) scriptOnAdd(); return true; } bool StaticShape::onNewDataBlock(GameBaseData* dptr) { mDataBlock = dynamic_cast(dptr); if (!mDataBlock || !Parent::onNewDataBlock(dptr)) return false; scriptOnNewDataBlock(); return true; } void StaticShape::onRemove() { scriptOnRemove(); removeFromScene(); Parent::onRemove(); } //---------------------------------------------------------------------------- void StaticShape::processTick(const Move* move) { Parent::processTick(move); // Image Triggers if (move && mDamageState == Enabled) { setImageTriggerState(0,move->trigger[0]); setImageTriggerState(1,move->trigger[1]); } if (isMounted()) { MatrixF mat; mMount.object->getMountTransform(mMount.node,&mat); Parent::setTransform(mat); Parent::setRenderTransform(mat); } } void StaticShape::interpolateTick(F32) { if (isMounted()) { MatrixF mat; mMount.object->getRenderMountTransform(mMount.node,&mat); Parent::setRenderTransform(mat); } if (mShadow) { mShadow->setMoving(false); if (!mDataBlock->shape.isNull() && mDataBlock->shape->sequences.empty()) // no sequences, can't animate... mShadow->setAnimating(false); } } void StaticShape::setTransform(const MatrixF& mat) { Parent::setTransform(mat); setMaskBits(PositionMask); } void StaticShape::onUnmount(ShapeBase*,S32) { // Make sure the client get's the final server pos. setMaskBits(PositionMask); } //---------------------------------------------------------------------------- U32 StaticShape::packUpdate(NetConnection *connection, U32 mask, BitStream *bstream) { U32 retMask = Parent::packUpdate(connection,mask,bstream); if (bstream->writeFlag(mask & PositionMask)) { bstream->writeAffineTransform(mObjToWorld); mathWrite(*bstream, mObjScale); } // powered? bstream->writeFlag(mPowered); return retMask; } void StaticShape::unpackUpdate(NetConnection *connection, BitStream *bstream) { Parent::unpackUpdate(connection,bstream); if (bstream->readFlag()) { MatrixF mat; bstream->readAffineTransform(&mat); Parent::setTransform(mat); Parent::setRenderTransform(mat); VectorF scale; mathRead(*bstream, &scale); setScale(scale); } // powered? mPowered = bstream->readFlag(); } //---------------------------------------------------------------------------- ConsoleMethod( StaticShape, setPoweredState, void, 3, 3, "(bool isPowered)") { if(!object->isServerObject()) return; object->setPowered(dAtob(argv[2])); } ConsoleMethod( StaticShape, getPoweredState, bool, 2, 2, "") { if(!object->isServerObject()) return(false); return(object->isPowered()); }