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