Alphabetical Class Index  Class Hierarchy   File Members   Compound Members   File List  

HMaterialLibrary.h
Go to the documentation of this file.
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