#pragma once #if !defined(GHOUL2_SHARED_H_INC) #define GHOUL2_SHARED_H_INC /* Ghoul2 Insert Start */ #pragma warning (push, 3) //go back down to 3 for the stl include #include #include #pragma warning (pop) using namespace std; /* Ghoul2 Insert End */ //=================================================================== // // G H O U L I I D E F I N E S // // we save the whole surfaceInfo_t struct struct surfaceInfo_t { int offFlags; // what the flags are for this model int surface; // index into array held inside the model definition of pointers to the actual surface data loaded in - used by both client and game float genBarycentricJ; // point 0 barycentric coors float genBarycentricI; // point 1 barycentric coors - point 2 is 1 - point0 - point1 int genPolySurfaceIndex; // used to point back to the original surface and poly if this is a generated surface int genLod; // used to determine original lod of original surface and poly hit location surfaceInfo_t(): offFlags(0), surface(0), genBarycentricJ(0), genBarycentricI(0), genPolySurfaceIndex(0), genLod(0) {} }; #define MDXABONEDEF // used in the mdxformat.h file to stop redefinitions of the bone struct. // we save the whole structure here. struct boneInfo_t { int boneNumber; // what bone are we overriding? mdxaBone_t matrix; // details of bone angle overrides - some are pre-done on the server, some in ghoul2 int flags; // flags for override int startFrame; // start frame for animation int endFrame; // end frame for animation NOTE anim actually ends on endFrame+1 int startTime; // time we started this animation int pauseTime; // time we paused this animation - 0 if not paused float animSpeed; // speed at which this anim runs. 1.0f means full speed of animation incoming - ie if anim is 20hrtz, we run at 20hrts. If 5hrts, we run at 5 hrts float blendFrame; // frame PLUS LERP value to blend from int blendLerpFrame; // frame to lerp the blend frame with. int blendTime; // Duration time for blending - used to calc amount each frame of new anim is blended with last frame of the last anim int blendStart; // Time when blending starts - not necessarily the same as startTime since we might start half way through an anim int boneBlendTime; // time for duration of bone angle blend with normal animation int boneBlendStart; // time bone angle blend with normal animation began int lastTime; // this does not go across the network mdxaBone_t newMatrix; // This is the lerped matrix that Ghoul2 uses on the client side - does not go across the network boneInfo_t(): boneNumber(-1), flags(0), startFrame(0), endFrame(0), startTime(0), pauseTime(0), animSpeed(0), blendFrame(0), blendLerpFrame(0), blendTime(0), blendStart(0), boneBlendTime(0), boneBlendStart(0), lastTime(0) { matrix.matrix[0][0] = matrix.matrix[0][1] = matrix.matrix[0][2] = matrix.matrix[0][3] = matrix.matrix[1][0] = matrix.matrix[1][1] = matrix.matrix[1][2] = matrix.matrix[1][3] = matrix.matrix[2][0] = matrix.matrix[2][1] = matrix.matrix[2][2] = matrix.matrix[2][3] = 0.0f; } }; //we save from top to boltUsed here. Don't bother saving the position, it gets rebuilt every frame anyway struct boltInfo_t{ int boneNumber; // bone number bolt attaches to int surfaceNumber; // surface number bolt attaches to int surfaceType; // if we attach to a surface, this tells us if it is an original surface or a generated one - doesn't go across the network int boltUsed; // nor does this mdxaBone_t position; // this does not go across the network boltInfo_t(): boneNumber(-1), surfaceNumber(-1), surfaceType(0), boltUsed(0) {} }; #ifdef _SOF2 typedef enum { PGORE_NONE, PGORE_ARMOR, PGORE_BULLETSMALL, PGORE_BULLETMED, PGORE_BULLETBIG, PGORE_HEGRENADE, PGORE_COUNT } goreEnum_t; struct goreEnumShader_t { goreEnum_t shaderEnum; char shaderName[MAX_QPATH]; }; struct SSkinGoreData { vec3_t angles; vec3_t position; int currentTime; int entNum; vec3_t rayDirection; // in world space vec3_t hitLocation; // in world space vec3_t scale; float SSize; // size of splotch in the S texture direction in world units float TSize; // size of splotch in the T texture direction in world units float theta; // angle to rotate the splotch // qhandle_t shader; // handle to shader for gore, this better be rendered after the shader of the underlying surface // this shader should also have "clamp" mode, not tiled. goreEnum_t shaderEnum; // enum that'll get switched over to the shader's actual handle }; #endif // _SOF2 #define MAX_GHOUL_COUNT_BITS 8 // bits required to send across the MAX_G2_MODELS inside of the networking - this is the only restriction on ghoul models possible per entity typedef vector surfaceInfo_v; typedef vector boneInfo_v; typedef vector boltInfo_v; typedef vector mdxaBone_v; // defines for stuff to go into the mflags #define GHOUL2_NOCOLLIDE 0x001 #define GHOUL2_NORENDER 0x002 #define GHOUL2_NOMODEL 0x004 #define GHOUL2_NEWORIGIN 0x008 // NOTE order in here matters. We save out from mModelindex to mFlags, but not the STL vectors that are at the top or the bottom. class CGhoul2Info { public: surfaceInfo_v mSlist; boltInfo_v mBltlist; boneInfo_v mBlist; // save from here int mModelindex; qhandle_t mCustomShader; qhandle_t mCustomSkin; int mModelBoltLink; int mSurfaceRoot; int mCreationID; int mLodBias; int mNewOrigin; // this contains the bolt index of the new origin for this model #ifdef _SOF2 int mGoreSetTag; #endif // _SOF2 qhandle_t mModel; // this and the next entries do NOT go across the network. They are for gameside access ONLY char mFileName[MAX_QPATH]; int mAnimFrameDefault; int mSkelFrameNum; int mMeshFrameNum; int mFlags; // used for determining whether to do full collision detection against this object // to here int *mTransformedVertsArray; // used to create an array of pointers to transformed verts per surface for collision detection mdxaBone_v mTempBoneList; int mSkin; CGhoul2Info(): mModelindex(-1), mCustomShader(0), mCustomSkin(0), mModelBoltLink(0), mModel(0), mSurfaceRoot(0), mAnimFrameDefault(0), mSkelFrameNum(-1), mMeshFrameNum(-1), mCreationID(0), mFlags(0), mTransformedVertsArray(0), mLodBias(0), mSkin(0), mNewOrigin(-1) { mFileName[0] = 0; } ~CGhoul2Info(void) { mSlist.~surfaceInfo_v(); mBltlist.~boltInfo_v(); mBlist.~boneInfo_v(); mTempBoneList.~mdxaBone_v(); } }; typedef vector CGhoul2Info_v; // collision detection stuff #define G2_FRONTFACE 1 #define G2_BACKFACE 0 class CCollisionRecord { public: float mDistance; int mEntityNum; int mModelIndex; int mPolyIndex; int mSurfaceIndex; vec3_t mCollisionPosition; vec3_t mCollisionNormal; int mFlags; int mMaterial; int mLocation; float mBarycentricI; // two barycentic coodinates for the hit point float mBarycentricJ; // K = 1-I-J CCollisionRecord(): mEntityNum(-1), mDistance(100000) {} }; // calling defines for the trace function enum EG2_Collision { G2_NOCOLLIDE, G2_COLLIDE, G2_RETURNONHIT }; //typedef map < float, CCollisionRecord > CCollisionRecord_m; enum EWraithInstFlags { WF_BASEMODEL = (1<<0), WF_CLIENTONLY = (1<<1), WF_SERVERONLY = (1<<2), WF_NPC = (1<<3), }; //==================================================================== #endif // GHOUL2_SHARED_H_INC