Code:
typedef struct { float x,y,z; } D3DVECTOR3; typedef struct { float x; float y; float z; } D3DVECTOR; typedef struct { float r, g, b, a; } D3DCOLORVALUE; typedef struct { FLOAT r; FLOAT g; FLOAT b; FLOAT a; } D3DXCOLOR; typedef struct { float m[4]; } D3DXMATRIX[4]; typedef struct { D3DCOLORVALUE Diffuse; /* Diffuse color RGBA */ D3DCOLORVALUE Ambient; /* Ambient color RGB */ D3DCOLORVALUE Specular; /* Specular 'shininess' */ D3DCOLORVALUE Emissive; /* Emissive color RGB */ float Power; /* Sharpness if specular highlight */ } D3DMATERIAL9; typedef enum { D3DLIGHT_POINT = 1, D3DLIGHT_SPOT = 2, D3DLIGHT_DIRECTIONAL = 3, D3DLIGHT_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ } D3DLIGHTTYPE; typedef struct { D3DLIGHTTYPE Type; /* Type of light source */ D3DCOLORVALUE Diffuse; /* Diffuse color of light */ D3DCOLORVALUE Specular; /* Specular color of light */ D3DCOLORVALUE Ambient; /* Ambient color of light */ D3DVECTOR Position; /* Position in world space */ D3DVECTOR Direction; /* Direction in world space */ float Range; /* Cutoff range */ float Falloff; /* Falloff */ float Attenuation0; /* Constant attenuation */ float Attenuation1; /* Linear attenuation */ float Attenuation2; /* Quadratic attenuation */ float Theta; /* Inner angle of spotlight cone */ float Phi; /* Outer angle of spotlight cone */ } D3DLIGHT9; typedef struct { char animationKeyFileName[ 64 ]; // loads this file from MR_VISUALEFFECT.XP } XANIMATION_KEY; typedef struct { int keyframeFileNameLength; char keyframeFileName[ keyframeFileNameLength ]; // loads this file from MR_VISUALEFFECT.XP } XKEYFRAME_CONTROLLER; typedef struct { int particleFileNameLength; char particleFileName[ particleFileNameLength ]; int bipedFileNameLength; if( bipedFileNameLength > 0 ) { char bipedFileName[ bipedFileNameLength ]; int bipedAnimationCount; if( bipedAnimationCount > 0 ) { XANIMATION_KEY animationKey[ bipedAnimationCount ]; } } int keyframeCount; if( keyframeCount > 0 ) { int nodeCount; XKEYFRAME_CONTROLLER keyframeController[ keyframeCount ]; } } XPARTICLE_MESH_DATA; typedef struct { int splineFileNameLength; if( splineFileNameLength > 0 ) { char splineFileName[ splineFileNameLength ]; } int curveType; int controlCount; int curveDivisionCount; if( controlCount > 0 ) { D3DVECTOR3 controlData[ controlCount ]; } } XSPLINE_CONTAINER; typedef struct { int useExtExdUVEffect; int useOscilloScopeUVEffect; int useRotationEffect; float uPanning; float vPanning; float uPanningVelocity; float vPanningVelocity; float yawRotation; float pitchRotation; float rollRotation; float yawRotationVelocity; float pitchRotationVelocity; float rollRotationVelocity; } XRENDERSTYLE_UVEFFECT; typedef struct { struct { char texName[ 32 ]; } textureName[ 4 ]; // char texturename[ 4 ][ 32 ]; D3DXMATRIX uvMatrix1; D3DXMATRIX uvMatrix2; D3DXMATRIX uvMatrix3; D3DXMATRIX uvMatrix4; D3DMATERIAL9 material; DWORD useLight : 1; DWORD useSpecular : 1; DWORD zBufferOperationMode : 2; DWORD alphaTest : 1; DWORD alphaTestCompareMode : 4; DWORD cullingMode : 2; DWORD useuvMatrix1 : 1; DWORD useuvMatrix2 : 1; DWORD useuvMatrix3 : 1; DWORD useuvMatrix4 : 1; DWORD useTransformBumpEnvMapping : 1; DWORD bumpEnvMappingStage : 2; DWORD ts1_textureCoordCount : 3; DWORD ts2_textureCoordCount : 3; DWORD ts3_textureCoordCount : 3; DWORD ts4_textureCoordCount : 3; DWORD reserved1 : 32-30; DWORD textureFactor; DWORD alphaReference; FLOAT bumpMapScale; FLOAT bumpMapOffset; DWORD ts1_colorOperation : 5; DWORD ts2_colorOperation : 5; DWORD ts3_colorOperation : 5; DWORD ts4_colorOperation : 5; DWORD ts1_colorArg1 : 3; DWORD ts2_colorArg1 : 3; DWORD ts3_colorArg1 : 3; DWORD ts4_colorArg1 : 3; DWORD ts1_alphaOperation : 5; DWORD ts2_alphaOperation : 5; DWORD ts3_alphaOperation : 5; DWORD ts4_alphaOperation : 5; DWORD ts1_alphaArg1 : 3; DWORD ts2_alphaArg1 : 3; DWORD ts3_alphaArg1 : 3; DWORD ts4_alphaArg1 : 3; DWORD ts1_colorArg2 : 3; DWORD ts2_colorArg2 : 3; DWORD ts3_colorArg2 : 3; DWORD ts4_colorArg2 : 3; DWORD ts1_alphaArg2 : 3; DWORD ts2_alphaArg2 : 3; DWORD ts3_alphaArg2 : 3; DWORD ts4_alphaArg2 : 3; DWORD ts1_projected : 1; DWORD ts2_projected : 1; DWORD ts3_projected : 1; DWORD ts4_projected : 1; DWORD blendMode : 4; DWORD ts1_sourceType : 3; DWORD ts2_sourceType : 3; DWORD ts3_sourceType : 3; DWORD ts4_sourceType : 3; DWORD ts1_uvCoordIndex : 3; DWORD ts2_uvCoordIndex : 3; DWORD ts3_uvCoordIndex : 3; DWORD ts4_uvCoordIndex : 3; DWORD zBufferCompareMode : 4; DWORD reserved3 : 32-28; DWORD ts1_uCoordAdress : 3; DWORD ts2_uCoordAdress : 3; DWORD ts3_uCoordAdress : 3; DWORD ts4_uCoordAdress : 3; DWORD ts3_vCoordAdress : 3; DWORD ts4_vCoordAdress : 3; DWORD ts1_vCoordAdress : 3; DWORD ts2_vCoordAdress : 3; DWORD reserved4 : 32-24; } XRENDERSTYLE_STRUCTURE; typedef struct { char renderStyleName[ 32 ]; XRENDERSTYLE_UVEFFECT uvEffect[ 4 ]; XRENDERSTYLE_STRUCTURE renderStyleStructure; } XRENDERSTYLE_ITEM; typedef struct { WORD styleVersion <format=hex>; // 0xFE90 int renderStyleCount; if( renderStyleCount > 0 ) { XRENDERSTYLE_ITEM styleItem[ renderStyleCount ]; } } XRENDERSTYLE_MANAGER; typedef enum { LTT_Infinity = 0, LTT_LimitTime, LTT_OneTime } XPARTICLE_LIFETIMETYPE; typedef enum { BLT_World = 0, BLT_Character, BLT_CharacterRightHand, BLT_CharacterLeftHand, BLT_CharacterRightLeg, BLT_CharacterLeftLeg, BLT_CharacterShortWeapon, BLT_CharacterLongWeapon, BLT_CharacterPelvis, BLT_CharacterHead, BLT_CharacterRightCalf, BLT_CharacterLeftCalf, BLT_CharacterRightForearm, BLT_CharacterLeftForearm, BLT_CharacterLeftWeapon, BLT_MaxCount } XPARTICLE_BIPEDLINKTYPE; typedef enum { VTT_None = 0, VTT_Camera, VTT_LockX, VTT_LockY, VTT_LockZ, VTT_Direction, VTT_ArbitrarilyPoint, VTT_CameraAndRollAnimation, VTT_FixedAndXRollAnimation, VTT_FixedAndYRollAnimation, VTT_FixedAndZRollAnimation, VTT_MaxCount } XPARTICLE_VIEWTARGETTYPE; typedef enum { RTT_Triangle = 0, RTT_NumericBillboard, RTT_Billboard, RTT_XZCrossBillboard, RTT_XYZCrossBillboard, RTT_Model, RTT_AnimationModel, RTT_OrgTextureModel, RTT_OrgTextureAnimationModel, RTT_TerrainDecal, RTT_LineEffect, RTT_MaxCount } XPARTICLE_RENDERINGTYPE; typedef enum { EMT_Point = 0, EMT_Line, EMT_Triangle, EMT_Plane, EMT_Box, EMT_Sphere, EMT_Cylinder, EMT_Cone, EMT_Blob, EMT_Disc, EMT_Rectangle } XPARTICLE_EMITTERTYPE; typedef struct { XPARTICLE_EMITTERTYPE type; float data[ 9 ]; float snapSize; } XPARTICLE_EMITTER; typedef enum { AT_Unknown = -1, AT_HeaderID = 0, AT_AvoidID, AT_BounceID, AT_CallActionListID, AT_CopyVertexBID, AT_DampingID, AT_ExplosionID, AT_FollowID, AT_GravitateID, AT_GravityID, AT_JetID, AT_KillOldID, AT_MatchVelocityID, AT_MoveID, AT_OrbitLineID, AT_OrbitPointID, AT_RandomAccelID, AT_RandomDisplaceID, AT_RandomVelocityID, AT_RestoreID, AT_SinkID, AT_SinkVelocityID, AT_SourceID, AT_SpeedLimitID, AT_TargetColorID, AT_TargetSizeID, AT_TargetVelocityID, AT_VortexID, AT_VertexID, AT_StopVolumeID, AT_EffectSoundID, AT_EffectLightID, AT_EffectScreenID, AT_CameraShakeID, AT_MaxCount } XPARTICLE_ACTIONTYPE; typedef struct { float startTime; float endTime; } XPARTICLE_TIMESLICE; typedef struct { int enable; int timeSliceCount; if( timeSliceCount > 0 ) { XPARTICLE_TIMESLICE timeSlice[ timeSliceCount ]; } } XPARTICLE_ACTIONITEM; typedef struct { XPARTICLE_ACTIONTYPE actionType; XPARTICLE_ACTIONITEM actionItem; switch( actionType ) { case AT_HeaderID: break; case AT_AvoidID: XPARTICLE_EMITTER position; float lookAhead; float magnitude; float epsilon; break; case AT_BounceID: XPARTICLE_EMITTER position; float oneMinusFriction; float resilience; float cutOffSqr; break; case AT_CallActionListID: int effectTemplateID; DWORD useTargetPosition; DWORD insideParticles; int useStopVolumeEffect; int enableSink; XPARTICLE_EMITTER position; break; case AT_CopyVertexBID: unsigned char copyPos; unsigned char copyVel; break; case AT_DampingID: D3DVECTOR3 damping; float vLowSqr; float vHighSqr; break; case AT_ExplosionID: D3DVECTOR3 center; float velocity; float magnitude; float stdev; float age; float epsilon; break; case AT_FollowID: float magnitude; float epsilon; float max_radius; break; case AT_GravitateID: float magnitude; float epsilon; float maxRadius; break; case AT_GravityID: D3DVECTOR3 direction; break; case AT_JetID: D3DVECTOR3 center; XPARTICLE_EMITTER acceleration; float magnitude; float epsilon; float maxRadius; break; case AT_KillOldID: float ageLimit; unsigned char killLessThan; break; case AT_MatchVelocityID: float magnitude; float epsilon; float maxRadius; break; case AT_MoveID: break; case AT_OrbitLineID: D3DVECTOR3 p; D3DVECTOR3 axis; float magnitude; float epsilon; float maxRadius; int useTargetPosition; break; case AT_OrbitPointID: D3DVECTOR3 center; float magnitude; float epsilon; float maxRadius; DWORD useTargetPosition; unsigned char directTurning; break; case AT_RandomAccelID: XPARTICLE_EMITTER genAcc; break; case AT_RandomDisplaceID: XPARTICLE_EMITTER genDisp; break; case AT_RandomVelocityID: XPARTICLE_EMITTER genVel; break; case AT_RestoreID: float timeLeft; break; case AT_SinkID: unsigned char killInside; XPARTICLE_EMITTER position; break; case AT_SinkVelocityID: unsigned char killInside; XPARTICLE_EMITTER velocity; break; case AT_SourceID: XPARTICLE_EMITTER position; XPARTICLE_EMITTER positionB; XPARTICLE_EMITTER size; XPARTICLE_EMITTER velocity; XPARTICLE_EMITTER color; float alpha; // if > 1.0f alpha = 1.0f float particleRate; float age; float age_sigma; unsigned char vertexB_tracks; int useRotation; int emitterSplineContainerIndex; float emitterPathMoveSpeed; int rewind; int timeBaseParticleRate; break; case AT_SpeedLimitID: float minSpeed; float maxSpeed; break; case AT_TargetColorID: D3DXCOLOR color; float scale; break; case AT_TargetSizeID: D3DVECTOR3 size; D3DVECTOR3 scale; break; case AT_TargetVelocityID: D3DVECTOR3 velocity; float scale; break; case AT_VortexID: D3DVECTOR3 center; D3DVECTOR3 axis; float magnitude; float epsilon; float maxRadius; break; case AT_VertexID: break; case AT_StopVolumeID: XPARTICLE_EMITTER position; break; case AT_EffectSoundID: int soundIndex; if( soundIndex > 0 ) { int soundNameLength; char soundName[ soundNameLength ]; } break; case AT_EffectLightID: D3DLIGHT9 light; break; case AT_EffectScreenID: DWORD color; // D3DCOLOR float fadeTime; break; case AT_CameraShakeID: float shakeTime; break; default: break; } } XPARTICLE_ACTIONBASE; typedef struct { int particleNameLength; if( particleNameLength > 0 ) { char particleName[ particleNameLength ]; // fseek past } int enableFlag; // fseek past float maxTrackTime; XPARTICLE_LIFETIMETYPE lifeTimeType; float limitTime; int maxParticles; unsigned char vertexB_tracks; float alpha; float age; float ageSigma; float renderStyleChangeTime; int renderStyleIndexCount; int renderStyleArray[ renderStyleIndexCount ]; char renderStyleNames[ 32 * renderStyleIndexCount ]; // fseek past XPARTICLE_BIPEDLINKTYPE bipedLinkType; int limitBipedRotation; XPARTICLE_BIPEDLINKTYPE emitterBipedLinkType; DWORD linkSubTarget; int meshModelIndex; char meshModelName[ 32 ]; XPARTICLE_VIEWTARGETTYPE viewTargetType; XPARTICLE_RENDERINGTYPE renderingType; D3DVECTOR3 baseRotateAngle; D3DVECTOR3 rotationFactor; D3DVECTOR3 arbitrarilyPoint; XPARTICLE_EMITTER size; XPARTICLE_EMITTER velocity; XPARTICLE_EMITTER vertexB; XPARTICLE_EMITTER color; int actionCount; if( actionCount > 0 ) { XPARTICLE_ACTIONBASE actionBase[ actionCount ]; } } XPARTICLE_LIST; typedef struct { int groupNameLength; if( groupNameLength > 0 ) { char groupName[ groupNameLength ]; // fseek past } int groupID; int enableFlag; // fseek past int maxInstanceCount; int particleCount; if( particleCount > 0 ) { XPARTICLE_LIST particleList[ particleCount ]; } } XPARTICLEGROUP_ITEM; struct { WORD headerIndicator <format=hex>; // 0xFEEB WORD version <format=hex>; // 0x5A5 // data referencing MR_VISUALEFFECT.XP int particleMeshCount; if( particleMeshCount > 0 ) { XPARTICLE_MESH_DATA particleMeshData[ particleMeshCount ]; } int emitterPathCount; if( emitterPathCount > 0 ) { XSPLINE_CONTAINER splineContainer[ emitterPathCount ]; } XRENDERSTYLE_MANAGER renderStyle; // data referencing TR_VISUALEFFECT.XP int particleGroupCount; if( particleGroupCount > 0 ) { XPARTICLEGROUP_ITEM particleItem[ particleGroupCount ]; } } theFile;