00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <drawable/shadedPrim.h>
00021 #include <iostream>
00022 #include <GL/glUtil.h>
00023
00024 using namespace std;
00025
00026 using namespace glift;
00027
00028
00029
00030 ShadedPrim::ShadedPrim( DrawableGLI* prim, Shader* shader )
00031 : m_prim( prim ),
00032 m_rawPrim( NULL ),
00033 m_shader( shader ),
00034 m_texCoordsPtr( NULL ),
00035 m_dispList( 0 )
00036 {
00037 if( m_prim == NULL) {
00038 err() << "ShadedPrim(...) Error:\n\tPrimitive == NULL.\n";
00039 exit(1);
00040 }
00041 if( m_shader == NULL) {
00042 err() << "ShadedPrim(...) Error:\n\tShader == NULL.\n";
00043 exit(1);
00044 }
00045
00046
00047
00048 if( m_rawPrim = dynamic_cast<RawPrim*>( m_prim ) ) {
00049 m_texCoordsPtr = m_rawPrim->genTexCoords( shader );
00050 }
00051
00052
00053 #ifdef USE_DISP_LIST
00054 m_dispList = glGenLists(1);
00055 glNewList( m_dispList, GL_COMPILE );
00056 {
00057 if( m_rawPrim && m_texCoordsPtr ) {
00058 m_rawPrim->bindTexCoords( m_texCoordsPtr );
00059 }
00060
00061 m_prim->draw();
00062
00063 if( m_rawPrim && m_texCoordsPtr ) {
00064 m_rawPrim->releaseTexCoords();
00065 }
00066 }
00067 glEndList();
00068 #endif
00069 }
00070
00071 ShadedPrim::ShadedPrim( const ShadedPrim& rhs)
00072 {
00073 initMembers(rhs);
00074 }
00075
00076 ShadedPrim& ShadedPrim::operator=(const ShadedPrim& rhs)
00077 {
00078 if( &rhs != this ) {
00079 initMembers(rhs);
00080 }
00081 return *this;
00082 }
00083
00084 ShadedPrim::~ShadedPrim()
00085 {
00086 for(uint i=0; i < m_texCoordsPtr->size(); i++) {
00087 delete (*m_texCoordsPtr)[i];
00088 }
00089 delete m_texCoordsPtr;
00090 }
00091
00092 void ShadedPrim::initMembers( DrawableGLI* prim, RawPrim* rawPrim, Shader* shader, MultiPrimTexCoord* texCoordsPtr )
00093 {
00094 m_prim = prim;
00095 m_rawPrim = rawPrim;
00096 m_shader = shader;
00097 m_texCoordsPtr = texCoordsPtr;
00098
00099 if( m_texCoordsPtr ) {
00100 m_texCoordsPtr = new MultiPrimTexCoord( texCoordsPtr->size() );
00101
00102
00103 for(uint i=0; i < m_texCoordsPtr->size(); i++) {
00104 MultiTexCoord* primTexCoords = (*texCoordsPtr)[i];
00105 (*m_texCoordsPtr)[i] = new MultiTexCoord( *primTexCoords );
00106 }
00107 }
00108
00109 if( m_prim == NULL) {
00110 err() << "ShadedPrim(...) Error:\n\tPrimitive == NULL.\n";
00111 exit(1);
00112 }
00113 if( m_shader == NULL) {
00114 err() << "ShadedPrim(...) Error:\n\tShader == NULL.\n";
00115 exit(1);
00116 }
00117 }
00118
00119 void ShadedPrim::initMembers( const ShadedPrim& rhs )
00120 {
00121 initMembers( rhs.m_prim, rhs.m_rawPrim, rhs.m_shader, rhs.m_texCoordsPtr );
00122 }
00123
00124
00125
00126
00127 void ShadedPrim::setPrim( DrawableGLI* prim )
00128 {
00129 if( prim ) {
00130 m_prim = prim;
00131
00132 if( RawPrim* rawPrim = dynamic_cast<RawPrim*>(prim) ) {
00133 m_rawPrim = rawPrim;
00134 }
00135 }
00136 }
00137
00138
00139
00140
00141 void ShadedPrim::setTexCoordPtr( MultiPrimTexCoord* texCoordsPtr )
00142 {
00143 if( texCoordsPtr ) {
00144 m_texCoordsPtr = texCoordsPtr;
00145 }
00146 }
00147
00148 void ShadedPrim::drawDef()
00149 {
00150 m_shader->bind();
00151
00152 #ifdef USE_DISP_LIST
00153 glCallList( m_dispList );
00154 #else
00155 if( m_rawPrim && m_texCoordsPtr ) {
00156 m_rawPrim->bindTexCoords( m_texCoordsPtr );
00157 }
00158
00159 m_prim->draw();
00160
00161 if( m_rawPrim && m_texCoordsPtr ) {
00162 m_rawPrim->releaseTexCoords();
00163 }
00164 #endif
00165
00166 m_shader->release();
00167
00168 glerr("draw()");
00169 }
00170