mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-09-15 02:33:15 +02:00
3dviewer: back to double (from float) in class S3D_MASTER for 3 members (m_MatScale, m_MatRotation, m_MatPosition) which are used in dialogs and r/w file functions, which expect double. Using float create minor but unwanted issues in r/w file functions. S3D_MATERIAL: enable all color options: if a 3d shape has bad color parameters, the shape must be modified, not the 3d rendering. The rendering now matches what we see in other vrml viewer like FreeCAD. Some minor coding style fixes.
832 lines
21 KiB
C++
832 lines
21 KiB
C++
/*
|
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
*
|
|
* Copyright (C) 2014 Mario Luzeiro <mrluzeiro@gmail.com>
|
|
* Copyright (C) 2013 Tuomas Vaherkoski <tuomasvaherkoski@gmail.com>
|
|
* Copyright (C) 2012 Jean-Pierre Charras, jp.charras@wanadoo.fr
|
|
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
|
|
* Copyright (C) 1992-2014 KiCad Developers, see AUTHORS.txt for contributors.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, you may find one here:
|
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
* or you may search the http://www.gnu.org website for the version 2 license,
|
|
* or you may write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
|
*/
|
|
|
|
/**
|
|
* @file vrml_v2_modelparser.cpp
|
|
*/
|
|
|
|
#include <fctsys.h>
|
|
#include <vector>
|
|
#include <macros.h>
|
|
#include <kicad_string.h>
|
|
#include <info3d_visu.h>
|
|
|
|
#include "3d_struct.h"
|
|
#include "modelparsers.h"
|
|
#include "vrml_aux.h"
|
|
|
|
VRML2_MODEL_PARSER::VRML2_MODEL_PARSER( S3D_MASTER* aMaster ) :
|
|
S3D_MODEL_PARSER( aMaster )
|
|
{
|
|
m_model = NULL;
|
|
}
|
|
|
|
|
|
VRML2_MODEL_PARSER::~VRML2_MODEL_PARSER()
|
|
{
|
|
for(unsigned int idx = 0; idx < childs.size(); idx++)
|
|
{
|
|
delete childs[idx];
|
|
}
|
|
}
|
|
|
|
|
|
void VRML2_MODEL_PARSER::Load( const wxString aFilename )
|
|
{
|
|
char text[128];
|
|
|
|
//DBG( printf( "Load %s\n", static_cast<const char*>(aFilename.mb_str()) ) );
|
|
m_file = wxFopen( aFilename, wxT( "rt" ) );
|
|
|
|
if( m_file == NULL )
|
|
{
|
|
return;
|
|
}
|
|
|
|
glShadeModel(GL_SMOOTH);
|
|
glEnable(GL_NORMALIZE);
|
|
|
|
float vrmlunits_to_3Dunits = g_Parm_3D_Visu.m_BiuTo3Dunits * UNITS3D_TO_UNITSPCB;
|
|
glScalef( vrmlunits_to_3Dunits, vrmlunits_to_3Dunits, vrmlunits_to_3Dunits );
|
|
|
|
glm::vec3 matScale( GetMaster()->m_MatScale.x, GetMaster()->m_MatScale.y,
|
|
GetMaster()->m_MatScale.z );
|
|
glm::vec3 matRot( GetMaster()->m_MatRotation.x, GetMaster()->m_MatRotation.y,
|
|
GetMaster()->m_MatRotation.z );
|
|
glm::vec3 matPos( GetMaster()->m_MatPosition.x, GetMaster()->m_MatPosition.y,
|
|
GetMaster()->m_MatPosition.z );
|
|
|
|
|
|
#define SCALE_3D_CONV ((IU_PER_MILS * 1000.0f) / UNITS3D_TO_UNITSPCB)
|
|
|
|
glTranslatef( matPos.x * SCALE_3D_CONV, matPos.y * SCALE_3D_CONV, matPos.z * SCALE_3D_CONV );
|
|
|
|
glRotatef(-matRot.z, 0.0f, 0.0f, 1.0f );
|
|
glRotatef(-matRot.y, 0.0f, 1.0f, 0.0f );
|
|
glRotatef(-matRot.x, 1.0f, 0.0f, 0.0f );
|
|
|
|
glScalef( matScale.x, matScale.y, matScale.z );
|
|
|
|
// Switch the locale to standard C (needed to print floating point numbers like 1.3)
|
|
SetLocaleTo_C_standard();
|
|
|
|
childs.clear();
|
|
|
|
while( GetNextTag( m_file, text ) )
|
|
{
|
|
|
|
if( ( text == NULL ) || ( *text == '}' ) || ( *text == ']' ) )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if( strcmp( text, "Transform" ) == 0 )
|
|
{
|
|
m_model = new S3D_MESH();
|
|
childs.push_back( m_model );
|
|
|
|
read_Transform();
|
|
|
|
}
|
|
else if( strcmp( text, "DEF" ) == 0 )
|
|
{
|
|
m_model = new S3D_MESH();
|
|
childs.push_back( m_model );
|
|
|
|
read_DEF();
|
|
}
|
|
}
|
|
|
|
fclose( m_file );
|
|
SetLocaleTo_Default(); // revert to the current locale
|
|
|
|
|
|
//DBG( printf( "chils size:%lu\n", childs.size() ) );
|
|
|
|
if( GetMaster()->IsOpenGlAllowed() )
|
|
{
|
|
for( unsigned int idx = 0; idx < childs.size(); idx++ )
|
|
{
|
|
childs[idx]->openGL_RenderAllChilds();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
int VRML2_MODEL_PARSER::read_Transform()
|
|
{
|
|
char text[128];
|
|
|
|
//DBG( printf( "Transform\n" ) );
|
|
|
|
while( GetNextTag( m_file, text ) )
|
|
{
|
|
if ( ( text == NULL ) || ( *text == ']' ) )
|
|
{
|
|
continue;
|
|
}
|
|
if ( ( *text == '}' ) )
|
|
{
|
|
//DBG( printf( " } Exit Transform\n" ) );
|
|
break;
|
|
}
|
|
if( strcmp( text, "translation" ) == 0 )
|
|
{
|
|
parseVertex( m_file, m_model->m_translation );
|
|
}
|
|
else if( strcmp( text, "rotation" ) == 0 )
|
|
{
|
|
if( fscanf( m_file, "%f %f %f %f", &m_model->m_rotation[0],
|
|
&m_model->m_rotation[1],
|
|
&m_model->m_rotation[2],
|
|
&m_model->m_rotation[3] ) != 4 )
|
|
{
|
|
// !TODO: log errors
|
|
m_model->m_rotation[0] = 0.0f;
|
|
m_model->m_rotation[1] = 0.0f;
|
|
m_model->m_rotation[2] = 0.0f;
|
|
m_model->m_rotation[3] = 0.0f;
|
|
}
|
|
else
|
|
{
|
|
m_model->m_rotation[3] = m_model->m_rotation[3] * 180.0f / 3.14f; // !TODO: use constants or functions
|
|
}
|
|
}
|
|
else if( strcmp( text, "scale" ) == 0 )
|
|
{
|
|
parseVertex( m_file, m_model->m_scale );
|
|
}
|
|
else if( strcmp( text, "scaleOrientation" ) == 0 )
|
|
{
|
|
// this m_scaleOrientation is not implemented, but it will be parsed
|
|
if( fscanf( m_file, "%f %f %f %f", &m_model->m_scaleOrientation[0],
|
|
&m_model->m_scaleOrientation[1],
|
|
&m_model->m_scaleOrientation[2],
|
|
&m_model->m_scaleOrientation[3] ) != 4 )
|
|
{
|
|
// !TODO: log errors
|
|
m_model->m_scaleOrientation[0] = 0.0f;
|
|
m_model->m_scaleOrientation[1] = 0.0f;
|
|
m_model->m_scaleOrientation[2] = 0.0f;
|
|
m_model->m_scaleOrientation[3] = 0.0f;
|
|
}
|
|
}
|
|
else if( strcmp( text, "center" ) == 0 )
|
|
{
|
|
parseVertex( m_file, m_model->m_center );
|
|
}
|
|
else if( strcmp( text, "children" ) == 0 )
|
|
{
|
|
// skip
|
|
}
|
|
else if( strcmp( text, "Switch" ) == 0 )
|
|
{
|
|
// skip
|
|
}
|
|
else if( strcmp( text, "whichChoice" ) == 0 )
|
|
{
|
|
int dummy;
|
|
if( fscanf( m_file, "%d", &dummy ) != 1 )
|
|
{
|
|
// !TODO: log errors
|
|
}
|
|
}
|
|
else if( strcmp( text, "choice" ) == 0 )
|
|
{
|
|
// skip
|
|
}
|
|
else if( strcmp( text, "Group" ) == 0 )
|
|
{
|
|
// skip
|
|
}
|
|
else if( strcmp( text, "Shape" ) == 0 )
|
|
{
|
|
S3D_MESH *parent = m_model;
|
|
|
|
S3D_MESH *new_mesh_model = new S3D_MESH();
|
|
|
|
m_model->childs.push_back( new_mesh_model );
|
|
|
|
m_model = new_mesh_model;
|
|
|
|
read_Shape();
|
|
|
|
m_model = parent;
|
|
|
|
}
|
|
else if( strcmp( text, "DEF" ) == 0 )
|
|
{
|
|
read_DEF();
|
|
}
|
|
else
|
|
{
|
|
DBG( printf( " %s NotImplemented\n", text ) );
|
|
read_NotImplemented( m_file, '}' );
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
int VRML2_MODEL_PARSER::read_DEF()
|
|
{
|
|
char text[128];
|
|
|
|
GetNextTag( m_file, text);
|
|
//DBG( printf( "DEF %s ", text ) );
|
|
|
|
while( GetNextTag( m_file, text ) )
|
|
{
|
|
if( ( text == NULL ) || ( *text == ']' ) )
|
|
{
|
|
//DBG( printf( " skiping %c\n", *text) );
|
|
continue;
|
|
}
|
|
|
|
if( ( *text == '}' ) )
|
|
{
|
|
//DBG( printf( " } Exit DEF\n") );
|
|
return 0;
|
|
}
|
|
|
|
if( strcmp( text, "Transform" ) == 0 )
|
|
{
|
|
return read_Transform ();
|
|
} else if( strcmp( text, "children" ) == 0 )
|
|
{
|
|
// skip
|
|
}
|
|
else if( strcmp( text, "Switch" ) == 0 )
|
|
{
|
|
// skip
|
|
}
|
|
else if( strcmp( text, "whichChoice" ) == 0 )
|
|
{
|
|
// skip
|
|
}
|
|
else if( strcmp( text, "choice" ) == 0 )
|
|
{
|
|
// skip
|
|
}
|
|
else if( strcmp( text, "Shape" ) == 0 )
|
|
{
|
|
S3D_MESH *parent = m_model;
|
|
S3D_MESH *new_mesh_model = new S3D_MESH();
|
|
m_model->childs.push_back( new_mesh_model );
|
|
|
|
m_model = new_mesh_model;
|
|
read_Shape();
|
|
m_model = parent;
|
|
}
|
|
}
|
|
|
|
DBG( printf( " DEF failed\n" ) );
|
|
return -1;
|
|
}
|
|
|
|
|
|
int VRML2_MODEL_PARSER::read_Shape()
|
|
{
|
|
char text[128];
|
|
|
|
//DBG( printf( " Shape\n") );
|
|
|
|
while( GetNextTag( m_file, text ) )
|
|
{
|
|
if ( ( text == NULL ) || ( *text == ']' ) )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if ( ( *text == '}' ) )
|
|
{
|
|
//DBG( printf( " } Exit Shape\n") );
|
|
return 0;
|
|
}
|
|
|
|
if( strcmp( text, "appearance" ) == 0 )
|
|
{
|
|
//skip
|
|
}
|
|
else if( strcmp( text, "Appearance" ) == 0 )
|
|
{
|
|
read_Appearance();
|
|
}
|
|
else if( strcmp( text, "geometry" ) == 0 )
|
|
{
|
|
//skip
|
|
}
|
|
else if( strcmp( text, "IndexedFaceSet" ) == 0 )
|
|
{
|
|
read_IndexedFaceSet();
|
|
}
|
|
else
|
|
{
|
|
DBG( printf( " %s NotImplemented\n", text ) );
|
|
read_NotImplemented( m_file, '}' );
|
|
}
|
|
}
|
|
|
|
DBG( printf( " Shape failed\n") );
|
|
return -1;
|
|
}
|
|
|
|
|
|
int VRML2_MODEL_PARSER::read_Appearance()
|
|
{
|
|
char text[128];
|
|
|
|
//DBG( printf( " Appearance\n") );
|
|
|
|
while( GetNextTag( m_file, text ) )
|
|
{
|
|
if ( ( text == NULL ) || ( *text == ']' ) )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if ( ( *text == '}' ) )
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if( strcmp( text, "material" ) == 0 )
|
|
{
|
|
read_material();
|
|
}
|
|
}
|
|
|
|
DBG( printf( " Appearance failed\n") );
|
|
return -1;
|
|
}
|
|
|
|
|
|
int VRML2_MODEL_PARSER::read_material()
|
|
{
|
|
S3D_MATERIAL* material = NULL;
|
|
char text[128];
|
|
|
|
//DBG( printf( " material ") );
|
|
|
|
if( GetNextTag( m_file, text ) )
|
|
{
|
|
if( strcmp( text, "Material" ) == 0 )
|
|
{
|
|
wxString mat_name;
|
|
material = new S3D_MATERIAL( GetMaster(), mat_name );
|
|
GetMaster()->Insert( material );
|
|
m_model->m_Materials = material;
|
|
|
|
if( strcmp( text, "Material" ) == 0 )
|
|
{
|
|
return read_Material();
|
|
}
|
|
}
|
|
else if( strcmp( text, "DEF" ) == 0 )
|
|
{
|
|
//DBG( printf( "DEF") );
|
|
|
|
if( GetNextTag( m_file, text ) )
|
|
{
|
|
//DBG( printf( "%s", text ) );
|
|
|
|
wxString mat_name;
|
|
mat_name = FROM_UTF8( text );
|
|
|
|
material = new S3D_MATERIAL( GetMaster(), mat_name );
|
|
GetMaster()->Insert( material );
|
|
m_model->m_Materials = material;
|
|
|
|
if( GetNextTag( m_file, text ) )
|
|
{
|
|
if( strcmp( text, "Material" ) == 0 )
|
|
{
|
|
return read_Material();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if( strcmp( text, "USE" ) == 0 )
|
|
{
|
|
//DBG( printf( "USE") );
|
|
|
|
if( GetNextTag( m_file, text ) )
|
|
{
|
|
//DBG( printf( "%s\n", text ) );
|
|
|
|
wxString mat_name;
|
|
mat_name = FROM_UTF8( text );
|
|
|
|
for( material = GetMaster()->m_Materials; material; material = material->Next() )
|
|
{
|
|
if( material->m_Name == mat_name )
|
|
{
|
|
m_model->m_Materials = material;
|
|
return 0;
|
|
}
|
|
}
|
|
DBG( printf( " read_material error: material not found\n" ) );
|
|
}
|
|
}
|
|
}
|
|
|
|
DBG( printf( " failed material\n") );
|
|
return -1;
|
|
}
|
|
|
|
|
|
int VRML2_MODEL_PARSER::read_Material()
|
|
{
|
|
char text[128];
|
|
glm::vec3 vertex;
|
|
|
|
//DBG( printf( " Material\n") );
|
|
|
|
while( GetNextTag( m_file, text ) )
|
|
{
|
|
if ( ( text == NULL ) || ( *text == ']' ) )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if ( ( *text == '}' ) )
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if( strcmp( text, "diffuseColor" ) == 0 )
|
|
{
|
|
//DBG( printf( " diffuseColor") );
|
|
parseVertex ( m_file, vertex);
|
|
//DBG( printf( "\n") );
|
|
m_model->m_Materials->m_DiffuseColor.push_back( vertex );
|
|
} else if( strcmp( text, "emissiveColor" ) == 0 )
|
|
{
|
|
//DBG( printf( " emissiveColor") );
|
|
parseVertex ( m_file, vertex);
|
|
//DBG( printf( "\n") );
|
|
if( GetMaster()->m_use_modelfile_emissiveColor == true )
|
|
{
|
|
m_model->m_Materials->m_EmissiveColor.push_back( vertex );
|
|
}
|
|
}
|
|
else if( strcmp( text, "specularColor" ) == 0 )
|
|
{
|
|
//DBG( printf( " specularColor") );
|
|
parseVertex ( m_file, vertex);
|
|
//DBG( printf( "\n") );
|
|
|
|
if( GetMaster()->m_use_modelfile_specularColor == true )
|
|
{
|
|
m_model->m_Materials->m_SpecularColor.push_back( vertex );
|
|
}
|
|
}
|
|
else if( strcmp( text, "ambientIntensity" ) == 0 )
|
|
{
|
|
float ambientIntensity;
|
|
parseFloat( m_file, &ambientIntensity );
|
|
//DBG( printf( " ambientIntensity %f\n", ambientIntensity) );
|
|
|
|
if( GetMaster()->m_use_modelfile_ambientIntensity == true )
|
|
{
|
|
m_model->m_Materials->m_AmbientColor.push_back( glm::vec3( ambientIntensity, ambientIntensity, ambientIntensity ) );
|
|
}
|
|
}
|
|
else if( strcmp( text, "transparency" ) == 0 )
|
|
{
|
|
float transparency;
|
|
parseFloat( m_file, &transparency );
|
|
//DBG( printf( " transparency %f\n", transparency) );
|
|
|
|
if( GetMaster()->m_use_modelfile_transparency == true )
|
|
{
|
|
m_model->m_Materials->m_Transparency.push_back( transparency );
|
|
}
|
|
}
|
|
else if( strcmp( text, "shininess" ) == 0 )
|
|
{
|
|
float shininess;
|
|
parseFloat( m_file, &shininess );
|
|
|
|
//DBG( printf( " shininess %f\n", shininess) );
|
|
// VRML value is normalized and openGL expects a value 0 - 128
|
|
if( GetMaster()->m_use_modelfile_shininess == true )
|
|
{
|
|
shininess = shininess * 128.0f;
|
|
m_model->m_Materials->m_Shininess.push_back( shininess );
|
|
}
|
|
}
|
|
}
|
|
|
|
DBG( printf( " Material failed\n") );
|
|
return -1;
|
|
}
|
|
|
|
|
|
int VRML2_MODEL_PARSER::read_IndexedFaceSet()
|
|
{
|
|
char text[128];
|
|
|
|
//DBG( printf( " IndexedFaceSet\n") );
|
|
|
|
m_normalPerVertex = false;
|
|
colorPerVertex = false;
|
|
|
|
while( GetNextTag( m_file, text ) )
|
|
{
|
|
if ( ( text == NULL ) || ( *text == ']' ) )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if ( ( *text == '}' ) )
|
|
{
|
|
//DBG( printf( " } Exit IndexedFaceSet\n") );
|
|
return 0;
|
|
}
|
|
|
|
if( strcmp( text, "normalPerVertex" ) == 0 )
|
|
{
|
|
if( GetNextTag( m_file, text ) )
|
|
{
|
|
if( strcmp( text, "TRUE" ) == 0 )
|
|
{
|
|
//DBG( printf( " m_normalPerVertex TRUE\n") );
|
|
m_normalPerVertex = true;
|
|
}
|
|
}
|
|
}
|
|
else if( strcmp( text, "colorPerVertex" ) == 0 )
|
|
{
|
|
GetNextTag( m_file, text );
|
|
if( strcmp( text, "TRUE" ) )
|
|
{
|
|
//DBG( printf( " colorPerVertex = true\n") );
|
|
colorPerVertex = true;
|
|
}
|
|
else
|
|
{
|
|
colorPerVertex = false;
|
|
}
|
|
|
|
}
|
|
else if( strcmp( text, "Coordinate" ) == 0 )
|
|
{
|
|
read_Coordinate();
|
|
}
|
|
else if( strcmp( text, "Normal" ) == 0 )
|
|
{
|
|
read_Normal();
|
|
}
|
|
else if( strcmp( text, "normalIndex" ) == 0 )
|
|
{
|
|
read_NormalIndex();
|
|
}
|
|
else if( strcmp( text, "Color" ) == 0 )
|
|
{
|
|
read_Color();
|
|
}
|
|
else if( strcmp( text, "coordIndex" ) == 0 )
|
|
{
|
|
read_coordIndex();
|
|
}
|
|
else if( strcmp( text, "colorIndex" ) == 0 )
|
|
{
|
|
read_colorIndex();
|
|
}
|
|
|
|
}
|
|
|
|
DBG( printf( " IndexedFaceSet failed %s\n", text) );
|
|
return -1;
|
|
}
|
|
|
|
|
|
int VRML2_MODEL_PARSER::read_colorIndex()
|
|
{
|
|
//DBG( printf( " read_colorIndex\n" ) );
|
|
|
|
m_model->m_MaterialIndex.clear();
|
|
|
|
if( colorPerVertex == true )
|
|
{
|
|
int index;
|
|
int first_index;
|
|
while( fscanf( m_file, "%d, ", &index ) )
|
|
{
|
|
if( index == -1 )
|
|
{
|
|
// it only implemented color per face, so it will store as the first in the list
|
|
m_model->m_MaterialIndex.push_back( first_index );
|
|
}
|
|
else
|
|
{
|
|
first_index = index;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
int index;
|
|
|
|
while( fscanf( m_file, "%d,", &index ) )
|
|
{
|
|
m_model->m_MaterialIndex.push_back( index );
|
|
}
|
|
}
|
|
|
|
//DBG( printf( " m_MaterialIndex.size: %ld\n", m_model->m_MaterialIndex.size() ) );
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
int VRML2_MODEL_PARSER::read_NormalIndex()
|
|
{
|
|
//DBG( printf( " read_NormalIndex\n" ) );
|
|
|
|
m_model->m_NormalIndex.clear();
|
|
|
|
glm::ivec3 coord;
|
|
|
|
int dummy; // should be -1
|
|
|
|
std::vector<int> coord_list;
|
|
coord_list.clear();
|
|
while( fscanf (m_file, "%d, ", &dummy ) == 1 )
|
|
{
|
|
if( dummy == -1 )
|
|
{
|
|
m_model->m_NormalIndex.push_back( coord_list );
|
|
//DBG( printf( " size: %lu ", coord_list.size()) );
|
|
coord_list.clear();
|
|
}
|
|
else
|
|
{
|
|
coord_list.push_back( dummy );
|
|
//DBG( printf( "%d ", dummy) );
|
|
}
|
|
}
|
|
|
|
//DBG( printf( " m_NormalIndex.size: %ld\n", m_model->m_NormalIndex.size() ) );
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
int VRML2_MODEL_PARSER::read_coordIndex()
|
|
{
|
|
//DBG( printf( " read_coordIndex\n" ) );
|
|
|
|
m_model->m_CoordIndex.clear();
|
|
|
|
glm::ivec3 coord;
|
|
|
|
int dummy; // should be -1
|
|
|
|
std::vector<int> coord_list;
|
|
coord_list.clear();
|
|
while( fscanf (m_file, "%d, ", &dummy ) == 1 )
|
|
{
|
|
if( dummy == -1 )
|
|
{
|
|
m_model->m_CoordIndex.push_back( coord_list );
|
|
//DBG( printf( " size: %lu ", coord_list.size()) );
|
|
coord_list.clear();
|
|
}
|
|
else
|
|
{
|
|
coord_list.push_back( dummy );
|
|
//DBG( printf( "%d ", dummy) );
|
|
}
|
|
}
|
|
|
|
//DBG( printf( " m_CoordIndex.size: %ld\n", m_model->m_CoordIndex.size() ) );
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
int VRML2_MODEL_PARSER::read_Color()
|
|
{
|
|
char text[128];
|
|
|
|
//DBG( printf( " read_Color\n") );
|
|
|
|
while( GetNextTag( m_file, text ) )
|
|
{
|
|
if ( ( text == NULL ) || ( *text == ']' ) )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if ( ( *text == '}' ) )
|
|
{
|
|
//DBG( printf( " m_DiffuseColor.size: %ld\n", m_model->m_Materials->m_DiffuseColor.size() ) );
|
|
return 0;
|
|
}
|
|
|
|
if( strcmp( text, "color" ) == 0 )
|
|
{
|
|
parseVertexList( m_file, m_model->m_Materials->m_DiffuseColor );
|
|
}
|
|
}
|
|
|
|
//DBG( printf( " read_Color failed\n") );
|
|
return -1;
|
|
}
|
|
|
|
|
|
|
|
|
|
int VRML2_MODEL_PARSER::read_Normal()
|
|
{
|
|
char text[128];
|
|
|
|
//DBG( printf( " Normal\n") );
|
|
|
|
while( GetNextTag( m_file, text ) )
|
|
{
|
|
if ( ( text == NULL ) || ( *text == ']' ) )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if ( ( *text == '}' ) )
|
|
{
|
|
//DBG( printf( " m_PerFaceNormalsNormalized.size: %lu\n", m_model->m_PerFaceNormalsNormalized.size() ) );
|
|
return 0;
|
|
}
|
|
|
|
if( strcmp( text, "vector" ) == 0 )
|
|
{
|
|
if(m_normalPerVertex == false )
|
|
{
|
|
parseVertexList( m_file, m_model->m_PerFaceNormalsNormalized );
|
|
}
|
|
else
|
|
{
|
|
parseVertexList( m_file, m_model->m_PerVertexNormalsNormalized );
|
|
|
|
//DBG( printf( " m_PerVertexNormalsNormalized.size: %lu\n", m_model->m_PerVertexNormalsNormalized.size() ) );
|
|
}
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
|
|
int VRML2_MODEL_PARSER::read_Coordinate()
|
|
{
|
|
char text[128];
|
|
|
|
//DBG( printf( " Coordinate\n") );
|
|
|
|
while( GetNextTag( m_file, text ) )
|
|
{
|
|
if ( ( text == NULL ) || ( *text == ']' ) )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if ( ( *text == '}' ) )
|
|
{
|
|
//DBG( printf( " m_Point.size: %lu\n", m_model->m_Point.size() ) );
|
|
return 0;
|
|
}
|
|
|
|
if( strcmp( text, "point" ) == 0 )
|
|
{
|
|
parseVertexList( m_file, m_model->m_Point);
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|