00001 /* 00002 * material.h 00003 * 00004 * Copyright (C) 2009 Thomas A. Vaughan 00005 * All rights reserved. 00006 * 00007 * 00008 * Redistribution and use in source and binary forms, with or without 00009 * modification, are permitted provided that the following conditions are met: 00010 * * Redistributions of source code must retain the above copyright 00011 * notice, this list of conditions and the following disclaimer. 00012 * * Redistributions in binary form must reproduce the above copyright 00013 * notice, this list of conditions and the following disclaimer in the 00014 * documentation and/or other materials provided with the distribution. 00015 * * Neither the name of the <organization> nor the 00016 * names of its contributors may be used to endorse or promote products 00017 * derived from this software without specific prior written permission. 00018 * 00019 * THIS SOFTWARE IS PROVIDED BY THOMAS A. VAUGHAN ''AS IS'' AND ANY 00020 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 00021 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00022 * DISCLAIMED. IN NO EVENT SHALL THOMAS A. VAUGHAN BE LIABLE FOR ANY 00023 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 00024 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00025 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 00026 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 00027 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00028 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00029 * 00030 * 00031 * Interfaces to deal with materials generally. 00032 */ 00033 00034 #ifndef WAVE_GLUT_GLUT_MATERIAL_H__ 00035 #define WAVE_GLUT_GLUT_MATERIAL_H__ 00036 00037 // includes -------------------------------------------------------------------- 00038 #include "wave-glut.h" 00039 00040 00041 namespace glut { 00042 00043 /// \ingroup glut 00044 /*@{*/ 00045 00046 00047 /// A Material is anything that needs to be set up prior to drawing, and 00048 /// possibly requiring some cleanup afterwards. This includes setup such 00049 /// as texture binding etc. This is a non functional base class for others 00050 /// to inherit from. 00051 class Material { 00052 public: 00053 // virtual destructor -------------------------------------------------- 00054 virtual ~Material(void) throw(); 00055 00056 // glut::Material class interface methods ------------------------------ 00057 00058 /// does this material include a texture? 00059 virtual bool hasTexture(void) const throw(); 00060 00061 /// this is called right before polygons needing the material are drawn 00062 virtual void prepare(void); 00063 00064 /// this is called after polygons have been drawn. Not all material 00065 /// objects need cleanup, but this hook is here for those that do. 00066 /// Note that any cleanup is not allowed to throw. 00067 virtual void cleanup(void) throw(); 00068 }; 00069 00070 00071 00072 /// helper class: put one of these on the stack, and it will make sure that 00073 /// prepare() and cleanup() are called. 00074 class MaterialContext { 00075 public: 00076 // constructor, destructor --------------------------------------------- 00077 MaterialContext(IN smart_ptr<Material>& material) { 00078 ASSERT(material, "null"); 00079 m_material = material; 00080 m_material->prepare(); 00081 } 00082 00083 ~MaterialContext(void) throw() { 00084 if (m_material) { 00085 m_material->cleanup(); 00086 } 00087 } 00088 00089 protected: 00090 // protected data members ---------------------------------------------- 00091 smart_ptr<Material> m_material; 00092 }; 00093 00094 00095 00096 }; // glut namespace 00097 00098 #endif // WAVE_GLUT_GLUT_MATERIAL_H__ 00099