Alphabetical Class Index  Class Hierarchy   File Members   Compound Members   File List  

HMaterialLibrary.h

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