void Model_IO::SaveMaterials(std::vector<Material>& materials, BinaryWriter& writer, const achar* path) { writer.Push((int32_t) materials.size()); for (int32_t i = 0; i < materials.size(); i++) { SaveMaterial(materials[i], writer, path); } }
void GLContext::Invoke( const Message &msg ) { for ( Message::message_t::const_iterator &it = msg.m_message.begin(); it != msg.m_message.end(); ++it ) { unsigned int size = (*it).m_int; int opcode = (*++it).m_int; switch( opcode ) { // Transformation case MATRIX_MODE: assert( size == 3 ); { int mode = ToGLFlag( (*++it).m_int ); glMatrixMode( mode ); } break; case PUSH_MATRIX: assert( size == 2 ); { glPushMatrix(); } break; case POP_MATRIX: assert( size == 2 ); { glPopMatrix(); } break; case LOAD_IDENTITY: assert( size == 2 ); { glLoadIdentity(); } break; case LOAD_MATRIX: assert( size == 18 ); { float x[16]; for ( int i=0; i<16; ++i ) { x[i] = (*++it).m_float; } glLoadMatrixf( x ); } break; case MULT_MATRIX: assert( size == 18 ); { float x[16]; for ( int i=0; i<16; ++i ) { x[i] = (*++it).m_float; } glMultMatrixf( x ); } break; case TRANSLATE: assert( size == 5 ); { float x = (*++it).m_float; float y = (*++it).m_float; float z = (*++it).m_float; glTranslatef( x, y ,z ); } break; case ROTATE: assert( size == 6 ); { float angle = (*++it).m_float; float x = (*++it).m_float; float y = (*++it).m_float; float z = (*++it).m_float; glRotatef( angle, x ,y ,z ); } break; case SCALE: assert( size == 5 ); { float x = (*++it).m_float; float y = (*++it).m_float; float z = (*++it).m_float; glScalef( x, y ,z ); } break; // Blocks case BLOCK_BEGIN: { m_restoreVector.push_back( Message() ); } break; case BLOCK_END: { Restore(); m_restoreVector.pop_back(); } break; case SAVE: assert( size == 3 ); { int flag = (*++it).m_int; Save( flag ); } break; case SAVE_LIGHT: assert( size == 4 ); { int light = (*++it).m_int; int flag = (*++it).m_int; SaveLight( light, flag ); } break; case SAVE_MATERIAL: assert( size == 4 ); { int face = (*++it).m_int; int flag = (*++it).m_int; SaveMaterial( face, flag ); } break; // State case ENABLE: assert( size == 3 ); { int flag = (*++it).m_int; glEnable( ToGLFlag( flag )); } break; case DISABLE: assert( size == 3 ); { int flag = (*++it).m_int; glDisable( ToGLFlag( flag )); } break; case BLEND_FUNC: assert( size == 4 ); { int sf = (*++it).m_int; int df = (*++it).m_int; glBlendFunc( ToGLBlendFun( sf ), ToGLBlendFun( df )); } break; case BIND_TEXTURE: assert( size == 4 ); { int target = ToGLFlag( (*++it).m_int ); int index = (*++it).m_int; glBindTexture( target, index ); } break; case MATERIAL_PROPERTY_FLOAT_4: assert ( size == 8 ); { int face = ToGLFlag( (*++it).m_int ); int prop = ToGLMaterial( (*++it).m_int ); float color[4]; for ( int i=0; i<4; ++i ) { color[i] = (*++it).m_float; } glMaterialfv( face, prop, color ); } break; case MATERIAL_PROPERTY_FLOAT: assert( size == 5 ); { int face = ToGLFlag( (*++it).m_int ); int prop = ToGLMaterial( (*++it).m_int ); float x = (*++it).m_float; glMaterialf( face, prop, x ); } break; case LIGHT_PROPERTY_FLOAT_4: assert ( size == 8 ); { int light = ToGLFlag( (*++it).m_int ); int prop = ToGLLight( (*++it).m_int ); float color[4]; for ( int i=0; i<4; ++i ) { color[i] = (*++it).m_float; } glLightfv( light, prop, color ); } break; case LIGHT_PROPERTY_FLOAT_3: assert ( size == 7 ); { int light = ToGLFlag( (*++it).m_int ); int prop = ToGLLight( (*++it).m_int ); float direction[3]; for ( int i=0; i<3; ++i ) { direction[i] = (*++it).m_float; } glLightfv( light, prop, direction ); } break; case LIGHT_PROPERTY_FLOAT: assert( size == 5 ); { int light = ToGLFlag( (*++it).m_int ); int prop = ToGLLight( (*++it).m_int ); float x = (*++it).m_float; glLightf( light, prop, x ); } break; case LIGHT_MODEL_PROPERTY_FLOAT_4: assert( size == 7 ); { int prop = (*++it).m_int; float color[4]; for ( int i=0; i<4; ++i ) { color[i] = (*++it).m_float; } glLightModelfv( prop, color ); } break; case LIGHT_MODEL_PROPERTY_INT: assert( size == 4 ); { int prop = ToGLLightModel( (*++it).m_int ); int x = (*++it).m_int; glLightModeli( prop, x ); } break; case COLOR_MATERIAL_MODE: assert( size == 4 ); { int face = ToGLFlag( (*++it).m_int ); int mode = ToGLMaterial( (*++it).m_int ); glColorMaterial( face, mode ); } break; case BEGIN: assert( size == 3 ); { int type = (*++it).m_int; glBegin( ToGLPrimitive( type )); } break; case END: assert( size == 2 ); glEnd(); break; case VERTEX: assert( size == 5 ); { float x = (*++it).m_float; float y = (*++it).m_float; float z = (*++it).m_float; glVertex3f(x,y,z); } break; case NORMAL: assert( size == 5 ); { float x = (*++it).m_float; float y = (*++it).m_float; float z = (*++it).m_float; glNormal3f(x,y,z); } break; case COLOR: assert( size == 6 ); { float r = (*++it).m_float; float g = (*++it).m_float; float b = (*++it).m_float; float a = (*++it).m_float; glColor4f(r,g,b,a); } break; case TEXTURE_COORD: assert( size == 4 ); { float u = (*++it).m_float; float v = (*++it).m_float; glTexCoord2f(u,v); } break; // Client State case ENABLE_CLIENT_STATE: assert( size == 3 ); { int flag = (*++it).m_int; if ( flag != INDEX_ARRAY ) { glEnableClientState( ToGLClientFlag( flag )); } } break; case DISABLE_CLIENT_STATE: assert( size == 3 ); { int flag = (*++it).m_int; if ( flag != INDEX_ARRAY ) { glDisableClientState( ToGLClientFlag( flag )); } } break; case VERTEX_ARRAY: assert( size == 4 ); { void *ptr = (*++it).m_pointer; unsigned int s = (*++it).m_uint; glVertexPointer( 3, GL_FLOAT, sizeof( GAL::P3f ), ptr ); } break; case NORMAL_ARRAY: assert( size == 4 ); { void *ptr = (*++it).m_pointer; unsigned int s = (*++it).m_uint; glNormalPointer( GL_FLOAT, sizeof( GAL::P3f ), ptr ); } break; case COLOR_ARRAY: assert( size == 4 ); { void *ptr = (*++it).m_pointer; unsigned int s = (*++it).m_uint; glColorPointer( 4, GL_FLOAT, sizeof( GAL::P4f ), ptr ); } break; case TEXTURE_COORD_ARRAY: assert( size == 4 ); { void *ptr = (*++it).m_pointer; unsigned int s = (*++it).m_uint; glTexCoordPointer( 2, GL_FLOAT, sizeof( GAL::P2f ), ptr ); } break; case INDEX_ARRAY: assert( size == 4 ); { void *ptr = (*++it).m_pointer; unsigned int s = (*++it).m_uint; m_indexPointer = reinterpret_cast< unsigned int *>( ptr ); m_numIndices = s; } break; case DRAW_ELEMENTS: assert( size == 5 ); { int type = (*++it).m_int; unsigned int first = (*++it).m_int; unsigned int count = (*++it).m_int; glDrawElements( ToGLPrimitive( type ), count, GL_UNSIGNED_INT, m_indexPointer + first ); } break; case MESSAGE_CB: { int cbOffset = (*++it).m_int; char *cbPtr = reinterpret_cast< char *>( const_cast< int * >( &((*++it).m_int ))); cbPtr += cbOffset; MessageCallback *pCB = reinterpret_cast< MessageCallback * >( cbPtr ); Invoke( pCB->Apply()); std::advance( it, size-4 ); } break; default: std::advance( it, size-2 ); break; }; } }