コード例 #1
0
ファイル: asd.Model_IO.cpp プロジェクト: altseed/Altseed
	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);
		}
	}
コード例 #2
0
        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;
                };
            }
        }