35#include <libFreeWRL.h>
37#include "../vrml_parser/Structs.h"
38#include "../vrml_parser/CRoutes.h"
39#include "../main/headers.h"
40#include "../opengl/Frustum.h"
41#include "../opengl/Material.h"
42#include "../opengl/OpenGL_Utils.h"
43#include "Component_Shape.h"
44#include "../scenegraph/RenderFuncs.h"
45#include "../scenegraph/Polyrep.h"
57 prep_BBox((
struct BBoxFields*)&node->bboxCenter);
58 if (node->shape != NULL) render_node(node->shape);
79 RETURN_FROM_CHILD_IF_NOT_FOR_ME
81 prep_sibAffectors((
struct X3D_Node*)node,&node->__sibAffectors);
82 prep_BBox((
struct BBoxFields*)&node->bboxCenter);
84 normalChildren(node->_sortedChildren);
87 fin_sibAffectors((
struct X3D_Node*)node,&node->__sibAffectors);
92 REINITIALIZE_SORTED_NODES_FIELD(node->children,node->_sortedChildren);
117 prep_BBox((
struct BBoxFields*)&node->bboxCenter);
120 for (i=0; i<node->children.n; i++) {
121 if (i >= node->visibles.n) render_node(node->children.p[i]);
122 else if (node->visibles.p[i])
123 render_node(node->children.p[i]);
146 if(!renderstate()->render_vp) {
148 push_transform_local_identity();
149 if (node->__do_anything) {
153 FW_GL_LOAD_IDENTITY();
156 if (node->__do_trans)
157 FW_GL_TRANSLATE_F(node->translation.c[0],node->translation.c[1],node->translation.c[2]);
160 if (node->__do_center)
161 FW_GL_TRANSLATE_F(node->center.c[0],node->center.c[1],node->center.c[2]);
165 if (node->__do_rotation) {
166 FW_GL_ROTATE_RADIANS(node->rotation.c[3], node->rotation.c[0],node->rotation.c[1],node->rotation.c[2]);
170 if (node->__do_scaleO) {
171 FW_GL_ROTATE_RADIANS(node->scaleOrientation.c[3], node->scaleOrientation.c[0], node->scaleOrientation.c[1],node->scaleOrientation.c[2]);
175 if (node->__do_scale)
176 FW_GL_SCALE_F(node->scale.c[0],node->scale.c[1],node->scale.c[2]);
179 if (node->__do_scaleO)
180 FW_GL_ROTATE_RADIANS(-node->scaleOrientation.c[3], node->scaleOrientation.c[0], node->scaleOrientation.c[1],node->scaleOrientation.c[2]);
183 if (node->__do_center)
184 FW_GL_TRANSLATE_F(-node->center.c[0],-node->center.c[1],-node->center.c[2]);
188 FW_GL_GETDOUBLEV(GL_MODELVIEW_MATRIX,mat);
190 FW_GL_TRANSFORM_D(mat);
191 reset_transform_local(mat);
203 RETURN_FROM_CHILD_IF_NOT_FOR_ME
209 prep_sibAffectors((
struct X3D_Node*)node,&node->__sibAffectors);
211 prep_BBox((
struct BBoxFields*)&node->bboxCenter);
212 normalChildren(node->_sortedChildren);
215 fin_sibAffectors((
struct X3D_Node*)node,&node->__sibAffectors);
223 node->__do_center = verify_translate ((GLfloat *)node->center.c);
224 node->__do_trans = verify_translate ((GLfloat *)node->translation.c);
225 node->__do_scale = verify_scale ((GLfloat *)node->scale.c);
226 node->__do_rotation = verify_rotate ((GLfloat *)node->rotation.c);
227 node->__do_scaleO = verify_rotate ((GLfloat *)node->scaleOrientation.c);
229 node->__do_anything = (node->__do_center ||
232 node->__do_rotation ||
235 REINITIALIZE_SORTED_NODES_FIELD(node->children,node->_sortedChildren);
242 if(!renderstate()->render_vp) {
243 pop_transform_local();
244 if (node->__do_anything) {
248 if((node->_renderFlags & VF_Viewpoint) == VF_Viewpoint) {
249 FW_GL_TRANSLATE_F(((node->center).c[0]),((node->center).c[1]),((node->center).c[2])
251 FW_GL_ROTATE_RADIANS(((node->scaleOrientation).c[3]),((node->scaleOrientation).c[0]),((node->scaleOrientation).c[1]),((node->scaleOrientation).c[2])
253 FW_GL_SCALE_F((
float)1.0/(((node->scale).c[0])),(
float)1.0/(((node->scale).c[1])),(
float)1.0/(((node->scale).c[2]))
255 FW_GL_ROTATE_RADIANS(-(((node->scaleOrientation).c[3])),((node->scaleOrientation).c[0]),((node->scaleOrientation).c[1]),((node->scaleOrientation).c[2])
257 FW_GL_ROTATE_RADIANS(-(((node->rotation).c[3])),((node->rotation).c[0]),((node->rotation).c[1]),((node->rotation).c[2])
259 FW_GL_TRANSLATE_F(-(((node->center).c[0])),-(((node->center).c[1])),-(((node->center).c[2]))
261 FW_GL_TRANSLATE_F(-(((node->translation).c[0])),-(((node->translation).c[1])),-(((node->translation).c[2]))
278 if (!compile_poly_if_required(node, node->coord, node->fogCoord, node->color, node->normal, node->texCoord))
return;
279 CULL_FACE(node->solid)
280 render_polyrep(node);
292 if (!compile_poly_if_required(node, node->coord, node->fogCoord, node->color, node->normal, node->texCoord))
return;
293 CULL_FACE(node->solid)
294 render_polyrep(node);