Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
K
kicad-source-mirror
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
kicad-source-mirror
Commits
73005087
Commit
73005087
authored
Jul 31, 2014
by
unknown
Committed by
jean-pierre charras
Jul 31, 2014
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
3d_viewer fix translation and rotation issues (patch from Mario Luzeiro)
parent
34b645da
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
100 additions
and
43 deletions
+100
-43
3d_draw.cpp
3d-viewer/3d_draw.cpp
+11
-8
3d_draw_basic_functions.cpp
3d-viewer/3d_draw_basic_functions.cpp
+9
-2
3d_material.cpp
3d-viewer/3d_material.cpp
+2
-2
3d_mesh_model.cpp
3d-viewer/3d_mesh_model.cpp
+15
-2
3d_mesh_model.h
3d-viewer/3d_mesh_model.h
+1
-0
modelparsers.h
3d-viewer/modelparsers.h
+1
-0
vrml_v1_modelparser.cpp
3d-viewer/vrml_v1_modelparser.cpp
+6
-6
vrml_v2_modelparser.cpp
3d-viewer/vrml_v2_modelparser.cpp
+40
-10
vrmlmodelparser.cpp
3d-viewer/vrmlmodelparser.cpp
+2
-2
x3dmodelparser.cpp
3d-viewer/x3dmodelparser.cpp
+13
-11
No files found.
3d-viewer/3d_draw.cpp
View file @
73005087
...
...
@@ -424,7 +424,7 @@ void EDA_3D_CANVAS::Redraw()
// Initialize Projection Matrix for Ortographic View
glOrtho
(
-
size
.
x
/
orthoReductionFactor
,
size
.
x
/
orthoReductionFactor
,
-
size
.
y
/
orthoReductionFactor
,
size
.
y
/
orthoReductionFactor
,
1
,
10
0
);
-
size
.
y
/
orthoReductionFactor
,
size
.
y
/
orthoReductionFactor
,
1
,
10
);
}
else
{
...
...
@@ -432,7 +432,7 @@ void EDA_3D_CANVAS::Redraw()
double
ratio_HV
=
(
double
)
size
.
x
/
size
.
y
;
// Initialize Projection Matrix for Perspective View
gluPerspective
(
45.0
*
g_Parm_3D_Visu
.
m_Zoom
,
ratio_HV
,
1
,
10
0
);
gluPerspective
(
45.0
*
g_Parm_3D_Visu
.
m_Zoom
,
ratio_HV
,
1
,
10
);
}
// position viewer
...
...
@@ -979,7 +979,7 @@ void EDA_3D_CANVAS::BuildBoard3DView(GLuint aBoardList, GLuint aBodyOnlyList)
if
(
g_Parm_3D_Visu
.
IsRealisticMode
()
)
{
SetGLEpoxyColor
(
0.9
);
SetGLEpoxyColor
(
1.0
);
if
(
g_Parm_3D_Visu
.
HightQualityMode
()
)
{
SetGLTexture
(
m_text_pcb
,
35.0
f
);
...
...
@@ -1400,7 +1400,7 @@ void EDA_3D_CANVAS::CreateDrawGL_List()
m_glLists
[
GL_ID_BOARD
]
=
glGenLists
(
1
);
m_glLists
[
GL_ID_BODY
]
=
glGenLists
(
1
);
BuildBoard3DView
(
m_glLists
[
GL_ID_BOARD
],
m_glLists
[
GL_ID_BODY
]);
CheckGLError
(
__FILE__
,
__LINE__
);
}
if
(
!
m_glLists
[
GL_ID_TECH_LAYERS
]
)
...
...
@@ -1409,6 +1409,7 @@ void EDA_3D_CANVAS::CreateDrawGL_List()
glNewList
(
m_glLists
[
GL_ID_TECH_LAYERS
],
GL_COMPILE
);
BuildTechLayers3DView
();
glEndList
();
CheckGLError
(
__FILE__
,
__LINE__
);
}
if
(
!
m_glLists
[
GL_ID_AUX_LAYERS
]
)
...
...
@@ -1417,9 +1418,9 @@ void EDA_3D_CANVAS::CreateDrawGL_List()
glNewList
(
m_glLists
[
GL_ID_AUX_LAYERS
],
GL_COMPILE
);
BuildBoard3DAuxLayers
();
glEndList
();
CheckGLError
(
__FILE__
,
__LINE__
);
}
// draw modules 3D shapes
if
(
!
m_glLists
[
GL_ID_3DSHAPES_SOLID_FRONT
]
&&
g_Parm_3D_Visu
.
GetFlag
(
FL_MODULE
)
)
{
...
...
@@ -1434,14 +1435,16 @@ void EDA_3D_CANVAS::CreateDrawGL_List()
BuildFootprintShape3DList
(
m_glLists
[
GL_ID_3DSHAPES_SOLID_FRONT
],
m_glLists
[
GL_ID_3DSHAPES_TRANSP_FRONT
],
false
);
CheckGLError
(
__FILE__
,
__LINE__
);
m_glLists
[
GL_ID_SHADOW_FRONT
]
=
glGenLists
(
1
);
m_glLists
[
GL_ID_SHADOW_BACK
]
=
glGenLists
(
1
);
m_glLists
[
GL_ID_SHADOW_BOARD
]
=
glGenLists
(
1
);
BuildShadowList
(
m_glLists
[
GL_ID_SHADOW_FRONT
],
m_glLists
[
GL_ID_SHADOW_BACK
],
m_glLists
[
GL_ID_SHADOW_BOARD
]);
}
// Test for errors
CheckGLError
(
__FILE__
,
__LINE__
);
CheckGLError
(
__FILE__
,
__LINE__
);
}
#ifdef PRINT_CALCULATION_TIME
unsigned
endtime
=
GetRunningMicroSecs
();
...
...
3d-viewer/3d_draw_basic_functions.cpp
View file @
73005087
...
...
@@ -51,12 +51,12 @@ static void CALLBACK tessCPolyPt2Vertex( const GLvoid* data );
// 2 helper functions to set the current normal vector for gle items
static
inline
void
SetNormalZpos
()
{
glNormal3f
(
0.0
,
0.0
,
1.0
);
//
glNormal3f( 0.0, 0.0, 1.0 );
}
static
inline
void
SetNormalZneg
()
{
glNormal3f
(
0.0
,
0.0
,
-
1.0
);
//
glNormal3f( 0.0, 0.0, -1.0 );
}
void
TransfertToGLlist
(
std
::
vector
<
S3D_VERTEX
>&
aVertices
,
double
aBiuTo3DUnits
);
...
...
@@ -185,6 +185,10 @@ void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
startContour
=
0
;
}
// https://www.opengl.org/sdk/docs/man2/xhtml/gluTessNormal.xml
gluTessNormal
(
tess
,
0.0
,
0.0
,
0.0
);
v_data
[
0
]
=
polylist
.
GetX
(
ii
)
*
aBiuTo3DUnits
;
v_data
[
1
]
=
-
polylist
.
GetY
(
ii
)
*
aBiuTo3DUnits
;
// gluTessVertex store pointers on data, not data, so do not store
...
...
@@ -193,6 +197,7 @@ void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
// before calling gluDeleteTess
gluTessVertex
(
tess
,
v_data
,
&
polylist
[
ii
]
);
if
(
polylist
.
IsEndContour
(
ii
)
)
{
gluTessEndContour
(
tess
);
...
...
@@ -215,7 +220,9 @@ void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
gluDeleteTess
(
tess
);
if
(
aThickness
==
0
)
{
return
;
}
// Build the 3D data : vertical side
Draw3D_VerticalPolygonalCylinder
(
polylist
,
aThickness
,
aZpos
-
(
aThickness
/
2.0
),
false
,
aBiuTo3DUnits
);
...
...
3d-viewer/3d_material.cpp
View file @
73005087
...
...
@@ -54,10 +54,10 @@ S3D_MATERIAL::S3D_MATERIAL( S3D_MASTER* father, const wxString& name ) :
void
SetOpenGlDefaultMaterial
()
{
glm
::
vec4
ambient
(
0.
2
,
0.2
,
0.2
,
1.0
);
glm
::
vec4
ambient
(
0.
15
,
0.15
,
0.15
,
1.0
);
glm
::
vec4
specular
(
0.1
,
0.1
,
0.1
,
1.0
);
glm
::
vec4
emissive
(
0.1
,
0.1
,
0.1
,
1.0
);
GLint
shininess_value
=
10
0
;
GLint
shininess_value
=
8
0
;
glColorMaterial
(
GL_FRONT_AND_BACK
,
GL_AMBIENT_AND_DIFFUSE
);
//glColor4f( 1.0, 1.0, 1.0, 1.0 );
...
...
3d-viewer/3d_mesh_model.cpp
View file @
73005087
...
...
@@ -57,6 +57,8 @@ S3D_MESH::~S3D_MESH()
void
S3D_MESH
::
openGL_RenderAllChilds
()
{
//DBG( printf( "openGL_RenderAllChilds") );
glPushMatrix
();
glTranslatef
(
m_translation
.
x
,
m_translation
.
y
,
m_translation
.
z
);
glRotatef
(
m_rotation
[
3
],
m_rotation
[
0
],
m_rotation
[
1
],
m_rotation
[
2
]
);
...
...
@@ -76,12 +78,13 @@ void S3D_MESH::openGL_RenderAllChilds()
SetOpenGlDefaultMaterial
();
glPopMatrix
();
}
void
S3D_MESH
::
openGL_Render
()
{
//DBG( printf( "
render\n
" ) );
//DBG( printf( "
openGL_Render
" ) );
if
(
m_Materials
)
{
...
...
@@ -90,6 +93,7 @@ void S3D_MESH::openGL_Render()
if
(
m_CoordIndex
.
size
()
==
0
)
{
return
;
}
...
...
@@ -134,7 +138,7 @@ void S3D_MESH::openGL_Render()
{
for
(
unsigned
int
ii
=
0
;
ii
<
m_CoordIndex
[
idx
].
size
();
ii
++
)
{
glm
::
vec3
normal
=
m_PerVertexNormalsNormalized
[
m_
Coord
Index
[
idx
][
ii
]];
glm
::
vec3
normal
=
m_PerVertexNormalsNormalized
[
m_
Normal
Index
[
idx
][
ii
]];
glNormal3fv
(
&
normal
.
x
);
glm
::
vec3
point
=
m_Point
[
m_CoordIndex
[
idx
][
ii
]];
...
...
@@ -176,6 +180,8 @@ void S3D_MESH::openGL_Render()
void
S3D_MESH
::
calcPointNormalized
()
{
//DBG( printf( "calcPointNormalized\n" ) );
if
(
isPointNormalizedComputed
==
true
)
{
return
;
...
...
@@ -221,8 +227,11 @@ bool IsClockwise(glm::vec3 v0, glm::vec3 v1, glm::vec3 v2)
void
S3D_MESH
::
calcPerFaceNormals
()
{
//DBG( printf( "calcPerFaceNormals" ) );
if
(
isPerFaceNormalsComputed
==
true
)
{
return
;
}
isPerFaceNormalsComputed
=
true
;
...
...
@@ -230,6 +239,7 @@ void S3D_MESH::calcPerFaceNormals ()
if
(
m_PerVertexNormalsNormalized
.
size
()
>
0
)
{
return
;
}
...
...
@@ -317,12 +327,15 @@ void S3D_MESH::calcPerFaceNormals ()
}
}
}
// http://www.bytehazard.com/code/vertnorm.html
// http://www.emeyex.com/site/tuts/VertexNormals.pdf
void
S3D_MESH
::
calcPerPointNormals
()
{
//DBG( printf( "calcPerPointNormals" ) );
if
(
isPerPointNormalsComputed
==
true
)
{
return
;
...
...
3d-viewer/3d_mesh_model.h
View file @
73005087
...
...
@@ -66,6 +66,7 @@ public:
// Point and index list
std
::
vector
<
glm
::
vec3
>
m_Point
;
std
::
vector
<
std
::
vector
<
int
>
>
m_CoordIndex
;
std
::
vector
<
std
::
vector
<
int
>
>
m_NormalIndex
;
std
::
vector
<
glm
::
vec3
>
m_PerFaceNormalsNormalized
;
std
::
vector
<
glm
::
vec3
>
m_PerVertexNormalsNormalized
;
...
...
3d-viewer/modelparsers.h
View file @
73005087
...
...
@@ -167,6 +167,7 @@ private:
int
read_IndexedFaceSet
();
int
read_Coordinate
();
int
read_Normal
();
int
read_NormalIndex
();
int
read_Color
();
int
read_coordIndex
();
int
read_colorIndex
();
...
...
3d-viewer/vrml_v1_modelparser.cpp
View file @
73005087
...
...
@@ -68,6 +68,9 @@ void VRML1_MODEL_PARSER::Load( const wxString aFilename )
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
);
...
...
@@ -78,14 +81,11 @@ void VRML1_MODEL_PARSER::Load( const wxString aFilename )
//glPushMatrix();
glTranslatef
(
matPos
.
x
*
SCALE_3D_CONV
,
matPos
.
y
*
SCALE_3D_CONV
,
matPos
.
z
*
SCALE_3D_CONV
);
glRotatef
(
matRot
.
z
,
0.0
f
,
0.0
f
,
1.0
f
);
glRotatef
(
matRot
.
y
,
0.0
f
,
1.0
f
,
0.0
f
);
glRotatef
(
matRot
.
x
,
1.0
f
,
0.0
f
,
0.0
f
);
glRotatef
(
-
matRot
.
z
,
0.0
f
,
0.0
f
,
1.0
f
);
glRotatef
(
-
matRot
.
y
,
0.0
f
,
1.0
f
,
0.0
f
);
glRotatef
(
-
matRot
.
x
,
1.0
f
,
0.0
f
,
0.0
f
);
glScalef
(
matScale
.
x
,
matScale
.
y
,
matScale
.
z
);
float
vrmlunits_to_3Dunits
=
g_Parm_3D_Visu
.
m_BiuTo3Dunits
*
UNITS3D_TO_UNITSPCB
;
glScalef
(
vrmlunits_to_3Dunits
,
vrmlunits_to_3Dunits
,
vrmlunits_to_3Dunits
);
// Switch the locale to standard C (needed to print floating point numbers like 1.3)
SetLocaleTo_C_standard
();
...
...
3d-viewer/vrml_v2_modelparser.cpp
View file @
73005087
...
...
@@ -70,6 +70,9 @@ void VRML2_MODEL_PARSER::Load( const wxString aFilename )
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
);
...
...
@@ -80,14 +83,11 @@ void VRML2_MODEL_PARSER::Load( const wxString aFilename )
//glPushMatrix();
glTranslatef
(
matPos
.
x
*
SCALE_3D_CONV
,
matPos
.
y
*
SCALE_3D_CONV
,
matPos
.
z
*
SCALE_3D_CONV
);
glRotatef
(
matRot
.
z
,
0.0
f
,
0.0
f
,
1.0
f
);
glRotatef
(
matRot
.
y
,
0.0
f
,
1.0
f
,
0.0
f
);
glRotatef
(
matRot
.
x
,
1.0
f
,
0.0
f
,
0.0
f
);
glRotatef
(
-
matRot
.
z
,
0.0
f
,
0.0
f
,
1.0
f
);
glRotatef
(
-
matRot
.
y
,
0.0
f
,
1.0
f
,
0.0
f
);
glRotatef
(
-
matRot
.
x
,
1.0
f
,
0.0
f
,
0.0
f
);
glScalef
(
matScale
.
x
,
matScale
.
y
,
matScale
.
z
);
float
vrmlunits_to_3Dunits
=
g_Parm_3D_Visu
.
m_BiuTo3Dunits
*
UNITS3D_TO_UNITSPCB
;
glScalef
(
vrmlunits_to_3Dunits
,
vrmlunits_to_3Dunits
,
vrmlunits_to_3Dunits
);
// Switch the locale to standard C (needed to print floating point numbers like 1.3)
SetLocaleTo_C_standard
();
...
...
@@ -546,12 +546,10 @@ int VRML2_MODEL_PARSER::read_IndexedFaceSet()
read_Coordinate
();
}
else
if
(
strcmp
(
text
,
"Normal"
)
==
0
)
{
//read_Normal();
read_NotImplemented
(
m_file
,
'}'
);
read_Normal
();
}
else
if
(
strcmp
(
text
,
"normalIndex"
)
==
0
)
{
//DBG( printf( " normalIndex NotImplemented\n" ) );
read_NotImplemented
(
m_file
,
']'
);
read_NormalIndex
();
}
else
if
(
strcmp
(
text
,
"Color"
)
==
0
)
{
read_Color
();
...
...
@@ -606,6 +604,38 @@ int VRML2_MODEL_PARSER::read_colorIndex()
}
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" ) );
...
...
3d-viewer/vrmlmodelparser.cpp
View file @
73005087
...
...
@@ -64,7 +64,7 @@ void VRML_MODEL_PARSER::Load( const wxString aFilename )
char
line
[
12
];
FILE
*
file
;
//
DBG( printf( "Load %s\n
", static_cast<const char*>(aFilename.mb_str()) ) );
//
DBG( printf( "Load %s
", static_cast<const char*>(aFilename.mb_str()) ) );
file
=
wxFopen
(
aFilename
,
wxT
(
"rt"
)
);
...
...
@@ -86,7 +86,7 @@ void VRML_MODEL_PARSER::Load( const wxString aFilename )
{
//DBG( printf( "About to parser a #VRML V2.0 file\n" ) );
vrml2_parser
->
Load
(
aFilename
);
return
;
}
else
if
(
stricmp
(
line
,
"#VRML V1.0"
)
==
0
)
...
...
3d-viewer/x3dmodelparser.cpp
View file @
73005087
...
...
@@ -69,18 +69,23 @@ void X3D_MODEL_PARSER::Load( const wxString aFilename )
glShadeModel
(
GL_SMOOTH
);
glEnable
(
GL_NORMALIZE
);
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
);
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
);
//glPushMatrix();
glTranslatef
(
matPos
.
x
,
matPos
.
y
,
matPos
.
z
);
#define SCALE_3D_CONV ((IU_PER_MILS * 1000.0f) / UNITS3D_TO_UNITSPCB)
glRotatef
(
matRot
.
z
,
0.0
f
,
0.0
f
,
1.0
f
);
glRotatef
(
matRot
.
y
,
0.0
f
,
1.0
f
,
0.0
f
);
glRotatef
(
matRot
.
x
,
1.0
f
,
0.0
f
,
0.0
f
);
//glPushMatrix();
glTranslatef
(
matPos
.
x
*
SCALE_3D_CONV
,
matPos
.
y
*
SCALE_3D_CONV
,
matPos
.
z
*
SCALE_3D_CONV
);
glRotatef
(
-
matRot
.
z
,
0.0
f
,
0.0
f
,
1.0
f
);
glRotatef
(
-
matRot
.
y
,
0.0
f
,
1.0
f
,
0.0
f
);
glRotatef
(
-
matRot
.
x
,
1.0
f
,
0.0
f
,
0.0
f
);
glScalef
(
matScale
.
x
,
matScale
.
y
,
matScale
.
z
);
// Switch the locale to standard C (needed to print floating point numbers)
...
...
@@ -502,9 +507,6 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
//triplets.push_back(point);
double
vrmlunits_to_3Dunits
=
g_Parm_3D_Visu
.
m_BiuTo3Dunits
*
UNITS3D_TO_UNITSPCB
;
point
*=
vrmlunits_to_3Dunits
;
m_model
->
m_Point
.
push_back
(
point
);
// VRML
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment