/* $NoKeywords: $ */ /* // // Copyright (c) 1993-2012 Robert McNeel & Associates. All rights reserved. // OpenNURBS, Rhinoceros, and Rhino3D are registered trademarks of Robert // McNeel & Associates. // // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY. // ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR PURPOSE AND OF // MERCHANTABILITY ARE HEREBY DISCLAIMED. // // For complete openNURBS copyright information see . // //////////////////////////////////////////////////////////////// */ #if !defined(OPENNURBS_MATERIAL_INC_) #define OPENNURBS_MATERIAL_INC_ /////////////////////////////////////////////////////////////////////////////// // // Class ON_Material // class ON_CLASS ON_Material : public ON_Object { ON_OBJECT_DECLARE(ON_Material); public: static double MaxShine(); // maximum value of shine exponent ON_Material(); // Default grey color ~ON_Material(); // destructor // C++ default copy construction and operator= work fine. bool operator==(const ON_Material&) const; // ignores m_material_index bool operator!=(const ON_Material&) const; // ignores m_material_index void Default(); ///////////////////////////////////////////////////////////////// // ON_Object overrides /* Description: Tests an object to see if its data members are correctly initialized. Parameters: text_log - [in] if the object is not valid and text_log is not NULL, then a brief englis description of the reason the object is not valid is appened to the log. The information appended to text_log is suitable for low-level debugging purposes by programmers and is not intended to be useful as a high level user interface tool. Returns: @untitled table true object is valid false object is invalid, uninitialized, etc. Remarks: Overrides virtual ON_Object::IsValid */ ON_BOOL32 IsValid( ON_TextLog* text_log = NULL ) const; void Dump( ON_TextLog& ) const; // for debugging ON_BOOL32 Write( ON_BinaryArchive& // open binary file ) const; ON_BOOL32 Read( ON_BinaryArchive& // open binary file ); ON::object_type ObjectType() const; // virtual ON_UUID ModelObjectId() const; ///////////////////////////////////////////////////////////////// // Interface // ignores m_material_index int Compare( const ON_Material& other ) const; // OBSOLETE - use m_ambient ON_Color Ambient() const; // OBSOLETE - use m_diffuse ON_Color Diffuse() const; // OBSOLETE - use m_emission ON_Color Emission() const; // OBSOLETE - use m_specular ON_Color Specular() const; // OBSOLETE - use m_ambient void SetAmbient( ON_Color ); // OBSOLETE - use m_diffuse void SetDiffuse( ON_Color ); // OBSOLETE - use m_emission void SetEmission( ON_Color ); // OBSOLETE - use m_specular void SetSpecular( ON_Color ); // Shine values are in range 0.0 to ON_Material::MaxShine() double Shine() const; void SetShine( double ); // 0 to ON_Material::MaxShine() // Transparency values are in range 0.0 = opaque to 1.0 = transparent double Transparency() const; void SetTransparency( double ); // 0.0 = opaque, 1.0 = transparent // OBSOLETE - use m_material_index int MaterialIndex() const; // OBSOLETE - use m_material_index void SetMaterialIndex( int ); // OBSOLETE - just use m_plugin_id ON_UUID MaterialPlugInUuid() const; // OBSOLETE - just use m_plugin_id void SetMaterialPlugInUuid( ON_UUID ); // OBSOLETE - just use m_material_name const wchar_t* MaterialName() const; // OBSOLETE - just use m_material_name void SetMaterialName( const wchar_t* ); // The only reliable and persistent way to reference // materials is by the material_id. ON_UUID m_material_id; // Runtime material table index. This value is constant // for each runtim instance of Rhino, but can change // each time a model is loaded or saved. Once a material // is in the CRhinoDoc material table, its id and index // never change in that instance of Rhino. int m_material_index; // ON_wString m_material_name; // For user comfort - duplicates permitted ON_wString m_flamingo_library; // Legacy information from V3. // Will vanish in V5. ON_Color m_ambient; ON_Color m_diffuse; ON_Color m_emission; ON_Color m_specular; ON_Color m_reflection; ON_Color m_transparent; double m_index_of_refraction; // generally >= 1.0 (speed of light in vacum)/(speed of light in material) double m_reflectivity; // 0.0 = none, 1.0 = 100% double m_shine; // 0.0 = none to GetMaxShine()=maximum double m_transparency; // 0.0 = opaque to 1.0 = transparent (1.0-alpha) bool m_bShared; // default = false. // True means this material can be shared. When an // object that uses this material is copied, // the new object will share the material. // False means this material is not shared. // When an object that uses this material is // duplicated. bool m_bDisableLighting; // default = false. // True means render this object without // applying any modulation based on lights. // Basically, the diffuse, ambient, specular and // emissive channels get combined additively, clamped, // and then get treated as an emissive channel. // Another way to think about it is when // m_bDisableLighting is true, render the same way // OpenGL does when ::glDisable( GL_LIGHTING ) is called. private: unsigned char m_reserved1[2]; #if defined(ON_64BIT_POINTER) unsigned char m_reserved2[4]; #endif public: /* Description: Searches for a texure with matching texture_id. If more than one texture matches, the first match is returned. Parameters: texture_id - [in] Returns: >=0 m_textures[] index of matching texture -1 if no match is found. */ int FindTexture( ON_UUID texture_id ) const; /* Description: Searches for a texure with matching filename and type. If more than one texture matches, the first match is returned. Parameters: filename - [in] If NULL, then any filename matches. type - [in] If ON_Texture::no_texture_type, then any texture type matches. i0 - [in] If i0 is < 0, the search begins at m_textures[0], if i0 >= m_textures.Count(), -1 is returnd, otherwise, the search begins at m_textures[i0+1]. Example: Iterate through all the the bitmap textures on a material. ON_Material& mat = ...; int ti = -1; int bitmap_texture_count = 0; for(;;) { ti = mat.FindTexture( NULL, ON_Texture::bitmap_texture, ti ); if ( ti < 0 ) { // no more bitmap textures break; } // we have a bitmap texture bitmap_texture_count++; const ON_Texture& bitmap_texture = mat.m_textures[ti]; ... } Returns: >=0 m_textures[] index of matching texture -1 if no match is found. */ int FindTexture( const wchar_t* filename, ON_Texture::TYPE type, int i0 = -1 ) const; /* Description: If there is already a texture with the same file name and type, then that texture is modified, otherwise a new texture is added. If tx has user data, the user data is copied to the m_textures[] element. Parameters: tx - [in] Returns: Index of the added texture in the m_textures[] array. Remarks: This is intended to be a quick and simple way to add textures to the material. If you need to do something different, then just work on the m_textures[] array. */ int AddTexture( const ON_Texture& tx ); /* Description: If there is a texture with a matching type, that texture's filename is modified, otherwise a new texture is added. Parameters: filename - [in] new filename type - [in] Returns: Index of the added texture in the m_textures[] array. Remarks: This is intended to be a quick and simple way to add textures to the material. If you need to do something different, then just work on the m_textures[] array. */ int AddTexture( const wchar_t* filename, ON_Texture::TYPE type ); /* Description: Deletes all texures with matching filenames and types. Parameters: filename - [in] If NULL, then any filename matches. type - [in] If ON_Texture::no_texture_type, then any texture type matches. Returns: Number of textures deleted. */ int DeleteTexture( const wchar_t* filename, ON_Texture::TYPE type ); ON_ObjectArray m_textures; /* Description: Used to provide per face material support. The parent object reference a basic material. When a brep face or mesh facet wants to use a material besides the base material, it specifies a channelSupports material channel. The default material channel is 0 and that indicates the base material. A channel of n > 0 means that face used the material with id m_material_channel[n-1]. If (n-1) >= m_material_channel.Count(), then the base material is used. The value of m_material_channel[n].m_id is persistent. The value of m_material_channel[n].m_i is a runtime index in the CRhinoDoc::m_material_table[]. If CRhinoDoc::m_material_table[m_i].m_uuid != m_id, then m_id is assumed to be correct. */ ON_SimpleArray m_material_channel; ON_UUID m_plugin_id; // ID of the last plug-in to modify this material private: static double m_max_shine; bool ReadV3Helper( ON_BinaryArchive& file, int minor_version ); bool WriteV3Helper( ON_BinaryArchive& file ) const; }; #if defined(ON_DLL_TEMPLATE) // This stuff is here because of a limitation in the way Microsoft // handles templates and DLLs. See Microsoft's knowledge base // article ID Q168958 for details. #pragma warning( push ) #pragma warning( disable : 4231 ) ON_DLL_TEMPLATE template class ON_CLASS ON_ClassArray; ON_DLL_TEMPLATE template class ON_CLASS ON_ObjectArray; #pragma warning( pop ) #endif #endif