35#include <libFreeWRL.h>
37#include "../vrml_parser/Structs.h"
38#include "../main/headers.h"
41#include "LinearAlgebra.h"
42#include "../opengl/Frustum.h"
43#include "../opengl/Material.h"
44#include "Component_Geometry3D.h"
45#include "../opengl/OpenGL_Utils.h"
46#include "../opengl/Textures.h"
48#include "Component_Shape.h"
49#include "../scenegraph/RenderFuncs.h"
50#include "../x3d_parser/Bindable.h"
53#if defined(_MSC_VER) && _MSC_VER < 1500
57#define SEGMENTS_PER_CIRCLE 36
62static void *createLines (
float start,
float end,
float radius,
int closed,
int *size,
float *_extent);
64#define COMPILE_AND_GET_BOUNDS(myType,myField) \
65void compile_##myType (struct X3D_##myType *node){ \
66 float myminx = FLT_MAX; \
67 float mymaxx = -FLT_MAX; \
68 float myminy = FLT_MAX; \
69 float mymaxy = -FLT_MAX; \
72 if (node->myField.n<=0) { \
73 node->EXTENT_MIN_X = 0.0f; \
74 node->EXTENT_MAX_X = 0.0f; \
75 node->EXTENT_MIN_Y = 0.0f; \
76 node->EXTENT_MAX_Y = 0.0f; \
78 for (count = 0; count < node->myField.n; count++) { \
79 if (node->myField.p[count].c[0] > mymaxx) mymaxx = node->myField.p[count].c[0]; \
80 if (node->myField.p[count].c[0] < myminx) myminx = node->myField.p[count].c[0]; \
81 if (node->myField.p[count].c[1] > mymaxy) mymaxy = node->myField.p[count].c[1]; \
82 if (node->myField.p[count].c[1] < myminy) myminy = node->myField.p[count].c[1]; \
84 node->EXTENT_MAX_X = mymaxx; \
85 node->EXTENT_MIN_X = myminx; \
86 node->EXTENT_MAX_Y = mymaxy; \
87 node->EXTENT_MIN_Y = myminy; \
94void compile_Arc2D (
struct X3D_Arc2D *node) {
96 struct SFVec2f *tmpptr_a, *tmpptr_b;
102 tmpptr_a = createLines (node->startAngle, node->endAngle, node->radius, NONE, &tmpint, node->_extent);
105 node->__numPoints = 0;
106 tmpptr_b = node->__points.p;
107 node->__points.p = tmpptr_a;
108 node->__numPoints = tmpint;
109 FREE_IF_NZ (tmpptr_b);
114void render_Arc2D (
struct X3D_Arc2D *node) {
117 if (node->__numPoints>0) {
119 setExtent( node->EXTENT_MAX_X, node->EXTENT_MIN_X,
120 node->EXTENT_MAX_Y, node->EXTENT_MIN_Y, 0.0f,0.0f,X3D_NODE(node));
125 FW_GL_VERTEX_POINTER (2,GL_FLOAT,0,(GLfloat *)node->__points.p);
126 sendArraysToGPU (GL_LINE_STRIP, 0, node->__numPoints);
127 tg->Mainloop.trisThisLoop += node->__numPoints;
148 float start, end, radius, angle, angle_increment;
149 int numPoints, arcpoints;
154 ct = node->closureType->strptr;
158 if (strcmp(ct,
"PIE") == 0) {
160 }
else if (strcmp(ct,
"CHORD") == 0) {
163 printf (
"ArcClose2D, closureType %s invalid\n",node->closureType->strptr);
165 start = node->startAngle;
166 end = node->endAngle;
167 radius = node->radius;
169 simpleDisc = APPROX(start,end);
175 if (radius < 0.0) radius = 1.0f;
177 if(0)
if (start > end) {
184 numPoints = SEGMENTS_PER_CIRCLE;
186 numPoints = (int) ((
float)(SEGMENTS_PER_CIRCLE * (end - start))/(PI*2.0f));
188 if (numPoints>SEGMENTS_PER_CIRCLE) numPoints=SEGMENTS_PER_CIRCLE;
190 arcpoints = numPoints;
194 tmpint = SEGMENTS_PER_CIRCLE+2;
195 fp = sfp = MALLOC (
struct SFVec2f *,
sizeof(
struct SFVec2f) * (numPoints));
196 tp = stp = MALLOC (
struct SFVec2f *,
sizeof(
struct SFVec2f) * (numPoints));
197 lindex = MALLOC (ushort *,
sizeof(ushort) * (numPoints*2)*2);
202 (*fp).c[0] = 0.0f; (*fp).c[1] = 0.0f; fp++;
203 (*tp).c[0] = 0.5f; (*tp).c[1] = 0.5f; tp++;
206 angle_increment = (end - start)/(
float)(arcpoints -1);
207 for (i=0,k=0,j=1;i<arcpoints;i++,k+=4,j++) {
211 (*fp).c[0] = node->radius * x;
212 (*fp).c[1] = node->radius * y;
220 (*tp).c[0] = 0.5f + x*.5f;
221 (*tp).c[1] = 0.5f + y*.5f;
223 angle += angle_increment;
224 angle = max(angle, start);
226 if(closure == CHORD){
227 sfp[0].c[0] = .5f * (sfp[1].c[0] + sfp[arcpoints].c[0]);
228 sfp[0].c[1] = .5f * (sfp[1].c[1] + sfp[arcpoints].c[1]);
229 stp[0].c[0] = .5f * (stp[1].c[0] + stp[arcpoints].c[0]);
230 stp[0].c[1] = .5f * (stp[1].c[1] + stp[arcpoints].c[1]);
232 node->__wireindices = lindex;
236 node->__numPoints = 0;
237 ofp = node->__points.p;
238 otp = node->__texCoords.p;
239 node->__points.p = sfp;
240 node->__texCoords.p = stp;
241 node->__simpleDisk = simpleDisc;
242 node->__numPoints = numPoints;
248 float myminx = FLT_MAX;
249 float mymaxx = -FLT_MAX;
250 float myminy = FLT_MAX;
251 float mymaxy = -FLT_MAX;
252 for (i=0; i<numPoints; i++) {
254 if (sfp[i].c[0] > mymaxx) mymaxx = sfp[i].c[0];
255 if (sfp[i].c[0] < myminx) myminx = sfp[i].c[0];
258 if (sfp[i].c[1] > mymaxy) mymaxy = sfp[i].c[1];
259 if (sfp[i].c[1] < myminy) myminy = sfp[i].c[1];
262 node->EXTENT_MAX_X = myminx;
263 node->EXTENT_MIN_X = mymaxx;
264 node->EXTENT_MAX_Y = myminy;
265 node->EXTENT_MIN_Y = mymaxy;
268#define DESIRE(whichOne,zzz) ((whichOne & zzz)==zzz)
271 if (node->__numPoints>0) {
272 struct textureVertexInfo mtf = {(GLfloat *)node->__texCoords.p,2,GL_FLOAT,0,NULL,NULL};
274 setExtent( node->EXTENT_MAX_X, node->EXTENT_MIN_X,
275 node->EXTENT_MAX_Y, node->EXTENT_MIN_Y, 0.0f,0.0f,X3D_NODE(node));
277 CULL_FACE(node->solid)
279 textureCoord_send(&mtf);
280 FW_GL_VERTEX_POINTER (2,GL_FLOAT,0,(GLfloat *)node->__points.p);
284 if(DESIRE(getShaderFlags().base,SHADINGSTYLE_WIRE)){
286 sendElementsToGPU(GL_LINES,((node->__numPoints-1)*4 -1 ),node->__wireindices);
288 sendArraysToGPU (GL_TRIANGLE_FAN, 0, node->__numPoints);
291 gglobal()->Mainloop.trisThisLoop += node->__numPoints;
298 struct SFVec2f *tmpptr_a, *tmpptr_b;
304 ct = node->closureType->strptr;
309 if (strcmp(ct,
"PIE") == 0) {
310 tmpptr_a = createLines (node->startAngle,
311 node->endAngle, node->radius, PIE, &tmpint,node->_extent);
312 }
else if (strcmp(ct,
"CHORD") == 0) {
313 tmpptr_a = createLines (node->startAngle,
314 node->endAngle, node->radius, CHORD, &tmpint,node->_extent);
316 printf (
"ArcClose2D, closureType %s invalid\n",node->closureType->strptr);
320 node->__numPoints = 0;
321 tmpptr_b = node->__points.p;
322 node->__points.p = tmpptr_a;
323 node->__numPoints = tmpint;
324 FREE_IF_NZ (tmpptr_b);
332 if (node->__numPoints>0) {
334 setExtent( node->EXTENT_MAX_X, node->EXTENT_MIN_X,
335 node->EXTENT_MAX_Y, node->EXTENT_MIN_Y, 0.0f,0.0f,X3D_NODE(node));
341 FW_GL_VERTEX_POINTER (2,GL_FLOAT,0,(GLfloat *)node->__points.p);
342 sendArraysToGPU (GL_LINE_STRIP, 0, node->__numPoints);
344 gglobal()->Mainloop.trisThisLoop += node->__numPoints;
352 struct SFVec2f *tmpptr_a, *tmpptr_b;
358 tmpptr_a = createLines (0.0f, 0.0f, node->radius, NONE, &tmpint,node->_extent);
361 node->__numPoints = 0;
362 tmpptr_b = node->__points.p;
363 node->__points.p = tmpptr_a;
364 node->__numPoints = tmpint;
365 FREE_IF_NZ (tmpptr_b);
372 if (node->__numPoints>0) {
374 setExtent( node->EXTENT_MAX_X, node->EXTENT_MIN_X,
375 node->EXTENT_MAX_Y, node->EXTENT_MIN_Y, 0.0f,0.0f,X3D_NODE(node));
380 FW_GL_VERTEX_POINTER (2,GL_FLOAT,0,(GLfloat *)node->__points.p);
381 sendArraysToGPU (GL_LINE_STRIP, 0, node->__numPoints);
382 gglobal()->Mainloop.trisThisLoop += node->__numPoints;
389COMPILE_AND_GET_BOUNDS(Polyline2D,lineSegments)
395 if (node->lineSegments.n>0) {
397 setExtent( node->EXTENT_MAX_X, node->EXTENT_MIN_X,
398 node->EXTENT_MAX_Y, node->EXTENT_MIN_Y, 0.0f,0.0f,X3D_NODE(node));
404 FW_GL_VERTEX_POINTER (2,GL_FLOAT,0,(GLfloat *)node->lineSegments.p);
405 sendArraysToGPU (GL_LINE_STRIP, 0, node->lineSegments.n);
406 gglobal()->Mainloop.trisThisLoop += node->lineSegments.n;
412COMPILE_AND_GET_BOUNDS(Polypoint2D,point)
418 if (node->point.n>0) {
420 setExtent( node->EXTENT_MAX_X, node->EXTENT_MIN_X,
421 node->EXTENT_MAX_Y, node->EXTENT_MIN_Y, 0.0f,0.0f,X3D_NODE(node));
427 FW_GL_VERTEX_POINTER (2,GL_FLOAT,0,(GLfloat *)node->point.p);
428 sendArraysToGPU (GL_POINTS, 0, node->point.n);
429 gglobal()->Mainloop.trisThisLoop += node->point.n;
454 if (node->innerRadius<0) {node->__numPoints = 0;
return;}
455 if (node->outerRadius<0) {node->__numPoints = 0;
return;}
458 if ((APPROX (node->innerRadius, 0.0)) ||
459 (APPROX(node->innerRadius,node->outerRadius))) simpleDisc = TRUE;
460 else simpleDisc = FALSE;
464 tmpint = SEGMENTS_PER_CIRCLE+2;
465 fp = sfp = MALLOC (
struct SFVec2f *,
sizeof(
struct SFVec2f) * (tmpint));
466 tp = stp = MALLOC (
struct SFVec2f *,
sizeof(
struct SFVec2f) * (tmpint));
467 lindex = MALLOC (ushort *,
sizeof(ushort) * (tmpint*2)*2);
472 (*fp).c[0] = 0.0f; (*fp).c[1] = 0.0f; fp++;
473 (*tp).c[0] = 0.5f; (*tp).c[1] = 0.5f; tp++;
476 for (i=SEGMENTS_PER_CIRCLE,j=1,k=0; i >= 0; i--,j++,k+=4) {
477 (*fp).c[0] = node->outerRadius * sinf(((
float)PI * 2.0f * (
float)i)/((
float)SEGMENTS_PER_CIRCLE));
478 (*fp).c[1] = node->outerRadius * cosf(((
float)PI * 2.0f * (
float)i)/((
float)SEGMENTS_PER_CIRCLE));
486 (*tp).c[0] = 0.5f + (sinf(((
float)PI * 2.0f * (
float)i)/((
float)SEGMENTS_PER_CIRCLE))/id);
487 (*tp).c[1] = 0.5f + (cosf(((
float)PI * 2.0f * (
float)i)/((
float)SEGMENTS_PER_CIRCLE))/id);
490 node->__wireindices = lindex;
492 tmpint = (SEGMENTS_PER_CIRCLE+1) * 2;
493 fp = sfp = MALLOC (
struct SFVec2f *,
sizeof(
struct SFVec2f) * 2 * tmpint);
494 tp = stp = MALLOC (
struct SFVec2f *,
sizeof(
struct SFVec2f) * (tmpint));
495 lindex = MALLOC (ushort *,
sizeof(ushort) * (tmpint*2) *2);
501 id = node->outerRadius * 2.0f / node->innerRadius;
503 for (i=SEGMENTS_PER_CIRCLE,j=0,k=0; i >= 0; i--,j+=2,k+=8) {
504 (*fp).c[0] = node->innerRadius * (float) sinf(((
float)PI * 2.0f * (
float)i)/((float)SEGMENTS_PER_CIRCLE));
505 (*fp).c[1] = node->innerRadius * (float) cosf(((
float)PI * 2.0f * (float)i)/((float)SEGMENTS_PER_CIRCLE));
507 (*fp).c[0] = node->outerRadius * (float) sinf(((
float)PI * 2.0f * (float)i)/((float)SEGMENTS_PER_CIRCLE));
508 (*fp).c[1] = node->outerRadius * (float) cosf(((
float)PI * 2.0f * (float)i)/((float)SEGMENTS_PER_CIRCLE));
520 (*tp).c[0] = 0.5f + ((float)sinf(((
float)PI * 2.0f * (float)i)/((float)SEGMENTS_PER_CIRCLE))/
id);
521 (*tp).c[1] = 0.5f + ((float)cosf(((
float)PI * 2.0f * (float)i)/((float)SEGMENTS_PER_CIRCLE))/
id);
523 (*tp).c[0] = 0.5f + ((float)sinf(((
float)PI * 2.0f * (float)i)/((float)SEGMENTS_PER_CIRCLE))/od);
524 (*tp).c[1] = 0.5f + ((float)cosf(((
float)PI * 2.0f * (float)i)/((float)SEGMENTS_PER_CIRCLE))/od);
527 node->__wireindices = lindex;
532 node->__numPoints = 0;
533 ofp = node->__points.p;
534 otp = node->__texCoords.p;
535 node->__points.p = sfp;
536 node->__texCoords.p = stp;
537 node->__simpleDisk = simpleDisc;
538 node->__numPoints = tmpint;
543 node->EXTENT_MAX_X = node->outerRadius;
544 node->EXTENT_MIN_X = -node->outerRadius;
545 node->EXTENT_MAX_Y = node->outerRadius;
546 node->EXTENT_MIN_Y = -node->outerRadius;
551 if (node->__numPoints>0) {
552 struct textureVertexInfo mtf = {(GLfloat *)node->__texCoords.p,2,GL_FLOAT,0,NULL,NULL};
554 setExtent( node->EXTENT_MAX_X, node->EXTENT_MIN_X,
555 node->EXTENT_MAX_Y, node->EXTENT_MIN_Y, 0.0f,0.0f,X3D_NODE(node));
557 CULL_FACE(node->solid)
559 textureCoord_send(&mtf);
560 FW_GL_VERTEX_POINTER (2,GL_FLOAT,0,(GLfloat *)node->__points.p);
564 if (node->__simpleDisk) {
565 if(DESIRE(getShaderFlags().base,SHADINGSTYLE_WIRE)){
567 sendElementsToGPU(GL_LINES,((node->__numPoints-1)*4 -1 ),node->__wireindices);
569 sendArraysToGPU (GL_TRIANGLE_FAN, 0, node->__numPoints);
573 if(DESIRE(getShaderFlags().base,SHADINGSTYLE_WIRE)){
575 sendElementsToGPU(GL_LINES,(node->__numPoints*4 -4 -1),node->__wireindices);
577 sendArraysToGPU (GL_TRIANGLE_STRIP, 0, node->__numPoints);
581 gglobal()->Mainloop.trisThisLoop += node->__numPoints;
592 GLfloat Ssize, Tsize;
601 if ((node->vertices.n %3) != 0) {
602 printf (
"TriangleSet2D, have incorrect vertex count, %d\n",node->vertices.n);
603 node->vertices.n -= node->vertices.n % 3;
607 tmpint = node->vertices.n;
608 node->vertices.n = 0;
611 FREE_IF_NZ (node->__texCoords.p);
612 node->__texCoords.p = fp = MALLOC (
struct SFVec2f *,
sizeof(
struct SFVec2f) * (tmpint));
613 node->__texCoords.n = tmpint;
614 node->__wireindices = lindex = MALLOC (ushort *,
sizeof(ushort)*(tmpint+1)*2);
616 minY = minX = FLT_MAX;
617 maxY = maxX = -FLT_MAX;
618 for (i=0; i<tmpint; i++) {
619 if (node->vertices.p[i].c[0] < minX) minX = node->vertices.p[i].c[0];
620 if (node->vertices.p[i].c[1] < minY) minY = node->vertices.p[i].c[1];
621 if (node->vertices.p[i].c[0] > maxX) maxX = node->vertices.p[i].c[0];
622 if (node->vertices.p[i].c[1] > maxY) maxY = node->vertices.p[i].c[1];
626 node->EXTENT_MAX_X = maxX;
627 node->EXTENT_MIN_X = minX;
628 node->EXTENT_MAX_Y = maxY;
629 node->EXTENT_MIN_Y = minY;
636 for (i=0,j=0; i<tmpint/3; i++,j+=6) {
640 lindex[j + 1] = i3+1;
641 lindex[j + 2] = i3+1;
642 lindex[j + 3] = i3+2;
643 lindex[j + 4] = i3+2;
647 for (i=0; i<tmpint; i++) {
648 (*fp).c[0] = (node->vertices.p[i].c[0] - minX) / Ssize;
649 (*fp).c[1] = (node->vertices.p[i].c[1] - minY) / Tsize;
654 node->vertices.n = tmpint;
659 if (node->vertices.n>0) {
660 struct textureVertexInfo mtf = {(GLfloat *)node->__texCoords.p,2,GL_FLOAT,0,NULL,NULL};
662 setExtent( node->EXTENT_MAX_X, node->EXTENT_MIN_X,
663 node->EXTENT_MAX_Y, node->EXTENT_MIN_Y, 0.0f,0.0f,X3D_NODE(node));
665 CULL_FACE(node->solid)
667 textureCoord_send(&mtf);
668 FW_GL_VERTEX_POINTER (2,GL_FLOAT,0,(GLfloat *)node->vertices.p);
671 if(DESIRE(getShaderFlags().base,SHADINGSTYLE_WIRE)){
673 sendElementsToGPU(GL_LINES,(node->vertices.n*2),node->__wireindices);
675 sendArraysToGPU (GL_TRIANGLES, 0, node->vertices.n);
678 gglobal()->Mainloop.trisThisLoop += node->vertices.n;
691 float x = ((node->size).c[0])/2;
692 float y = ((node->size).c[1])/2;
697 if (!node->__points.p) ptr = MALLOC (
struct SFVec3f *,
sizeof(
struct SFVec3f)*(6));
698 else ptr = node->__points.p;
702 #define PTF0 *pt++ = x; *pt++ = y; *pt++ = 0.0f;
703 #define PTF1 *pt++ = -x; *pt++ = y; *pt++ = 0.0f;
704 #define PTF2 *pt++ = -x; *pt++ = -y; *pt++ = 0.0f;
705 #define PTF3 *pt++ = x; *pt++ = -y; *pt++ = 0.0f;
707 PTF0 PTF1 PTF2 PTF0 PTF2 PTF3
709 node->__points.p = (
struct SFVec3f*) ptr;
719 extern GLfloat boxtex[];
720 extern GLfloat boxnorms[];
723 float x = ((node->size).c[0])/2;
724 float y = ((node->size).c[1])/2;
727 if ((x < 0) || (y < 0))
return;
730 if (!node->__points.p)
return;
733 setExtent(x,-x,y,-y,0.0f,0.0f,X3D_NODE(node));
735 CULL_FACE(node->solid)
738 textureCoord_send(&mtf);
739 FW_GL_VERTEX_POINTER (3,GL_FLOAT,0,(GLfloat *)node->__points.p);
740 FW_GL_NORMAL_POINTER (GL_FLOAT,0,boxnorms);
743 if(DESIRE(getShaderFlags().base,SHADINGSTYLE_WIRE)){
745 static ushort wireindices [] = { 0, 1, 1, 2, 2, 0, 3, 4, 4, 5, 5, 3 };
746 sendElementsToGPU(GL_LINES,6*2,wireindices);
748 sendArraysToGPU (GL_TRIANGLES, 0, 6);
750 gglobal()->Mainloop.trisThisLoop += 2;
761static void *createLines (
float start,
float end,
float radius,
int closed,
int *size,
float *_extent) {
770 float myminx = FLT_MAX;
771 float mymaxx = -FLT_MAX;
772 float myminy = FLT_MAX;
773 float mymaxy = -FLT_MAX;
778 isCircle = APPROX(start,end);
781 if ((start < PI*2.0) || (start > PI*2.0)) start = 0.0f;
782 if ((end < PI*2.0) || (end > PI*2.0)) end = (float) (PI/2.0);
783 if (radius<0.0) radius = 1.0f;
793 numPoints = SEGMENTS_PER_CIRCLE;
796 numPoints = (int) ((
float)(SEGMENTS_PER_CIRCLE * (start-end))/(PI*2.0f));
797 if (numPoints>SEGMENTS_PER_CIRCLE) numPoints=SEGMENTS_PER_CIRCLE;
803 arcpoints = numPoints;
806 if (closed == CHORD) numPoints+=2;
807 if (closed == PIE) numPoints+=2;
809 points = MALLOC (
float *,
sizeof(
float)*numPoints*2);
812 for (i=0; i<arcpoints; i++) {
813 *fp = radius * cosf(((
float)PI * 2.0f * (
float)i)/((
float)SEGMENTS_PER_CIRCLE));
815 *fp = radius * sinf(((
float)PI * 2.0f * (
float)i)/((
float)SEGMENTS_PER_CIRCLE));
820 if (closed == CHORD) {
822 *fp = .5f*(points[0] + points[(arcpoints-1)*2]);
824 *fp = .5f*(points[1] + points[(arcpoints-1)*2 +1]);
828 *fp = radius * cosf(0.0f/((
float)SEGMENTS_PER_CIRCLE));
830 *fp = radius * sinf(0.0f/((
float)SEGMENTS_PER_CIRCLE));
832 }
else if (closed == PIE) {
834 *fp = 0.0f; fp++; *fp=0.0f; fp++;
836 *fp = radius * cosf(0.0f/((
float)SEGMENTS_PER_CIRCLE));
838 *fp = radius * sinf(0.0f/((
float)SEGMENTS_PER_CIRCLE));
853 for (i=0; i<numPoints; i++) {
855 if (*fp > mymaxx) mymaxx = *fp;
856 if (*fp < myminx) myminx = *fp;
859 if (*fp > mymaxy) mymaxy = *fp;
860 if (*fp < myminy) myminy = *fp;
863 EXTENT_MIN_X = myminx;
864 EXTENT_MAX_X = mymaxx;
865 EXTENT_MIN_Y = myminy;
866 EXTENT_MAX_Y = mymaxy;
869 return (
void *)points;
879void collide_Disk2D (
struct X3D_Disk2D *node) {
886 GLDOUBLE awidth, atop, abottom, astep, modelMatrix[16];
895 naviinfo = (
struct sNaviInfo*)tg->Bindable.naviinfo;
896 awidth = naviinfo->width;
897 atop = naviinfo->width;
898 abottom = -naviinfo->height;
899 astep = -naviinfo->height+naviinfo->step;
902 iv.x = node->size.c[0];
903 jv.y = node->size.c[1];
905 ov.x = -(node->size.c[0])/2; ov.y = -(node->size.c[1])/2; ov.z = 0.0;
908 FW_GL_GETDOUBLEV(GL_MODELVIEW_MATRIX, modelMatrix);
910 matmultiplyAFFINE(modelMatrix,modelMatrix,FallInfo()->avatar2collision);
915 double shapeMBBmin[3], shapeMBBmax[3], dsize[3];
917 float2double(dsize,node->size.c,3);
918 vecscaled(shapeMBBmax,dsize,.5);
919 vecscaled(shapeMBBmax,dsize,-.5);
925 if(!avatarCollisionVolumeIntersectMBB(modelMatrix, shapeMBBmin, shapeMBBmax))
return;
928 transform(&ov,&ov,modelMatrix);
929 transform3x3(&iv,&iv,modelMatrix);
930 transform3x3(&jv,&jv,modelMatrix);
931 transform3x3(&kv,&kv,modelMatrix);
933 delta = box_disp(abottom,atop,astep,awidth,ov,iv,jv,kv);
935 vecscale(&delta,&delta,-1);
937 accumulate_disp(CollisionInfo(),delta);
940 #ifdef COLLISIONVERBOSE
941 if((fabs(delta.x) != 0. || fabs(delta.y) != 0. || fabs(delta.z) != 0.))
942 printf(
"COLLISION_BOX: (%f %f %f) (%f %f %f)\n",
944 delta.x, delta.y, delta.z
946 if((fabs(delta.x != 0.) || fabs(delta.y != 0.) || fabs(delta.z) != 0.))
947 printf(
"iv=(%f %f %f) jv=(%f %f %f) kv=(%f %f %f)\n",