/////////////////////////////////////////////////////////////////////// // // *** INTERACTIVE DATA VISUALIZATION (IDV) CONFIDENTIAL AND PROPRIETARY INFORMATION *** // // This software is supplied under the terms of a license agreement or // nondisclosure agreement with Interactive Data Visualization, Inc. and // may not be copied, disclosed, or exploited except in accordance with // the terms of that agreement. // // Copyright (c) 2003-2017 IDV, Inc. // All rights reserved in all media. // // IDV, Inc. // http://www.idvinc.com /////////////////////////////////////////////////////////////////////// // Preprocessor / Includes #pragma once #include "DataBuffer.h" /////////////////////////////////////////////////////////////////////// // Packing #ifdef ST_SETS_PACKING_INTERNALLY #pragma pack(push, 4) #endif /////////////////////////////////////////////////////////////////////// // namespace SpeedTreeDataBuffer namespace SpeedTreeDataBuffer { namespace GameEngine8 { /////////////////////////////////////////////////////////////////////// // Data Structs struct Vec2 { st_float32 x, y; }; struct Vec3 { st_float32 x, y, z; }; struct Vec4 { st_float32 x, y, z, w; }; enum EWindGeometryType { Branch, Frond, Leaf, FacingLeaf, Billboard }; struct SVertex { Vec3 m_vAnchor; Vec3 m_vOffset; Vec3 m_vLodOffset; Vec3 m_vNormal; Vec3 m_vTangent; Vec3 m_vBinormal; Vec2 m_vTexCoord; Vec2 m_vLightmapTexCoord; Vec3 m_vColor; Vec2 m_vWindBranch; Vec3 m_vWindNonBranch; st_float32 m_fWindRandom; st_float32 m_fAmbientOcclusion; st_float32 m_fBlendWeight; st_uint32 m_uiBoneID; st_byte m_bWindLeaf2Flag; }; struct SDrawCall { st_uint32 m_uiMaterialIndex; EWindGeometryType m_eWindGeometryType; st_uint32 m_uiIndexStart; st_uint32 m_uiIndexCount; }; struct SBone { st_uint32 m_uiID; st_uint32 m_uiParentID; Vec3 m_vStart; Vec3 m_vEnd; float m_fRadius; }; struct SWindConfig { static const int c_nNumBranchLevels = 2; static const int c_nNumLeafGroups = 2; static const int c_nNumPointsInCurves = 10; // main settings enum EWindPreset { WIND_PRESET_NONE, WIND_PRESET_FASTEST, WIND_PRESET_FAST, WIND_PRESET_BETTER, WIND_PRESET_BEST, WIND_PRESET_PALM }; EWindPreset m_ePreset; float m_fStrengthResponse; float m_fDirectionResponse; float m_fAnchorOffset; float m_fAnchorDistanceScale; // gusting float m_fGustFrequency; float m_fGustStrengthMin; float m_fGustStrengthMax; float m_fGustDurationMin; float m_fGustDurationMax; float m_fGustRiseScalar; float m_fGustFallScalar; // oscillations enum EOscillationComponents { OSC_GLOBAL, OSC_BRANCH_1, OSC_BRANCH_2, OSC_LEAF_1_RIPPLE, OSC_LEAF_1_TUMBLE, OSC_LEAF_1_TWITCH, OSC_LEAF_2_RIPPLE, OSC_LEAF_2_TUMBLE, OSC_LEAF_2_TWITCH, OSC_FROND_RIPPLE, NUM_OSC_COMPONENTS }; float m_afFrequencies[NUM_OSC_COMPONENTS][c_nNumPointsInCurves]; // global motion float m_fGlobalHeight; float m_fGlobalHeightExponent; float m_afGlobalDistance[c_nNumPointsInCurves]; float m_afGlobalDirectionAdherence[c_nNumPointsInCurves]; // branch motion struct SBranchWindLevel { float m_afDistance[c_nNumPointsInCurves]; float m_afDirectionAdherence[c_nNumPointsInCurves]; float m_afWhip[c_nNumPointsInCurves]; float m_fTurbulence; float m_fTwitch; float m_fTwitchFreqScale; }; SBranchWindLevel m_asBranch[c_nNumBranchLevels]; float m_vFrondStyleBranchAnchor[3]; float m_fMaxBranchLength; // leaf motion struct SLeafGroup { float m_afRippleDistance[c_nNumPointsInCurves]; float m_afTumbleFlip[c_nNumPointsInCurves]; float m_afTumbleTwist[c_nNumPointsInCurves]; float m_afTumbleDirectionAdherence[c_nNumPointsInCurves]; float m_afTwitchThrow[c_nNumPointsInCurves]; float m_fTwitchSharpness; float m_fLeewardScalar; }; SLeafGroup m_asLeaf[c_nNumLeafGroups]; // frond motion float m_afFrondRippleDistance[c_nNumPointsInCurves]; float m_fFrondRippleTile; float m_fFrondRippleLightingScalar; // options enum EOptions { GLOBAL_WIND, GLOBAL_PRESERVE_SHAPE, BRANCH_1_SIMPLE, BRANCH_1_DIRECTIONAL, BRANCH_1_DIRECTIONAL_FROND, BRANCH_1_TURBULENCE, BRANCH_1_WHIP, BRANCH_1_OSC_COMPLEX, BRANCH_2_SIMPLE, BRANCH_2_DIRECTIONAL, BRANCH_2_DIRECTIONAL_FROND, BRANCH_2_TURBULENCE, BRANCH_2_WHIP, BRANCH_2_OSC_COMPLEX, LEAF_RIPPLE_VERTEX_NORMAL_1, LEAF_RIPPLE_COMPUTED_1, LEAF_TUMBLE_1, LEAF_TWITCH_1, LEAF_OCCLUSION_1, LEAF_RIPPLE_VERTEX_NORMAL_2, LEAF_RIPPLE_COMPUTED_2, LEAF_TUMBLE_2, LEAF_TWITCH_2, LEAF_OCCLUSION_2, FROND_RIPPLE_ONE_SIDED, FROND_RIPPLE_TWO_SIDED, FROND_RIPPLE_ADJUST_LIGHTING, ROLLING, NUM_WIND_OPTIONS }; st_byte m_abOptions[NUM_WIND_OPTIONS]; }; /////////////////////////////////////////////////////////////////////// // Data Tables class CLod : public CTable { public: ST_INLINE CArray Vertices(void) { return GetContainer >(0); } ST_INLINE CArray Indices(void) { return GetContainer >(1); } ST_INLINE CArray DrawCalls(void) { return GetContainer >(2); } }; class CMaterialMap : public CTable { public: ST_INLINE st_bool Used(void) { return GetValue(0); } ST_INLINE CString Path(void) { return GetContainer(1); } ST_INLINE Vec4 Color(void) { return GetValue(2); } }; class CMaterial : public CTable { public: ST_INLINE CString Name(void) { return GetContainer(0); } ST_INLINE st_bool TwoSided(void) { return GetValue(1); } ST_INLINE st_bool Billboard(void) { return GetValue(2); } ST_INLINE CTableArray Maps(void) { return GetContainer >(3); } }; class CCollisionObject : public CTable { public: ST_INLINE Vec3 Position(void) { return GetValue(0); } ST_INLINE Vec3 Position2(void) { return GetValue(1); } ST_INLINE float Radius(void) { return GetValue(2); } ST_INLINE CString UserData(void) { return GetContainer(3); } }; /////////////////////////////////////////////////////////////////////// // class CTree class CTree : public CReader { public: // file info ST_INLINE st_uint32 VersionMajor(void) { return GetValue(0); } ST_INLINE st_uint32 VersionMinor(void) { return GetValue(1); } // geometry info ST_INLINE st_bool LastLodIsBillboard(void) { return GetValue(2); } ST_INLINE CTableArray Lods(void) { return GetContainer >(3); } ST_INLINE CTableArray CollisionObjects(void) { return GetContainer >(4); } // material info ST_INLINE CTableArray Materials(void) { return GetContainer >(5); } ST_INLINE st_uint32 LightmapSize(void) { return GetValue(6); } // wind ST_INLINE const SWindConfig& Wind(void) { return GetValue(7); } // bones/skeleton ST_INLINE const CArray Bones(void) { return GetContainer >(8); } protected: ST_INLINE const st_char* FileToken(void) const { return "SpeedTree___"; } }; } // end namespace GameEngine8 } // end namespace SpeedTreeDataBuffer #ifdef ST_SETS_PACKING_INTERNALLY #pragma pack(pop) #endif