30 #include <system_threads.h>
35 #include <libFreeWRL.h>
40 #include "../vrml_parser/Structs.h"
41 #include "../main/headers.h"
42 #include "../main/ProdCon.h"
43 #include "../vrml_parser/CParseGeneral.h"
44 #include "../scenegraph/Vector.h"
45 #include "../vrml_parser/CFieldDecls.h"
46 #include "../vrml_parser/CParseParser.h"
47 #include "../vrml_parser/CParseLexer.h"
48 #include "../vrml_parser/CParse.h"
49 #include "../vrml_parser/CRoutes.h"
50 #include "../scenegraph/quaternion.h"
51 #include "../scenegraph/Viewer.h"
52 #include "../scenegraph/sounds.h"
53 #include "../scenegraph/LinearAlgebra.h"
54 #include "../scenegraph/Component_KeyDevice.h"
55 #include "../input/EAIHeaders.h"
56 #include "../input/InputFunctions.h"
58 #include "../opengl/Material.h"
59 #include "../scenegraph/Component_Core.h"
60 #include "../scenegraph/Component_Networking.h"
61 #include "LoadTextures.h"
62 #include "OpenGL_Utils.h"
64 #include "../scenegraph/RenderFuncs.h"
65 #include "../scenegraph/Component_Shape.h"
68 #include "../x3d_parser/Bindable.h"
70 #include "../ui/common.h"
72 void kill_rendering(
void);
76 static void mesa_Frustum(GLDOUBLE left, GLDOUBLE right, GLDOUBLE bottom, GLDOUBLE top, GLDOUBLE nearZ, GLDOUBLE farZ, GLDOUBLE *m);
78 #undef DEBUG_FW_LOADMAT
79 #ifdef DEBUG_FW_LOADMAT
80 static void fw_glLoadMatrixd(GLDOUBLE *val,
char *,
int);
81 #define FW_GL_LOADMATRIX(aaa) fw_glLoadMatrixd(aaa,__FILE__,__LINE__);
83 static void fw_glLoadMatrixd(GLDOUBLE *val);
84 #define FW_GL_LOADMATRIX(aaa) fw_glLoadMatrixd(aaa);
97 static void mesa_Ortho(GLDOUBLE left, GLDOUBLE right, GLDOUBLE bottom, GLDOUBLE top, GLDOUBLE nearZ, GLDOUBLE farZ, GLDOUBLE *m);
108 #define LOCK_MEMORYTABLE pthread_mutex_lock(&p->memtablelock);
109 #define UNLOCK_MEMORYTABLE pthread_mutex_unlock(&p->memtablelock);
116 #define MAX_LARGE_MATRIX_STACK 256
117 #define MAX_SMALL_MATRIX_STACK 9
118 #define MATRIX_SIZE 16
119 typedef GLDOUBLE MATRIX4[MATRIX_SIZE];
123 OLDCODE#ifdef DISABLER
124 OLDCODEvoid fwl_glGenQueries(GLsizei n, GLuint* ids)
126 OLDCODE#
if defined(IPHONE)
129 OLDCODE rdr_caps = tg->display.rdr_caps;
130 OLDCODE if (rdr_caps->have_GL_VERSION_3_0)
132 OLDCODE glGenQueries(n, ids);
136 OLDCODE glGenQueriesEXT(n, ids);
139 OLDCODE glGenQueries(n, ids);
142 OLDCODEvoid fwl_glDeleteQueries(GLsizei n,
const GLuint* ids)
144 OLDCODE#
if defined(IPHONE)
147 OLDCODE rdr_caps = tg->display.rdr_caps;
148 OLDCODE if (rdr_caps->have_GL_VERSION_3_0)
150 OLDCODE glDeleteQueries(n, ids);
154 OLDCODE glDeleteQueriesEXT(n, ids);
157 OLDCODE glDeleteQueries(n, ids);
160 OLDCODEvoid fwl_glGetQueryObjectuiv(GLuint
id, GLenum pname, GLuint* params)
162 OLDCODE#
if defined(IPHONE)
165 OLDCODE rdr_caps = tg->display.rdr_caps;
166 OLDCODE if (rdr_caps->have_GL_VERSION_3_0)
168 OLDCODE glGetQueryObjectuiv(
id, pname, params);
172 OLDCODE glGetQueryObjectuivEXT(
id, pname, params);
175 OLDCODE glGetQueryObjectuiv(
id, pname, params);
185 struct Vector *linearNodeTable;
187 int potentialHoleCount;
189 float cc_red, cc_green, cc_blue, cc_alpha;
190 pthread_mutex_t memtablelock;
191 MATRIX4 FW_ModelView[MAX_LARGE_MATRIX_STACK];
192 MATRIX4 FW_ProjectionView[MAX_SMALL_MATRIX_STACK];
193 MATRIX4 FW_TextureView[MAX_SMALL_MATRIX_STACK];
196 int projectionviewTOS;
201 GLDOUBLE *currentMatrix;
206 struct Vector *myShaderTable;
207 int userDefinedShaderCount;
208 char *userDefinedFragmentShader[MAX_USER_DEFINED_SHADERS];
209 char *userDefinedVertexShader[MAX_USER_DEFINED_SHADERS];
215 void *OpenGL_Utils_constructor(){
220 void OpenGL_Utils_init(
struct tOpenGL_Utils *t)
224 t->displayDepth = 24;
227 t->cc_changed = FALSE;
230 t->prv = OpenGL_Utils_constructor();
233 p->linearNodeTable = NULL;
234 p->potentialHoleCount = 0;
240 pthread_mutex_init(&(p->memtablelock), NULL);
244 p->projectionviewTOS = 0;
245 p->textureviewTOS = 0;
248 p->whichMode = GL_MODELVIEW;
249 p->currentMatrix = p->FW_ModelView[0];
252 loadIdentityMatrix(p->FW_ModelView[0]);
253 loadIdentityMatrix(p->FW_ProjectionView[0]);
254 loadIdentityMatrix(p->FW_TextureView[0]);
262 p->userDefinedShaderCount = 0;
269 void OpenGL_Utils_clear(
struct tOpenGL_Utils *t)
275 deleteVector(
struct X3D_Node*,p->linearNodeTable);
276 if(p->myShaderTable){
278 for(i=0;i<vectorSize(p->myShaderTable);i++){
280 FREE_IF_NZ(entry->myCapabilities);
288 GLEWContext * glewGetContext()
295 GLDOUBLE *getPickrayMatrix(
int index)
300 bstack = getActiveBindableStacks(tg);
301 return bstack->pickraymatrix[index];
303 void setPickrayMatrix(
int index, GLDOUBLE *mat)
308 bstack = getActiveBindableStacks(tg);
309 memcpy(bstack->pickraymatrix[index],mat,16*
sizeof(GLDOUBLE));
313 void kill_userDefinedShaders() {
320 p->userDefinedShaderCount = 0;
324 for (i=0; i<MAX_USER_DEFINED_SHADERS; i++) {
327 FREE_IF_NZ (p->userDefinedFragmentShader[i]);
328 FREE_IF_NZ (p->userDefinedVertexShader[i]);
331 for (i=0; i <vectorSize(p->myShaderTable); i++) {
333 FREE_IF_NZ(me->myCapabilities);
341 p->myShaderTable->n = 0;
346 int getNextFreeUserDefinedShaderSlot() {
352 p->userDefinedShaderCount++;
353 if (p->userDefinedShaderCount == MAX_USER_DEFINED_SHADERS)
return -1;
355 rv = p->userDefinedShaderCount;
361 void sendShaderTextToEngine(
int ste,
int parts,
char ** vertSource,
char ** fragSource) {
371 for (i=0; i<parts; i++) {
373 if (vertSource[i] != NULL) vs=vertSource[i];
374 if (fragSource[i] != NULL) fs=fragSource[i];
378 p->userDefinedFragmentShader[ste] = fs;
379 p->userDefinedVertexShader[ste] = vs;
383 #if defined (_ANDROID)
397 void fwl_decomposeShape(
struct X3D_Shape * node,
406 struct X3D_Node * geom = node->geometry;
409 *fpptr = NULL; *lpptr = NULL; *matptr = NULL; *texptr = NULL;
410 *texttptr = NULL; *geomptr = NULL;
412 POSSIBLE_PROTO_EXPANSION(
struct X3D_Appearance *,X3D_NODE(app),app);
413 POSSIBLE_PROTO_EXPANSION(
struct X3D_Node*,geom,geom);
424 POSSIBLE_PROTO_EXPANSION(
struct X3D_Material *,X3D_NODE(mat),*matptr);
430 POSSIBLE_PROTO_EXPANSION(
struct X3D_Node *,geom,*geomptr);
439 int fwl_android_get_valid_shapeNodes(
struct Vector **shapeNodes) {
448 if (*shapeNodes == NULL) {
449 *shapeNodes = newVector (
struct X3D_Shape *, 16);
453 if (p==NULL)
return 0;
454 if (p->linearNodeTable==NULL)
return 0;
461 for (tc=0; tc<vectorSize(p->linearNodeTable); tc++){
462 struct X3D_Node *node = vector_get(
struct X3D_Node *,p->linearNodeTable, tc);
467 POSSIBLE_PROTO_EXPANSION (
struct X3D_Node *,node,node);
470 if ((node->_nodeType == NODE_Shape) && (node->referenceCount>0)) {
471 struct X3D_Node *geom = X3D_SHAPE(node)->geometry;
475 POSSIBLE_PROTO_EXPANSION (
struct X3D_Node *, geom, geom);
477 if ((geom->_nodeType != NODE_IndexedLineSet) &&
478 (geom->_nodeType != NODE_LineSet) &&
479 (geom->_nodeType != NODE_PointSet)) {
482 vector_pushBack(
struct X3D_Node *,me, node);
515 return vectorSize(me);
522 void fwl_android_zero_shapeNodeTable(
struct Vector **shapeNodes) {
523 if (*shapeNodes == NULL) {
524 *shapeNodes = newVector (
struct X3D_Shape *, 16);
527 vectorSize(*shapeNodes) = 0;
537 int fwl_get_FillPropStatus(
struct Vector **shapeNodes,
int whichEntry) {
550 if (vectorSize(*shapeNodes) == 0 ) {
551 if (fwl_android_get_valid_shapeNodes(shapeNodes) == 0)
return FALSE;
556 struct X3D_Node *node = vector_get(
struct X3D_Node *,*shapeNodes, whichEntry);
558 fwl_decomposeShape(X3D_SHAPE(node),&fp,&lp,&mat,&tex,&tt,&geom);
562 return (fp->_enabled);
567 void fwl_set_FillPropStatus (
struct Vector **shapeNodes,
int whichEntry,
int yesNo,
float fillScale) {
578 if (vectorSize(*shapeNodes) == 0 ) {
579 if (fwl_android_get_valid_shapeNodes(shapeNodes) == 0)
return;
584 struct X3D_Node *node = vector_get(
struct X3D_Node *,*shapeNodes, whichEntry);
587 fwl_decomposeShape(X3D_SHAPE(node),&fp,&lp,&mat,&tex,&tt,&geom);
593 if (X3D_SHAPE(node)->appearance == NULL) {
595 ap = createNewX3DNode(NODE_Appearance);
596 AddRemoveSFNodeFieldChild(node,
597 offsetPointer_deref(
struct X3D_Node **,node,offsetof (
struct X3D_Shape, appearance)),
598 X3D_NODE(ap),0,__FILE__,__LINE__);
600 mat = createNewX3DNode(NODE_Material);
601 AddRemoveSFNodeFieldChild(X3D_NODE(ap),
603 X3D_NODE(mat),0,__FILE__,__LINE__);
607 ap = X3D_APPEARANCE(X3D_SHAPE(node)->appearance);
612 if (ap->fillProperties == NULL) {
614 fp = X3D_FILLPROPERTIES(createNewX3DNode(NODE_FillProperties));
615 AddRemoveSFNodeFieldChild(X3D_NODE(ap),
617 X3D_NODE(fp),0,__FILE__,__LINE__);
620 fp = X3D_FILLPROPERTIES(ap->fillProperties);
622 if (fp->_nodeType == NODE_FillProperties) fp->_enabled = TRUE;
626 fp->_hatchScale.c[0] = fillScale;
627 fp->_hatchScale.c[1] = fillScale;
635 ap = X3D_APPEARANCE(X3D_SHAPE(node)->appearance);
637 if (ap->fillProperties != NULL) {
640 if (fp->_nodeType == NODE_FillProperties) fp->_enabled = FALSE;
649 int fwl_get_FillPropHatched(
struct Vector **shapeNodes,
int whichEntry) {
658 if (vectorSize(*shapeNodes) == 0 ) {
663 struct X3D_Node *node = vector_get(
struct X3D_Node *,*shapeNodes, whichEntry);
664 fwl_decomposeShape(X3D_SHAPE(node),&fp,&lp,&mat,&tex,&tt,&geom);
666 return (fp->hatched);
670 void fwl_set_FillPropHatched (
struct Vector **shapeNodes,
int whichEntry,
int yesNo) {
680 if (vectorSize(*shapeNodes) == 0 ) {
685 struct X3D_Node *node = vector_get(
struct X3D_Node *,*shapeNodes, whichEntry);
686 fwl_decomposeShape(X3D_SHAPE(node),&fp,&lp,&mat,&tex,&tt,&geom);
688 if (fp!=NULL) fp->hatched = yesNo;
692 int fwl_get_FillPropFilled(
struct Vector **shapeNodes,
int whichEntry) {
701 if (vectorSize(*shapeNodes) == 0 ) {
706 struct X3D_Node *node = vector_get(
struct X3D_Node *,*shapeNodes, whichEntry);
707 fwl_decomposeShape(X3D_SHAPE(node),&fp,&lp,&mat,&tex,&tt,&geom);
713 void fwl_set_FillPropFilled (
struct Vector **shapeNodes,
int whichEntry,
int yesNo) {
723 if (vectorSize(*shapeNodes) == 0 ) {
728 struct X3D_Node *node = vector_get(
struct X3D_Node *,*shapeNodes, whichEntry);
729 fwl_decomposeShape(X3D_SHAPE(node),&fp,&lp,&mat,&tex,&tt,&geom);
731 if (fp!=NULL) fp->filled = yesNo;
736 int fwl_get_FillPropStyle(
struct Vector **shapeNodes,
int whichEntry) {
745 if (vectorSize(*shapeNodes) == 0 ) {
750 struct X3D_Node *node = vector_get(
struct X3D_Node *,*shapeNodes, whichEntry);
751 fwl_decomposeShape(X3D_SHAPE(node),&fp,&lp,&mat,&tex,&tt,&geom);
753 if (fp==NULL)
return 0;
754 return (fp->hatchStyle);
758 void fwl_set_FillPropStyle (
struct Vector **shapeNodes,
int whichEntry,
int which) {
768 if (vectorSize(*shapeNodes) == 0 ) {
773 struct X3D_Node *node = vector_get(
struct X3D_Node *,*shapeNodes, whichEntry);
774 fwl_decomposeShape(X3D_SHAPE(node),&fp,&lp,&mat,&tex,&tt,&geom);
776 if (fp!=NULL) fp->hatchStyle = which;
781 int fwl_get_FillPropColour(
struct Vector **shapeNodes,
int whichEntry) {
791 if (vectorSize(*shapeNodes) == 0 ) {
796 struct X3D_Node *node = vector_get(
struct X3D_Node *,*shapeNodes, whichEntry);
797 fwl_decomposeShape(X3D_SHAPE(node),&fp,&lp,&mat,&tex,&tt,&geom);
799 #define CLAMP(value, min, max) (((value) >(max)) ? (max) : (((value) <(min)) ? (min) : (value)))
800 if (fp==NULL)
return 0;
802 integer_colour = 0xFF000000 + (
803 ((uint8_t)(255.0f *CLAMP(fp->hatchColor.c[0], 0.0, 1.0)) <<16) |
804 ((uint8_t)(255.0f *CLAMP(fp->hatchColor.c[1], 0.0, 1.0)) <<8) |
805 ((uint8_t)(255.0f *CLAMP(fp->hatchColor.c[2], 0.0, 1.0))));
808 return (integer_colour);
812 void fwl_set_FillPropColour (
struct Vector **shapeNodes,
int whichEntry,
int argbColour) {
822 if (vectorSize(*shapeNodes) == 0 ) {
827 struct X3D_Node *node = vector_get(
struct X3D_Node *,*shapeNodes, whichEntry);
828 fwl_decomposeShape(X3D_SHAPE(node),&fp,&lp,&mat,&tex,&tt,&geom);
831 fp->hatchColor.c[0] =CLAMP(((
float)((argbColour &0xff0000) >>16)) /255.0, 0.0, 1.0);
832 fp->hatchColor.c[1] =CLAMP(((
float)((argbColour &0x00ff00) >>8)) /255.0, 0.0, 1.0);
833 fp->hatchColor.c[2] =CLAMP(((
float)((argbColour &0x0000ff))) /255.0, 0.0, 1.0);
846 int fwl_set_MaterialExisting(
struct Vector **shapeNodes,
int whichEntry) {
856 int twoSided = FALSE;
860 if (vectorSize(*shapeNodes) == 0 ) {
861 if (fwl_android_get_valid_shapeNodes(shapeNodes) == 0)
return FALSE;
866 struct X3D_Node *node = vector_get(
struct X3D_Node *,*shapeNodes, whichEntry);
869 fwl_decomposeShape(X3D_SHAPE(node),&fp,&lp,&mat,&tex,&tt,&geom);
873 if (X3D_SHAPE(node)->appearance == NULL) {
875 ap = createNewX3DNode(NODE_Appearance);
876 AddRemoveSFNodeFieldChild(node,
877 offsetPointer_deref(
struct X3D_Node **,node,offsetof (
struct X3D_Shape, appearance)),
878 X3D_NODE(ap),0,__FILE__,__LINE__);
880 mat = createNewX3DNode(NODE_TwoSidedMaterial);
881 AddRemoveSFNodeFieldChild(X3D_NODE(ap),
883 X3D_NODE(mat),0,__FILE__,__LINE__);
886 ap = X3D_APPEARANCE(X3D_SHAPE(node)->appearance);
892 if (ap->material == NULL) {
894 tsm = X3D_TWOSIDEDMATERIAL(createNewX3DNode(NODE_TwoSidedMaterial));
895 AddRemoveSFNodeFieldChild(X3D_NODE(ap),
897 X3D_NODE(tsm),0,__FILE__,__LINE__);
900 tsm = X3D_TWOSIDEDMATERIAL(ap->material);
904 if (tsm->_nodeType != NODE_TwoSidedMaterial) {
907 if (mat->_nodeType == NODE_Material) {
909 ntsm->ambientIntensity = mat->ambientIntensity;
910 ntsm->backAmbientIntensity = mat->ambientIntensity;
911 ntsm->shininess = mat->shininess;
912 ntsm->backShininess = mat->shininess;
913 ntsm->transparency = mat->transparency;
914 ntsm->backTransparency = mat->transparency;
915 memcpy((
void *)&ntsm->diffuseColor, (
void *)&mat->diffuseColor,
sizeof(
struct SFColor));
916 memcpy((
void *)&ntsm->backDiffuseColor, (
void *)&mat->diffuseColor,
sizeof(
struct SFColor));
917 memcpy((
void *)&ntsm->emissiveColor, (
void *)&mat->emissiveColor,
sizeof(
struct SFColor));
918 memcpy((
void *)&ntsm->backEmissiveColor, (
void *)&mat->emissiveColor,
sizeof(
struct SFColor));
919 memcpy((
void *)&ntsm->specularColor, (
void *)&mat->specularColor,
sizeof(
struct SFColor));
920 memcpy((
void *)&ntsm->backSpecularColor, (
void *)&mat->specularColor,
sizeof(
struct SFColor));
921 ntsm->separateBackColor=FALSE;
923 ConsoleMessage (
"somehow the Material is not a node of Material type for this node");
927 AddRemoveSFNodeFieldChild(X3D_NODE(ap),
929 X3D_NODE(ntsm),0,__FILE__,__LINE__);
932 twoSided = X3D_TWOSIDEDMATERIAL(tsm)->separateBackColor;
958 int fwl_get_MaterialColourValue(
struct Vector **shapeNodes,
int whichEntry,
int whichValue) {
970 if (vectorSize(*shapeNodes) == 0 ) {
971 if (fwl_android_get_valid_shapeNodes(shapeNodes) == 0)
return 0;
976 struct X3D_Node *node = vector_get(
struct X3D_Node *,*shapeNodes, whichEntry);
979 fwl_decomposeShape(X3D_SHAPE(node),&fp,&lp,&mat,&tex,&tt,&geom);
981 if (mat == NULL)
return 0;
983 if (mat->_nodeType == NODE_TwoSidedMaterial) {
986 switch (whichValue) {
987 case 0: col = &tmat->diffuseColor;
break;
988 case 1: col = &tmat->emissiveColor;
break;
989 case 2: col = &tmat->specularColor;
break;
990 case 3: col = &tmat->backDiffuseColor;
break;
991 case 4: col = &tmat->backEmissiveColor;
break;
992 case 5: col = &tmat->backSpecularColor;
break;
997 integer_colour = 0xFF000000 + (
998 ((uint8_t)(255.0f *CLAMP(col->c[0], 0.0, 1.0)) <<16) |
999 ((uint8_t)(255.0f *CLAMP(col->c[1], 0.0, 1.0)) <<8) |
1000 ((uint8_t)(255.0f *CLAMP(col->c[2], 0.0, 1.0))));
1002 return integer_colour;
1005 ConsoleMessage (
"getMaterialValue, expected a TwoSidedMaterial, not a %s\n",stringNodeType(mat->_nodeType));
1011 void fwl_set_TwoSidedMaterialStatus(
struct Vector **shapeNodes,
int whichEntry,
int oneTwo) {
1021 if (vectorSize(*shapeNodes) == 0 ) {
1026 struct X3D_Node *node = vector_get(
struct X3D_Node *,*shapeNodes, whichEntry);
1027 fwl_decomposeShape(X3D_SHAPE(node),&fp,&lp,&mat,&tex,&tt,&geom);
1029 if (mat == NULL)
return;
1030 if (mat->_nodeType == NODE_TwoSidedMaterial) {
1032 X3D_TWOSIDEDMATERIAL(mat)->separateBackColor = oneTwo;
1038 void fwl_set_MaterialColourValue (
struct Vector **shapeNodes,
int whichEntry,
int whichValue,
int argbColour) {
1048 if (vectorSize(*shapeNodes) == 0 ) {
1053 struct X3D_Node *node = vector_get(
struct X3D_Node *,*shapeNodes, whichEntry);
1054 fwl_decomposeShape(X3D_SHAPE(node),&fp,&lp,&mat,&tex,&tt,&geom);
1056 if (mat == NULL)
return;
1057 if (mat->_nodeType == NODE_TwoSidedMaterial) {
1060 switch (whichValue) {
1061 case 0: col = &tmat->diffuseColor;
break;
1062 case 1: col = &tmat->emissiveColor;
break;
1063 case 2: col = &tmat->specularColor;
break;
1064 case 3: col = &tmat->backDiffuseColor;
break;
1065 case 4: col = &tmat->backEmissiveColor;
break;
1066 case 5: col = &tmat->backSpecularColor;
break;
1070 col->c[0] =CLAMP(((
float)((argbColour &0xff0000) >>16)) /255.0, 0.0, 1.0);
1071 col->c[1] =CLAMP(((
float)((argbColour &0x00ff00) >>8)) /255.0, 0.0, 1.0);
1072 col->c[2] =CLAMP(((
float)((argbColour &0x0000ff))) /255.0, 0.0, 1.0);
1085 int fwl_get_MaterialFloatValue(
struct Vector **shapeNodes,
int whichEntry,
int whichSide,
int whichField) {
1099 if (vectorSize(*shapeNodes) == 0 ) {
1100 if (fwl_android_get_valid_shapeNodes(shapeNodes) == 0)
return 0;
1105 struct X3D_Node *node = vector_get(
struct X3D_Node *,*shapeNodes, whichEntry);
1108 fwl_decomposeShape(X3D_SHAPE(node),&fp,&lp,&mat,&tex,&tt,&geom);
1110 if (mat == NULL)
return 0;
1112 if (mat->_nodeType == NODE_TwoSidedMaterial) {
1116 switch (whichField) {
1117 case 1: fcol = tmat->shininess;
break;
1118 case 2: fcol = tmat->transparency;
break;
1119 case 3: fcol = tmat->ambientIntensity;
break;
1121 ConsoleMessage (
"hmmm - expect 1-3, got %d",whichField);
1126 switch (whichField) {
1127 case 1: fcol = tmat->backShininess;
break;
1128 case 2: fcol = tmat->backTransparency;
break;
1129 case 3: fcol = tmat->backAmbientIntensity;
break;
1131 ConsoleMessage (
"hmmm - expect 1-3, got %d",whichField);
1137 return (
int)(fcol*100.0);
1139 ConsoleMessage (
"getMaterialValue, expected a TwoSidedMaterial, not a %s\n",stringNodeType(mat->_nodeType));
1145 void fwl_set_MaterialFloatValue(
struct Vector **shapeNodes,
int whichEntry,
int whichSide,
int whichField,
int nv) {
1159 if (vectorSize(*shapeNodes) == 0 ) {
1160 if (fwl_android_get_valid_shapeNodes(shapeNodes) == 0)
return;
1165 struct X3D_Node *node = vector_get(
struct X3D_Node *,*shapeNodes, whichEntry);
1168 fwl_decomposeShape(X3D_SHAPE(node),&fp,&lp,&mat,&tex,&tt,&geom);
1170 if (mat == NULL)
return;
1172 if (mat->_nodeType == NODE_TwoSidedMaterial) {
1174 float nnv = CLAMP(((
float)nv)/100.0,0.0,1.0);
1177 switch (whichField) {
1178 case 1: tmat->shininess=nnv;
break;
1179 case 2: tmat->transparency=nnv;
break;
1180 case 3: tmat->ambientIntensity=nnv;
break;
1182 ConsoleMessage (
"hmmm - expect 1-3, got %d",whichField);
1186 switch (whichField) {
1187 case 1: tmat->backShininess=nnv;
break;
1188 case 2: tmat->backTransparency=nnv;
break;
1189 case 3: tmat->backAmbientIntensity=nnv;
break;
1191 ConsoleMessage (
"hmmm - expect 1-3, got %d",whichField);
1197 ConsoleMessage (
"getMaterialValue, expected a TwoSidedMaterial, not a %s\n",stringNodeType(mat->_nodeType));
1202 OLDCODE#undef JASTESTING
1203 OLDCODE#ifdef JASTESTING
1207 OLDCODEvoid printNodeMemoryTable(
void) {
1212 OLDCODE
int foundHoleCount = 0;
1214 OLDCODE LOCK_MEMORYTABLE
1215 OLDCODE
for (tc=0; tc<vectorSize(p->linearNodeTable); tc++){
1216 OLDCODE
struct X3D_Node *node = vector_get(
struct X3D_Node *,p->linearNodeTable,tc);
1218 OLDCODE
if (node != NULL) {
1219 OLDCODE
if (node->_nodeType == NODE_Shape) {
1221 OLDCODE
struct X3D_Shape *sh = X3D_SHAPE(node);
1222 OLDCODE
if (sh->appearance != NULL) {
1223 OLDCODE
struct X3D_Appearance *ap = X3D_APPEARANCE(sh->appearance);
1225 OLDCODE
if (ap->material != NULL) {
1227 OLDCODE
struct X3D_Material *mt = X3D_MATERIAL(ap->material);
1237 OLDCODE mt->transparency += 0.05;
1238 OLDCODE
if (mt->transparency > 1.0) mt->transparency=0.0;
1239 OLDCODE mt->_change ++;
1254 OLDCODE foundHoleCount ++;
1260 OLDCODE UNLOCK_MEMORYTABLE
1268 #define TURN_OFF_SHOULDSORTCHILDREN node->_renderFlags = node->_renderFlags & (0xFFFF^ VF_shouldSortChildren);
1278 OLDCODEvoid fwl_set_glClearColor (
float red ,
float green ,
float blue ,
float alpha) {
1282 OLDCODE p->cc_red = red; p->cc_green = green ; p->cc_blue = blue ; p->cc_alpha = alpha ;
1283 OLDCODE tg->OpenGL_Utils.cc_changed = TRUE;
1286 OLDCODEvoid setglClearColor (
float *val) {
1290 OLDCODE p->cc_red = *val; val++;
1291 OLDCODE p->cc_green = *val; val++;
1292 OLDCODE p->cc_blue = *val;
1299 OLDCODE tg->OpenGL_Utils.cc_changed = TRUE;
1304 void fwl_setShadingStyle(
int val) {
1309 p->shadingStyle = val;
1311 int fwl_getShadingStyle() {
1315 return p->shadingStyle;
1321 OLDCODEvoid fwl_set_phongShading (
int val) {
1325 OLDCODE
if(val) fwl_setShadingStyle(2);
1326 OLDCODE
else fwl_setShadingStyle(1);
1329 OLDCODEint fwl_get_phongShading () {
1333 OLDCODE
return fwl_getShadingStyle() == 2 ? TRUE : FALSE;
1367 static void shaderErrorLog(GLuint myShader,
char *which) {
1368 #if defined (GL_VERSION_2_0) || defined (GL_ES_VERSION_2_0)
1369 #define MAX_INFO_LOG_SIZE 512
1370 GLchar infoLog[MAX_INFO_LOG_SIZE];
1371 char outline[MAX_INFO_LOG_SIZE*2];
1372 glGetShaderInfoLog(myShader, MAX_INFO_LOG_SIZE, NULL, infoLog);
1373 sprintf(outline,
"problem with %s shader: %s",which, infoLog);
1374 ConsoleMessage (outline);
1376 ConsoleMessage (
"Problem compiling shader");
1389 #ifdef GL_SHADER_COMPILER
1391 static bool haveDoneThis =
false;
1400 struct Vector *myShaderTable = p->myShaderTable;
1406 for (i=0; i<vectorSize(myShaderTable); i++) {
1409 if(me->whichOne.volume == rq_cap0.volume && me->whichOne.effects == rq_cap0.effects){
1410 return me->myCapabilities;
1413 if (me->whichOne.base == rq_cap0.base && me->whichOne.effects == rq_cap0.effects && me->whichOne.usershaders == rq_cap0.usershaders) {
1415 return me->myCapabilities;
1436 #ifdef GL_SHADER_COMPILER
1437 glGetBooleanv(GL_SHADER_COMPILER,&b);
1438 if (!haveDoneThis) {
1439 haveDoneThis =
true;
1443 ConsoleMessage(
"no shader compiler\n");
1452 #if defined (GL_SHADER_COMPILER) && defined (GL_HIGH_FLOAT)
1455 GLint range[2]; GLint precision;
1458 ConsoleMessage(
"starting getMyShader");
1460 glGetBooleanv(GL_SHADER_COMPILER,&b);
1461 if (b) ConsoleMessage(
"have shader compiler");
else ConsoleMessage(
"NO SHADER COMPILER");
1464 glGetShaderPrecisionFormat(GL_VERTEX_SHADER,GL_LOW_FLOAT, range, &precision);
1465 ConsoleMessage (
"GL_VERTEX_SHADER, GL_LOW_FLOAT range [%d,%d],precision %d",range[0],range[1],precision);
1466 glGetShaderPrecisionFormat(GL_VERTEX_SHADER,GL_MEDIUM_FLOAT, range, &precision);
1467 ConsoleMessage (
"GL_VERTEX_SHADER, GL_MEDIUM_FLOAT range [%d,%d],precision %d",range[0],range[1],precision);
1468 glGetShaderPrecisionFormat(GL_VERTEX_SHADER,GL_HIGH_FLOAT, range, &precision);
1469 ConsoleMessage (
"GL_VERTEX_SHADER, GL_HIGH_FLOAT range [%d,%d],precision %d",range[0],range[1],precision);
1471 glGetShaderPrecisionFormat(GL_VERTEX_SHADER,GL_LOW_INT, range, &precision);
1472 ConsoleMessage (
"GL_VERTEX_SHADER, GL_LOW_INT range [%d,%d],precision %d",range[0],range[1],precision);
1473 glGetShaderPrecisionFormat(GL_VERTEX_SHADER,GL_MEDIUM_INT, range, &precision);
1474 ConsoleMessage (
"GL_VERTEX_SHADER, GL_MEDIUM_INT range [%d,%d],precision %d",range[0],range[1],precision);
1475 glGetShaderPrecisionFormat(GL_VERTEX_SHADER,GL_HIGH_INT, range, &precision);
1476 ConsoleMessage (
"GL_VERTEX_SHADER, GL_HIGH_INT range [%d,%d],precision %d",range[0],range[1],precision);
1478 glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER,GL_LOW_FLOAT, range, &precision);
1479 ConsoleMessage (
"GL_FRAGMENT_SHADER, GL_LOW_FLOAT range [%d,%d],precision %d",range[0],range[1],precision);
1480 glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER,GL_MEDIUM_FLOAT, range, &precision);
1481 ConsoleMessage (
"GL_FRAGMENT_SHADER, GL_MEDIUM_FLOAT range [%d,%d],precision %d",range[0],range[1],precision);
1482 glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER,GL_HIGH_FLOAT, range, &precision);
1483 ConsoleMessage (
"GL_FRAGMENT_SHADER, GL_HIGH_FLOAT range [%d,%d],precision %d",range[0],range[1],precision);
1485 glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER,GL_LOW_INT, range, &precision);
1486 ConsoleMessage (
"GL_FRAGMENT_SHADER, GL_LOW_INT range [%d,%d],precision %d",range[0],range[1],precision);
1487 glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER,GL_MEDIUM_INT, range, &precision);
1488 ConsoleMessage (
"GL_FRAGMENT_SHADER, GL_MEDIUM_INT range [%d,%d],precision %d",range[0],range[1],precision);
1489 glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER,GL_HIGH_INT, range, &precision);
1490 ConsoleMessage (
"GL_FRAGMENT_SHADER, GL_HIGH_INT range [%d,%d],precision %d",range[0],range[1],precision);
1492 #endif // #ifdef GL_ES_VERSION_2_0 specific debugging
1497 new ->whichOne = rq_cap;
1501 makeAndCompileShader(
new);
1507 return new->myCapabilities;
1513 rq_cap0s.base = rq_cap0;
1514 return getMyShaders(rq_cap0s);
1516 #define DESIRE(whichOne,zzz) ((whichOne & zzz)==zzz)
1520 static const GLchar *vertPosDec =
"\
1521 attribute vec4 fw_Vertex; \n \
1522 uniform mat4 fw_ModelViewMatrix; \n \
1523 uniform mat4 fw_ProjectionMatrix; \n ";
1525 static const GLchar *vertNormDec =
" \
1526 uniform mat3 fw_NormalMatrix;\n \
1527 attribute vec3 fw_Normal; \n";
1529 static const GLchar *vertSimColDec =
"\
1530 attribute vec4 fw_Color;\n ";
1532 static const GLchar *vertTexMatrixDec =
"\
1533 uniform mat4 fw_TextureMatrix0;\n";
1535 static const GLchar *vertTexCoordGenDec =
"\
1536 uniform int fw_textureCoordGenType;\n";
1538 static const GLchar *vertTexCoordDec =
"\
1539 attribute vec2 fw_MultiTexCoord0;\n";
1541 static const GLchar *vertOneMatDec =
"\
1542 uniform fw_MaterialParameters\n\
1543 fw_FrontMaterial; \n";
1544 static const GLchar *vertBackMatDec =
"\
1545 uniform fw_MaterialParameters fw_BackMaterial; \n";
1551 static const GLchar *vecNormPos =
" \
1553 vec4 vertexPos; \n";
1555 static const GLchar *varyingNormPos =
" \
1556 varying vec3 vertexNorm; \
1557 varying vec4 vertexPos; \n";
1559 static const GLchar *varyingTexCoord =
"\
1560 varying vec3 fw_TexCoord[4];\n";
1562 static const GLchar *varyingFrontColour =
"\
1563 varying vec4 v_front_colour; \n";
1565 static const GLchar *varyingHatchPosition =
"\
1566 varying vec2 hatchPosition; \n";
1570 static const GLchar *vertMainStart =
"void main(void) { \n";
1572 static const GLchar *vertEnd =
"}";
1574 static const GLchar *vertPos =
"gl_Position = fw_ProjectionMatrix * fw_ModelViewMatrix * fw_Vertex;\n ";
1576 static const GLchar *vertNormPosCalc =
"\
1577 vertexNorm = normalize(fw_NormalMatrix * fw_Normal);\n \
1578 vertexPos = fw_ModelViewMatrix * fw_Vertex;\n ";
1580 static const GLchar *vertSimColUse =
"v_front_colour = fw_Color; \n";
1582 static const GLchar *vertEmissionOnlyColourAss =
"v_front_colour = fw_FrontMaterial.emission;\n";
1583 static const GLchar *vertSingTexCalc =
"fw_TexCoord[0] = vec3(vec4(fw_TextureMatrix0 *vec4(fw_MultiTexCoord0,0,0))).stp;\n";
1585 static const GLchar *vertSingTexCubeCalc =
"\
1586 vec3 u=normalize(vec3(fw_ProjectionMatrix * fw_Vertex)); /* myEyeVertex */ \
1587 /* vec3 n=normalize(vec3(fw_NormalMatrix*fw_Normal)); \
1588 fw_TexCoord[0] = reflect(u,n); myEyeNormal */ \n \
1589 /* v_texC = reflect(normalize(vec3(vertexPos)),vertexNorm);\n */ \
1590 fw_TexCoord[0] = reflect(u,vertexNorm);\n";
1594 const static GLchar *fragTCGTDefs = TEXTURECOORDINATEGENERATORDefs;
1599 static const GLchar *sphEnvMapCalc =
" \n \
1600 /* sphereEnvironMapping Calculation */ \
1601 /* vec3 u=normalize(vec3(fw_ModelViewMatrix * fw_Vertex)); (myEyeVertex) \
1602 vec3 n=normalize(vec3(fw_NormalMatrix*fw_Normal)); \
1603 vec3 r = reflect(u,n); (myEyeNormal) */ \n\
1604 vec3 u=normalize(vec3(vertexPos)); /* u is normalized position, used below more than once */ \n \
1605 vec3 r= reflect(u,vertexNorm); \n\
1606 if (fw_textureCoordGenType==TCGT_SPHERE) { /* TCGT_SPHERE GL_SPHERE_MAP OpenGL Equiv */ \n\
1607 float m=2.0 * sqrt(r.x*r.x + r.y*r.y + (r.z*1.0)*(r.z*1.0)); \n\
1608 fw_TexCoord[0] = vec3(r.x/m+0.5,r.y/m+0.5,0.0); \n \
1609 }else if (fw_textureCoordGenType==TCGT_CAMERASPACENORMAL) /* GL_REFLECTION_MAP used for sampling cubemaps */ {\n \
1610 float dotResult = 2.0 * dot(u,r); \n\
1611 fw_TexCoord[0] = vec3(u-r)*dotResult;\n\
1612 } else { /* default usage - like default CubeMaps */ \n\
1613 vec3 u=normalize(vec3(fw_ProjectionMatrix * fw_Vertex)); /* myEyeVertex */ \
1614 fw_TexCoord[0] = reflect(u,vertexNorm);\n \
1618 static const GLchar *vertHatchPosCalc =
"hatchPosition = fw_Vertex.xy;\n";
1620 static const GLchar *fillPropDefines =
"\
1621 uniform vec4 HatchColour; \n\
1622 uniform bool hatched; uniform bool filled;\n\
1623 uniform vec2 HatchScale; uniform vec2 HatchPct; uniform int algorithm; ";
1627 static const GLchar *lightDefines =
"\
1628 struct fw_MaterialParameters {\n\
1635 uniform int lightcount;\n\
1636 //uniform float lightRadius[MAX_LIGHTS];\n\
1637 uniform int lightType[MAX_LIGHTS];//ANGLE like this\n\
1638 struct fw_LightSourceParameters { \n\
1643 vec4 halfVector; \n\
1644 vec4 spotDirection; \n\
1645 float spotBeamWidth; \n\
1646 float spotCutoff; \n\
1647 vec3 Attenuations; \n\
1648 //float constantAttenuation; \n\
1649 //float linearAttenuation; \n\
1650 //float quadraticAttenuation; \n\
1651 float lightRadius; \n\
1652 //int lightType; ANGLE doesnt like int in struct array \n\
1655 uniform fw_LightSourceParameters fw_LightSource[MAX_LIGHTS] /* gl_MaxLights */ ;\n\
1674 static const GLchar *ADSLLightModel =
"\n\
1675 /* use ADSLightModel here the ADS colour is returned from the function. */\n\
1676 vec4 ADSLightModel(in vec3 myNormal, in vec4 myPosition, in bool useMatDiffuse) {\n\
1678 vec4 diffuse = vec4(0., 0., 0., 0.);\n\
1679 vec4 ambient = vec4(0., 0., 0., 0.);\n\
1680 vec4 specular = vec4(0., 0., 0., 1.);\n\
1681 vec3 normal = normalize (myNormal);\n\
1683 vec3 viewv = -normalize(myPosition.xyz); \n \
1684 bool backFacing = (dot(normal,viewv) < 0.0); \n \
1686 vec4 matdiffuse = vec4(1.0,1.0,1.0,1.0);\n\
1687 float myAlph = 0.0;\n\
1689 fw_MaterialParameters myMat = fw_FrontMaterial;\n\
1691 /* back Facing materials - flip the normal and grab back materials */ \n \
1692 if (backFacing) { \n \
1693 normal = -normal; \n \
1694 myMat = fw_BackMaterial; \n \
1697 emissive = myMat.emission;\n\
1698 myAlph = myMat.diffuse.a;\n\
1699 if(useMatDiffuse)\n\
1700 matdiffuse = myMat.diffuse;\n\
1702 /* apply the lights to this material */\n\
1703 for (i=0; i<MAX_LIGHTS; i++) {\n\
1704 if(i<lightcount) { /*weird but ANGLE needs constant loop*/ \n\
1705 vec4 myLightDiffuse = fw_LightSource[i].diffuse;\n\
1706 vec4 myLightAmbient = fw_LightSource[i].ambient;\n\
1707 vec4 myLightSpecular = fw_LightSource[i].specular;\n\
1708 vec4 myLightPosition = fw_LightSource[i].position; \n\
1709 int myLightType = lightType[i]; //fw_LightSource[i].lightType;\n\
1710 vec3 myLightDir = fw_LightSource[i].spotDirection.xyz; \n\
1711 vec3 eyeVector = normalize(myPosition.xyz);\n\
1712 vec3 VP; /* vector of light direction and distance */\n\
1713 VP = myLightPosition.xyz - myPosition.xyz;\n\
1714 vec3 L = myLightDir; /*directional light*/ \n\
1715 if(myLightType < 2) /*point and spot*/ \n\
1716 L = normalize(VP); \n\
1717 float nDotL = max(dot(normal, L), 0.0);\n\
1718 vec3 halfVector = normalize(L - eyeVector);\n\
1719 /* normal dot light half vector */\n\
1720 float nDotHV = max(dot(normal,halfVector),0.0);\n\
1722 if (myLightType==1) {\n\
1725 float spotAttenuation = 0.0; \n\
1726 float powerFactor = 0.0; /* for light dropoff */ \n\
1727 float attenuation; /* computed attenuation factor */\n\
1728 float d; /* distance to vertex */ \n\
1730 if (nDotL > 0.0) {\n\
1731 powerFactor = pow(nDotL,myMat.shininess); \n\
1732 /* tone down the power factor if myMat.shininess borders 0 */\n\
1733 if (myMat.shininess < 1.0) {\n\
1734 powerFactor *= myMat.shininess; \n\
1737 attenuation = 1.0/(fw_LightSource[i].Attenuations.x + (fw_LightSource[i].Attenuations.y * d) + (fw_LightSource[i].Attenuations.z *d *d));\n\
1738 spotDot = dot (-L,myLightDir);\n\
1739 /* check against spotCosCutoff */\n\
1740 if (spotDot > fw_LightSource[i].spotCutoff) {\n\
1741 spotAttenuation = pow(spotDot,fw_LightSource[i].spotCutoff);\n\
1743 attenuation *= spotAttenuation;\n\
1744 /* diffuse light computation */\n\
1745 diffuse += nDotL* matdiffuse*myLightDiffuse * attenuation;\n\
1746 /* ambient light computation */\n\
1747 ambient += myMat.ambient*myLightAmbient;\n\
1748 /* specular light computation */\n\
1749 specular += myLightSpecular * powerFactor * attenuation;\n\
1751 } else if (myLightType == 2) { \n\
1752 /* DirectionalLight */ \n\
1753 float powerFactor = 0.0; /* for light dropoff */\n\
1754 if (nDotL > 0.0) {\n\
1755 powerFactor = pow(nDotHV, myMat.shininess);\n\
1756 /* tone down the power factor if myMat.shininess borders 0 */\n\
1757 if (myMat.shininess < 1.0) {\n\
1758 powerFactor *= myMat.shininess;\n\
1761 /* Specular light computation */\n\
1762 specular += myMat.specular *myLightSpecular*powerFactor;\n\
1763 /* diffuse light computation */\n\
1764 diffuse += nDotL*matdiffuse*myLightDiffuse;\n\
1765 /* ambient light computation */\n\
1766 ambient += myMat.ambient*myLightAmbient; \n\
1769 float powerFactor=0.0; /* for light dropoff */\n\
1770 float attenuation = 0.0; /* computed attenuation factor */\n\
1771 float d = length(VP); /* distance to vertex */ \n\
1772 /* are we within range? */\n\
1773 if (d <= fw_LightSource[i].lightRadius) {\n\
1774 if (nDotL > 0.0) {\n\
1775 powerFactor = pow(nDotL, myMat.shininess);\n\
1776 //attenuation = (myMat.shininess-128.0);\n\
1778 /* this is actually the SFVec3f attenuation field */\n\
1779 attenuation = 1.0/(fw_LightSource[i].Attenuations.x + (fw_LightSource[i].Attenuations.y * d) + (fw_LightSource[i].Attenuations.z *d *d));\n\
1780 /* diffuse light computation */\n\
1781 diffuse += nDotL* matdiffuse*myLightDiffuse * attenuation;\n\
1782 /* ambient light computation */\n\
1783 ambient += myMat.ambient*myLightAmbient;\n\
1784 /* specular light computation */\n\
1785 attenuation *= (myMat.shininess/128.0);\n\
1786 specular += myLightSpecular * powerFactor * attenuation;\n\
1791 return clamp(vec4(vec3(ambient+diffuse+specular+emissive),myAlph), 0.0, 1.0);\n\
1794 #ifdef USING_SHADER_LIGHT_ARRAY_METHOD
1799 static const GLchar *lightDefinesArrayMethod =
"\
1800 struct fw_MaterialParameters {\n\
1807 uniform int lightcount;\n\
1808 uniform int lightType[MAX_LIGHTS];\n\
1809 uniform vec4 lightambient[MAX_LIGHTS]; \n\
1810 uniform vec4 lightdiffuse[MAX_LIGHTS]; \n\
1811 uniform vec4 lightspecular[MAX_LIGHTS]; \n\
1812 uniform vec4 lightposition[MAX_LIGHTS]; \n\
1813 uniform vec4 lighthalfVector[MAX_LIGHTS]; \n\
1814 uniform vec4 lightspotDirection[MAX_LIGHTS]; \n\
1815 uniform float lightspotBeamWidth[MAX_LIGHTS]; \n\
1816 uniform float lightspotCutoff[MAX_LIGHTS]; \n\
1817 uniform float lightRadius[MAX_LIGHTS]; \n\
1818 uniform vec3 lightAttenuations[MAX_LIGHTS]; \n\
1821 static const GLchar *ADSLLightModelArrayMethod =
"\n\
1822 /* use ADSLightModel here the ADS colour is returned from the function. */\n\
1823 vec4 ADSLightModel(in vec3 myNormal, in vec4 myPosition, in bool useMatDiffuse) {\n\
1825 vec4 diffuse = vec4(0., 0., 0., 0.);\n\
1826 vec4 ambient = vec4(0., 0., 0., 0.);\n\
1827 vec4 specular = vec4(0., 0., 0., 1.);\n\
1828 vec3 normal = normalize (myNormal);\n\
1830 vec3 viewv = -normalize(myPosition.xyz); \n \
1831 bool backFacing = (dot(normal,viewv) < 0.0); \n \
1833 vec4 matdiffuse = vec4(1.0,1.0,1.0,1.0);\n\
1834 float myAlph = 0.0;\n\
1836 fw_MaterialParameters myMat = fw_FrontMaterial;\n\
1838 /* back Facing materials - flip the normal and grab back materials */ \n \
1839 if (backFacing) { \n \
1840 normal = -normal; \n \
1841 myMat = fw_BackMaterial; \n \
1844 emissive = myMat.emission;\n\
1845 myAlph = myMat.diffuse.a;\n\
1846 if(useMatDiffuse)\n\
1847 matdiffuse = myMat.diffuse;\n\
1849 /* apply the lights to this material */\n\
1850 for (i=0; i<MAX_LIGHTS; i++) {\n\
1851 if(i<lightcount){ /* weird but ANGLE for d3d9 needs constant loop (d3d11/winrt OK with variable loop)*/ \n\
1852 vec4 myLightDiffuse = lightdiffuse[i];\n\
1853 vec4 myLightAmbient = lightambient[i];\n\
1854 vec4 myLightSpecular = lightspecular[i];\n\
1855 vec4 myLightPosition = lightposition[i]; \n\
1856 vec4 myspotDirection = lightspotDirection[i]; \n\
1857 int myLightType = lightType[i]; \n\
1858 vec3 myLightDir = myspotDirection.xyz; \n\
1859 vec3 eyeVector = normalize(myPosition.xyz);\n\
1860 vec3 VP; /* vector of light direction and distance */\n\
1861 VP = myLightPosition.xyz - myPosition.xyz;\n\
1862 vec3 L = myLightDir; /*directional light*/ \n\
1863 if(myLightType < 2) /*point and spot*/ \n\
1864 L = normalize(VP); \n\
1865 float nDotL = max(dot(normal, L), 0.0);\n\
1866 vec3 halfVector = normalize(L - eyeVector);\n\
1867 /* normal dot light half vector */\n\
1868 float nDotHV = max(dot(normal,halfVector),0.0);\n\
1870 if (myLightType==1) {\n\
1873 float spotAttenuation = 0.0; \n\
1874 float powerFactor = 0.0; /* for light dropoff */ \n\
1875 float attenuation; /* computed attenuation factor */\n\
1876 float d; /* distance to vertex */ \n\
1878 if (nDotL > 0.0) {\n\
1879 powerFactor = pow(nDotL,myMat.shininess); \n\
1880 /* tone down the power factor if myMat.shininess borders 0 */\n\
1881 if (myMat.shininess < 1.0) {\n\
1882 powerFactor *= myMat.shininess; \n\
1885 attenuation = 1.0/(lightAttenuations[i].x + (lightAttenuations[i].y * d) + (lightAttenuations[i].z *d *d));\n\
1886 spotDot = dot (-L,myLightDir);\n\
1887 /* check against spotCosCutoff */\n\
1888 if (spotDot > lightspotCutoff[i]) {\n\
1889 spotAttenuation = pow(spotDot,lightspotBeamWidth[i]);\n\
1891 attenuation *= spotAttenuation;\n\
1892 /* diffuse light computation */\n\
1893 diffuse += nDotL* matdiffuse*myLightDiffuse * attenuation;\n\
1894 /* ambient light computation */\n\
1895 ambient += myMat.ambient*myLightAmbient;\n\
1896 /* specular light computation */\n\
1897 specular += myLightSpecular * powerFactor * attenuation;\n\
1899 } else if (myLightType == 2) { \n\
1900 /* DirectionalLight */ \n\
1901 float powerFactor = 0.0; /* for light dropoff */\n\
1902 if (nDotL > 0.0) {\n\
1903 powerFactor = pow(nDotHV, myMat.shininess);\n\
1904 /* tone down the power factor if myMat.shininess borders 0 */\n\
1905 if (myMat.shininess < 1.0) {\n\
1906 powerFactor *= myMat.shininess;\n\
1909 /* Specular light computation */\n\
1910 specular += myMat.specular *myLightSpecular*powerFactor;\n\
1911 /* diffuse light computation */\n\
1912 diffuse += nDotL*matdiffuse*myLightDiffuse;\n\
1913 /* ambient light computation */\n\
1914 ambient += myMat.ambient*myLightAmbient; \n\
1917 float powerFactor=0.0; /* for light dropoff */\n\
1918 float attenuation = 0.0; /* computed attenuation factor */\n\
1919 float d = length(VP); /* distance to vertex */ \n\
1920 /* are we within range? */\n\
1921 if (d <= lightRadius[i]) {\n\
1922 if (nDotL > 0.0) {\n\
1923 powerFactor = pow(nDotL, myMat.shininess);\n\
1925 /* this is actually the SFVec3f attenuation field */\n\
1926 attenuation = 1.0/(lightAttenuations[i].x + (lightAttenuations[i].y * d) + (lightAttenuations[i].z *d *d));\n\
1927 /* diffuse light computation */\n\
1928 diffuse += nDotL* matdiffuse*myLightDiffuse * attenuation;\n\
1929 /* ambient light computation */\n\
1930 ambient += myMat.ambient*myLightAmbient;\n\
1931 /* specular light computation */\n\
1932 attenuation *= (myMat.shininess/128.0);\n\
1933 specular += myLightSpecular * powerFactor * attenuation;\n\
1938 return clamp(vec4(vec3(ambient+diffuse+specular+emissive),myAlph), 0.0, 1.0);\n\
1949 #if defined (GL_ES_VERSION_2_0)
1950 static const GLchar *fragHighPrecision =
"precision highp float;\n ";
1951 static const GLchar *fragMediumPrecision =
"precision mediump float;\n ";
1952 static const GLchar *maxLights = STR_MAX_LIGHTS;
1954 static const GLchar *maxLights = STR_MAX_LIGHTS;
1974 static const GLchar *fragMainStart =
"void main() { vec4 finalFrag = vec4(1.,1.,1.,1.);\n";
1975 static const GLchar *anaglyphGrayFragEnd =
"float gray = dot(finalFrag.rgb, vec3(0.299, 0.587, 0.114)); \n \
1976 gl_FragColor = vec4(gray, gray, gray, finalFrag.a);}";
1982 static const GLchar *discardInFragEnd =
"if (finalFrag.a==0.0) {discard; } else {gl_FragColor = finalFrag;}}";
1983 static const GLchar *fragEnd =
"gl_FragColor = finalFrag;}";
1986 static const GLchar *fragTex0Dec =
"uniform sampler2D fw_Texture_unit0; \n";
1987 static const GLchar *fragTex0CubeDec =
"uniform samplerCube fw_Texture_unit0; \n";
1991 static const GLchar *fragSimColAss =
"finalFrag = v_front_colour * finalFrag;\n ";
1992 static const GLchar *fragNoAppAss =
"finalFrag = vec4(1.0, 1.0, 1.0, 1.0);\n";
1993 static const GLchar *fragFrontColAss=
" finalFrag = v_front_colour * finalFrag;";
1994 const static GLchar *fragADSLAss =
"finalFrag = ADSLightModel(vertexNorm,vertexPos,true) * finalFrag;";
1995 const static GLchar *vertADSLCalc =
"v_front_colour = ADSLightModel(vertexNorm,vertexPos,true);";
1996 const static GLchar *vertADSLCalc0 =
"v_front_colour = ADSLightModel(vertexNorm,vertexPos,false);";
1998 const static GLchar *fragSingTexAss =
"finalFrag = texture2D(fw_Texture_unit0, fw_TexCoord[0].st) * finalFrag;\n";
1999 const static GLchar *fragSingTexCubeAss =
"finalFrag = textureCube(fw_Texture_unit0, fw_TexCoord[0]) * finalFrag;\n";
2013 const static GLchar *fragMultiTexDef = MULTITEXTUREDefs;
2015 static const GLchar *fragMultiTexUniforms =
" \
2016 /* defined for single textures... uniform sampler2D fw_Texture_unit0; */\
2017 uniform sampler2D fw_Texture_unit1; \
2018 uniform sampler2D fw_Texture_unit2; \
2019 /* REMOVE these as shader compile takes long \
2020 uniform sampler2D fw_Texture_unit3; \
2021 uniform sampler2D fw_Texture_unit4; \
2022 uniform sampler2D fw_Texture_unit5; \
2023 uniform sampler2D fw_Texture_unit6; \
2024 uniform sampler2D fw_Texture_unit7; \
2026 uniform int fw_Texture_mode0; \
2027 uniform int fw_Texture_mode1; \
2028 uniform int fw_Texture_mode2; \
2029 /* REMOVE these as shader compile takes long \
2030 uniform int fw_Texture_mode3; \
2031 uniform int fw_Texture_mode4; \
2032 uniform int fw_Texture_mode5; \
2033 uniform int fw_Texture_mode6; \
2034 uniform int fw_Texture_mode7; \
2037 uniform int textureCount;\n";
2039 static const GLchar *fragFillPropFunc =
"\
2040 vec4 fillPropCalc(in vec4 prevColour, vec2 MCposition, int algorithm) {\
2042 vec2 position, useBrick; \
2044 position = MCposition / HatchScale; \
2046 if (algorithm == 0) {/* bricking */ \
2047 if (fract(position.y * 0.5) > 0.5) \
2048 position.x += 0.5; \
2051 /* algorithm 1, 2 = no futzing required here */ \
2052 if (algorithm == 3) {/* positive diagonals */ \
2053 vec2 curpos = position; \
2054 position.x -= curpos.y; \
2057 if (algorithm == 4) {/* negative diagonals */ \
2058 vec2 curpos = position; \
2059 position.x += curpos.y; \
2062 if (algorithm == 6) {/* diagonal crosshatch */ \
2063 vec2 curpos = position; \
2064 if (fract(position.y) > 0.5) { \
2065 if (fract(position.x) < 0.5) position.x += curpos.y; \
2066 else position.x -= curpos.y; \
2068 if (fract(position.x) > 0.5) position.x += curpos.y; \
2069 else position.x -= curpos.y; \
2073 position = fract(position); \
2075 useBrick = step(position, HatchPct); \
2077 if (filled) {colour = prevColour;} else { colour=vec4(0.,0.,0.,0); }\
2079 colour = mix(HatchColour, colour, useBrick.x * useBrick.y); \
2083 static const GLchar *fragFillPropCalc =
"\
2084 finalFrag= fillPropCalc(finalFrag, hatchPosition, algorithm);\n";
2086 static const GLchar *fragMulTexFunc =
"\
2087 vec4 finalColCalc(in vec4 prevColour, in int mode, in sampler2D tex, in vec2 texcoord) { \
2088 vec4 texel = texture2D(tex,texcoord); \
2089 vec4 rv = vec4(1.,0.,1.,1.); \
2091 if (mode==MTMODE_OFF) { rv = vec4(prevColour);} \
2092 else if (mode==MTMODE_REPLACE) {rv = vec4(texture2D(tex, texcoord));}\
2093 else if (mode==MTMODE_MODULATE) { \
2098 cf = prevColour.rgb; \
2099 af = prevColour.a; \
2105 rv = vec4(ct*cf, at*af); \
2108 else if (mode==MTMODE_MODULATE2X) { \
2112 cf = prevColour.rgb; \
2113 af = prevColour.a; \
2117 rv = vec4(vec4(ct*cf, at*af)*vec4(2.,2.,2.,2.)); \
2119 else if (mode==MTMODE_MODULATE4X) { \
2123 cf = prevColour.rgb; \
2124 af = prevColour.a; \
2128 rv = vec4(vec4(ct*cf, at*af)*vec4(4.,4.,4.,4.)); \
2130 else if (mode== MTMODE_ADDSIGNED) {\
2131 rv = vec4 (prevColour + texel - vec4 (0.5, 0.5, 0.5, -.5)); \
2133 else if (mode== MTMODE_ADDSIGNED2X) {\
2134 rv = vec4 ((prevColour + texel - vec4 (0.5, 0.5, 0.5, -.5))*vec4(2.,2.,2.,2.)); \
2136 else if (mode== MTMODE_ADD) {\
2137 rv= vec4 (prevColour + texel); \
2139 else if (mode== MTMODE_SUBTRACT) {\
2140 rv = vec4 (prevColour - texel); \
2142 else if (mode==MTMODE_ADDSMOOTH) { \
2143 rv = vec4 (prevColour + (prevColour - vec4 (1.,1.,1.,1.)) * texel); \
2149 const static GLchar *fragMulTexCalc =
"\
2150 if(textureCount>=1) {finalFrag=finalColCalc(finalFrag,fw_Texture_mode0,fw_Texture_unit0,fw_TexCoord[0].st);} \n\
2151 if(textureCount>=2) {finalFrag=finalColCalc(finalFrag,fw_Texture_mode1,fw_Texture_unit1,fw_TexCoord[0].st);} \n\
2152 if(textureCount>=3) {finalFrag=finalColCalc(finalFrag,fw_Texture_mode2,fw_Texture_unit2,fw_TexCoord[0].st);} \n\
2153 /* REMOVE these as shader compile takes long \
2154 if(textureCount>=4) {finalFrag=finalColCalc(finalFrag,fw_Texture_mode3,fw_Texture_unit3,fw_TexCoord[0].st);} \n\
2155 if(textureCount>=5) {finalFrag=finalColCalc(finalFrag,fw_Texture_mode4,fw_Texture_unit4,fw_TexCoord[0].st);} \n\
2156 if(textureCount>=6) {finalFrag=finalColCalc(finalFrag,fw_Texture_mode5,fw_Texture_unit5,fw_TexCoord[0].st);} \n\
2157 if(textureCount>=7) {finalFrag=finalColCalc(finalFrag,fw_Texture_mode6,fw_Texture_unit6,fw_TexCoord[0].st);} \n\
2158 if(textureCount>=8) {finalFrag=finalColCalc(finalFrag,fw_Texture_mode7,fw_Texture_unit7,fw_TexCoord[0].st);} \n\
2164 const static GLchar *pointSizeDeclare=
"uniform float pointSize;\n";
2165 const static GLchar *pointSizeAss=
"gl_PointSize = pointSize; \n";
2168 static int getSpecificShaderSourceOriginal (
const GLchar *vertexSource[vertexEndMarker],
2172 bool didADSLmaterial;
2173 #ifdef USING_SHADER_LIGHT_ARRAY_METHOD
2175 const GLchar *lightDefines0 = lightDefinesArrayMethod;
2176 const GLchar *ADSLLightModel0 = ADSLLightModelArrayMethod;
2178 const GLchar *lightDefines0 = lightDefines;
2179 const GLchar *ADSLLightModel0 = ADSLLightModel;
2186 #if defined (GL_ES_VERSION_2_0)
2187 bool haveHighPrecisionFragmentShaders =
false;
2189 #ifdef VARY_VERTEX_PRECISION
2190 bool haveHighPrecisionVertexShaders =
false;
2193 GLint range[2]; GLint precision;
2196 if (DESIRE(whichOne.base,SHADINGSTYLE_PHONG)) {
2197 glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER,GL_HIGH_FLOAT, range, &precision);
2199 haveHighPrecisionFragmentShaders=
true;
2201 haveHighPrecisionFragmentShaders=
false;
2202 glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER,GL_MEDIUM_FLOAT, range, &precision);
2203 if (precision == 0) {
2204 ConsoleMessage(
"low precision Fragment shaders only available - view may not work so well");
2207 #ifdef VARY_VERTEX_PRECISION
2210 glGetShaderPrecisionFormat(GL_VERTEX_SHADER,GL_HIGH_FLOAT, range, &precision);
2212 haveHighPrecisionVertexShaders=
true;
2214 haveHighPrecisionVertexShaders=
false;
2215 glGetShaderPrecisionFormat(GL_VERTEX_SHADER,GL_MEDIUM_FLOAT, range, &precision);
2216 if (precision == 0) {
2217 ConsoleMessage(
"low precision Vertex shaders only available - view may not work so well");
2220 #endif //VARY_VERTEX_PRECISION
2225 #endif // GL_ES_VERSION_2_0 for GL_HIGH_FLOAT or GL_MEDIUM_FLOAT
2227 #if defined (VERBOSE) && defined (GL_ES_VERSION_2_0)
2231 glGetBooleanv(GL_SHADER_COMPILER,&b);
2232 if (b) ConsoleMessage(
"have shader compiler");
else ConsoleMessage(
"NO SHADER COMPILER");
2235 glGetShaderPrecisionFormat(GL_VERTEX_SHADER,GL_LOW_FLOAT, range, &precision);
2236 ConsoleMessage (
"GL_VERTEX_SHADER, GL_LOW_FLOAT range [%d,%d],precision %d",range[0],range[1],precision);
2237 glGetShaderPrecisionFormat(GL_VERTEX_SHADER,GL_MEDIUM_FLOAT, range, &precision);
2238 ConsoleMessage (
"GL_VERTEX_SHADER, GL_MEDIUM_FLOAT range [%d,%d],precision %d",range[0],range[1],precision);
2239 glGetShaderPrecisionFormat(GL_VERTEX_SHADER,GL_HIGH_FLOAT, range, &precision);
2240 ConsoleMessage (
"GL_VERTEX_SHADER, GL_HIGH_FLOAT range [%d,%d],precision %d",range[0],range[1],precision);
2242 glGetShaderPrecisionFormat(GL_VERTEX_SHADER,GL_LOW_INT, range, &precision);
2243 ConsoleMessage (
"GL_VERTEX_SHADER, GL_LOW_INT range [%d,%d],precision %d",range[0],range[1],precision);
2244 glGetShaderPrecisionFormat(GL_VERTEX_SHADER,GL_MEDIUM_INT, range, &precision);
2245 ConsoleMessage (
"GL_VERTEX_SHADER, GL_MEDIUM_INT range [%d,%d],precision %d",range[0],range[1],precision);
2246 glGetShaderPrecisionFormat(GL_VERTEX_SHADER,GL_HIGH_INT, range, &precision);
2247 ConsoleMessage (
"GL_VERTEX_SHADER, GL_HIGH_INT range [%d,%d],precision %d",range[0],range[1],precision);
2249 glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER,GL_LOW_FLOAT, range, &precision);
2250 ConsoleMessage (
"GL_FRAGMENT_SHADER, GL_LOW_FLOAT range [%d,%d],precision %d",range[0],range[1],precision);
2251 glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER,GL_MEDIUM_FLOAT, range, &precision);
2252 ConsoleMessage (
"GL_FRAGMENT_SHADER, GL_MEDIUM_FLOAT range [%d,%d],precision %d",range[0],range[1],precision);
2253 glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER,GL_HIGH_FLOAT, range, &precision);
2254 ConsoleMessage (
"GL_FRAGMENT_SHADER, GL_HIGH_FLOAT range [%d,%d],precision %d",range[0],range[1],precision);
2256 glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER,GL_LOW_INT, range, &precision);
2257 ConsoleMessage (
"GL_FRAGMENT_SHADER, GL_LOW_INT range [%d,%d],precision %d",range[0],range[1],precision);
2258 glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER,GL_MEDIUM_INT, range, &precision);
2259 ConsoleMessage (
"GL_FRAGMENT_SHADER, GL_MEDIUM_INT range [%d,%d],precision %d",range[0],range[1],precision);
2260 glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER,GL_HIGH_INT, range, &precision);
2261 ConsoleMessage (
"GL_FRAGMENT_SHADER, GL_HIGH_INT range [%d,%d],precision %d",range[0],range[1],precision);
2263 #endif //VERBOSE for GL_ES_VERSION_2_0
2266 if DESIRE(whichOne.base,NO_APPEARANCE_SHADER) ConsoleMessage ("want NO_APPEARANCE_SHADER");
2267 if DESIRE(whichOne.base,MATERIAL_APPEARANCE_SHADER) ConsoleMessage ("want MATERIAL_APPEARANCE_SHADER");
2268 if DESIRE(whichOne.base,TWO_MATERIAL_APPEARANCE_SHADER) ConsoleMessage ("want TWO_MATERIAL_APPEARANCE_SHADER");
2269 if DESIRE(whichOne.base,ONE_TEX_APPEARANCE_SHADER)ConsoleMessage("want ONE_TEX_APPEARANCE_SHADER");
2270 if DESIRE(whichOne.base,MULTI_TEX_APPEARANCE_SHADER)ConsoleMessage("want MULTI_TEX_APPEARANCE_SHADER");
2271 if DESIRE(whichOne.base,COLOUR_MATERIAL_SHADER)ConsoleMessage("want COLOUR_MATERIAL_SHADER");
2272 if DESIRE(whichOne.base,FILL_PROPERTIES_SHADER)ConsoleMessage("want FILL_PROPERTIES_SHADER");
2273 if DESIRE(whichOne.base,HAVE_LINEPOINTS_COLOR)ConsoleMessage ("want LINE_POINTS_COLOR");
2274 if DESIRE(whichOne.base,HAVE_LINEPOINTS_APPEARANCE)ConsoleMessage ("want LINE_POINTS_APPEARANCE");
2275 if DESIRE(whichOne.base,HAVE_TEXTURECOORDINATEGENERATOR) ConsoleMessage ("want HAVE_TEXTURECOORDINATEGENERATOR");
2276 if DESIRE(whichOne.base,HAVE_CUBEMAP_TEXTURE) ConsoleMessage ("want HAVE_CUBEMAP_TEXTURE");
2282 #if defined(GL_ES_VERSION_2_0)
2283 fragmentSource[fragmentGLSLVersion] =
"#version 100\n";
2284 vertexSource[vertexGLSLVersion] =
"#version 100\n";
2285 if (haveHighPrecisionFragmentShaders) {
2286 fragmentSource[fragmentPrecisionDeclare] = fragHighPrecision;
2289 fragmentSource[fragmentPrecisionDeclare] = fragMediumPrecision;
2293 #ifdef VARY_VERTEX_PRECISION
2295 if (haveHighPrecisionVertexShaders) {
2296 vertexSource[vertexPrecisionDeclare] = fragHighPrecision;
2297 ConsoleMessage(
"have high precision vertex shaders");
2299 vertexSource[vertexPrecisionDeclare] = fragMediumPrecision;
2300 ConsoleMessage(
"have medium precision vertex shaders");
2302 #endif //VARY_VERTEX_PRECISION
2306 fragmentSource[fragmentGLSLVersion] =
"#version 110\n";
2307 vertexSource[vertexGLSLVersion] =
"#version 110\n";
2310 fragmentSource[fragMaxLightsDeclare] = maxLights;
2311 vertexSource[vertMaxLightsDeclare] = maxLights;
2312 vertexSource[vertexPositionDeclare] = vertPosDec;
2318 if (!whichOne.usershaders) {
2325 vertexSource[vertexMainStart] = vertMainStart;
2326 vertexSource[vertexPositionCalculation] = vertPos;
2327 vertexSource[vertexMainEnd] = vertEnd;
2330 fragmentSource[fragmentMainStart] = fragMainStart;
2331 if(Viewer()->anaglyph || Viewer()->anaglyphB)
2332 fragmentSource[fragmentMainEnd] = anaglyphGrayFragEnd;
2334 if (DESIRE(whichOne.base,SHADINGSTYLE_PHONG)) fragmentSource[fragmentMainEnd] = discardInFragEnd;
2335 else fragmentSource[fragmentMainEnd] = fragEnd;
2344 if DESIRE(whichOne.base,COLOUR_MATERIAL_SHADER) {
2345 vertexSource[vertexSimpleColourDeclare] = vertSimColDec;
2346 vertexSource[vertFrontColourDeclare] = varyingFrontColour;
2347 vertexSource[vertexSimpleColourCalculation] = vertSimColUse;
2348 vertexSource[vertexPointSizeDeclare] = pointSizeDeclare;
2349 vertexSource[vertexPointSizeAssign] = pointSizeAss;
2350 fragmentSource[fragmentSimpleColourDeclare] = varyingFrontColour;
2351 fragmentSource[fragmentSimpleColourAssign] = fragSimColAss;
2354 if DESIRE(whichOne.base,NO_APPEARANCE_SHADER) {
2355 fragmentSource[fragmentSimpleColourAssign] = fragNoAppAss;
2356 vertexSource[vertexPointSizeDeclare] = pointSizeDeclare;
2357 vertexSource[vertexPointSizeAssign] = pointSizeAss;
2365 if (DESIRE(whichOne.base,SHADINGSTYLE_PHONG)) {
2366 doThis = (DESIRE(whichOne.base,MATERIAL_APPEARANCE_SHADER)) ||
2367 (DESIRE(whichOne.base,TWO_MATERIAL_APPEARANCE_SHADER));
2369 doThis = DESIRE(whichOne.base,TWO_MATERIAL_APPEARANCE_SHADER);
2373 vertexSource[vertexNormPosOutput] = varyingNormPos;
2374 vertexSource[vertexNormalDeclare] = vertNormDec;
2375 vertexSource[vertexNormPosCalculation] = vertNormPosCalc;
2377 fragmentSource[fragmentLightDefines] = lightDefines0;
2378 fragmentSource[fragmentOneColourDeclare] = vertOneMatDec;
2379 fragmentSource[fragmentBackColourDeclare] = vertBackMatDec;
2380 fragmentSource[fragmentNormPosDeclare] = varyingNormPos;
2381 fragmentSource[fragmentADSLLightModel] = ADSLLightModel0;
2382 fragmentSource[fragmentADSLAssign] = fragADSLAss;
2389 didADSLmaterial =
false;
2390 if((DESIRE(whichOne.base,MATERIAL_APPEARANCE_SHADER)) && (!DESIRE(whichOne.base,SHADINGSTYLE_PHONG))) {
2391 vertexSource[vertexNormalDeclare] = vertNormDec;
2392 vertexSource[vertexLightDefines] = lightDefines0;
2393 vertexSource[vertexOneMaterialDeclare] = vertOneMatDec;
2394 vertexSource[vertFrontColourDeclare] = varyingFrontColour;
2395 vertexSource[vertexNormPosCalculation] = vertNormPosCalc;
2396 vertexSource[vertexNormPosOutput] = vecNormPos;
2397 vertexSource[vertexLightingEquation] = ADSLLightModel0;
2398 vertexSource[vertexBackMaterialDeclare] = vertBackMatDec;
2399 vertexSource[vertexADSLCalculation] = vertADSLCalc;
2400 didADSLmaterial =
true;
2401 fragmentSource[fragmentOneColourDeclare] = varyingFrontColour;
2402 fragmentSource[fragmentOneColourAssign] = fragFrontColAss;
2406 if DESIRE(whichOne.base,HAVE_LINEPOINTS_APPEARANCE) {
2407 vertexSource[vertexLightDefines] = lightDefines0;
2408 vertexSource[vertFrontColourDeclare] = varyingFrontColour;
2409 vertexSource[vertexOneMaterialDeclare] = vertOneMatDec;
2411 #if defined (GL_ES_VERSION_2_0)
2412 vertexSource[vertexPointSizeDeclare] = pointSizeDeclare;
2413 vertexSource[vertexPointSizeAssign] = pointSizeAss;
2416 vertexSource[vertexOneMaterialCalculation] = vertEmissionOnlyColourAss;
2417 fragmentSource[fragmentSimpleColourDeclare] = varyingFrontColour;
2418 fragmentSource[fragmentSimpleColourAssign] = fragSimColAss;
2423 if (DESIRE(whichOne.base,ONE_TEX_APPEARANCE_SHADER) ||
2424 DESIRE(whichOne.base,HAVE_TEXTURECOORDINATEGENERATOR) ||
2425 DESIRE(whichOne.base,HAVE_CUBEMAP_TEXTURE) ||
2426 DESIRE(whichOne.base,MULTI_TEX_APPEARANCE_SHADER)) {
2427 vertexSource[vertexTexCoordInputDeclare] = vertTexCoordDec;
2428 vertexSource[vertexTexCoordOutputDeclare] = varyingTexCoord;
2429 vertexSource[vertexTextureMatrixDeclare] = vertTexMatrixDec;
2430 vertexSource[vertexSingleTextureCalculation] = vertSingTexCalc;
2432 vertexSource[vertexADSLCalculation] = vertADSLCalc0;
2434 fragmentSource[fragmentTexCoordDeclare] = varyingTexCoord;
2435 fragmentSource[fragmentTex0Declare] = fragTex0Dec;
2436 fragmentSource[fragmentTextureAssign] = fragSingTexAss;
2440 if (DESIRE(whichOne.base,HAVE_CUBEMAP_TEXTURE)) {
2441 vertexSource[vertexSingleTextureCalculation] = vertSingTexCubeCalc;
2443 fragmentSource[fragmentTex0Declare] = fragTex0CubeDec;
2444 fragmentSource[fragmentTextureAssign] = fragSingTexCubeAss;
2448 if DESIRE(whichOne.base,MULTI_TEX_APPEARANCE_SHADER) {
2452 vertexSource[vertexOneMaterialDeclare] = vertOneMatDec;
2453 vertexSource[vertexLightDefines] = lightDefines0;
2454 vertexSource[vertexNormPosCalculation] = vertNormPosCalc;
2455 vertexSource[vertexNormPosOutput] = vecNormPos;
2456 vertexSource[vertexLightingEquation] = ADSLLightModel0;
2457 vertexSource[vertexBackMaterialDeclare] = vertBackMatDec;
2459 fragmentSource[fragmentMultiTexDefines]= fragMultiTexUniforms;
2460 fragmentSource[fragmentMultiTexDeclare] = fragMultiTexDef;
2461 fragmentSource[fragmentTex0Declare] = fragTex0Dec;
2462 fragmentSource[fragmentMultiTexModel] = fragMulTexFunc;
2463 fragmentSource[fragmentTextureAssign] = fragMulTexCalc;
2467 if DESIRE(whichOne.base,HAVE_TEXTURECOORDINATEGENERATOR) {
2470 vertexSource[vertexTextureMatrixDeclare] = vertTexCoordGenDec;
2471 vertexSource[vertexSingleTextureCalculation] = sphEnvMapCalc;
2473 vertexSource[vertexTCGTDefines] = fragTCGTDefs;
2477 if DESIRE(whichOne.base,FILL_PROPERTIES_SHADER) {
2480 vertexSource[vertexHatchPositionDeclare] = varyingHatchPosition;
2481 vertexSource[vertexHatchPositionCalculation] = vertHatchPosCalc;
2483 fragmentSource[fragmentFillPropDefines] = fillPropDefines;
2484 fragmentSource[fragmentHatchPositionDeclare] = varyingHatchPosition;
2485 fragmentSource[fragmentFillPropModel] = fragFillPropFunc;
2486 fragmentSource[fragmentFillPropAssign] = fragFillPropCalc;
2491 if (whichOne.usershaders) {
2498 me = whichOne.usershaders;
2504 vertexSource[vertexMainStart] =
" \n \
2505 #define HEADLIGHT_LIGHT 0\n \
2506 #define ftransform() (fw_ProjectionMatrix*fw_ModelViewMatrix*fw_Vertex)\n \
2507 #define gl_ModelViewProjectionMatrix (fw_ProjectionMatrix*fw_ModelViewMatrix)\n \
2508 #define gl_NormalMatrix fw_NormalMatrix\n \
2509 #define gl_ProjectionMatrix fw_ProjectionMatrix \n\
2510 #define gl_ModelViewMatrix fw_ModelViewMatrix \n\
2511 #define fw_TextureMatrix fw_TextureMatrix0 \n\
2512 #define gl_TextureMatrix fw_TextureMatrix0 \n\
2513 #define gl_Vertex fw_Vertex \n \
2514 #define gl_Normal fw_Normal\n \
2515 #define gl_Texture_unit0 fw_Texture_unit0\n \
2516 #define gl_MultiTexCoord0 fw_MultiTexCoord0\n \
2517 #define gl_Texture_unit1 fw_Texture_unit1\n \
2518 #define gl_MultiTexCoord1 fw_MultiTexCoord1\n \
2519 #define gl_Texture_unit2 fw_Texture_unit2\n \
2520 #define gl_MultiTexCoord2 fw_MultiTexCoord2\n \
2521 #define gl_LightSource fw_LightSource\n ";
2529 fragmentSource[fragmentMainStart] =
" \
2530 #define HEADLIGHT_LIGHT 0\n \
2531 #define gl_NormalMatrix fw_NormalMatrix\n \
2532 #define gl_Normal fw_Normal\n \
2533 #define gl_LightSource fw_LightSource\n ";
2538 vertexSource[vertexLightDefines] = lightDefines0;
2539 vertexSource[vertexSimpleColourDeclare] = vertSimColDec;
2540 vertexSource[vertFrontColourDeclare] = varyingFrontColour;
2544 vertexSource[vertexNormalDeclare] = vertNormDec;
2545 fragmentSource[fragmentLightDefines] = lightDefines0;
2548 if ((p->userDefinedVertexShader[me] == NULL) || (p->userDefinedFragmentShader[me]==NULL)) {
2549 ConsoleMessage (
"no Shader Source found for user defined shaders...");
2553 fragmentSource[fragmentUserDefinedInput] = p->userDefinedFragmentShader[me];
2554 vertexSource[vertexUserDefinedInput] = p->userDefinedVertexShader[me];
2563 vertexShaderResources_t x1;
2564 fragmentShaderResources_t x2;
2567 ConsoleMessage (
"Vertex source:\n");
2568 for (x1=vertexGLSLVersion; x1<vertexEndMarker; x1++) {
2569 if (strlen(vertexSource[x1])>0)
2570 ConsoleMessage(
"%s",vertexSource[x1]);
2572 ConsoleMessage(
"Fragment Source:\n");
2574 for (x2=fragmentGLSLVersion; x2<fragmentEndMarker; x2++) {
2575 if (strlen(fragmentSource[x2])>0)
2576 ConsoleMessage(
"%s",fragmentSource[x2]);
2586 int getSpecificShaderSourceCastlePlugs (
const GLchar **vertexSource,
const GLchar **fragmentSource,
shaderflagsstruct whichOne);
2587 int getSpecificShaderSourceVolume (
const GLchar **vertexSource,
const GLchar **fragmentSource,
shaderflagsstruct whichOne);
2588 static int getSpecificShaderSource (
const GLchar *vertexSource[vertexEndMarker],
const GLchar *fragmentSource[fragmentEndMarker],
2590 int iret, userDefined, usingCastlePlugs = 1;
2591 userDefined = whichOne.usershaders ? TRUE : FALSE;
2593 if(usingCastlePlugs && !userDefined) {
2596 iret = getSpecificShaderSourceVolume(vertexSource, fragmentSource, whichOne);
2598 iret = getSpecificShaderSourceCastlePlugs(vertexSource, fragmentSource, whichOne);
2600 iret = getSpecificShaderSourceOriginal(vertexSource, fragmentSource, whichOne);
2609 GLuint myVertexShader = 0;
2610 GLuint myFragmentShader= 0;
2614 const GLchar *vertexSource[vertexEndMarker];
2615 const GLchar *fragmentSource[fragmentEndMarker];
2616 vertexShaderResources_t x1;
2617 fragmentShaderResources_t x2;
2621 ConsoleMessage (
"makeAndCompileShader called");
2626 for (x1=vertexGLSLVersion; x1<vertexEndMarker; x1++)
2627 vertexSource[x1] =
"";
2628 for (x2=fragmentGLSLVersion; x2<fragmentEndMarker; x2++)
2629 fragmentSource[x2] =
"";
2633 myProg = glCreateProgram();
2634 (*myShader).myShaderProgram = myProg;
2637 (*myShader).compiledOK = FALSE;
2640 if (!getSpecificShaderSource(vertexSource, fragmentSource, me->whichOne)) {
2645 myVertexShader = CREATE_SHADER (VERTEX_SHADER);
2646 SHADER_SOURCE(myVertexShader, vertexEndMarker, ((
const GLchar **)vertexSource), NULL);
2647 COMPILE_SHADER(myVertexShader);
2648 GET_SHADER_INFO(myVertexShader, COMPILE_STATUS, &success);
2650 shaderErrorLog(myVertexShader,
"VERTEX");
2653 ATTACH_SHADER(myProg, myVertexShader);
2657 myFragmentShader = CREATE_SHADER (FRAGMENT_SHADER);
2658 SHADER_SOURCE(myFragmentShader, fragmentEndMarker, (
const GLchar **) fragmentSource, NULL);
2659 COMPILE_SHADER(myFragmentShader);
2660 GET_SHADER_INFO(myFragmentShader, COMPILE_STATUS, &success);
2662 shaderErrorLog(myFragmentShader,
"FRAGMENT");
2664 ATTACH_SHADER(myProg, myFragmentShader);
2667 LINK_SHADER(myProg);
2669 glGetProgramiv(myProg,GL_LINK_STATUS, &success);
2670 (*myShader).compiledOK = (success == GL_TRUE);
2672 getShaderCommonInterfaces(myShader);
2675 GLuint myProg = me->myShaderProgram;
2679 #ifdef SHADERVERBOSE
2688 printf (
"getShaderCommonInterfaces, I am program %d\n",myProg);
2690 if (glIsProgram(myProg))
2691 printf (
"getShaderCommonInterfaces, %d is a program\n",myProg);
2693 printf (
"hmmm - it is not a program!\n");
2694 glGetAttachedShaders(myProg,10,&count,shaders);
2695 printf (
"got %d attached shaders, they are: \n",count);
2696 for (i=0; i<count; i++) {
2699 printf (
"%d\n",shaders[i]);
2700 glGetShaderSource(shaders[i],3000,&len,sl);
2701 printf (
"len %d\n",len);
2702 printf (
"sl: %s\n",sl);
2704 glGetProgramiv(myProg,GL_INFO_LOG_LENGTH, xxx); printf (
"GL_INFO_LOG_LENGTH_STATUS %d\n",xxx[0]);
2705 glGetProgramiv(myProg,GL_LINK_STATUS, xxx); printf (
"GL_LINK_STATUS %d\n",xxx[0]);
2706 glGetProgramiv(myProg,GL_VALIDATE_STATUS, xxx); printf (
"GL_VALIDATE_STATUS %d\n",xxx[0]);
2707 glGetProgramiv(myProg,GL_ACTIVE_ATTRIBUTES, xxx); printf (
"GL_ACTIVE_ATTRIBUTES %d\n",xxx[0]);
2708 glGetProgramiv(myProg,GL_ACTIVE_UNIFORMS, xxx); printf (
"GL_ACTIVE_UNIFORMS %d\n",xxx[0]);
2710 glGetProgramiv(myProg,GL_INFO_LOG_LENGTH, xxx);
2712 #define MAX_INFO_LOG_SIZE 512
2713 GLchar infoLog[MAX_INFO_LOG_SIZE];
2714 glGetProgramInfoLog(myProg, MAX_INFO_LOG_SIZE, NULL, infoLog);
2715 printf (
"log: %s\n",infoLog);
2721 me->myMaterialEmission = GET_UNIFORM(myProg,
"fw_FrontMaterial.emission");
2722 me->myMaterialDiffuse = GET_UNIFORM(myProg,
"fw_FrontMaterial.diffuse");
2723 me->myMaterialShininess = GET_UNIFORM(myProg,
"fw_FrontMaterial.shininess");
2724 me->myMaterialAmbient = GET_UNIFORM(myProg,
"fw_FrontMaterial.ambient");
2725 me->myMaterialSpecular = GET_UNIFORM(myProg,
"fw_FrontMaterial.specular");
2727 me->myMaterialBackEmission = GET_UNIFORM(myProg,
"fw_BackMaterial.emission");
2728 me->myMaterialBackDiffuse = GET_UNIFORM(myProg,
"fw_BackMaterial.diffuse");
2729 me->myMaterialBackShininess = GET_UNIFORM(myProg,
"fw_BackMaterial.shininess");
2730 me->myMaterialBackAmbient = GET_UNIFORM(myProg,
"fw_BackMaterial.ambient");
2731 me->myMaterialBackSpecular = GET_UNIFORM(myProg,
"fw_BackMaterial.specular");
2736 me->lightcount = GET_UNIFORM(myProg,
"lightcount");
2765 char uniformName[100];
2766 me->haveLightInShader =
false;
2767 #ifdef USING_SHADER_LIGHT_ARRAY_METHOD
2769 for (i = 0; i<MAX_LIGHTS; i++) {
2772 strcpy(uniformName,
"lightambient[0]");
2773 sndx = strstr(uniformName,
"[");
2775 me->lightAmbient[i] = GET_UNIFORM(myProg, uniformName);
2779 strcpy(uniformName,
"lightdiffuse[0]");
2780 sndx = strstr(uniformName,
"[");
2782 me->lightDiffuse[i] = GET_UNIFORM(myProg, uniformName);
2786 strcpy(uniformName,
"lightspecular[0]");
2787 sndx = strstr(uniformName,
"[");
2789 me->lightSpecular[i] = GET_UNIFORM(myProg, uniformName);
2793 strcpy(uniformName,
"lightposition[0]");
2794 sndx = strstr(uniformName,
"[");
2796 me->lightPosition[i] = GET_UNIFORM(myProg, uniformName);
2801 if (me->lightPosition[i] != -1) me->haveLightInShader =
true;
2803 strcpy(uniformName,
"lightspotDirection[0]");
2804 sndx = strstr(uniformName,
"[");
2806 me->lightSpotDir[i] = GET_UNIFORM(myProg, uniformName);
2810 strcpy(uniformName,
"lightspotExponent[0]");
2811 sndx = strstr(uniformName,
"[");
2813 me->lightSpotBeamWidth[i] = GET_UNIFORM(myProg, uniformName);
2817 strcpy(uniformName,
"lightspotCutoff[0]");
2818 sndx = strstr(uniformName,
"[");
2820 me->lightSpotCutoffAngle[i] = GET_UNIFORM(myProg, uniformName);
2824 strcpy(uniformName,
"lightAttenuations[0]");
2825 sndx = strstr(uniformName,
"[");
2827 me->lightAtten[i] = GET_UNIFORM(myProg, uniformName);
2829 strcpy(uniformName,
"lightRadius[0]");
2830 sndx = strstr(uniformName,
"[");
2832 me->lightRadius[i] = GET_UNIFORM(myProg, uniformName);
2837 #else //USING_SHADER_LIGHT_ARRAY_METHOD
2838 strcpy(uniformName,
"fw_LightSource[0].");
2839 for (i=0; i<MAX_LIGHTS; i++) {
2841 uniformName[15] =
'0' + i;
2843 strcpy(&uniformName[18],
"ambient");
2846 me->lightAmbient[i] = GET_UNIFORM(myProg,uniformName);
2850 strcpy(&uniformName[18],
"diffuse");
2851 me->lightDiffuse[i] = GET_UNIFORM(myProg,uniformName);
2855 strcpy(&uniformName[18],
"specular");
2856 me->lightSpecular[i] = GET_UNIFORM(myProg,uniformName);
2860 strcpy(&uniformName[18],
"position");
2861 me->lightPosition[i] = GET_UNIFORM(myProg,uniformName);
2866 if (me->lightPosition[i] != -1) me->haveLightInShader =
true;
2868 strcpy(&uniformName[18],
"spotDirection");
2869 me->lightSpotDir[i] = GET_UNIFORM(myProg,uniformName);
2874 strcpy(&uniformName[18],
"spotBeamWidth");
2875 me->lightSpotBeamWidth[i] = GET_UNIFORM(myProg,uniformName);
2879 strcpy(&uniformName[18],
"spotCutoff");
2880 me->lightSpotCutoffAngle[i] = GET_UNIFORM(myProg,uniformName);
2884 strcpy(&uniformName[18],
"Attenuations");
2885 me->lightAtten[i] = GET_UNIFORM(myProg,uniformName);
2901 strcpy(&uniformName[18],
"lightRadius");
2902 me->lightRadius[i] = GET_UNIFORM(myProg,uniformName);
2910 #endif // USING_SHADER_LIGHT_ARRAY_METHOD
2911 strcpy(uniformName,
"lightType[0]");
2912 for (i = 0; i < MAX_LIGHTS; i++) {
2914 uniformName[10] =
'0' + i;
2915 me->lightType[i] = GET_UNIFORM(myProg, uniformName);
2921 me->ModelViewMatrix = GET_UNIFORM(myProg,
"fw_ModelViewMatrix");
2922 me->ProjectionMatrix = GET_UNIFORM(myProg,
"fw_ProjectionMatrix");
2923 me->NormalMatrix = GET_UNIFORM(myProg,
"fw_NormalMatrix");
2924 me->ModelViewInverseMatrix = GET_UNIFORM(myProg,
"fw_ModelViewInverseMatrix");
2926 me->TextureMatrix[0] = GET_UNIFORM(myProg,
"fw_TextureMatrix0");
2927 me->TextureMatrix[1] = GET_UNIFORM(myProg,
"fw_TextureMatrix1");
2928 me->TextureMatrix[2] = GET_UNIFORM(myProg,
"fw_TextureMatrix2");
2929 me->TextureMatrix[3] = GET_UNIFORM(myProg,
"fw_TextureMatrix3");
2931 me->Vertices = GET_ATTRIB(myProg,
"fw_Vertex");
2933 me->Normals = GET_ATTRIB(myProg,
"fw_Normal");
2934 me->Colours = GET_ATTRIB(myProg,
"fw_Color");
2935 me->FogCoords = GET_ATTRIB(myProg,
"fw_FogCoords");
2939 me->TexCoords[0] = GET_ATTRIB(myProg,
"fw_MultiTexCoord0");
2940 me->TexCoords[1] = GET_ATTRIB(myProg,
"fw_MultiTexCoord1");
2941 me->TexCoords[2] = GET_ATTRIB(myProg,
"fw_MultiTexCoord2");
2942 me->TexCoords[3] = GET_ATTRIB(myProg,
"fw_MultiTexCoord3");
2945 for (i=0; i<MAX_MULTITEXTURE; i++) {
2947 sprintf (line,
"fw_Texture_unit%d",i);
2948 me->TextureUnit[i]= GET_UNIFORM(myProg,line);
2949 sprintf (line,
"fw_Texture_mode%d",i);
2950 me->TextureMode[i] = GET_UNIFORM(myProg,line);
2951 sprintf (line,
"fw_Texture_source%d",i);
2952 me->TextureSource[i] = GET_UNIFORM(myProg,line);
2953 sprintf (line,
"fw_Texture_function%d",i);
2954 me->TextureFunction[i] = GET_UNIFORM(myProg,line);
2959 me->textureCount = GET_UNIFORM(myProg,
"textureCount");
2960 me->multitextureColor = GET_UNIFORM(myProg,
"mt_Color");
2964 me->tex3dTiles = GET_UNIFORM(myProg,
"tex3dTiles");
2965 me->tex3dUseVertex = GET_UNIFORM(myProg,
"tex3dUseVertex");
2966 me->magFilter = GET_UNIFORM(myProg,
"magFilter");
2967 me->repeatSTR = GET_UNIFORM(myProg,
"repeatSTR");
2971 me->myPointSize = GET_UNIFORM(myProg,
"pointSize");
2972 me->hatchColour = GET_UNIFORM(myProg,
"HatchColour");
2973 me->hatchPercent = GET_UNIFORM(myProg,
"HatchPct");
2974 me->hatchScale = GET_UNIFORM(myProg,
"HatchScale");
2975 me->filledBool = GET_UNIFORM(myProg,
"filled");
2976 me->hatchedBool = GET_UNIFORM(myProg,
"hatched");
2977 me->algorithm = GET_UNIFORM(myProg,
"algorithm");
2979 me->fogColor = GET_UNIFORM(myProg,
"fw_fogparams.fogColor");
2980 me->fogvisibilityRange = GET_UNIFORM(myProg,
"fw_fogparams.visibilityRange");
2981 me->fogScale = GET_UNIFORM(myProg,
"fw_fogparams.fogScale");
2982 me->fogType = GET_UNIFORM(myProg,
"fw_fogparams.fogType");
2985 me->clipplanes = GET_UNIFORM(myProg,
"fw_clipplanes");
2986 me->nclipplanes = GET_UNIFORM(myProg,
"fw_nclipplanes");
2989 me->texCoordGenType = GET_UNIFORM(myProg,
"fw_textureCoordGenType");
2993 printf (
"shader uniforms: vertex %d normal %d modelview %d projection %d\n",
2994 me->Vertices, me->Normals, me->ModelViewMatrix, me->ProjectionMatrix);
2995 printf (
"hatchColour %d, hatchPercent %d",me->hatchColour, me->hatchPercent);
3001 void calculateViewingSpeed();
3002 static void handle_GeoLODRange(
struct X3D_GeoLOD *node) {
3006 getCurrentPosInModel(FALSE);
3007 calculateViewingSpeed();
3008 cx = Viewer()->currentPosInModel.x - node->__movedCoords.c[0];
3009 cy = Viewer()->currentPosInModel.y - node->__movedCoords.c[1];
3010 cz = Viewer()->currentPosInModel.z - node->__movedCoords.c[2];
3015 oldInRange = node->__inRange;
3018 if((cx*cx+cy*cy+cz*cz) > (node->range * node->range)) {
3019 node->__inRange = FALSE;
3021 node->__inRange = TRUE;
3025 if (oldInRange != node->__inRange) {
3028 if (node->__inRange) printf (
"TRUE: ");
else printf (
"FALSE: ");
3029 printf (
"range changed; level %d, comparing %lf:%lf:%lf and range %lf node %u\n",
3030 node->__level, cx,cy,cz, node->range, node);
3034 if (node->children.p == NULL) node->children.p=MALLOC(
struct X3D_Node **,
sizeof(
struct X3D_Node *) * 4);
3036 if (node->__inRange == TRUE) {
3038 printf (
"GeoLOD %u level %d, inRange set to FALSE, range %lf\n",node, node->__level, node->range);
3040 node->level_changed = 1;
3041 node->children.p[0] = node->__child1Node;
3042 node->children.p[1] = node->__child2Node;
3043 node->children.p[2] = node->__child3Node;
3044 node->children.p[3] = node->__child4Node;
3045 node->children.n = 4;
3048 printf (
"GeoLOD %u level %d, inRange set to TRUE range %lf\n",node, node->__level, node->range);
3050 node->level_changed = 0;
3051 node->children.n = 0;
3052 if( node->__rootUrl )
3054 node->children.p[0] = node->__rootUrl;
3055 node->children.n = 1;
3057 else if( node->rootNode.p && node->rootNode.p[0] )
3059 node->children.p[0] = node->rootNode.p[0];
3060 node->children.n = 1;
3063 MARK_EVENT(X3D_NODE(node), offsetof (
struct X3D_GeoLOD, level_changed));
3064 MARK_EVENT(X3D_NODE(node), offsetof (
struct X3D_GeoLOD, children));
3065 oldInRange = X3D_GEOLOD(node)->__inRange;
3071 update_node(X3D_NODE(node));
3075 #ifdef DEBUGGING_CODE
3077 void drawBBOX(
struct X3D_Node *node) {
3079 FW_GL_COLOR3F((
float)1.0,(
float)0.6,(
float)0.6);
3083 glVertex3d(node->EXTENT_MIN_X, node->EXTENT_MIN_Y, node->EXTENT_MIN_Z);
3084 glVertex3d(node->EXTENT_MIN_X, node->EXTENT_MIN_Y, node->EXTENT_MAX_Z);
3088 glVertex3d(node->EXTENT_MIN_X, node->EXTENT_MIN_Y, node->EXTENT_MIN_Z);
3089 glVertex3d(node->EXTENT_MIN_X, node->EXTENT_MAX_Y, node->EXTENT_MIN_Z);
3093 glVertex3d(node->EXTENT_MIN_X, node->EXTENT_MAX_Y, node->EXTENT_MIN_Z);
3094 glVertex3d(node->EXTENT_MIN_X, node->EXTENT_MAX_Y, node->EXTENT_MAX_Z);
3098 glVertex3d(node->EXTENT_MIN_X, node->EXTENT_MIN_Y, node->EXTENT_MAX_Z);
3099 glVertex3d(node->EXTENT_MIN_X, node->EXTENT_MAX_Y, node->EXTENT_MAX_Z);
3104 glVertex3d(node->EXTENT_MAX_X, node->EXTENT_MIN_Y, node->EXTENT_MIN_Z);
3105 glVertex3d(node->EXTENT_MAX_X, node->EXTENT_MIN_Y, node->EXTENT_MAX_Z);
3109 glVertex3d(node->EXTENT_MAX_X, node->EXTENT_MIN_Y, node->EXTENT_MIN_Z);
3110 glVertex3d(node->EXTENT_MAX_X, node->EXTENT_MAX_Y, node->EXTENT_MIN_Z);
3114 glVertex3d(node->EXTENT_MAX_X, node->EXTENT_MAX_Y, node->EXTENT_MIN_Z);
3115 glVertex3d(node->EXTENT_MAX_X, node->EXTENT_MAX_Y, node->EXTENT_MAX_Z);
3119 glVertex3d(node->EXTENT_MAX_X, node->EXTENT_MIN_Y, node->EXTENT_MAX_Z);
3120 glVertex3d(node->EXTENT_MAX_X, node->EXTENT_MAX_Y, node->EXTENT_MAX_Z);
3125 glVertex3d(node->EXTENT_MIN_X, node->EXTENT_MIN_Y, node->EXTENT_MIN_Z);
3126 glVertex3d(node->EXTENT_MAX_X, node->EXTENT_MIN_Y, node->EXTENT_MIN_Z);
3130 glVertex3d(node->EXTENT_MIN_X, node->EXTENT_MIN_Y, node->EXTENT_MAX_Z);
3131 glVertex3d(node->EXTENT_MAX_X, node->EXTENT_MIN_Y, node->EXTENT_MAX_Z);
3135 glVertex3d(node->EXTENT_MIN_X, node->EXTENT_MAX_Y, node->EXTENT_MIN_Z);
3136 glVertex3d(node->EXTENT_MAX_X, node->EXTENT_MAX_Y, node->EXTENT_MIN_Z);
3140 glVertex3d(node->EXTENT_MIN_X, node->EXTENT_MAX_Y, node->EXTENT_MAX_Z);
3141 glVertex3d(node->EXTENT_MAX_X, node->EXTENT_MAX_Y, node->EXTENT_MAX_Z);
3145 #endif //DEBUGGING_CODE
3147 static void calculateNearFarplanes(
struct X3D_Node *vpnode,
int layerid ) {
3149 GLDOUBLE cfp = -DBL_MAX;
3150 GLDOUBLE cnp = DBL_MAX;
3152 bool doingGeoSpatial =
false;
3153 double bboxMovedCentreZ = 0.0;
3154 double bboxSphereRadius = 0.0;
3169 printf (
"have a bound viewpoint... lets calculate our near/far planes from it \n");
3170 printf (
"we are currently at %4.2f %4.2f %4.2f\n",Viewer()->currentPosInModel.x, Viewer()->currentPosInModel.y, Viewer()->currentPosInModel.z);
3176 if ((vpnode->_nodeType != NODE_Viewpoint) &&
3177 (vpnode->_nodeType != NODE_OrthoViewpoint) &&
3178 (vpnode->_nodeType != NODE_GeoViewpoint)) {
3179 printf (
"can not do this node type yet %s, for cpf\n",stringNodeType(vpnode->_nodeType));
3180 viewer->nearPlane = DEFAULT_NEARPLANE;
3181 viewer->farPlane = DEFAULT_FARPLANE;
3182 viewer->backgroundPlane = DEFAULT_BACKGROUNDPLANE;
3186 if (vpnode->_nodeType == NODE_GeoViewpoint) {
3187 doingGeoSpatial =
true;
3195 if (doingGeoSpatial) {
3196 if ((rn->EXTENT_MAX_X - rn->EXTENT_MIN_X) > bboxSphereRadius) {
3197 bboxSphereRadius = rn->EXTENT_MAX_X - rn->EXTENT_MIN_X;
3199 if ((rn->EXTENT_MAX_Y - rn->EXTENT_MIN_Y) > bboxSphereRadius) {
3200 bboxSphereRadius = rn->EXTENT_MAX_Y - rn->EXTENT_MIN_Y;
3202 if ((rn->EXTENT_MAX_Z - rn->EXTENT_MIN_Z) > bboxSphereRadius) {
3203 bboxSphereRadius = rn->EXTENT_MAX_Z - rn->EXTENT_MIN_Z;
3205 bboxSphereRadius /=2.0;
3209 ConsoleMessage (
"bboxSphereRadius %lf",bboxSphereRadius);
3215 FW_GL_GETDOUBLEV(GL_MODELVIEW_MATRIX, MM);
3218 printf (
"rootNode extents x: %4.2f %4.2f y:%4.2f %4.2f z: %4.2f %4.2f\n",rootNode()->EXTENT_MAX_X, rootNode()->EXTENT_MIN_X,rootNode()->EXTENT_MAX_Y, rootNode()->EXTENT_MIN_Y,rootNode()->EXTENT_MAX_Z, rootNode()->EXTENT_MIN_Z);
3222 moveAndRotateThisPoint(&bboxPoints[0], rn->EXTENT_MIN_X, rn->EXTENT_MIN_Y, rn->EXTENT_MIN_Z,MM);
3223 moveAndRotateThisPoint(&bboxPoints[1], rn->EXTENT_MIN_X, rn->EXTENT_MIN_Y, rn->EXTENT_MAX_Z,MM);
3224 moveAndRotateThisPoint(&bboxPoints[2], rn->EXTENT_MIN_X, rn->EXTENT_MAX_Y, rn->EXTENT_MIN_Z,MM);
3225 moveAndRotateThisPoint(&bboxPoints[3], rn->EXTENT_MIN_X, rn->EXTENT_MAX_Y, rn->EXTENT_MAX_Z,MM);
3226 moveAndRotateThisPoint(&bboxPoints[4], rn->EXTENT_MAX_X, rn->EXTENT_MIN_Y, rn->EXTENT_MIN_Z,MM);
3227 moveAndRotateThisPoint(&bboxPoints[5], rn->EXTENT_MAX_X, rn->EXTENT_MIN_Y, rn->EXTENT_MAX_Z,MM);
3228 moveAndRotateThisPoint(&bboxPoints[6], rn->EXTENT_MAX_X, rn->EXTENT_MAX_Y, rn->EXTENT_MIN_Z,MM);
3229 moveAndRotateThisPoint(&bboxPoints[7], rn->EXTENT_MAX_X, rn->EXTENT_MAX_Y, rn->EXTENT_MAX_Z,MM);
3233 for (ci=0; ci<8; ci++) {
3234 bboxMovedCentreZ += bboxPoints[ci].z;
3238 printf (
"moved bbox node %d is %4.2f %4.2f %4.2f\n",ci,bboxPoints[ci].x, bboxPoints[ci].y, bboxPoints[ci].z);
3241 if (!doingGeoSpatial) {
3242 if (-(bboxPoints[ci].z) > cfp) cfp = -(bboxPoints[ci].z);
3243 if (-(bboxPoints[ci].z) < cnp) cnp = -(bboxPoints[ci].z);
3247 bboxMovedCentreZ /= 8.0;
3249 if (doingGeoSpatial) {
3250 cnp = -bboxMovedCentreZ - bboxSphereRadius;
3251 cfp = -bboxMovedCentreZ;
3256 ConsoleMessage (
"centre of bbox is %lf Z away",bboxMovedCentreZ);
3257 ConsoleMessage (
"bboxMovedCentreZ minus bboxRadius %lf",-bboxMovedCentreZ - bboxSphereRadius);
3265 if (cnp<DEFAULT_NEARPLANE) cnp = DEFAULT_NEARPLANE;
3267 if (cfp<1.0) cfp = 1.0;
3277 printf (
"cnp %lf cfp before leaving room for Background %lf\n",cnp,cfp);
3287 if ((cnp<1.0) && (vpnode->_nodeType == NODE_GeoViewpoint)) {
3289 cnp = Viewer()->currentPosInModel.z/16.0;
3291 ConsoleMessage (
"vp height %lf moved height %lf posinModel %f",X3D_GEOVIEWPOINT(vpnode)->position.c[2],
3292 X3D_GEOVIEWPOINT(vpnode)->__movedPosition.c[2],Viewer()->currentPosInModel.z);
3293 smooger ++;
if (smooger == 100) smooger = 0;
3301 viewer->nearPlane = min(cnp,DEFAULT_NEARPLANE);
3303 if (vectorSize(getActiveBindableStacks(tg)->background)!= 0) {
3304 viewer->farPlane = max(cfp * 10.0,DEFAULT_FARPLANE);
3305 viewer->backgroundPlane = max(cfp*5.0,DEFAULT_BACKGROUNDPLANE);
3307 viewer->farPlane = max(cfp,DEFAULT_FARPLANE);
3308 viewer->backgroundPlane = max(cfp,DEFAULT_BACKGROUNDPLANE);
3312 void doglClearColor() {
3316 FW_GL_CLEAR_COLOR(p->cc_red, p->cc_green, p->cc_blue, p->cc_alpha);
3317 tg->OpenGL_Utils.cc_changed = FALSE;
3325 void clear_shader_table()
3335 if (p->myShaderTable != NULL) {
3338 for (i=0; i<vectorSize(p->myShaderTable); i++) {
3350 bool fwl_initialize_GL()
3352 char blankTexture[] = {0x40, 0x40, 0x40, 0xFF};
3358 PRINT_GL_ERROR_IF_ANY(
"fwl_initialize_GL start 1");
3359 initialize_rdr_caps();
3361 PRINT_GL_ERROR_IF_ANY(
"fwl_initialize_GL start 3");
3366 #if defined(TARGET_X11) || defined(TARGET_MOTIF)
3372 PRINT_GL_ERROR_IF_ANY(
"fwl_initialize_GL start 4");
3374 FW_GL_MATRIX_MODE(GL_PROJECTION);
3375 FW_GL_LOAD_IDENTITY();
3376 FW_GL_MATRIX_MODE(GL_MODELVIEW);
3378 PRINT_GL_ERROR_IF_ANY(
"fwl_initialize_GL start 6");
3380 FW_GL_CLEAR_COLOR(p->cc_red, p->cc_green, p->cc_blue, p->cc_alpha);
3382 PRINT_GL_ERROR_IF_ANY(
"fwl_initialize_GL start 7");
3384 PRINT_GL_ERROR_IF_ANY(
"fwl_initialize_GL start 8");
3387 FW_GL_DEPTHFUNC(GL_LEQUAL);
3388 glEnable(GL_DEPTH_TEST);
3390 PRINT_GL_ERROR_IF_ANY(
"fwl_initialize_GL start 9");
3392 gl_linewidth = gglobal()->Mainloop.gl_linewidth;
3398 #if defined (GL_ES_VERSION_2_0)
3399 #if defined (GL_PROGRAM_POINT_SIZE)
3400 glEnable(GL_PROGRAM_POINT_SIZE);
3402 #if defined (GL_PROGRAM_POINT_SIZE_EXT)
3403 glEnable(GL_PROGRAM_POINT_SIZE_EXT);
3406 glPointSize (gl_linewidth);
3409 glLineWidth(gl_linewidth);
3411 PRINT_GL_ERROR_IF_ANY(
"fwl_initialize_GL start a");
3422 FW_GL_BLENDFUNC(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
3423 FW_GL_CLEAR(GL_COLOR_BUFFER_BIT);
3425 PRINT_GL_ERROR_IF_ANY(
"fwl_initialize_GL start b");
3434 PRINT_GL_ERROR_IF_ANY(
"fwl_initialize_GL start c0");
3437 initializeLightTables();
3439 PRINT_GL_ERROR_IF_ANY(
"fwl_initialize_GL start c1");
3443 CULL_FACE_INITIALIZE;
3445 FW_GL_PIXELSTOREI(GL_UNPACK_ALIGNMENT,1);
3446 FW_GL_PIXELSTOREI(GL_PACK_ALIGNMENT,1);
3448 PRINT_GL_ERROR_IF_ANY(
"fwl_initialize_GL start c");
3452 FW_GL_GENTEXTURES (1,&tg->Textures.defaultBlankTexture);
3453 glBindTexture (GL_TEXTURE_2D, tg->Textures.defaultBlankTexture);
3454 FW_GL_TEXPARAMETERI( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3455 FW_GL_TEXPARAMETERI( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3456 FW_GL_TEXIMAGE2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, blankTexture);
3458 PRINT_GL_ERROR_IF_ANY(
"fwl_initialize_GL start d");
3463 clear_shader_table();
3479 ivec4 get_current_viewport();
3480 void BackEndClearBuffer(
int which) {
3481 ivec4 vport = get_current_viewport();
3482 FW_GL_SCISSOR(vport.X,vport.Y,vport.W,vport.H);
3483 glEnable(GL_SCISSOR_TEST);
3485 FW_GL_CLEAR(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
3488 FW_GL_CLEAR(GL_DEPTH_BUFFER_BIT);
3491 glDisable(GL_SCISSOR_TEST);
3495 void BackEndLightsOff() {
3497 for (i=0; i<HEADLIGHT_LIGHT; i++) {
3498 setLightState(i, FALSE);
3503 void fw_glMatrixMode(GLint mode) {
3506 p->whichMode = mode;
3508 printf (
"fw_glMatrixMode, projTOS %d, modTOS %d texvTOS %d\n",p->projectionviewTOS,p->modelviewTOS, p->textureviewTOS);
3510 switch (p->whichMode) {
3511 case GL_PROJECTION: printf (
"glMatrixMode(GL_PROJECTION)\n");
break;
3512 case GL_MODELVIEW: printf (
"glMatrixMode(GL_MODELVIEW)\n");
break;
3513 case GL_TEXTURE: printf (
"glMatrixMode(GL_TEXTURE)\n");
break;
3517 switch (p->whichMode) {
3518 case GL_PROJECTION: p->currentMatrix = (GLDOUBLE *) &p->FW_ProjectionView[p->projectionviewTOS];
break;
3519 case GL_MODELVIEW: p->currentMatrix = (GLDOUBLE *) &p->FW_ModelView[p->modelviewTOS];
break;
3520 case GL_TEXTURE: p->currentMatrix = (GLDOUBLE *) &p->FW_TextureView[p->textureviewTOS];
break;
3521 default: printf (
"invalid mode sent in it is %d, expected one of %d %d %d\n",p->whichMode, GL_PROJECTION,GL_MODELVIEW,GL_TEXTURE);
3526 void fw_glLoadIdentity(
void) {
3529 loadIdentityMatrix(p->currentMatrix);
3530 FW_GL_LOADMATRIX(p->currentMatrix);
3533 MATRIX4* PushMat(
int a,
int *b,
int c, MATRIX4 *d){
3536 printf(
"stack overflow, depth %d whichmode %d\n", *b, a);
3539 memcpy((
void *)d[*b], (
void *)d[*b - 1],
sizeof(GLDOUBLE)* 16);
3544 void printMaxStackUsed(){
3546 ConsoleMessage(
"%25s %d\n",
"max modelview stack used", p->maxStackUsed);
3548 void fw_glPushMatrix(
void) {
3551 switch (p->whichMode) {
3552 case GL_PROJECTION: p->currentMatrix = *PushMat(GL_PROJECTION, &p->projectionviewTOS, MAX_SMALL_MATRIX_STACK, p->FW_ProjectionView);
break;
3553 case GL_MODELVIEW: p->currentMatrix = *PushMat(GL_MODELVIEW, &p->modelviewTOS, MAX_LARGE_MATRIX_STACK, p->FW_ModelView);
break;
3554 case GL_TEXTURE: p->currentMatrix = *PushMat(GL_TEXTURE, &p->textureviewTOS, MAX_SMALL_MATRIX_STACK, p->FW_TextureView);
break;
3555 default:printf(
"wrong mode in popMatrix\n");
3557 p->maxStackUsed = max(p->maxStackUsed, p->modelviewTOS);
3558 FW_GL_LOADMATRIX(p->currentMatrix);
3575 MATRIX4 *PopMat(
int a,
int *b, MATRIX4 *c){
3579 printf(
"popMatrix, stack underflow, whichMode %d\n", a);
3583 void fw_glPopMatrix(
void) {
3586 switch (p->whichMode) {
3587 case GL_PROJECTION: p->currentMatrix = *PopMat(GL_PROJECTION, &p->projectionviewTOS, p->FW_ProjectionView);
break;
3588 case GL_MODELVIEW: p->currentMatrix = *PopMat(GL_MODELVIEW, &p->modelviewTOS, p->FW_ModelView);
break;
3589 case GL_TEXTURE: p->currentMatrix = *PopMat(GL_TEXTURE, &p->textureviewTOS, p->FW_TextureView);
break;
3591 default: printf (
"wrong mode in popMatrix\n");
3594 FW_GL_LOADMATRIX(p->currentMatrix);
3611 void fw_glTranslated(GLDOUBLE x, GLDOUBLE y, GLDOUBLE z) {
3617 p->currentMatrix[12] = p->currentMatrix[0] * x + p->currentMatrix[4] * y + p->currentMatrix[8] * z + p->currentMatrix[12];
3618 p->currentMatrix[13] = p->currentMatrix[1] * x + p->currentMatrix[5] * y + p->currentMatrix[9] * z + p->currentMatrix[13];
3619 p->currentMatrix[14] = p->currentMatrix[2] * x + p->currentMatrix[6] * y + p->currentMatrix[10] * z + p->currentMatrix[14];
3620 p->currentMatrix[15] = p->currentMatrix[3] * x + p->currentMatrix[7] * y + p->currentMatrix[11] * z + p->currentMatrix[15];
3622 FW_GL_LOADMATRIX(p->currentMatrix);
3625 void fw_glTranslatef(
float x,
float y,
float z) {
3629 p->currentMatrix[12] = p->currentMatrix[0] * x + p->currentMatrix[4] * y + p->currentMatrix[8] * z + p->currentMatrix[12];
3630 p->currentMatrix[13] = p->currentMatrix[1] * x + p->currentMatrix[5] * y + p->currentMatrix[9] * z + p->currentMatrix[13];
3631 p->currentMatrix[14] = p->currentMatrix[2] * x + p->currentMatrix[6] * y + p->currentMatrix[10] * z + p->currentMatrix[14];
3632 p->currentMatrix[15] = p->currentMatrix[3] * x + p->currentMatrix[7] * y + p->currentMatrix[11] * z + p->currentMatrix[15];
3634 FW_GL_LOADMATRIX(p->currentMatrix);
3638 void fw_glRotateRad (GLDOUBLE angle, GLDOUBLE x, GLDOUBLE y, GLDOUBLE z) {
3645 loadIdentityMatrix (myMat);
3648 mag = x*x + y*y + z*z;
3651 if (APPROX(mag,0.00)) {
3656 if (APPROX(angle,0.0)) {
3660 if (!APPROX(mag,1.0)) {
3662 in.x = x; in.y = y, in.z = z;
3663 vecnormal(&out,&in);
3664 x = out.x; y = out.y; z = out.z;
3669 matrotate(myMat,angle,x,y,z);
3672 matmultiplyAFFINE(p->currentMatrix,myMat,p->currentMatrix);
3676 FW_GL_LOADMATRIX(p->currentMatrix);
3680 void fw_glRotated (GLDOUBLE angle, GLDOUBLE x, GLDOUBLE y, GLDOUBLE z) {
3688 radAng = angle * 3.1415926536/ 180.0;
3690 loadIdentityMatrix (myMat);
3693 mag = x*x + y*y + z*z;
3696 if (APPROX(mag,0.00)) {
3701 if (APPROX(angle,0.0)) {
3705 if (!APPROX(mag,1.0)) {
3707 in.x = x; in.y = y, in.z = z;
3708 vecnormal(&out,&in);
3709 x = out.x; y = out.y; z = out.z;
3717 matrotate(myMat,radAng,x,y,z);
3718 matmultiplyAFFINE(p->currentMatrix,p->currentMatrix,myMat);
3720 FW_GL_LOADMATRIX(p->currentMatrix);
3723 void fw_glRotatef (
float a,
float x,
float y,
float z) {
3724 fw_glRotated((GLDOUBLE)a, (GLDOUBLE)x, (GLDOUBLE)y, (GLDOUBLE)z);
3727 void fw_glScaled (GLDOUBLE x, GLDOUBLE y, GLDOUBLE z) {
3732 p->currentMatrix[0] *= x; p->currentMatrix[4] *= y; p->currentMatrix[8] *= z;
3733 p->currentMatrix[1] *= x; p->currentMatrix[5] *= y; p->currentMatrix[9] *= z;
3734 p->currentMatrix[2] *= x; p->currentMatrix[6] *= y; p->currentMatrix[10] *= z;
3735 p->currentMatrix[3] *= x; p->currentMatrix[7] *= y; p->currentMatrix[11] *= z;
3737 FW_GL_LOADMATRIX(p->currentMatrix);
3740 void fw_glScalef (
float x,
float y,
float z) {
3745 p->currentMatrix[0] *= x; p->currentMatrix[4] *= y; p->currentMatrix[8] *= z;
3746 p->currentMatrix[1] *= x; p->currentMatrix[5] *= y; p->currentMatrix[9] *= z;
3747 p->currentMatrix[2] *= x; p->currentMatrix[6] *= y; p->currentMatrix[10] *= z;
3748 p->currentMatrix[3] *= x; p->currentMatrix[7] *= y; p->currentMatrix[11] *= z;
3750 FW_GL_LOADMATRIX(p->currentMatrix);
3754 void fw_glGetDoublev (
int ty, GLDOUBLE *mat) {
3767 case GL_PROJECTION_MATRIX: dp = p->FW_ProjectionView[p->projectionviewTOS];
break;
3768 case GL_MODELVIEW_MATRIX: dp = p->FW_ModelView[p->modelviewTOS];
break;
3769 case GL_TEXTURE_MATRIX: dp = p->FW_TextureView[p->textureviewTOS];
break;
3771 loadIdentityMatrix(mat);
3772 printf (
"invalid mode sent in it is %d, expected one of %d %d %d\n",ty,GL_PROJECTION_MATRIX,GL_MODELVIEW_MATRIX,GL_TEXTURE_MATRIX);
3775 memcpy((
void *)mat, (
void *) dp,
sizeof (GLDOUBLE) * MATRIX_SIZE);
3778 void fw_glSetDoublev (
int ty, GLDOUBLE *mat) {
3791 case GL_PROJECTION_MATRIX: dp = p->FW_ProjectionView[p->projectionviewTOS];
break;
3792 case GL_MODELVIEW_MATRIX: dp = p->FW_ModelView[p->modelviewTOS];
break;
3793 case GL_TEXTURE_MATRIX: dp = p->FW_TextureView[p->textureviewTOS];
break;
3795 printf (
"invalid mode sent in it is %d, expected one of %d %d %d\n",ty,GL_PROJECTION_MATRIX,GL_MODELVIEW_MATRIX,GL_TEXTURE_MATRIX);
3798 memcpy((
void *) dp, (
void *)mat,
sizeof (GLDOUBLE) * MATRIX_SIZE);
3803 void kill_rendering() {
3817 void kill_oldWorld(
int kill_EAI,
int kill_JavaScript,
char *file,
int line) {
3827 printf (
"kill 1 myThread %u displayThread %u\n",pthread_self(), gglobal()->threads.DispThrd);
3829 if (pthread_self().p != gglobal()->threads.DispThrd.p ) {
3831 if (pthread_self() != gglobal()->threads.DispThrd) {
3833 ConsoleMessage (
"kill_oldWorld must run in the displayThread called at %s:%d\n",file,line);
3839 resetSensorEvents();
3849 resource_tree_destroy();
3852 gglobal()->resources.root_res = NULL;
3859 rootnode = rootNode();
3860 if (rootnode != NULL) {
3861 if(rootnode->_nodeType == NODE_Proto){
3862 unload_broto(X3D_PROTO(rootnode));
3864 struct Multi_Node *children, *sortedChildren;
3866 children = &X3D_PROTO(rootNode())->__children;
3867 sortedChildren = &X3D_PROTO(rootNode())->_sortedChildren;
3869 if (children->n != 0) {
3870 for (i=0; i<children->n; i++) {
3871 markForDispose(children->p[i], TRUE);
3882 sortedChildren->n = 0;
3888 closeConsoleMessage();
3898 EAI_killBindables();
3900 killKeySensorNodeList();
3907 setMenuStatus(NULL);
3910 kill_userDefinedShaders();
3922 #if !defined(EXCLUDE_EAI)
3926 fwlio_RxTx_control(CHANNEL_EAI, RxTx_STOP) ;
3931 sprintf (mystring,
"QUIT");
3932 Sound_toserver(mystring);
3937 if (globalParser != NULL) {
3938 parser_destroyData(globalParser);
3947 setMenuStatus(
"NONE");
3949 void unload_globalParser() {
3953 parser_destroyData(globalParser);
3954 FREE_IF_NZ(globalParser->lexer);
3956 FREE_IF_NZ(globalParser);
3957 gglobal()->CParse.globalParser = NULL;
3959 void unload_libraryscenes();
3960 void reset_Browser(){
3965 struct X3D_Node *rootnode = rootNode();
3966 if (rootnode != NULL) {
3967 if( rootnode->_nodeType == NODE_Proto){
3968 unload_broto(X3D_PROTO(rootnode));
3969 unload_globalParser();
3970 resource_tree_destroy();
3971 unload_libraryscenes();
3974 kill_oldWorld(TRUE,TRUE,__FILE__,__LINE__);
3980 #if defined (_ANDROID)
3983 void fwl_Android_reloadAssets(
void) {
3991 resetGlobalShader();
3996 fwl_initialize_GL();
4000 if (p->linearNodeTable != NULL) {
4002 for (tc=0; tc<vectorSize(p->linearNodeTable); tc++){
4003 node = vector_get(
struct X3D_Node *,p->linearNodeTable,tc);
4011 switch (node->_nodeType) {
4016 me->__SphereIndxVBO = 0;
4017 FREE_IF_NZ(me->__points.p);
4018 me->__points.p = NULL;
4030 case NODE_Cylinder: {
4032 me->__cylinderVBO = 0;
4036 case NODE_Background: {
4051 for (i=0; i<VBO_COUNT; i++) pr->VBO_buffers[i] = 0;
4067 int checkNode(
struct X3D_Node *node,
char *fn,
int line) {
4072 printf (
"checkNode, node is NULL at %s %d\n",fn,line);
4076 if (node == X3D_NODE(rootNode()))
return FALSE;
4080 for (tc=0; tc<vectorSize(p->linearNodeTable); tc++){
4081 if (vector_get(
struct X3D_Node *,p->linearNodeTable,tc) == node) {
4082 if (node->referenceCount > 0) {
4100 static void createMemoryTable(){
4103 p->linearNodeTable = newVector(
struct X3D_Node*, 128);
4109 void registerX3DNode(
struct X3D_Node * tmp){
4112 bool filledHole = FALSE;
4116 if (p->linearNodeTable == NULL) {
4117 createMemoryTable();
4121 if (p->potentialHoleCount > 0) {
4122 for (tc=0; tc<vectorSize(p->linearNodeTable); tc++){
4124 if (vector_get(
struct X3D_Node *,p->linearNodeTable,tc) == NULL) {
4125 vector_set(
struct X3D_Node *, p->linearNodeTable, tc, tmp);
4126 p->potentialHoleCount--;
4140 if (!filledHole) vector_pushBack(
struct X3D_Node *, p->linearNodeTable, tmp);
4144 int removeNodeFromVector(
int iaction,
struct Vector *v,
struct X3D_Node *node);
4145 void unRegisterX3DNode(
struct X3D_Node * tmp){
4148 if (p->linearNodeTable ) {
4149 removeNodeFromVector(1, p->linearNodeTable, tmp);
4165 void doNotRegisterThisNodeForDestroy(
struct X3D_Node * nodePtr){
4173 for (i=0; i<vectorSize(p->linearNodeTable); i++) {
4174 if (vector_get(
struct X3D_Node *,p->linearNodeTable,i) == nodePtr) {
4175 vector_set(
struct X3D_Node *,p->linearNodeTable,i,NULL);
4176 p->potentialHoleCount++;
4194 static void sortChildren (
int line,
struct Multi_Node *ch,
struct Multi_Node *sortedCh,
int sortForDistance) {
4209 printf (
"sortChildren line %d nc %d ",line,nc);
4210 if (sortForDistance) printf (
"sortForDistance ");
4216 if (nc != sortedCh->n) {
4217 FREE_IF_NZ(sortedCh->p);
4218 sortedCh->p = MALLOC(
void *,
sizeof (
struct X3DNode *) * nc);
4219 memcpy(sortedCh->p, ch->p,
sizeof(
struct X3DNode *) * nc);
4224 printf (
"sortChildren start, %d, chptr %u\n",nc,ch);
4229 if (!sortForDistance)
return;
4237 for(i=0; i<nc; i++) {
4239 for (j=(nc-1); j>i; j--) {
4241 a = X3D_NODE(sortedCh->p[j-1]);
4242 b = X3D_NODE(sortedCh->p[j]);
4246 if (a->_dist > b->_dist) {
4249 sortedCh->p[j-1] = b;
4263 printf (
"sortChildren returning.\n");
4264 for(i=0; i<nc; i++) {
4267 printf (
"child %d %u %f %s",i,b,b->_dist,stringNodeType(b->_nodeType));
4269 printf (
"no child %d", i);
4271 printf (
" unsorted %u\n",b);
4277 void zeroVisibilityFlag(
void) {
4283 if (fwl_isinputThreadParsing())
return;
4287 if ((gglobal()->Frustum.OccFailed) || fwl_isTextureParsing()) {
4292 for (i=0; i<vectorSize(p->linearNodeTable); i++){
4293 node = vector_get(
struct X3D_Node *,p->linearNodeTable,i);
4295 node->_renderFlags = node->_renderFlags | VF_hasVisibleChildren;
4299 else if (p->linearNodeTable)
4302 for (i=0; i<vectorSize(p->linearNodeTable); i++){
4303 node = vector_get(
struct X3D_Node *,p->linearNodeTable,i);
4307 #ifdef OCCLUSIONVERBOSE
4308 if (((node->_renderFlags) & VF_hasVisibleChildren) != 0) {
4309 printf (
"%lf, zeroVisibility - %d is a %s, flags %x\n",TickTime(), i,stringNodeType(node->_nodeType), (node->_renderFlags) & VF_hasVisibleChildren);
4313 node->_renderFlags = node->_renderFlags & (0xFFFF^VF_hasVisibleChildren);
4325 #define CMD(TTT,YYY) \
4327 if (NODE_NEEDS_COMPILING) compile_Metadata##TTT((struct X3D_Metadata##TTT *) YYY)
4329 #define BEGIN_NODE(thistype) case NODE_##thistype:
4330 #define END_NODE break;
4332 #define SIBLING_SENSITIVE(thistype) \
4334 if (((struct X3D_##thistype *)node)->enabled) { \
4335 nParents = vectorSize((struct X3D_##thistype *)pnode->_parentVector); \
4336 parentVector = (((struct X3D_##thistype *)pnode)->_parentVector); \
4339 #define ANCHOR_SENSITIVE(thistype) \
4341 anchorPtr = (struct X3D_Anchor *)node;
4346 #define BINDABLE(thistype) \
4347 setBindPtr = (int *)(((char*)(node))+offsetof (struct X3D_##thistype, set_bind)); \
4348 if ((*setBindPtr) == 100) {setBindPtr = NULL; } //else {printf ("OpenGL, BINDING %d\n",*setBindPtr);}
4350 #define CHILDREN_NODE(thistype) \
4351 addChildren = NULL; removeChildren = NULL; \
4352 offsetOfChildrenPtr = offsetof (struct X3D_##thistype, children); \
4353 if (((struct X3D_##thistype *)node)->addChildren.n > 0) { \
4354 addChildren = &((struct X3D_##thistype *)node)->addChildren; \
4355 childrenPtr = &((struct X3D_##thistype *)node)->children; \
4357 if (((struct X3D_##thistype *)node)->removeChildren.n > 0) { \
4358 removeChildren = &((struct X3D_##thistype *)node)->removeChildren; \
4359 childrenPtr = &((struct X3D_##thistype *)node)->children; \
4362 #define CHILDREN_SWITCH_NODE(thistype) \
4363 addChildren = NULL; removeChildren = NULL; \
4364 offsetOfChildrenPtr = offsetof (struct X3D_##thistype, choice); \
4365 if (((struct X3D_##thistype *)node)->addChildren.n > 0) { \
4366 addChildren = &((struct X3D_##thistype *)node)->addChildren; \
4367 childrenPtr = &((struct X3D_##thistype *)node)->choice; \
4369 if (((struct X3D_##thistype *)node)->removeChildren.n > 0) { \
4370 removeChildren = &((struct X3D_##thistype *)node)->removeChildren; \
4371 childrenPtr = &((struct X3D_##thistype *)node)->choice; \
4374 #define CHILDREN_LOD_NODE \
4375 addChildren = NULL; removeChildren = NULL; \
4376 offsetOfChildrenPtr = offsetof (struct X3D_LOD, children); \
4377 if (X3D_LODNODE(node)->addChildren.n > 0) { \
4378 addChildren = &X3D_LODNODE(node)->addChildren; \
4379 if (X3D_LODNODE(node)->__isX3D == 0) childrenPtr = &X3D_LODNODE(node)->level; \
4380 else childrenPtr = &X3D_LODNODE(node)->children; \
4382 if (X3D_LODNODE(node)->removeChildren.n > 0) { \
4383 removeChildren = &X3D_LODNODE(node)->removeChildren; \
4384 if (X3D_LODNODE(node)->__isX3D == 0) childrenPtr = &X3D_LODNODE(node)->level; \
4385 else childrenPtr = &X3D_LODNODE(node)->children; \
4388 #define CHILDREN_ANY_NODE(thistype,thischildren) \
4389 addChildren = NULL; removeChildren = NULL; \
4390 offsetOfChildrenPtr = offsetof (struct X3D_##thistype, thischildren); \
4391 if (((struct X3D_##thistype *)node)->addChildren.n > 0) { \
4392 addChildren = &((struct X3D_##thistype *)node)->addChildren; \
4393 childrenPtr = &((struct X3D_##thistype *)node)->thischildren; \
4395 if (((struct X3D_##thistype *)node)->removeChildren.n > 0) { \
4396 removeChildren = &((struct X3D_##thistype *)node)->removeChildren; \
4397 childrenPtr = &((struct X3D_##thistype *)node)->thischildren; \
4401 #define EVIN_AND_FIELD_SAME(thisfield, thistype) \
4402 if ((((struct X3D_##thistype *)node)->set_##thisfield.n) > 0) { \
4403 ((struct X3D_##thistype *)node)->thisfield.n = 0; \
4404 FREE_IF_NZ (((struct X3D_##thistype *)node)->thisfield.p); \
4405 ((struct X3D_##thistype *)node)->thisfield.p = ((struct X3D_##thistype *)node)->set_##thisfield.p; \
4406 ((struct X3D_##thistype *)node)->thisfield.n = ((struct X3D_##thistype *)node)->set_##thisfield.n; \
4407 ((struct X3D_##thistype *)node)->set_##thisfield.n = 0; \
4408 ((struct X3D_##thistype *)node)->set_##thisfield.p = NULL; \
4416 OLDCODE#define LOCAL_LIGHT_PARENT_FLAG \
4418 OLDCODE
for (i = 0; i < vectorSize(pnode->_parentVector); i++) { \
4419 OLDCODE
struct X3D_Node *n = vector_get(
struct X3D_Node*, pnode->_parentVector, i); \
4420 OLDCODE
if( n != 0 ) n->_renderFlags = n->_renderFlags | VF_localLight; \
4425 #define ADD_TO_PARENT_SIBAFFECTORS \
4427 for (i = 0; i < vectorSize(pnode->_parentVector); i++) { \
4428 struct X3D_Node *n = vector_get(struct X3D_Node*, pnode->_parentVector, i); \
4429 if( n != 0 ) AddToSibAffectors(n,pnode); \
4433 #define CHECK_MATERIAL_TRANSPARENCY \
4434 if (((struct X3D_Material *)node)->transparency > 0.0001) { \
4436 update_renderFlag(X3D_NODE(pnode),VF_Blend | VF_shouldSortChildren);\
4437 gglobal()->RenderFuncs.have_transparency = TRUE; \
4440 #define CHECK_FILL_PROPERTY_FILLED \
4441 if ((((struct X3D_FillProperties *)node)->_enabled == TRUE) && (((struct X3D_FillProperties *)node)->filled == FALSE)) { \
4443 update_renderFlag(X3D_NODE(pnode),VF_Blend | VF_shouldSortChildren);\
4444 gglobal()->RenderFuncs.have_transparency = TRUE; \
4447 #define CHECK_TWOSIDED_MATERIAL_TRANSPARENCY \
4448 if ((((struct X3D_TwoSidedMaterial *)node)->transparency > 0.0001) || (((struct X3D_TwoSidedMaterial *)node)->backTransparency > 0.0001)){ \
4450 update_renderFlag(X3D_NODE(pnode),VF_Blend | VF_shouldSortChildren);\
4451 gglobal()->RenderFuncs.have_transparency = TRUE; \
4454 #define CHECK_IMAGETEXTURE_TRANSPARENCY \
4455 if (isTextureAlpha(((struct X3D_ImageTexture *)node)->__textureTableIndex)) { \
4457 update_renderFlag(X3D_NODE(pnode),VF_Blend | VF_shouldSortChildren);\
4458 gglobal()->RenderFuncs.have_transparency = TRUE; \
4461 #define CHECK_PIXELTEXTURE_TRANSPARENCY \
4462 if (isTextureAlpha(((struct X3D_PixelTexture *)node)->__textureTableIndex)) { \
4464 update_renderFlag(X3D_NODE(pnode),VF_Blend | VF_shouldSortChildren);\
4465 gglobal()->RenderFuncs.have_transparency = TRUE; \
4468 #define CHECK_MOVIETEXTURE_TRANSPARENCY \
4469 if (isTextureAlpha(((struct X3D_MovieTexture *)node)->__textureTableIndex)) { \
4471 update_renderFlag(X3D_NODE(pnode),VF_Blend | VF_shouldSortChildren);\
4472 gglobal()->RenderFuncs.have_transparency = TRUE; \
4488 if(node->_nodeType == NODE_Proto)
4494 if(pn->__children.n > 0)
4495 dnode = getTypeNode(pn->__children.p[0]);
4504 void printStatsNodes(){
4509 ConsoleMessage(
"%25s %d\n",
"Nodes count", p->linearNodeTable->n);
4512 int unRegisterX3DAnyNode(
struct X3D_Node *node);
4522 for (i = 0; i < vectorSize(p->linearNodeTable); i++){
4523 node = vector_get(
struct X3D_Node *, p->linearNodeTable, i);
4525 if (node->referenceCount <= 0) {
4528 unRegisterX3DAnyNode(node);
4530 vector_set(
struct X3D_Node *,p->linearNodeTable,i,NULL);
4539 int isSiblingAffector(
struct X3D_Node *node){
4541 switch(node->_nodeType){
4542 case NODE_DirectionalLight:
4543 case NODE_SpotLight:
4544 case NODE_PointLight:
4546 case NODE_ClipPlane:
4563 int hasSiblingAffectorField(
struct X3D_Node *node,
int whereFrom){
4569 printf (
"hasSiblingAffectorField, node %p from line %d\n",node,whereFrom);
4572 switch(node->_nodeType){
4576 case NODE_Transform:
4578 case NODE_Billboard:
4579 case NODE_Collision:
4580 case NODE_GeoLocation:
4581 case NODE_GeoTransform:
4582 case NODE_HAnimSite:
4583 case NODE_HAnimHumanoid:
4586 case NODE_EspduTransform:
4587 case NODE_CADAssembly:
4592 case NODE_LayoutLayer:
4593 case NODE_LayoutGroup:
4594 case NODE_ScreenGroup:
4595 case NODE_PickableGroup:
4596 case NODE_StaticGroup:
4603 void *sibAffectorPtr(
struct X3D_Node *node){
4607 int *fieldOffsetsPtr;
4608 fieldOffsetsPtr = (
int*) NODE_OFFSETS[node->_nodeType];
4610 while(fieldOffsetsPtr[0] > -1){
4612 if(fieldOffsetsPtr[0] == FIELDNAMES___sibAffectors){
4613 fieldPtr = offsetPointer_deref(
char *, node,fieldOffsetsPtr[1]);
4616 fieldOffsetsPtr += 5;
4620 void AddToSibAffectors(
struct X3D_Node *parent,
struct X3D_Node *affector){
4629 printf (
"in AddToSibAffectors, we have node parent NULL, node is a %s\n",stringNodeType(affector->_nodeType));
4633 if(hasSiblingAffectorField(parent,__LINE__) && isSiblingAffector(affector)){
4634 struct Multi_Node *safs = sibAffectorPtr(parent);
4636 safs->p = REALLOC(safs->p,(safs->n+1)*
sizeof(
struct X3D_Node*));
4637 safs->p[safs->n] = affector;
4642 void zeroSibAffectors(
struct X3D_Node *node){
4645 struct Multi_Node* saf = sibAffectorPtr(node);
4655 int needs_updating_Inline(
struct X3D_Node *node);
4658 void startOfLoopNodeUpdates(
void) {
4662 struct Vector *parentVector;
4664 int i,j,k,foundbound;
4670 size_t offsetOfChildrenPtr;
4678 if (rootNode() == NULL)
return;
4682 removeChildren = NULL;
4684 parentVector = NULL;
4686 offsetOfChildrenPtr = 0;
4689 tg->Mainloop.HaveSensitive = FALSE;
4690 tg->RenderFuncs.have_transparency = FALSE;
4694 if (fwl_isinputThreadParsing())
return;
4695 profile_start(
"loopnodeupdt");
4702 for (i=0; i<vectorSize(p->linearNodeTable); i++){
4703 node = vector_get(
struct X3D_Node *,p->linearNodeTable,i);
4705 if (node->referenceCount <= 0) {
4714 vector_set(
struct X3D_Node *,p->linearNodeTable,i,NULL);
4717 node->_renderFlags = node->_renderFlags & (0xFFFF^VF_Sensitive);
4718 node->_renderFlags = node->_renderFlags & (0xFFFF^VF_Viewpoint);
4719 node->_renderFlags = node->_renderFlags & (0xFFFF^VF_localLight);
4720 node->_renderFlags = node->_renderFlags & (0xFFFF^VF_globalLight);
4721 node->_renderFlags = node->_renderFlags & (0xFFFF^VF_Blend);
4723 if(hasSiblingAffectorField(node,__LINE__)){
4724 zeroSibAffectors(node);
4732 rn->_renderFlags = rn->_renderFlags & (0xFFFF^VF_Sensitive);
4733 rn->_renderFlags = rn->_renderFlags & (0xFFFF^VF_Viewpoint);
4734 rn->_renderFlags = rn->_renderFlags & (0xFFFF^VF_localLight);
4735 rn->_renderFlags = rn->_renderFlags & (0xFFFF^VF_globalLight);
4736 rn->_renderFlags = rn->_renderFlags & (0xFFFF^VF_Blend);
4742 if (rootNode() != NULL) {
4743 struct Multi_Node *children, *_sortedChildren;
4744 node = (
struct X3D_Node*)rootNode();
4746 _sortedChildren = NULL;
4747 if(node->_nodeType == NODE_Proto){
4748 children = &X3D_PROTO(node)->__children;
4749 _sortedChildren = &X3D_PROTO(node)->_sortedChildren;
4751 if(node->_nodeType == NODE_Group) {
4752 children = &X3D_GROUP(node)->children;
4753 _sortedChildren = &X3D_GROUP(node)->_sortedChildren;
4755 sortChildren (__LINE__,children, _sortedChildren,rootNode()->_renderFlags & VF_shouldSortChildren);
4756 rootNode()->_renderFlags=rootNode()->_renderFlags & (0xFFFF^VF_shouldSortChildren);
4757 if(node->_nodeType == NODE_Proto){
4762 addChildren = NULL; removeChildren = NULL;
4763 offsetOfChildrenPtr = offsetof (
struct X3D_Proto, __children);
4764 if (((
struct X3D_Proto *)node)->addChildren.n > 0) {
4765 addChildren = &((
struct X3D_Proto *)node)->addChildren;
4766 childrenPtr = &((
struct X3D_Proto *)node)->__children;
4768 if (((
struct X3D_Proto *)node)->removeChildren.n > 0) {
4769 removeChildren = &((
struct X3D_Proto *)node)->removeChildren;
4770 childrenPtr = &((
struct X3D_Proto *)node)->__children;
4774 CHILDREN_NODE(Group)
4777 if (childrenPtr != NULL) {
4778 if (addChildren != NULL) {
4779 AddRemoveChildren(node,childrenPtr,(
struct X3D_Node * *) addChildren->p,addChildren->n,1,__FILE__,__LINE__);
4782 if (removeChildren != NULL) {
4783 AddRemoveChildren(node,childrenPtr,(
struct X3D_Node * *) removeChildren->p,removeChildren->n,2,__FILE__,__LINE__);
4784 removeChildren->n=0;
4787 MARK_EVENT(node,offsetOfChildrenPtr);
4798 for (i=0; i<vectorSize(p->linearNodeTable); i++){
4799 node = vector_get(
struct X3D_Node *,p->linearNodeTable,i);
4801 if (node->referenceCount > 0) {
4803 node = getTypeNode(node);
4804 if(node == NULL && pnode != NULL)
4805 if(pnode->_nodeType == NODE_Proto){
4819 load_externProtoInstance(X3D_PROTO(pnode));
4821 node = getTypeNode(pnode);
4825 switch (node->_nodeType) {
4828 if ((X3D_SHAPE(node)->__occludeCheckCount <=0) ||
4829 (X3D_SHAPE(node)->__visible)) {
4830 update_renderFlag (X3D_NODE(pnode),VF_hasVisibleChildren);
4834 X3D_SHAPE(node)->__occludeCheckCount--;
4841 BEGIN_NODE(DirectionalLight)
4842 if (X3D_DIRECTIONALLIGHT(node)->on) {
4843 if (X3D_DIRECTIONALLIGHT(node)->global)
4844 update_renderFlag(pnode,VF_globalLight);
4847 ADD_TO_PARENT_SIBAFFECTORS
4851 BEGIN_NODE(SpotLight)
4852 if (X3D_SPOTLIGHT(node)->on) {
4853 if (X3D_SPOTLIGHT(node)->global)
4854 update_renderFlag(pnode,VF_globalLight);
4857 ADD_TO_PARENT_SIBAFFECTORS
4861 BEGIN_NODE(PointLight)
4862 if (X3D_POINTLIGHT(node)->on) {
4863 if (X3D_POINTLIGHT(node)->global)
4864 update_renderFlag(pnode,VF_globalLight);
4867 ADD_TO_PARENT_SIBAFFECTORS
4871 BEGIN_NODE(LocalFog)
4872 ADD_TO_PARENT_SIBAFFECTORS
4874 BEGIN_NODE(ClipPlane)
4875 ADD_TO_PARENT_SIBAFFECTORS
4878 ADD_TO_PARENT_SIBAFFECTORS
4885 BEGIN_NODE(IndexedLineSet)
4886 EVIN_AND_FIELD_SAME(colorIndex,IndexedLineSet)
4887 EVIN_AND_FIELD_SAME(coordIndex,IndexedLineSet)
4890 BEGIN_NODE(IndexedTriangleFanSet)
4891 EVIN_AND_FIELD_SAME(index,IndexedTriangleFanSet)
4893 BEGIN_NODE(IndexedTriangleSet)
4894 EVIN_AND_FIELD_SAME(index,IndexedTriangleSet)
4896 BEGIN_NODE(IndexedTriangleStripSet)
4897 EVIN_AND_FIELD_SAME(index,IndexedTriangleStripSet)
4899 BEGIN_NODE(GeoElevationGrid)
4900 EVIN_AND_FIELD_SAME(height,GeoElevationGrid)
4902 BEGIN_NODE(ElevationGrid)
4903 EVIN_AND_FIELD_SAME(height,ElevationGrid)
4905 BEGIN_NODE(Extrusion)
4906 EVIN_AND_FIELD_SAME(crossSection,Extrusion)
4907 EVIN_AND_FIELD_SAME(orientation,Extrusion)
4908 EVIN_AND_FIELD_SAME(scale,Extrusion)
4909 EVIN_AND_FIELD_SAME(spine,Extrusion)
4911 BEGIN_NODE(IndexedFaceSet)
4912 EVIN_AND_FIELD_SAME(colorIndex,IndexedFaceSet)
4913 EVIN_AND_FIELD_SAME(coordIndex,IndexedFaceSet)
4914 EVIN_AND_FIELD_SAME(normalIndex,IndexedFaceSet)
4915 EVIN_AND_FIELD_SAME(texCoordIndex,IndexedFaceSet)
4925 BEGIN_NODE(LineSensor) SIBLING_SENSITIVE(LineSensor) END_NODE
4926 BEGIN_NODE(PlaneSensor) SIBLING_SENSITIVE(PlaneSensor) END_NODE
4927 BEGIN_NODE(SphereSensor) SIBLING_SENSITIVE(SphereSensor) END_NODE
4928 BEGIN_NODE(CylinderSensor) SIBLING_SENSITIVE(CylinderSensor) END_NODE
4929 BEGIN_NODE(TouchSensor) SIBLING_SENSITIVE(TouchSensor) END_NODE
4930 BEGIN_NODE(GeoTouchSensor) SIBLING_SENSITIVE(GeoTouchSensor) END_NODE
4934 propagateExtent(X3D_NODE(node));
4935 ANCHOR_SENSITIVE(Anchor)
4936 CHILDREN_NODE(Anchor)
4941 update_renderFlag (X3D_NODE(pnode),VF_hasVisibleChildren);
4944 BEGIN_NODE(CADLayer)
4945 propagateExtent(X3D_NODE(node));
4946 CHILDREN_NODE(Switch)
4951 sortChildren (__LINE__,&X3D_CADPART(node)->children,&X3D_CADPART(node)->_sortedChildren,pnode->_renderFlags & VF_shouldSortChildren);
4952 TURN_OFF_SHOULDSORTCHILDREN
4953 propagateExtent(X3D_NODE(node));
4954 CHILDREN_NODE(CADPart)
4958 BEGIN_NODE(CADAssembly)
4959 sortChildren (__LINE__,&X3D_CADASSEMBLY(node)->children,&X3D_CADASSEMBLY(node)->_sortedChildren,pnode->_renderFlags & VF_shouldSortChildren);
4960 TURN_OFF_SHOULDSORTCHILDREN
4961 propagateExtent(X3D_NODE(node));
4962 CHILDREN_NODE(CADAssembly)
4966 BEGIN_NODE(Viewpoint) BINDABLE(Viewpoint) END_NODE
4967 BEGIN_NODE(OrthoViewpoint) BINDABLE(OrthoViewpoint) END_NODE
4968 BEGIN_NODE(GeoViewpoint) BINDABLE(GeoViewpoint) END_NODE
4970 BEGIN_NODE(NavigationInfo)
4972 BINDABLE(NavigationInfo)
4975 BEGIN_NODE(StaticGroup)
4977 sortChildren (__LINE__,&X3D_STATICGROUP(node)->children,&X3D_STATICGROUP(node)->_sortedChildren,pnode->_renderFlags & VF_shouldSortChildren);
4978 TURN_OFF_SHOULDSORTCHILDREN
4979 propagateExtent(X3D_NODE(node));
4985 sortChildren (__LINE__,&X3D_GROUP(node)->children,&X3D_GROUP(node)->_sortedChildren,pnode->_renderFlags & VF_shouldSortChildren);
4986 TURN_OFF_SHOULDSORTCHILDREN
4987 propagateExtent(X3D_NODE(node));
4988 CHILDREN_NODE(Group)
4991 BEGIN_NODE(PickableGroup)
4994 propagateExtent(X3D_NODE(node));
4995 CHILDREN_NODE(PickableGroup)
4999 sortChildren (__LINE__,&X3D_INLINE(node)->__children,&X3D_INLINE(node)->_sortedChildren,node->_renderFlags & VF_shouldSortChildren);
5000 TURN_OFF_SHOULDSORTCHILDREN
5001 propagateExtent(X3D_NODE(node));
5002 CHILDREN_ANY_NODE(Inline,__children)
5005 BEGIN_NODE(Transform)
5006 sortChildren (__LINE__,&X3D_TRANSFORM(node)->children,&X3D_TRANSFORM(node)->_sortedChildren,pnode->_renderFlags & VF_shouldSortChildren);
5007 TURN_OFF_SHOULDSORTCHILDREN
5008 propagateExtent(X3D_NODE(node));
5009 CHILDREN_NODE(Transform)
5018 BEGIN_NODE(Contour2D)
5019 CHILDREN_NODE(Contour2D)
5022 BEGIN_NODE(HAnimSite)
5023 CHILDREN_NODE(HAnimSite)
5026 BEGIN_NODE(HAnimSegment)
5027 CHILDREN_NODE(HAnimSegment)
5030 BEGIN_NODE(HAnimJoint)
5031 CHILDREN_NODE(HAnimJoint)
5034 BEGIN_NODE(Billboard)
5035 propagateExtent(X3D_NODE(node));
5036 CHILDREN_NODE(Billboard)
5037 update_renderFlag(pnode,VF_Proximity);
5040 BEGIN_NODE(Collision)
5041 propagateExtent(X3D_NODE(node));
5042 CHILDREN_NODE(Collision)
5046 propagateExtent(X3D_NODE(node));
5047 CHILDREN_SWITCH_NODE(Switch)
5051 propagateExtent(X3D_NODE(node));
5053 update_renderFlag(pnode,VF_Proximity);
5057 BEGIN_NODE(Material) CHECK_MATERIAL_TRANSPARENCY END_NODE
5058 BEGIN_NODE(TwoSidedMaterial) CHECK_TWOSIDED_MATERIAL_TRANSPARENCY END_NODE
5059 BEGIN_NODE(FillProperties) CHECK_FILL_PROPERTY_FILLED END_NODE
5062 BEGIN_NODE(ImageTexture) CHECK_IMAGETEXTURE_TRANSPARENCY END_NODE
5063 BEGIN_NODE(PixelTexture) CHECK_PIXELTEXTURE_TRANSPARENCY END_NODE
5064 BEGIN_NODE(MovieTexture) CHECK_MOVIETEXTURE_TRANSPARENCY END_NODE
5066 BEGIN_NODE(VolumeData)
5067 tg->RenderFuncs.have_transparency = TRUE;
5068 update_renderFlag(X3D_NODE(pnode),VF_Blend | VF_shouldSortChildren);\
5070 BEGIN_NODE(SegmentedVolumeData)
5071 tg->RenderFuncs.have_transparency = TRUE;
5072 update_renderFlag(X3D_NODE(pnode),VF_Blend | VF_shouldSortChildren);\
5074 BEGIN_NODE(IsoSurfaceVolumeData)
5075 tg->RenderFuncs.have_transparency = TRUE;
5076 update_renderFlag(X3D_NODE(pnode),VF_Blend | VF_shouldSortChildren);\
5081 BEGIN_NODE(Background)
5082 BINDABLE(Background)
5086 BEGIN_NODE(TextureBackground)
5087 BINDABLE(TextureBackground)
5098 BEGIN_NODE (VisibilitySensor)
5099 #ifdef OCCLUSION_STUFF
5101 if ((X3D_VISIBILITYSENSOR(node)->__occludeCheckCount <=0) ||
5102 (X3D_VISIBILITYSENSOR(node)->__visible)) {
5103 update_renderFlag (X3D_NODE(pnode),VF_hasVisibleChildren);
5107 X3D_VISIBILITYSENSOR(node)->__occludeCheckCount--;
5110 update_renderFlag(pnode,VF_Blend & VF_shouldSortChildren);
5114 update_renderFlag(pnode,VF_Other);
5119 BEGIN_NODE (ProximitySensor)
5120 if (X3D_PROXIMITYSENSOR(node)->enabled) update_renderFlag(pnode,VF_Proximity);
5124 BEGIN_NODE (GeoProximitySensor)
5125 if (X3D_GEOPROXIMITYSENSOR(node)->enabled) update_renderFlag(pnode,VF_Proximity);
5130 if (!(NODE_NEEDS_COMPILING)) {
5131 handle_GeoLODRange(X3D_GEOLOD(node));
5134 propagateExtent(X3D_NODE(node));
5137 BEGIN_NODE (GeoTransform)
5138 sortChildren (__LINE__,&X3D_GEOTRANSFORM(node)->children,&X3D_GEOTRANSFORM(node)->_sortedChildren,pnode->_renderFlags & VF_shouldSortChildren);
5139 TURN_OFF_SHOULDSORTCHILDREN
5140 propagateExtent(X3D_NODE(node));
5141 CHILDREN_NODE(GeoTransform)
5144 BEGIN_NODE (GeoLocation)
5145 sortChildren (__LINE__,&X3D_GEOLOCATION(node)->children,&X3D_GEOLOCATION(node)->_sortedChildren,pnode->_renderFlags & VF_shouldSortChildren);
5146 TURN_OFF_SHOULDSORTCHILDREN
5147 propagateExtent(X3D_NODE(node));
5148 CHILDREN_NODE(GeoLocation)
5151 BEGIN_NODE(MetadataSFBool) CMD(SFBool,node); END_NODE
5152 BEGIN_NODE(MetadataSFFloat) CMD(SFFloat,node); END_NODE
5153 BEGIN_NODE(MetadataMFFloat) CMD(MFFloat,node); END_NODE
5154 BEGIN_NODE(MetadataSFRotation) CMD(
SFRotation,node); END_NODE
5155 BEGIN_NODE(MetadataMFRotation) CMD(MFRotation,node); END_NODE
5156 BEGIN_NODE(MetadataSFVec3f) CMD(
SFVec3f,node); END_NODE
5157 BEGIN_NODE(MetadataMFVec3f) CMD(MFVec3f,node); END_NODE
5158 BEGIN_NODE(MetadataMFBool) CMD(MFBool,node); END_NODE
5159 BEGIN_NODE(MetadataSFInt32) CMD(SFInt32,node); END_NODE
5160 BEGIN_NODE(MetadataMFInt32) CMD(MFInt32,node); END_NODE
5161 BEGIN_NODE(MetadataSFNode) CMD(SFNode,node); END_NODE
5162 BEGIN_NODE(MetadataMFNode) CMD(MFNode,node); END_NODE
5163 BEGIN_NODE(MetadataSFColor) CMD(
SFColor,node); END_NODE
5164 BEGIN_NODE(MetadataMFColor) CMD(MFColor,node); END_NODE
5165 BEGIN_NODE(MetadataSFColorRGBA) CMD(
SFColorRGBA,node); END_NODE
5166 BEGIN_NODE(MetadataMFColorRGBA) CMD(MFColorRGBA,node); END_NODE
5167 BEGIN_NODE(MetadataSFTime) CMD(SFTime,node); END_NODE
5168 BEGIN_NODE(MetadataMFTime) CMD(MFTime,node); END_NODE
5169 BEGIN_NODE(MetadataSFString) CMD(SFString,node); END_NODE
5170 BEGIN_NODE(MetadataMFString) CMD(MFString,node); END_NODE
5171 BEGIN_NODE(MetadataSFVec2f) CMD(
SFVec2f,node); END_NODE
5172 BEGIN_NODE(MetadataMFVec2f) CMD(MFVec2f,node); END_NODE
5173 BEGIN_NODE(MetadataSFImage) CMD(SFImage,node); END_NODE
5174 BEGIN_NODE(MetadataSFVec3d) CMD(
SFVec3d,node); END_NODE
5175 BEGIN_NODE(MetadataMFVec3d) CMD(MFVec3d,node); END_NODE
5176 BEGIN_NODE(MetadataSFDouble) CMD(SFDouble,node); END_NODE
5177 BEGIN_NODE(MetadataMFDouble) CMD(MFDouble,node); END_NODE
5178 BEGIN_NODE(MetadataSFMatrix3f) CMD(
SFMatrix3f,node); END_NODE
5179 BEGIN_NODE(MetadataMFMatrix3f) CMD(MFMatrix3f,node); END_NODE
5180 BEGIN_NODE(MetadataSFMatrix3d) CMD(
SFMatrix3d,node); END_NODE
5181 BEGIN_NODE(MetadataMFMatrix3d) CMD(MFMatrix3d,node); END_NODE
5182 BEGIN_NODE(MetadataSFMatrix4f) CMD(
SFMatrix4f,node); END_NODE
5183 BEGIN_NODE(MetadataMFMatrix4f) CMD(MFMatrix4f,node); END_NODE
5184 BEGIN_NODE(MetadataSFMatrix4d) CMD(
SFMatrix4d,node); END_NODE
5185 BEGIN_NODE(MetadataMFMatrix4d) CMD(MFMatrix4d,node); END_NODE
5186 BEGIN_NODE(MetadataSFVec2d) CMD(
SFVec2d,node); END_NODE
5187 BEGIN_NODE(MetadataMFVec2d) CMD(MFVec2d,node); END_NODE
5188 BEGIN_NODE(MetadataSFVec4f) CMD(
SFVec4f,node); END_NODE
5189 BEGIN_NODE(MetadataMFVec4f) CMD(MFVec4f,node); END_NODE
5190 BEGIN_NODE(MetadataSFVec4d) CMD(
SFVec4d,node); END_NODE
5191 BEGIN_NODE(MetadataMFVec4d) CMD(MFVec4d,node); END_NODE
5198 if (nParents != 0) {
5199 for (j=0; j<nParents; j++) {
5201 n->_renderFlags = n->_renderFlags | VF_Sensitive;
5204 tg->Mainloop.HaveSensitive = TRUE;
5209 if (anchorPtr != NULL) {
5210 anchorPtr->_renderFlags = anchorPtr->_renderFlags | VF_Sensitive;
5213 tg->Mainloop.HaveSensitive = TRUE;
5218 if (setBindPtr != NULL) {
5220 if (*setBindPtr < 100) {
5223 send_bind_to(node,*setBindPtr);
5249 if (childrenPtr != NULL) {
5251 if (addChildren != NULL) {
5258 AddRemoveChildren(node,childrenPtr,(
struct X3D_Node * *) addChildren->p,addChildren->n,1,__FILE__,__LINE__);
5262 for (i=0; i<addChildren->n; i++) {
5263 struct X3D_Node *ch = X3D_NODE(addChildren->p[i]);
5264 remove_parent(ch,node);
5270 if (removeChildren != NULL) {
5271 AddRemoveChildren(node,childrenPtr,(
struct X3D_Node * *) removeChildren->p,removeChildren->n,2,__FILE__,__LINE__);
5274 for (i=0; i<removeChildren->n; i++) {
5275 struct X3D_Node *ch = X3D_NODE(removeChildren->p[i]);
5276 remove_parent(ch,node);
5278 removeChildren->n=0;
5283 MARK_EVENT(node,offsetOfChildrenPtr);
5294 for(k=0;k<vectorSize(tg->Bindable.bstacks);k++){
5297 if( vectorSize(bstack->viewpoint) > 0){
5301 struct X3D_Node *boundvp = vector_back(
struct X3D_Node*,bstack->viewpoint);
5302 update_renderFlag(boundvp, VF_Viewpoint);
5303 calculateNearFarplanes(boundvp, bstack->layerId);
5312 viewer->nearPlane = DEFAULT_NEARPLANE;
5313 viewer->farPlane = DEFAULT_FARPLANE;
5314 viewer->backgroundPlane = DEFAULT_BACKGROUNDPLANE;
5316 profile_end(
"loopnodeupdt");
5323 void markForDispose(
struct X3D_Node *node,
int recursive){
5325 int *fieldOffsetsPtr;
5328 if (node==NULL)
return;
5329 if (node==X3D_NODE(rootNode()) && node->_nodeType != NODE_Proto) {
5330 ConsoleMessage (
"not disposing rootNode");
5336 ConsoleMessage (
"\nmarkingForDispose %p (%s) currently at %d",node,
5337 stringNodeType(node->_nodeType),node->referenceCount);
5341 if (node->referenceCount > 0)
5342 node->referenceCount--;
5349 fieldOffsetsPtr = (
int*) NODE_OFFSETS[node->_nodeType];
5351 while (*fieldOffsetsPtr != -1) {
5352 fieldPtr = offsetPointer_deref(
char *, node,*(fieldOffsetsPtr+1));
5354 ConsoleMessage (
"looking at field %s type %s",FIELDNAMES[*fieldOffsetsPtr],FIELDTYPES[*(fieldOffsetsPtr+2)]);
5358 if (*fieldOffsetsPtr == FIELDNAMES_setValue)
5361 if (*fieldOffsetsPtr == FIELDNAMES_valueChanged)
5364 if (*fieldOffsetsPtr == FIELDNAMES__selected)
5367 if (*fieldOffsetsPtr == FIELDNAMES___oldChildren)
5370 if (*fieldOffsetsPtr == FIELDNAMES___oldKeyPtr)
5373 if (*fieldOffsetsPtr == FIELDNAMES___oldKeyValuePtr)
5377 if (node->_nodeType == NODE_GeoLOD) {
5378 if (*fieldOffsetsPtr == FIELDNAMES_children)
break;
5381 if (*fieldOffsetsPtr == FIELDNAMES__shaderUserDefinedFields)
5385 switch(*(fieldOffsetsPtr+2)){
5386 case FIELDTYPE_MFNode: {
5394 for (i=0; i<MNode->n; i++) {
5399 ConsoleMessage (
"calling markForDispose on node %p as it is an element of an MFNode",tp);
5401 markForDispose(tp,TRUE);
5407 case FIELDTYPE_SFNode: {
5410 memcpy(&SNode,fieldPtr,
sizeof(
struct X3D_Node *));
5413 ConsoleMessage (
"SFNode, field is %p...",SNode);
5414 if (SNode != NULL) {
5415 ConsoleMessage (
"SFNode, .... and it is of type %s",stringNodeType(SNode->_nodeType));
5416 ConsoleMessage (
" ... field SFNode, %s type %s\n",FIELDNAMES[*fieldOffsetsPtr],FIELDTYPES[*(fieldOffsetsPtr+2)]);
5420 if(SNode && SNode->referenceCount > 0) {
5422 ConsoleMessage (
"calling markForDispose on node %p as it is contents of SFNode field",SNode);
5424 markForDispose(SNode, TRUE);
5441 OLDCODE #define DELETE_IF_IN_PRODCON(aaa) \
5442 OLDCODE
if (tg->ProdCon.aaa) { \
5443 OLDCODE
bool foundIt = FALSE; \
5445 OLDCODE
for (i=0; i<vectorSize(tg->ProdCon.aaa); i++) { \
5446 OLDCODE
if (vector_get(
struct X3D_Node*,tg->ProdCon.aaa, i) == structptr) { \
5447 OLDCODE foundIt = TRUE; \
5451 OLDCODE
if (foundIt) { \
5452 OLDCODE
struct Vector *newStack = newVector(
struct X3D_Node*, 2); \
5453 OLDCODE
for (i=0; i<vectorSize(tg->ProdCon.aaa); i++) { \
5454 OLDCODE
if (vector_get(
struct X3D_Node*,tg->ProdCon.aaa, i) != structptr) { \
5455 OLDCODE vector_pushBack(
struct X3D_Node*, newStack, \
5456 OLDCODE vector_get(
struct X3D_Node*,tg->ProdCon.aaa,i)); \
5459 OLDCODE deleteVector(
struct X3D_Node*, tg->ProdCon.aaa); \
5460 OLDCODE tg->ProdCon.aaa = newStack; \
5464 OLDCODE #define DELETE_IF_IN_STACK(aaa) \
5465 OLDCODE
if (tg->Bindable.aaa) { \
5466 OLDCODE
bool foundIt = FALSE; \
5468 OLDCODE
for (i=0; i<vectorSize(tg->Bindable.aaa); i++) { \
5469 OLDCODE
if (vector_get(
struct X3D_Node*,tg->Bindable.aaa, i) == structptr) { \
5470 OLDCODE foundIt = TRUE; \
5474 OLDCODE
if (foundIt) { \
5475 OLDCODE
struct Vector *newStack = newVector(
struct X3D_Node*, 2); \
5476 OLDCODE
for (i=0; i<vectorSize(tg->Bindable.aaa); i++) { \
5477 OLDCODE
if (vector_get(
struct X3D_Node*,tg->Bindable.aaa, i) != structptr) { \
5478 OLDCODE vector_pushBack(
struct X3D_Node*, newStack, \
5479 OLDCODE vector_get(
struct X3D_Node*,tg->Bindable.aaa,i)); \
5482 OLDCODE deleteVector(
struct X3D_Node*, tg->Bindable.aaa); \
5483 OLDCODE tg->Bindable.aaa = newStack; \
5492 BOOL walk_fields(
struct X3D_Node* node, BOOL (*callbackFunc)(),
void* callbackData)
5499 int type,mode,source;
5501 int *fieldOffsetsPtr;
5513 fieldOffsetsPtr = (
int *)NODE_OFFSETS[node->_nodeType];
5515 while (*fieldOffsetsPtr != -1) {
5516 fname = FIELDNAMES[fieldOffsetsPtr[0]];
5518 publicfield = fname && (fname[0] !=
'_') ? TRUE : FALSE;
5519 mode = PKW_from_KW(fieldOffsetsPtr[3]);
5520 type = fieldOffsetsPtr[2];
5522 fieldPtr = (
union anyVrml*)offsetPointer_deref(
char *, node,*(fieldOffsetsPtr+1));
5525 foundField = callbackFunc(callbackData,node,jfield,fieldPtr,fname,mode,type,source,publicfield);
5526 if( foundField )
break;
5533 user = nodeTypeSupportsUserFields(node);
5548 switch(node->_nodeType)
5551 case NODE_ComposedShader:
5552 case NODE_ShaderProgram :
5554 case NODE_PackagedShader:
5560 switch(node->_nodeType)
5562 case NODE_Script: shader =(
struct Shader_Script *)(X3D_SCRIPT(node)->__scriptObj);
break;
5563 case NODE_ComposedShader: shader =(
struct Shader_Script *)(X3D_COMPOSEDSHADER(node)->_shaderUserDefinedFields);
break;
5564 case NODE_ShaderProgram: shader =(
struct Shader_Script *)(X3D_SHADERPROGRAM(node)->_shaderUserDefinedFields);
break;
5565 case NODE_PackagedShader: shader =(
struct Shader_Script *)(X3D_PACKAGEDSHADER(node)->_shaderUserDefinedFields);
break;
5566 case NODE_Effect: shader =(
struct Shader_Script *)(X3D_EFFECT(node)->_shaderUserDefinedFields);
break;
5569 for(j=0; j!=vectorSize(shader->fields); ++j)
5572 mode = sfield->fieldDecl->PKWmode;
5573 fname = ScriptFieldDecl_getName(sfield);
5574 type = sfield->fieldDecl->fieldType;
5575 fieldPtr = &sfield->value;
5576 source = node->_nodeType == NODE_Script ? 1 : 2;
5578 foundField = callbackFunc(callbackData,node,jfield,fieldPtr,fname,mode,type,source,publicfield);
5593 for(j=0; j!=vectorSize(pstruct->iface); ++j)
5596 mode = pfield->mode;
5597 fname = pfield->cname;
5598 type = pfield->type;
5599 fieldPtr = &pfield->defaultVal;
5602 foundField = callbackFunc(callbackData,node,jfield,fieldPtr,fname,mode,type,source,publicfield);
5675 BOOL isManagedField(
int mode,
int type, BOOL isPublic)
5677 BOOL isManaged = (type == FIELDTYPE_SFNode || type == FIELDTYPE_MFNode);
5678 isManaged = isManaged && (mode == PKW_initializeOnly || mode == PKW_inputOutput);
5679 isManaged = isManaged && isPublic;
5689 void indentf(
int indent){
5691 for(m=0;m<indent;m++) printf(
" ");
5694 void print_node_links0(
struct X3D_Node* sfn,
int *level);
5695 BOOL cbPrintLinks(
void *callbackData,
struct X3D_Node* node,
int jfield,
5696 union anyVrml *fieldPtr,
char *fieldName,
int mode,
int type,
int source,BOOL publicfield)
5698 int *level = (
int*)callbackData;
5703 if(isManagedField(type,mode,publicfield))
5705 int n,k,haveSomething;
5707 haveSomething = (type==FIELDTYPE_SFNode && fieldPtr->sfnode) || (type==FIELDTYPE_MFNode && fieldPtr->mfnode.n);
5710 printf(
"%s ",fieldName);
5711 if(type==FIELDTYPE_SFNode){
5712 plist = &fieldPtr->sfnode;
5715 plist = fieldPtr->mfnode.p;
5716 n = fieldPtr->mfnode.n;
5726 if(n>1) indentf((*level));
5727 print_node_links0(sfn,level);
5729 if(type==FIELDTYPE_MFNode && n > 1){
5740 void print_node_links0(
struct X3D_Node* sfn,
int *level)
5745 printf(
"node %p ",sfn);
5746 if(sfn->_parentVector && vectorSize(sfn->_parentVector)){
5748 printf(
" parents={");
5749 for(j=0;j<vectorSize(sfn->_parentVector);j++){
5750 struct X3D_Node *parent = vector_get(
struct X3D_Node *,sfn->_parentVector, j);
5751 printf(
"%p, ",parent);
5756 walk_fields(sfn,cbPrintLinks,level);
5759 void print_node_links(
struct X3D_Node* sfn)
5762 print_node_links0(sfn,&level);
5764 printf(
"ouch level =%d\n",level);
5768 BOOL cbUnlinkChild(
void *callbackData,
struct X3D_Node* node,
int jfield,
5769 union anyVrml *fieldPtr,
char *fieldName,
int mode,
int type,
int source,BOOL publicfield)
5771 if(isManagedField(mode,type,publicfield)){
5772 if(type == FIELDTYPE_SFNode){
5773 struct X3D_Node **sfn = &fieldPtr->sfnode;
5774 AddRemoveSFNodeFieldChild(node,sfn,*sfn,2,__FILE__,__LINE__);
5775 if(fieldPtr->sfnode)
5776 printf(
"didn't delete sfnode child\n");
5777 }
else if(type == FIELDTYPE_MFNode){
5779 AddRemoveChildren(node,mfn,mfn->p,mfn->n,2,__FILE__,__LINE__);
5784 BOOL cbUnlinkParent(
void *callbackData,
struct X3D_Node* parent,
int jfield,
5785 union anyVrml *fieldPtr,
char *fieldName,
int mode,
int type,
int source,BOOL publicfield)
5787 struct X3D_Node* node = X3D_NODE(callbackData);
5788 if(isManagedField(mode,type,publicfield)){
5789 if(type == FIELDTYPE_SFNode){
5790 struct X3D_Node **sfn = &fieldPtr->sfnode;
5791 AddRemoveSFNodeFieldChild(parent,sfn,node,2,__FILE__,__LINE__);
5792 }
else if(type == FIELDTYPE_MFNode){
5794 AddRemoveChildren(parent,mfn,&node,1,2,__FILE__,__LINE__);
5799 void unlink_node(
struct X3D_Node* node)
5804 walk_fields(node,cbUnlinkChild,NULL);
5806 if(node->_parentVector && vectorSize(node->_parentVector)){
5808 struct Vector* pp = newVector(
struct X3D_Node*,vectorSize(node->_parentVector));
5809 for(j=0;j<vectorSize(node->_parentVector);j++){
5810 struct X3D_Node *parent = vector_get(
struct X3D_Node *,node->_parentVector, j);
5811 vector_pushBack(
struct X3D_Node*,pp,parent);
5813 for(j=0;j<vectorSize(pp);j++){
5815 walk_fields(parent,cbUnlinkParent,node);
5817 node->_parentVector->n = 0;
5818 deleteVector(
struct X3D_Node*, pp);
5823 void deleteMallocedFieldValue(
int type,
union anyVrml *fieldPtr);
5824 BOOL cbFreeMallocedBuiltinField(
void *callbackData,
struct X3D_Node* node,
int jfield,
5825 union anyVrml *fieldPtr,
char *fieldName,
int mode,
int type,
int source,BOOL publicfield)
5837 if(strcmp(fieldName,
"__oldurl") && strcmp(fieldName,
"_parentVector")) {
5840 deleteMallocedFieldValue(type,fieldPtr);
5841 if(type == FIELDTYPE_FreeWRLPTR){
5842 if(!strncmp(fieldName,
"__x",3) || !strncmp(fieldName,
"__v",3)) {
5843 FREE_IF_NZ(fieldPtr->sfnode);
5851 BOOL cbFreePublicMallocedBuiltinField(
void *callbackData,
struct X3D_Node* node,
int jfield,
5852 union anyVrml *fieldPtr,
char *fieldName,
int mode,
int type,
int source,BOOL publicfield)
5863 if(strncmp(fieldName,
"_",1)) {
5866 deleteMallocedFieldValue(type,fieldPtr);
5872 BOOL cbFreeMallocedUserField(
void *callbackData,
struct X3D_Node* node,
int jfield,
5873 union anyVrml *fieldPtr,
char *fieldName,
int mode,
int type,
int source,BOOL publicfield)
5886 if(strncmp(fieldName,
"__",2)) {
5889 deleteMallocedFieldValue(type,fieldPtr);
5897 switch(node->_nodeType)
5899 case NODE_Script: shader =(
struct Shader_Script *)(X3D_SCRIPT(node)->__scriptObj);
break;
5900 case NODE_ComposedShader: shader =(
struct Shader_Script *)(X3D_COMPOSEDSHADER(node)->_shaderUserDefinedFields);
break;
5901 case NODE_Effect: shader =(
struct Shader_Script *)(X3D_EFFECT(node)->_shaderUserDefinedFields);
break;
5902 case NODE_ShaderProgram: shader =(
struct Shader_Script *)(X3D_SHADERPROGRAM(node)->_shaderUserDefinedFields);
break;
5903 case NODE_PackagedShader: shader =(
struct Shader_Script *)(X3D_PACKAGEDSHADER(node)->_shaderUserDefinedFields);
break;
5908 switch(node->_nodeType)
5910 case NODE_Script: X3D_SCRIPT(node)->__scriptObj = (
void *)shader;
break;
5911 case NODE_ComposedShader: X3D_COMPOSEDSHADER(node)->_shaderUserDefinedFields = (
void *)shader;;
break;
5912 case NODE_Effect: X3D_EFFECT(node)->_shaderUserDefinedFields = (
void *)shader;;
break;
5913 case NODE_ShaderProgram: X3D_SHADERPROGRAM(node)->_shaderUserDefinedFields = (
void *)shader;;
break;
5914 case NODE_PackagedShader: X3D_PACKAGEDSHADER(node)->_shaderUserDefinedFields = (
void *)shader;;
break;
5922 for(i=0;i<vectorSize(shader->fields);i++){
5924 deleteScriptFieldDecl(field);
5928 FREE_IF_NZ(shader->fields);
5935 void freeMallocedNodeFields0(
struct X3D_Node* node){
5945 int isScriptType, isBrotoType, hasUserFields;
5946 isScriptType = node->_nodeType == NODE_Script || node->_nodeType == NODE_ComposedShader || node->_nodeType == NODE_ShaderProgram || node->_nodeType == NODE_PackagedShader;
5947 isBrotoType = node->_nodeType == NODE_Proto;
5948 hasUserFields = isScriptType || isBrotoType;
5953 walk_fields(node,cbFreeMallocedUserField,NULL);
5957 deleteShaderDefinition(shader);
5958 setShader(node,NULL);
5960 }
else if(isBrotoType){
5962 deleteProtoDefinition(pnode->__protoDef);
5963 FREE_IF_NZ(pnode->__protoDef);
5964 FREE_IF_NZ(pnode->__typename);
5974 walk_fields(node,cbFreeMallocedBuiltinField,NULL);
5981 void freeMallocedNodeFields(
struct X3D_Node* node){
5983 deleteVector(
void*,node->_parentVector);
5984 if(node->_gc) free_registered_node_gc(node);
5985 freeMallocedNodeFields0(node);
6225 #ifdef DEBUG_FW_LOADMAT
6226 static void fw_glLoadMatrixd(GLDOUBLE *val,
char *where,
int line) {
6228 for (i=0; i<16; i++) {
6229 if (val[i] > 2000.0) printf (
"FW_GL_LOADMATRIX, val %d %lf at %s:%d\n",i,val[i],where,line);
6230 if (val[i] < -2000.0) printf (
"FW_GL_LOADMATRIX, val %d %lf at %s:%d\n",i,val[i],where,line);
6234 static void fw_glLoadMatrixd(GLDOUBLE *val) {
6238 #ifndef GL_ES_VERSION_2_0
6242 BOOL matrix3x3_inverse_float(
float *inn,
float *outt);
6244 void sendExplicitMatriciesToShader (GLint ModelViewMatrix, GLint ProjectionMatrix, GLint NormalMatrix, GLint *TextureMatrix, GLint ModelViewInverseMatrix)
6256 dp = p->FW_ModelView[p->modelviewTOS];
6260 for (i=0; i<16; i++) {
6264 profile_start(
"sendmtx");
6265 GLUNIFORMMATRIX4FV(ModelViewMatrix,1,GL_FALSE,spval);
6266 profile_end(
"sendmtx");
6269 dp = p->FW_ProjectionView[p->projectionviewTOS];
6271 matdouble2float4(sp,dp);
6277 profile_start(
"sendmtx");
6278 GLUNIFORMMATRIX4FV(ProjectionMatrix,1,GL_FALSE,spval);
6279 profile_end(
"sendmtx");
6282 for(j=0;j<MAX_MULTITEXTURE;j++) {
6283 int itexturestackposition = j+1;
6284 if (TextureMatrix[j] != -1 && itexturestackposition <= p->textureviewTOS) {
6286 dp = p->FW_TextureView[itexturestackposition];
6291 for (i=0; i<16; i++) {
6295 profile_start(
"sendmtx");
6296 GLUNIFORMMATRIX4FV(TextureMatrix[j],1,GL_FALSE,spval);
6297 profile_end(
"sendmtx");
6301 if( ModelViewInverseMatrix != -1){
6308 GLDOUBLE inverseMV[16];
6312 dpp = p->FW_ModelView[p->modelviewTOS];
6313 memcpy(MV,dpp,
sizeof(GLDOUBLE)*16);
6314 matinverse (inverseMV,MV);
6317 for (ii=0; ii<16; ii++) {
6318 *spi = (float) *dpi;
6321 GLUNIFORMMATRIX4FV(ModelViewInverseMatrix,1,GL_FALSE,spvali);
6326 if (NormalMatrix != -1) {
6328 dp = p->FW_ModelView[p->modelviewTOS];
6337 spval[i*3 +j] = (
float) dp[i*4 + j];
6339 matrix3x3_inverse_float(spval, ftemp);
6341 for (i = 0; i < 3; i++)
6342 for (j = 0; j < 3; j++)
6343 normMat[i*3 +j] = ftemp[j*3 + i];
6347 GLDOUBLE inverseMV[16];
6348 GLDOUBLE transInverseMV[16];
6350 memcpy(MV,dp,
sizeof(GLDOUBLE)*16);
6352 matinverse (inverseMV,MV);
6353 mattranspose(transInverseMV,inverseMV);
6355 normMat[0] = (float) transInverseMV[0];
6356 normMat[1] = (float) transInverseMV[1];
6357 normMat[2] = (float) transInverseMV[2];
6359 normMat[3] = (float) transInverseMV[4];
6360 normMat[4] = (float) transInverseMV[5];
6361 normMat[5] = (float) transInverseMV[6];
6363 normMat[6] = (float) transInverseMV[8];
6364 normMat[7] = (float) transInverseMV[9];
6365 normMat[8] = (float) transInverseMV[10];
6373 profile_start(
"sendmtx");
6374 GLUNIFORMMATRIX3FV(NormalMatrix,1,GL_FALSE,normMat);
6375 profile_end(
"sendmtx");
6384 sendExplicitMatriciesToShader (me->ModelViewMatrix, me->ProjectionMatrix, me->NormalMatrix,me->TextureMatrix,me->ModelViewInverseMatrix);
6387 #define SEND_VEC2(myMat,myVal) \
6388 if (me->myMat != -1) { GLUNIFORM2FV(me->myMat,1,myVal);}
6390 #define SEND_VEC4(myMat,myVal) \
6391 if (me->myMat != -1) { GLUNIFORM4FV(me->myMat,1,myVal);}
6393 #define SEND_FLOAT(myMat,myVal) \
6394 if (me->myMat != -1) { GLUNIFORM1F(me->myMat,myVal);}
6396 #define SEND_INT(myMat,myVal) \
6397 if (me->myMat != -1) { GLUNIFORM1I(me->myMat,myVal);}
6406 profile_start(
"sendvec");
6407 memcpy(color4,fog->color.c,
sizeof(
float)*3);
6409 SEND_VEC4(fogColor,color4);
6410 SEND_FLOAT(fogvisibilityRange,fog->visibilityRange*fog->__fogScale);
6411 SEND_FLOAT(fogScale,1.0f);
6412 SEND_INT(fogType,fog->__fogType);
6414 profile_end(
"sendvec");
6417 float *getTransformedClipPlanes();
6418 int getClipPlaneCount();
6422 float *clipplanes = getTransformedClipPlanes();
6423 nsend = getClipPlaneCount();
6424 GLUNIFORM4FV(me->clipplanes,nsend,clipplanes);
6425 GLUNIFORM1I(me->nclipplanes,nsend);
6434 fw_FrontMaterial = &myap->fw_FrontMaterial;
6435 fw_BackMaterial = &myap->fw_BackMaterial;
6455 PRINT_GL_ERROR_IF_ANY(
"BEGIN sendMaterialsToShader");
6458 profile_start(
"sendvec");
6459 SEND_VEC4(myMaterialAmbient,fw_FrontMaterial->ambient);
6460 SEND_VEC4(myMaterialDiffuse,fw_FrontMaterial->diffuse);
6461 SEND_VEC4(myMaterialSpecular,fw_FrontMaterial->specular);
6462 SEND_VEC4(myMaterialEmission,fw_FrontMaterial->emission);
6463 SEND_FLOAT(myMaterialShininess,fw_FrontMaterial->shininess);
6465 SEND_VEC4(myMaterialBackAmbient,fw_BackMaterial->ambient);
6466 SEND_VEC4(myMaterialBackDiffuse,fw_BackMaterial->diffuse);
6467 SEND_VEC4(myMaterialBackSpecular,fw_BackMaterial->specular);
6468 SEND_VEC4(myMaterialBackEmission,fw_BackMaterial->emission);
6469 SEND_FLOAT(myMaterialBackShininess,fw_BackMaterial->shininess);
6470 profile_end(
"sendvec");
6472 if (me->haveLightInShader) sendLightInfo(me);
6475 #if defined (GL_ES_VERSION_2_0)
6476 SEND_FLOAT(myPointSize,myap->pointSize);
6478 glPointSize(myap->pointSize > 0 ? myap->pointSize : 1);
6481 profile_start(
"sendmat");
6483 SEND_INT(filledBool,myap->filledBool);
6484 SEND_INT(hatchedBool,myap->hatchedBool);
6485 SEND_INT(algorithm,myap->algorithm);
6486 SEND_VEC4(hatchColour,myap->hatchColour);
6487 SEND_VEC2(hatchScale,myap->hatchScale);
6488 SEND_VEC2(hatchPercent,myap->hatchPercent);
6491 SEND_INT(texCoordGenType,myap->texCoordGeneratorType);
6492 profile_end(
"sendmat");
6493 PRINT_GL_ERROR_IF_ANY(
"END sendMaterialsToShader");
6496 void __gluMultMatrixVecd(
const GLDOUBLE matrix[16],
const GLDOUBLE in[4],
6501 for (i=0; i<4; i++) {
6503 in[0] * matrix[0*4+i] +
6504 in[1] * matrix[1*4+i] +
6505 in[2] * matrix[2*4+i] +
6506 in[3] * matrix[3*4+i];
6512 (GLDOUBLE objx, GLDOUBLE objy, GLDOUBLE objz,
6513 const GLDOUBLE modelMatrix[16],
6514 const GLDOUBLE projMatrix[16],
6515 const GLint viewport[4],
6516 GLDOUBLE *winx, GLDOUBLE *winy, GLDOUBLE *winz)
6525 __gluMultMatrixVecd(modelMatrix, in, out);
6526 __gluMultMatrixVecd(projMatrix, out, in);
6527 if (in[3] == 0.0)
return;
6532 in[0] = in[0] * 0.5 + 0.5;
6533 in[1] = in[1] * 0.5 + 0.5;
6534 in[2] = in[2] * 0.5 + 0.5;
6537 in[0] = in[0] * viewport[2] + viewport[0];
6538 in[1] = in[1] * viewport[3] + viewport[1];
6545 void __gluMultMatricesd(
const GLDOUBLE a[16],
const GLDOUBLE b[16],
6550 for (i = 0; i < 4; i++) {
6551 for (j = 0; j < 4; j++) {
6566 int __gluInvertMatrixd(
const GLDOUBLE m[16], GLDOUBLE invOut[16])
6568 GLDOUBLE inv[16], det;
6571 inv[0] = m[5]*m[10]*m[15] - m[5]*m[11]*m[14] - m[9]*m[6]*m[15]
6572 + m[9]*m[7]*m[14] + m[13]*m[6]*m[11] - m[13]*m[7]*m[10];
6573 inv[4] = -m[4]*m[10]*m[15] + m[4]*m[11]*m[14] + m[8]*m[6]*m[15]
6574 - m[8]*m[7]*m[14] - m[12]*m[6]*m[11] + m[12]*m[7]*m[10];
6575 inv[8] = m[4]*m[9]*m[15] - m[4]*m[11]*m[13] - m[8]*m[5]*m[15]
6576 + m[8]*m[7]*m[13] + m[12]*m[5]*m[11] - m[12]*m[7]*m[9];
6577 inv[12] = -m[4]*m[9]*m[14] + m[4]*m[10]*m[13] + m[8]*m[5]*m[14]
6578 - m[8]*m[6]*m[13] - m[12]*m[5]*m[10] + m[12]*m[6]*m[9];
6579 inv[1] = -m[1]*m[10]*m[15] + m[1]*m[11]*m[14] + m[9]*m[2]*m[15]
6580 - m[9]*m[3]*m[14] - m[13]*m[2]*m[11] + m[13]*m[3]*m[10];
6581 inv[5] = m[0]*m[10]*m[15] - m[0]*m[11]*m[14] - m[8]*m[2]*m[15]
6582 + m[8]*m[3]*m[14] + m[12]*m[2]*m[11] - m[12]*m[3]*m[10];
6583 inv[9] = -m[0]*m[9]*m[15] + m[0]*m[11]*m[13] + m[8]*m[1]*m[15]
6584 - m[8]*m[3]*m[13] - m[12]*m[1]*m[11] + m[12]*m[3]*m[9];
6585 inv[13] = m[0]*m[9]*m[14] - m[0]*m[10]*m[13] - m[8]*m[1]*m[14]
6586 + m[8]*m[2]*m[13] + m[12]*m[1]*m[10] - m[12]*m[2]*m[9];
6587 inv[2] = m[1]*m[6]*m[15] - m[1]*m[7]*m[14] - m[5]*m[2]*m[15]
6588 + m[5]*m[3]*m[14] + m[13]*m[2]*m[7] - m[13]*m[3]*m[6];
6589 inv[6] = -m[0]*m[6]*m[15] + m[0]*m[7]*m[14] + m[4]*m[2]*m[15]
6590 - m[4]*m[3]*m[14] - m[12]*m[2]*m[7] + m[12]*m[3]*m[6];
6591 inv[10] = m[0]*m[5]*m[15] - m[0]*m[7]*m[13] - m[4]*m[1]*m[15]
6592 + m[4]*m[3]*m[13] + m[12]*m[1]*m[7] - m[12]*m[3]*m[5];
6593 inv[14] = -m[0]*m[5]*m[14] + m[0]*m[6]*m[13] + m[4]*m[1]*m[14]
6594 - m[4]*m[2]*m[13] - m[12]*m[1]*m[6] + m[12]*m[2]*m[5];
6595 inv[3] = -m[1]*m[6]*m[11] + m[1]*m[7]*m[10] + m[5]*m[2]*m[11]
6596 - m[5]*m[3]*m[10] - m[9]*m[2]*m[7] + m[9]*m[3]*m[6];
6597 inv[7] = m[0]*m[6]*m[11] - m[0]*m[7]*m[10] - m[4]*m[2]*m[11]
6598 + m[4]*m[3]*m[10] + m[8]*m[2]*m[7] - m[8]*m[3]*m[6];
6599 inv[11] = -m[0]*m[5]*m[11] + m[0]*m[7]*m[9] + m[4]*m[1]*m[11]
6600 - m[4]*m[3]*m[9] - m[8]*m[1]*m[7] + m[8]*m[3]*m[5];
6601 inv[15] = m[0]*m[5]*m[10] - m[0]*m[6]*m[9] - m[4]*m[1]*m[10]
6602 + m[4]*m[2]*m[9] + m[8]*m[1]*m[6] - m[8]*m[2]*m[5];
6604 det = m[0]*inv[0] + m[1]*inv[4] + m[2]*inv[8] + m[3]*inv[12];
6610 for (i = 0; i < 16; i++)
6611 invOut[i] = inv[i] * det;
6618 void fw_gluUnProject(GLDOUBLE winx, GLDOUBLE winy, GLDOUBLE winz,
6619 const GLDOUBLE modelMatrix[16],
6620 const GLDOUBLE projMatrix[16],
6621 const GLint viewport[4],
6622 GLDOUBLE *objx, GLDOUBLE *objy, GLDOUBLE *objz)
6627 GLDOUBLE finalMatrix[16];
6631 __gluMultMatricesd(modelMatrix, projMatrix, finalMatrix);
6632 if (!__gluInvertMatrixd(finalMatrix, finalMatrix))
return;
6640 in[0] = (in[0] - viewport[0]) / viewport[2];
6641 in[1] = (in[1] - viewport[1]) / viewport[3];
6644 in[0] = in[0] * 2 - 1;
6645 in[1] = in[1] * 2 - 1;
6646 in[2] = in[2] * 2 - 1;
6648 __gluMultMatrixVecd(finalMatrix, in, out);
6649 if (out[3] == 0.0)
return;
6659 void fw_Ortho (GLDOUBLE left, GLDOUBLE right, GLDOUBLE bottom, GLDOUBLE top, GLDOUBLE nearZ, GLDOUBLE farZ) {
6664 dp = p->FW_ProjectionView[p->projectionviewTOS];
6667 if (right <= left) right = left+1.0;
6668 if (top <= bottom) top= bottom+1.0;
6669 if (farZ <= nearZ) farZ= nearZ + 2.0;
6672 mesa_Ortho(left,right,bottom,top,nearZ,farZ,dp);
6676 FW_GL_LOADMATRIX(dp);
6681 void fw_gluPerspective(GLDOUBLE fovy, GLDOUBLE aspect, GLDOUBLE zNear, GLDOUBLE zFar) {
6682 GLDOUBLE xmin, xmax, ymin, ymax;
6691 ymax = zNear * tan(fovy * M_PI / 360.0);
6693 xmin = ymin * aspect;
6694 xmax = ymax * aspect;
6697 FW_GL_MATRIX_MODE(GL_PROJECTION);
6699 dp = p->FW_ProjectionView[p->projectionviewTOS];
6701 mesa_Frustum(xmin, xmax, ymin, ymax, zNear, zFar, ndp);
6702 mattranspose(ndp2,ndp);
6708 matmultiplyFULL(ndp,ndp2,dp);
6713 #define TRY_PERSPECTIVE_METHOD_1
6714 #ifdef TRY_PERSPECTIVE_METHOD_1
6715 FW_GL_LOADMATRIX(ndp);
6717 memcpy (p->FW_ProjectionView[p->projectionviewTOS],ndp,16*sizeof (GLDOUBLE));
6721 #ifdef TRY_PERSPECTIVE_METHOD_2
6725 GLDOUBLE sine, cotangent, deltaZ;
6726 GLDOUBLE radians = fovy / 2.0 * M_PI / 180.0;
6728 deltaZ = zFar - zNear;
6729 sine = sin(radians);
6730 if ((deltaZ == 0) || (sine == 0) || (aspect == 0)) {
6733 cotangent = cos(radians) / sine;
6735 loadIdentityMatrix(m);
6737 m[0*4+0] = cotangent / aspect;
6738 m[1*4+1] = cotangent;
6739 m[2*4+2] = -(zFar + zNear) / deltaZ;
6741 m[3*4+2] = -2 * zNear * zFar / deltaZ;
6743 matmultiplyFULL(m,m,dp);
6745 FW_GL_LOADMATRIX(m);
6752 #ifdef TRY_PERSPECTIVE_METHOD_3
6758 gluPerspective(fovy,aspect,zNear,zFar);
6759 FW_GL_GETDOUBLEV(GL_PROJECTION_MATRIX,yyy);
6772 void fw_gluPerspective_2(GLDOUBLE xcenter, GLDOUBLE fovy, GLDOUBLE aspect, GLDOUBLE zNear, GLDOUBLE zFar) {
6776 GLDOUBLE xmin, xmax, ymin, ymax;
6785 ymax = zNear * tan(fovy * M_PI / 360.0);
6787 xmin = ymin * aspect;
6788 xmax = ymax * aspect;
6789 xmin += xcenter * xmin;
6790 xmax += xcenter * xmin;
6792 FW_GL_MATRIX_MODE(GL_PROJECTION);
6794 dp = p->FW_ProjectionView[p->projectionviewTOS];
6796 mesa_Frustum(xmin, xmax, ymin, ymax, zNear, zFar, ndp);
6797 mattranspose(ndp2,ndp);
6803 matmultiplyFULL(ndp,ndp2,dp);
6808 FW_GL_LOADMATRIX(ndp);
6810 memcpy (p->FW_ProjectionView[p->projectionviewTOS],ndp,16*sizeof (GLDOUBLE));
6815 void fw_gluPickMatrix(GLDOUBLE xx, GLDOUBLE yy, GLDOUBLE width, GLDOUBLE height, GLint *vp) {
6817 printf (
"PickMat %lf %lf %lf %lf %d %d %d %d\n",xx,yy,width,height,vp[0], vp[1],vp[2],vp[3]);
6820 if ((width < 0.0) || (height < 0.0))
return;
6822 FW_GL_TRANSLATE_D((vp[2] - 2.0 * (xx - vp[0])) / width, (vp[3] - 2.0 * (yy - vp[1])) / height, 0.0);
6823 FW_GL_SCALE_D(vp[2] / width, vp[3] / height, 1.0);
6843 mesa_Frustum(GLDOUBLE left, GLDOUBLE right, GLDOUBLE bottom, GLDOUBLE top, GLDOUBLE nearZ, GLDOUBLE farZ, GLDOUBLE *m)
6846 GLDOUBLE x = (2.0*nearZ) / (right-left);
6847 GLDOUBLE y = (2.0*nearZ) / (top-bottom);
6848 GLDOUBLE a = (right+left) / (right-left);
6849 GLDOUBLE b = (top+bottom) / (top-bottom);
6850 GLDOUBLE c = -(farZ+nearZ) / ( farZ-nearZ);
6851 GLDOUBLE d = -(2.0F*farZ*nearZ) / (farZ-nearZ);
6888 mesa_Ortho(GLDOUBLE left, GLDOUBLE right, GLDOUBLE bottom, GLDOUBLE top, GLDOUBLE nearZ, GLDOUBLE farZ, GLDOUBLE *m)
6890 #define M(row,col) m[col*4+row]
6891 M(0,0) = 2.0F / (right-left);
6894 M(0,3) = -(right+left) / (right-left);
6897 M(1,1) = 2.0F / (top-bottom);
6899 M(1,3) = -(top+bottom) / (top-bottom);
6903 M(2,2) = -2.0F / (farZ-nearZ);
6904 M(2,3) = -(farZ+nearZ) / (farZ-nearZ);