35 #include <libFreeWRL.h>
37 #include "../vrml_parser/Structs.h"
38 #include "../main/headers.h"
39 #include "../opengl/Frustum.h"
40 #include "../opengl/Material.h"
41 #include "../opengl/OpenGL_Utils.h"
42 #include "../opengl/Textures.h"
43 #include "Component_ProgrammableShaders.h"
44 #include "Component_Shape.h"
45 #include "RenderFuncs.h"
54 struct X3D_Node * this_textureTransform;
65 static void *Component_Shape_constructor(){
70 void Component_Shape_init(
struct tComponent_Shape *t){
73 t->prv = Component_Shape_constructor();
80 return &p->appearanceProperties;
84 static int hasUserDefinedShader(
struct X3D_Node *node) {
85 #define NO_SHADER 99999
86 unsigned int rv = NO_SHADER;
88 if (node==NULL)
return 0;
92 if (node->_nodeType == NODE_Appearance) {
97 if (ap && ap->shaders.n != 0) {
101 if (ap->shaders.n > 1) {
102 ConsoleMessage (
"warning, Appearance->shaders has more than 1 node, using only first one");
109 if (cps->_nodeType == NODE_ComposedShader) {
114 if (cps->_retrievedURLData) {
115 if (cps->_shaderUserNumber == -1) cps->_shaderUserNumber = getNextFreeUserDefinedShaderSlot();
116 rv = cps->_shaderUserNumber;
118 }
else if (cps->_nodeType == NODE_PackagedShader) {
120 if (X3D_PACKAGEDSHADER(cps)->_retrievedURLData) {
121 if (X3D_PACKAGEDSHADER(cps)->_shaderUserNumber == -1)
122 X3D_PACKAGEDSHADER(cps)->_shaderUserNumber = getNextFreeUserDefinedShaderSlot();
123 rv = X3D_PACKAGEDSHADER(cps)->_shaderUserNumber;
125 }
else if (cps->_nodeType == NODE_ProgramShader) {
127 if (X3D_PROGRAMSHADER(cps)->_retrievedURLData) {
128 if (X3D_PROGRAMSHADER(cps)->_shaderUserNumber == -1)
129 X3D_PROGRAMSHADER(cps)->_shaderUserNumber = getNextFreeUserDefinedShaderSlot();
131 rv = X3D_PROGRAMSHADER(cps)->_shaderUserNumber;
134 ConsoleMessage (
"shader field of Appearance is a %s, ignoring",stringNodeType(cps->_nodeType));
144 if (rv == NO_SHADER) rv = 0;
152 int hasGeneratedCubeMapTexture(
struct X3D_Appearance *appearance){
155 POSSIBLE_PROTO_EXPANSION(
struct X3D_Appearance *, X3D_NODE(appearance),tmpN)
156 if(tmpN && tmpN->texture)
157 if(tmpN->texture->_nodeType == NODE_GeneratedCubeMapTexture) ret = TRUE;
161 void setUserShaderNode(struct
X3D_Node *me) {
163 p->userShaderNode = me;
166 struct X3D_Node *getThis_textureTransform(){
168 return p->this_textureTransform;
180 RENDER_MATERIAL_SUBNODES(node->material);
182 if (node->fillProperties) {
183 POSSIBLE_PROTO_EXPANSION(
struct X3D_Node *, node->fillProperties,tmpN);
188 if (node->lineProperties) {
189 POSSIBLE_PROTO_EXPANSION(
struct X3D_Node *, node->lineProperties,tmpN);
201 POSSIBLE_PROTO_EXPANSION(
struct X3D_Node *, node->textureTransform,p->this_textureTransform);
204 POSSIBLE_PROTO_EXPANSION(
struct X3D_Node *, node->texture,tmpN);
205 tg->RenderFuncs.texturenode = (
void*)tmpN;
211 if (node->shaders.n !=0) {
213 int foundGoodShader = FALSE;
215 for (count=0; count<node->shaders.n; count++) {
216 POSSIBLE_PROTO_EXPANSION(
struct X3D_Node *, node->shaders.p[count], tmpN);
220 if (foundGoodShader) {
223 SET_SHADER_SELECTED_FALSE(tmpN);
226 SET_FOUND_GOOD_SHADER(tmpN);
227 DEBUG_SHADER(
"running shader (%s) %d of %d\n",
228 stringNodeType(X3D_NODE(tmpN)->_nodeType),count, node->shaders.n);
236 if (node->effects.n !=0) {
239 prep_sibAffectors(X3D_NODE(node),&node->effects);
271 p->material_oneSided = node;
276 return p->material_oneSided;
280 return p->material_twoSided;
289 if (node->ambientIntensity < 0.0f) node->ambientIntensity=0.0f;
290 if (node->ambientIntensity > 1.0f) node->ambientIntensity=1.0f;
291 if (node->shininess < 0.0f) node->shininess=0.0f;
292 if (node->shininess > 1.0f) node->shininess=1.0f;
293 if (node->transparency < 0.0f) node->transparency=MIN_NODE_TRANSPARENCY;
294 if (node->transparency >= 1.0f) node->transparency=MAX_NODE_TRANSPARENCY;
296 for (i=0; i<3; i++) {
297 if (node->diffuseColor.c[i] < 0.0f) node->diffuseColor.c[i]=0.0f;
298 if (node->diffuseColor.c[i] > 1.0f) node->diffuseColor.c[i]=1.0f;
299 if (node->emissiveColor.c[i] < 0.0f) node->emissiveColor.c[i]=0.0f;
300 if (node->emissiveColor.c[i] > 1.0f) node->emissiveColor.c[i]=1.0f;
301 if (node->specularColor.c[i] < 0.0f) node->specularColor.c[i]=0.0f;
302 if (node->specularColor.c[i] > 1.0f) node->specularColor.c[i]=1.0f;
307 trans = 1.0f - node->transparency;
325 node->_verifiedColor.p[3] = trans;
326 node->_verifiedColor.p[7] = trans;
327 node->_verifiedColor.p[11] = trans;
328 node->_verifiedColor.p[15] = trans;
331 memcpy((
void *)(&node->_verifiedColor.p[8]), node->diffuseColor.c, sizeof (
float) * 3);
334 for(i=0; i<3; i++) { node->_verifiedColor.p[i+4] = node->_verifiedColor.p[i+8] * node->ambientIntensity; }
337 memcpy((
void *)(&node->_verifiedColor.p[12]), node->specularColor.c, sizeof (
float) * 3);
340 memcpy((
void *)(&node->_verifiedColor.p[0]), node->emissiveColor.c, sizeof (
float) * 3);
343 node->_verifiedColor.p[16] = node->shininess * 128.0f;
345 #define MAX_SHIN 128.0f
346 #define MIN_SHIN 0.01f
347 if ((node->_verifiedColor.p[16] > MAX_SHIN) || (node->_verifiedColor.p[16] < MIN_SHIN)) {
348 if (node->_verifiedColor.p[16]>MAX_SHIN){node->_verifiedColor.p[16] = MAX_SHIN;}
else{node->_verifiedColor.p[16]=MIN_SHIN;}
356 #define CHECK_COLOUR_FIELD(aaa) \
358 struct X3D_##aaa *me = (struct X3D_##aaa *)realNode; \
359 if (me->color == NULL) return NOTHING; \
360 else return COLOUR_MATERIAL_SHADER; \
363 #define CHECK_FOGCOORD_FIELD(aaa) \
365 struct X3D_##aaa *me = (struct X3D_##aaa *)realNode; \
366 if (me->fogCoord == NULL) return NOTHING; \
367 else return HAVE_FOG_COORDS; \
375 static bool getIfLinePoints(
struct X3D_Node *realNode) {
376 if (realNode == NULL)
return false;
377 switch (realNode->_nodeType) {
378 case NODE_IndexedLineSet:
381 case NODE_Polyline2D:
382 case NODE_Polypoint2D:
393 int *fieldOffsetsPtr = NULL;
396 if (realGeomNode == NULL)
return tc;
398 fieldOffsetsPtr = (
int *)NODE_OFFSETS[realGeomNode->_nodeType];
400 while (*fieldOffsetsPtr != -1) {
401 if (*fieldOffsetsPtr == FIELDNAMES_texCoord) {
403 memcpy(&tc,offsetPointer_deref(
void*, realGeomNode,*(fieldOffsetsPtr+1)),
sizeof(
struct X3D_Node *));
406 fieldOffsetsPtr += 5;
411 static int getShapeTextureCoordGen(
struct X3D_Node *realNode) {
413 tc = getGeomTexCoordField(realNode);
415 if (tc->_nodeType == NODE_TextureCoordinateGenerator)
return HAVE_TEXTURECOORDINATEGENERATOR;
422 static int getShapeColourShader (
struct X3D_Node *myGeom) {
425 POSSIBLE_PROTO_EXPANSION(
struct X3D_Node *,myGeom,realNode);
427 if (realNode == NULL)
return NOTHING;
432 switch (realNode->_nodeType) {
433 CHECK_COLOUR_FIELD(IndexedFaceSet);
434 CHECK_COLOUR_FIELD(IndexedLineSet);
435 CHECK_COLOUR_FIELD(IndexedTriangleFanSet);
436 CHECK_COLOUR_FIELD(IndexedTriangleSet);
437 CHECK_COLOUR_FIELD(IndexedTriangleStripSet);
438 CHECK_COLOUR_FIELD(LineSet);
439 CHECK_COLOUR_FIELD(PointSet);
440 CHECK_COLOUR_FIELD(TriangleFanSet);
441 CHECK_COLOUR_FIELD(TriangleStripSet);
442 CHECK_COLOUR_FIELD(TriangleSet);
443 CHECK_COLOUR_FIELD(ElevationGrid);
444 CHECK_COLOUR_FIELD(GeoElevationGrid);
445 CHECK_COLOUR_FIELD(QuadSet);
446 CHECK_COLOUR_FIELD(IndexedQuadSet);
453 static int getShapeFogShader (
struct X3D_Node *myGeom) {
456 POSSIBLE_PROTO_EXPANSION(
struct X3D_Node *,myGeom,realNode);
458 if (realNode == NULL)
return NOTHING;
463 switch (realNode->_nodeType) {
464 CHECK_FOGCOORD_FIELD(IndexedFaceSet);
465 CHECK_FOGCOORD_FIELD(IndexedLineSet);
466 CHECK_FOGCOORD_FIELD(IndexedTriangleFanSet);
467 CHECK_FOGCOORD_FIELD(IndexedTriangleSet);
468 CHECK_FOGCOORD_FIELD(IndexedTriangleStripSet);
469 CHECK_FOGCOORD_FIELD(LineSet);
470 CHECK_FOGCOORD_FIELD(PointSet);
471 CHECK_FOGCOORD_FIELD(TriangleFanSet);
472 CHECK_FOGCOORD_FIELD(TriangleStripSet);
473 CHECK_FOGCOORD_FIELD(TriangleSet);
474 CHECK_FOGCOORD_FIELD(ElevationGrid);
476 CHECK_FOGCOORD_FIELD(QuadSet);
477 CHECK_FOGCOORD_FIELD(IndexedQuadSet);
484 static int getAppearanceShader (
struct X3D_Node *myApp) {
489 int retval = NOTHING;
492 if (myApp == NULL)
return retval;
494 POSSIBLE_PROTO_EXPANSION(
struct X3D_Appearance *, myApp,realAppearanceNode);
495 if (!realAppearanceNode || realAppearanceNode->_nodeType != NODE_Appearance)
return retval;
497 if (realAppearanceNode->material != NULL) {
498 POSSIBLE_PROTO_EXPANSION(
struct X3D_Node *, realAppearanceNode->material,realMaterialNode);
499 if(realMaterialNode) {
500 if (realMaterialNode->_nodeType == NODE_Material) {
501 retval |= MATERIAL_APPEARANCE_SHADER;
503 if (realMaterialNode->_nodeType == NODE_TwoSidedMaterial) {
504 retval |= TWO_MATERIAL_APPEARANCE_SHADER;
510 if (realAppearanceNode->fillProperties != NULL) {
512 POSSIBLE_PROTO_EXPANSION(
struct X3D_Node *, realAppearanceNode->fillProperties,fp);
514 if (fp->_nodeType != NODE_FillProperties) {
515 ConsoleMessage(
"getAppearanceShader, fillProperties has a node type of %s",stringNodeType(fp->_nodeType));
518 if (X3D_FILLPROPERTIES(fp)->_enabled)
519 retval |= FILL_PROPERTIES_SHADER;
525 if (realAppearanceNode->texture != NULL) {
529 POSSIBLE_PROTO_EXPANSION(
struct X3D_Node *, realAppearanceNode->texture,tex);
531 if ((tex->_nodeType == NODE_ImageTexture) ||
532 (tex->_nodeType == NODE_MovieTexture) ||
533 (tex->_nodeType == NODE_PixelTexture) ){
534 retval |= ONE_TEX_APPEARANCE_SHADER;
535 }
else if( (tex->_nodeType == NODE_PixelTexture3D) ||
536 (tex->_nodeType == NODE_ComposedTexture3D) ||
537 (tex->_nodeType == NODE_ImageTexture3D) ) {
538 retval |= ONE_TEX_APPEARANCE_SHADER;
539 retval |= TEX3D_SHADER;
540 if(tex->_nodeType == NODE_ComposedTexture3D)
541 retval |= TEX3D_LAYER_SHADER;
542 }
else if (tex->_nodeType == NODE_MultiTexture) {
543 retval |= MULTI_TEX_APPEARANCE_SHADER;
544 }
else if ((tex->_nodeType == NODE_ComposedCubeMapTexture) ||
545 (tex->_nodeType == NODE_ImageCubeMapTexture) ||
546 (tex->_nodeType == NODE_GeneratedCubeMapTexture)) {
547 retval |= HAVE_CUBEMAP_TEXTURE;
549 ConsoleMessage (
"getAppearanceShader, texture field %s not supported yet\n",
550 stringNodeType(tex->_nodeType));
556 printf (
"getAppearanceShader, returning %x\n",retval);
557 #endif //SHAPE_VERBOSE
593 hatchX = 0.80f; hatchY = 0.80f;
594 algor = node->hatchStyle; filled = node->filled; hatched = node->hatched;
595 switch (node->hatchStyle) {
597 case 1: hatchX = 1.0f;
break;
598 case 2: hatchY = 1.0f;
break;
599 case 3: hatchY=1.0f;
break;
600 case 4: hatchY=1.0f;
break;
602 case 6: hatchY = 1.0f;
break;
605 node->hatched = FALSE;
609 me->filledBool = filled;
610 me->hatchedBool = hatched;
611 me->hatchPercent[0] = hatchX;
612 me->hatchPercent[1] = hatchY;
613 me->hatchScale[0] = node->_hatchScale.c[0];
614 me->hatchScale[1] = node->_hatchScale.c[1];
615 me->algorithm = algor;
616 me->hatchColour[0]=node->hatchColor.c[0]; me->hatchColour[1]=node->hatchColor.c[1]; me->hatchColour[2] = node->hatchColor.c[2];
617 me->hatchColour[3] = 1.0;
622 #ifdef NEED_TO_ADD_TO_SHADER
623 much of
this was working in older versions of FreeWRL,
624 before we went to 100% shader based code. Check FreeWRL
625 from (say) 2011 to see what the shader code looked like
633 if (node->linewidthScaleFactor > 1.0) {
635 glLineWidth(node->linewidthScaleFactor);
636 me= getAppearanceProperties();
637 me->pointSize = node->linewidthScaleFactor;
641 #ifdef NEED_TO_ADD_TO_SHADER
642 if (node->linetype > 1) {
644 switch (node->linetype) {
645 case 2: pat = 0xff00;
break;
646 case 3: pat = 0x4040;
break;
647 case 4: pat = 0x04ff;
break;
648 case 5: pat = 0x44fe;
break;
649 case 6: pat = 0x0100;
break;
650 case 7: pat = 0x0100;
break;
651 case 10: pat = 0xaaaa;
break;
652 case 11: pat = 0x0170;
break;
653 case 12: pat = 0x0000;
break;
654 case 13: pat = 0x0000;
break;
664 int getImageChannelCountFromTTI(
struct X3D_Node *appearanceNode ){
666 int channels, imgalpha, haveTexture;
671 POSSIBLE_PROTO_EXPANSION(
struct X3D_Appearance*,appearanceNode,appearance);
675 if(appearance->texture){
680 if(appearance->texture->_nodeType == NODE_MultiTexture ||
681 appearance->texture->_nodeType == NODE_ComposedTexture3D ){
684 switch(appearance->texture->_nodeType){
685 case NODE_MultiTexture: mtex = &((
struct X3D_MultiTexture*)appearance->texture)->texture;
break;
686 case NODE_ComposedTexture3D: mtex = &((
struct X3D_ComposedTexture3D*)appearance->texture)->texture;
break;
691 for(k=0;k<mtex->n;k++){
698 channels = max(channels,tti->channels);
699 imgalpha = max(tti->hasAlpha,imgalpha);
704 }
else if(appearance->texture->_nodeType == NODE_ComposedCubeMapTexture){
723 channels = max(channels,tti->channels);
724 imgalpha = max(tti->hasAlpha,imgalpha);
736 channels = tti->channels;
737 imgalpha = tti->hasAlpha;
744 channels = haveTexture ? channels : 0;
752 void update_effect_uniforms();
754 void textureTransform_start();
757 void child_Shape (
struct X3D_Shape *node) {
763 {0.0f, 0.0f, 0.0f, 1.0f},
764 {0.0f, 0.0f, 0.0f, 1.0f},
765 {0.8f, 0.8f, 0.8f, 1.0f},
766 {0.0f, 0.0f, 0.0f, 1.0f},
775 if(!(node->geometry)) {
return; }
779 if((renderstate()->render_collision) || (renderstate()->render_sensitive)) {
781 POSSIBLE_PROTO_EXPANSION(
struct X3D_Node *,node->geometry,tmpNG);
789 tg->RenderFuncs.last_texture_type = NOTEXTURE;
790 tg->RenderFuncs.shapenode = node;
793 memcpy (&p->appearanceProperties.fw_FrontMaterial, &defaultMaterials, sizeof (
struct fw_MaterialParameters));
794 memcpy (&p->appearanceProperties.fw_BackMaterial, &defaultMaterials, sizeof (
struct fw_MaterialParameters));
796 if((renderstate()->render_cube) && hasGeneratedCubeMapTexture((
struct X3D_Appearance*)node->appearance))
800 if (renderstate()->render_blend == (node->_renderFlags & VF_Blend)) {
808 RENDER_MATERIAL_SUBNODES(node->appearance);
812 if (p->material_oneSided != NULL) {
813 memcpy (&p->appearanceProperties.fw_FrontMaterial, p->material_oneSided->_verifiedColor.p, sizeof (
struct fw_MaterialParameters));
814 memcpy (&p->appearanceProperties.fw_BackMaterial, p->material_oneSided->_verifiedColor.p, sizeof (
struct fw_MaterialParameters));
816 memcpy(p->appearanceProperties.emissionColour,p->material_oneSided->_verifiedColor.p, 3*
sizeof(
float));
818 }
else if (p->material_twoSided != NULL) {
819 memcpy (&p->appearanceProperties.fw_FrontMaterial, p->material_twoSided->_verifiedFrontColor.p, sizeof (
struct fw_MaterialParameters));
820 memcpy (&p->appearanceProperties.fw_BackMaterial, p->material_twoSided->_verifiedBackColor.p, sizeof (
struct fw_MaterialParameters));
822 memcpy(p->appearanceProperties.emissionColour,p->material_twoSided->_verifiedFrontColor.p, 3*
sizeof(
float));
830 POSSIBLE_PROTO_EXPANSION(
struct X3D_Node *, node->geometry,tmpNG);
832 shader_requirements.base = node->_shaderflags_base;
833 shader_requirements.effects = node->_shaderflags_effects;
834 shader_requirements.usershaders = node->_shaderflags_usershaders;
835 isUserShader = shader_requirements.usershaders ? TRUE : FALSE;
867 channels = getImageChannelCountFromTTI(node->appearance);
870 shader_requirements.base |= MAT_FIRST;
872 if(shader_requirements.base & COLOUR_MATERIAL_SHADER){
877 shader_requirements.base |= CPV_REPLACE_PRIOR;
880 if(channels && (channels == 3 || channels == 4) && modulation < 2)
881 shader_requirements.base |= TEXTURE_REPLACE_PRIOR;
884 if(channels && (channels == 2 || channels == 4) && modulation == 0)
885 shader_requirements.base |= TEXALPHA_REPLACE_PRIOR;
891 shader_requirements.base |= getShaderFlags().base;
892 shader_requirements.effects |= getShaderFlags().effects;
897 scap = getMyShaders(shader_requirements);
898 enableGlobalShader(scap);
902 if (tmpNG && tmpNG->_intern) {
903 if (tmpNG->_intern->tcoordtype == NODE_TextureCoordinateGenerator) {
904 getAppearanceProperties()->texCoordGeneratorType = tmpNG->_intern->texgentype;
910 if(isUserShader && p->userShaderNode){
914 switch (p->userShaderNode->_nodeType) {
915 case NODE_ComposedShader:
916 if (X3D_COMPOSEDSHADER(p->userShaderNode)->isValid) {
917 if (!X3D_COMPOSEDSHADER(p->userShaderNode)->_initialized) {
918 sendInitialFieldsToShader(p->userShaderNode);
922 case NODE_ProgramShader:
923 if (X3D_PROGRAMSHADER(p->userShaderNode)->isValid) {
924 if (!X3D_PROGRAMSHADER(p->userShaderNode)->_initialized) {
925 sendInitialFieldsToShader(p->userShaderNode);
930 case NODE_PackagedShader:
931 if (X3D_PACKAGEDSHADER(p->userShaderNode)->isValid) {
932 if (!X3D_PACKAGEDSHADER(p->userShaderNode)->_initialized) {
933 sendInitialFieldsToShader(p->userShaderNode);
941 if(shader_requirements.effects){
942 update_effect_uniforms();
946 #ifdef SHAPEOCCLUSION
961 textureTransform_start();
965 FW_GL_BINDBUFFER(GL_ARRAY_BUFFER, 0);
966 FW_GL_BINDBUFFER(GL_ELEMENT_ARRAY_BUFFER, 0);
967 textureTransform_end();
969 #ifdef SHAPEOCCLUSION
974 if(node->appearance){
976 POSSIBLE_PROTO_EXPANSION(
struct X3D_Appearance *,node->appearance,tmpA);
978 fin_sibAffectors(X3D_NODE(tmpA),&tmpA->effects);
986 finishedWithGlobalShader();
987 p->material_twoSided = NULL;
988 p->material_oneSided = NULL;
989 p->userShaderNode = NULL;
990 tg->RenderFuncs.shapenode = NULL;
995 if (p->this_textureTransform) {
996 p->this_textureTransform = NULL;
997 FW_GL_MATRIX_MODE(GL_TEXTURE);
998 FW_GL_LOAD_IDENTITY();
999 FW_GL_MATRIX_MODE(GL_MODELVIEW);
1004 float gl_linewidth = tg->Mainloop.gl_linewidth;
1005 glLineWidth(gl_linewidth);
1006 p->appearanceProperties.pointSize = gl_linewidth;
1016 void compile_Shape (
struct X3D_Shape *node) {
1017 int whichAppearanceShader = 0;
1018 int whichShapeColorShader = 0;
1019 int whichShapeFogShader = 0;
1020 bool isUnlitGeometry =
false;
1021 int hasTextureCoordinateGenerator = 0;
1022 int whichUnlitGeometry = 0;
1026 int userDefinedShader = 0;
1033 POSSIBLE_PROTO_EXPANSION(
struct X3D_Node *, node->geometry,tmpG);
1034 whichShapeColorShader = getShapeColourShader(tmpG);
1035 whichShapeFogShader = getShapeFogShader(tmpG);
1037 isUnlitGeometry = getIfLinePoints(tmpG);
1038 hasTextureCoordinateGenerator = getShapeTextureCoordGen(tmpG);
1040 POSSIBLE_PROTO_EXPANSION(
struct X3D_Node *, node->appearance,tmpN);
1044 userDefinedShader = hasUserDefinedShader(tmpN);
1049 whichUnlitGeometry = HAVE_LINEPOINTS_COLOR;
1050 whichAppearanceShader = getAppearanceShader(tmpN);
1054 node->_shaderflags_base = (whichShapeColorShader | whichShapeFogShader | whichAppearanceShader |
1055 hasTextureCoordinateGenerator | whichUnlitGeometry );
1056 node->_shaderflags_usershaders = userDefinedShader;
1057 node->_shaderflags_effects = 0;
1063 if (node->_shaderflags_base == NOTHING)
1064 node->_shaderflags_base = NO_APPEARANCE_SHADER;
1078 if (node->ambientIntensity < 0.0) node->ambientIntensity=0.0f;
1079 if (node->ambientIntensity > 1.0) node->ambientIntensity=1.0f;
1080 if (node->shininess < 0.0) node->shininess=0.0f;
1081 if (node->shininess > 1.0) node->shininess=1.0f;
1082 if (node->transparency < 0.0) node->transparency=MIN_NODE_TRANSPARENCY;
1083 if (node->transparency >= 1.0) node->transparency=MAX_NODE_TRANSPARENCY;
1085 if (node->backAmbientIntensity < 0.0) node->backAmbientIntensity=0.0f;
1086 if (node->backAmbientIntensity > 1.0) node->backAmbientIntensity=1.0f;
1087 if (node->backShininess < 0.0) node->backShininess=0.0f;
1088 if (node->backShininess > 1.0) node->backShininess=1.0f;
1089 if (node->backTransparency < 0.0) node->backTransparency=0.0f;
1090 if (node->backTransparency > 1.0) node->backTransparency=1.0f;
1092 for (i=0; i<3; i++) {
1093 if (node->diffuseColor.c[i] < 0.0) node->diffuseColor.c[i]=0.0f;
1094 if (node->diffuseColor.c[i] > 1.0) node->diffuseColor.c[i]=1.0f;
1095 if (node->emissiveColor.c[i] < 0.0) node->emissiveColor.c[i]=0.0f;
1096 if (node->emissiveColor.c[i] > 1.0) node->emissiveColor.c[i]=1.0f;
1097 if (node->specularColor.c[i] < 0.0) node->specularColor.c[i]=0.0f;
1098 if (node->specularColor.c[i] > 1.0) node->specularColor.c[i]=1.0f;
1100 if (node->backDiffuseColor.c[i] < 0.0) node->backDiffuseColor.c[i]=0.0f;
1101 if (node->backDiffuseColor.c[i] > 1.0) node->backDiffuseColor.c[i]=1.0f;
1102 if (node->backEmissiveColor.c[i] < 0.0) node->backEmissiveColor.c[i]=0.0f;
1103 if (node->backEmissiveColor.c[i] > 1.0) node->backEmissiveColor.c[i]=1.0f;
1104 if (node->backSpecularColor.c[i] < 0.0) node->backSpecularColor.c[i]=0.0f;
1105 if (node->backSpecularColor.c[i] > 1.0) node->backSpecularColor.c[i]=1.0f;
1109 trans = 1.0f - node->transparency;
1110 node->_verifiedFrontColor.p[3] = trans;
1111 node->_verifiedFrontColor.p[7] = trans;
1112 node->_verifiedFrontColor.p[11] = trans;
1113 node->_verifiedFrontColor.p[15] = trans;
1114 trans = 1.0f - node->backTransparency;
1115 node->_verifiedBackColor.p[3] = trans;
1116 node->_verifiedBackColor.p[7] = trans;
1117 node->_verifiedBackColor.p[11] = trans;
1118 node->_verifiedBackColor.p[15] = trans;
1122 memcpy((
void *)(&node->_verifiedFrontColor.p[8]), node->diffuseColor.c, sizeof (
float) * 3);
1125 for(i=0; i<4; i++) { node->_verifiedFrontColor.p[i+4] = node->_verifiedFrontColor.p[i+8] * node->ambientIntensity; }
1128 memcpy((
void *)(&node->_verifiedFrontColor.p[12]), node->specularColor.c, sizeof (
float) * 3);
1131 memcpy((
void *)(&node->_verifiedFrontColor.p[0]), node->emissiveColor.c, sizeof (
float) * 3);
1134 node->_verifiedFrontColor.p[16] = node->shininess * 128.0f;
1136 #define MAX_SHIN 128.0f
1137 #define MIN_SHIN 0.01f
1138 if ((node->_verifiedFrontColor.p[16] > MAX_SHIN) || (node->_verifiedFrontColor.p[16] < MIN_SHIN)) {
1139 if (node->_verifiedFrontColor.p[16]>MAX_SHIN){node->_verifiedFrontColor.p[16] = MAX_SHIN;}
else{node->_verifiedFrontColor.p[16]=MIN_SHIN;}
1144 if (node->separateBackColor) {
1147 memcpy((
void *)(&node->_verifiedBackColor.p[8]), node->backDiffuseColor.c, sizeof (
float) * 3);
1150 for(i=0; i<3; i++) { node->_verifiedBackColor.p[i+4] = node->_verifiedBackColor.p[i+8] * node->ambientIntensity; }
1153 memcpy((
void *)(&node->_verifiedBackColor.p[12]), node->backSpecularColor.c, sizeof (
float) * 3);
1156 memcpy((
void *)(&node->_verifiedBackColor.p[0]), node->backEmissiveColor.c, sizeof (
float) * 3);
1159 node->_verifiedBackColor.p[16] = node->shininess * 128.0f;
1161 #define MAX_SHIN 128.0f
1162 #define MIN_SHIN 0.01f
1163 if ((node->_verifiedBackColor.p[16] > MAX_SHIN) || (node->_verifiedBackColor.p[16] < MIN_SHIN)) {
1164 if (node->_verifiedBackColor.p[16]>MAX_SHIN){node->_verifiedBackColor.p[16] = MAX_SHIN;}
else{node->_verifiedBackColor.p[16]=MIN_SHIN;}
1171 memcpy(node->_verifiedBackColor.p, node->_verifiedFrontColor.p, sizeof (
float) * 17);
1185 p->material_twoSided = node;