00001 // 00002 // Copyright (c) 2010 by Tech Soft 3D, LLC. 00003 // The information contained herein is confidential and proprietary to 00004 // Tech Soft 3D, LLC., and considered a trade secret as defined under 00005 // civil and criminal statutes. Tech Soft 3D shall pursue its civil 00006 // and criminal remedies in the event of unauthorized use or misappropriation 00007 // of its trade secrets. Use of this information by anyone other than 00008 // authorized employees of Tech Soft 3D, LLC. is granted only under a 00009 // written non-disclosure agreement, expressly prescribing the scope and 00010 // manner of such use. 00011 // 00012 // $Id: d3ea8bff2a73ae52fc72d65a4b1f01b5dc554a34 $ 00013 // 00017 #ifndef _HMATERIALLIBRARY_H 00018 #define _HMATERIALLIBRARY_H 00019 00020 #ifdef H_PACK_8 00021 #pragma pack(push) 00022 #pragma pack(8) 00023 #endif 00024 00025 #include "HTools.h" 00026 #include "BStream.h" 00027 00028 00029 class HTK_One_Material; 00030 00034 class MVO_API HMaterialLibrary { 00035 00036 public: 00037 HMaterialLibrary(); 00038 virtual ~HMaterialLibrary(); 00039 00040 /* 00041 * basic usage 00042 */ 00043 00050 bool RegisterMaterials (const char *directory); 00054 bool RegisterMaterials (const wchar_t *directory); 00056 bool IsValid () const { return m_Valid; } 00062 bool ApplyStyles(); 00065 const char *GetContainerSegment () const; 00078 const char *GetMaterialList(char *buffer = 0, int buffer_length = -1); 00082 bool IsValidMaterial (const char *name) const; 00087 bool ApplyMaterial (const char *name); 00094 bool ReloadMaterial (const char *name); 00095 00096 /* 00097 * for run-time tweaks 00098 */ 00104 bool CloneMaterial (const char *old_material_name, char *new_material_name); 00109 bool RenameMaterial (const char *old_material_name, const char *new_material_name); 00114 bool GetTweakablesCount (const char *material_name, int *count); 00121 bool GetTweakableByIndex (const char *material_name, int index, char *tweakable_name, char *type); 00128 bool GetTweakableByName (const char *material_name, char const *tweakable_name, int *index, char *type); 00132 int CountFromType (const char *type); 00138 bool GetTweakableDefaults (const char *material_name, int index, float *vals); 00144 bool Tweak (const char *material_name, int index, const float *vals); 00153 bool Tweak (const char *material_name, int index, float val0, float val1=0, float val2=0, float val3=0 ); 00154 00155 /* 00156 * environment texture set up 00157 */ 00159 const char *GetEnvironmentList(char *buffer = 0, int buffer_length = -1); 00163 bool IsValidEnvironment (const char *name) const; 00168 bool SetEnvironment (const char *name); 00169 00174 bool EnsureMaterialInitialized (const char *name); 00179 bool EnsureEnvironmentInitialized (const char *name); 00180 00181 bool FindReferencedMaterials (HC_KEY segment_tree, char *list, int list_size); 00182 bool InitWrite (const char *list, int *size); 00183 bool InitRead (int version); 00184 TK_Status ParseBuffer (char const *buffer, int size); 00185 const char *GetCurrentEnvironment(char *buffer = 0, int buffer_length = -1); 00186 00191 bool Compile (const char *name); 00192 00195 enum Read_Flags { 00196 Read_Flags_Default = 0x0000, 00197 Prefer_Embedded = 0x0001, 00198 Prefer_Highest_Resolution = 0x0002, 00199 }; 00200 void SetReadFlags (Read_Flags flags) { m_ReadFlags = flags; }; 00201 Read_Flags GetReadFlags () { return m_ReadFlags; }; 00202 00205 enum Write_Flags { 00206 Write_Flags_Default = 0x0000, 00207 Embedded = 0x0001, 00208 //Baked = 0x0002, //!< write plain attributes instead of materials so that the receiving side can view without any special handling (not yet implemented) 00209 //Downsample = 0x0004, //!< embed material data, but choose a variant with low resolution (not yet implemented) 00210 }; 00211 void SetWriteFlags (Write_Flags flags) { m_WriteFlags = flags; }; 00212 Write_Flags GetWriteFlags () { return m_WriteFlags; }; 00213 00214 protected: 00215 const wchar_t *m_MaterialDirectory; 00216 struct vhash_s *m_MaterialHash; 00217 struct vhash_s *m_EnvironmentHash; 00218 const char *m_MaterialList; 00219 const char *m_EnvironmentList; 00220 const char *m_CurrentEnvironment; 00221 HC_KEY m_MaterialSegmentKey; 00222 HC_KEY m_CurrentEnvironmentKey; 00223 Read_Flags m_ReadFlags; 00224 Write_Flags m_WriteFlags; 00225 bool m_Valid; 00226 00233 bool Initialize (const char *name, bool environment = false); 00234 00239 virtual void Error (const char *message, int severity = 1); 00245 bool GetTweakablesString (const char *material_name, char *string); 00253 bool GetShaderSource (const char *material_name, char *shader_source, char *options = 0); 00254 00259 const char *FindValidMaterial (const char *name) const; 00260 00264 bool Compile (const char *name, void *bufferlist); 00265 00266 private: 00267 struct vlist_s *m_SerializationBufferList; 00268 BStreamFileToolkit *m_tk; 00269 00270 enum ErrorCode { 00271 HMatOK = 1, 00272 HMatParseError = -1, 00273 HMatFileError = -2, 00274 }; 00275 00276 void Init(); 00277 void RecordHSFMaterial (const wchar_t *path, const wchar_t *filename); 00278 void FindHSFMaterials (const wchar_t *path); 00279 bool HasIndexFile (const wchar_t *path, const wchar_t *subpath, const wchar_t *subdir, const wchar_t *index_file); 00280 void FindSubdirectories (const wchar_t *path, const wchar_t *subpath); 00281 bool GenerateSerializationBufferList (const char *materials); 00282 const char *HashToString (struct vhash_s *hash, char *buffer = 0, int buffer_size = -1) const; 00283 ErrorCode slurp_dat_file( 00284 const wchar_t *index_file, 00285 const wchar_t *subdir, 00286 const wchar_t *path, 00287 void *datlist); 00288 friend class HTK_One_Material; 00289 friend class HTK_Material_Composite; 00290 }; 00291 00292 00293 00294 00295 class MVO_API HTK_Material_Composite : public TK_Material 00296 { 00297 public: 00298 HTK_Material_Composite (HMaterialLibrary *hmat, HC_KEY key) : TK_Material() { 00299 H_ASSERT (hmat != NULL); 00300 H_ASSERT (key != -1); 00301 m_Root = key; 00302 m_HMat = hmat; 00303 } 00304 00305 HTK_Material_Composite (HMaterialLibrary *hmat) : TK_Material() { 00306 H_ASSERT (hmat != NULL); 00307 m_Root = -1; 00308 m_HMat = hmat; 00309 } 00310 00311 TK_Status Interpret(BStreamFileToolkit &tk, ID_Key key, int variant); 00312 TK_Status Execute(BStreamFileToolkit & tk); 00313 00314 protected: 00315 HC_KEY m_Root; 00316 HMaterialLibrary *m_HMat; 00317 }; 00318 00319 00320 class MVO_API HTK_One_Material : public BBaseOpcodeHandler 00321 { 00322 public: 00323 HTK_One_Material (); 00324 HTK_One_Material (HMaterialLibrary *hmat); 00325 ~HTK_One_Material (); 00326 00327 TK_Status Interpret(BStreamFileToolkit &tk, HMaterialLibrary *hmat, const char *name); 00328 TK_Status Execute(BStreamFileToolkit & tk); 00329 TK_Status Read (BStreamFileToolkit & tk); 00330 TK_Status Write (BStreamFileToolkit & tk); 00331 void Reset (); 00332 00335 enum Subop_Flags { 00336 OMF_Environment = 0x0001, 00337 OMF_Instancee = 0x0002, 00338 OMF_Tweaks = 0x0004, 00339 OMF_Embedded = 0x0008, 00340 OMF_Height_Field= 0x0010, 00341 }; 00344 enum Tweak_Type { 00345 OMT_Float1 = 0x1, 00346 OMT_Float2 = 0x2, 00347 OMT_Float3 = 0x3, 00348 OMT_Float4 = 0x4, 00349 }; 00350 00351 protected: 00352 HMaterialLibrary *m_HMat; //not locally owned 00353 void *m_MaterialDescriptor; //not locally owned 00354 char *m_Name; 00355 int m_NameLength; 00356 char *m_Instancee; 00357 int m_InstanceeLength; 00358 int m_TweakCount; 00359 int *m_TweakNameLengths; 00360 char **m_TweakNames; 00361 char *m_TweakTypes; 00362 float **m_Tweaks; 00363 float m_HeightFieldScale; 00364 unsigned int m_subop; 00365 int m_substage; 00366 int m_substage2; 00367 00368 //the rest of the variables are all used for embedding hsf data 00369 #define ONEMATBUFSIZE 512 00370 void *m_subtk; 00371 FILE *m_HSF; 00372 int m_EmbeddedLength; 00373 unsigned char m_EmbeddingBuffer[ONEMATBUFSIZE]; 00374 int m_EmbeddingBufferUsed; 00375 00376 void Init (); 00377 }; 00378 00379 00380 00381 00382 00383 #ifdef H_PACK_8 00384 #pragma pack(pop) 00385 #endif 00386 00387 #endif