28#ifndef __FREEWRL_COLLISION_H__
29#define __FREEWRL_COLLISION_H__
40 #include <CL/opencl.h>
43 #include <CL/opencl.h>
57#define PR_DOUBLESIDED 0x01
58#define PR_FRONTFACING 0x02
59#define PR_BACKFACING 0x04
60#define PR_NOSTEPING 0x08
67polyrep_disp_rec(double y1,
85int fast_ycylinder_box_intersect(
double y1,
double y2,
double r,
struct point_XYZ pcenter,
double xs,
double ys,
double zs);
90int fast_ycylinder_cone_intersect(
double y1,
double y2,
double r,
struct point_XYZ pcenter,
double halfheight,
double baseradius);
94struct point_XYZ cone_disp(double y1, double y2, double ydisp, double r, struct
point_XYZ base, struct
point_XYZ top, double baseradius);
98struct point_XYZ cylinder_disp(double y1, double y2, double ydisp, double r, struct
point_XYZ base, struct
point_XYZ top, double baseradius);
104struct point_XYZ planar_polyrep_disp(double y1, double y2, double ydisp, double r, struct
X3D_PolyRep pr, GLDOUBLE* mat, prflags flags,
struct point_XYZ n);
111#ifdef DEBUG_SCENE_EXPORT
112void printpolyrep(
struct X3D_PolyRep pr,
int npoints);
114void printmatrix(GLDOUBLE* mat);
120struct sCollisionGPU {
121 cl_program CollideGPU_program;
122 cl_kernel CollideGPU_kernel;
123 size_t CollideGPU_workgroup_size;
124 int CollideGPU_output_size;
125 cl_mem CollideGPU_output_buffer;
126 cl_mem CollideGPU_matrix_buffer;
127 cl_mem CollideGPU_vertex_buffer;
128 cl_mem CollideGPU_index_buffer;
153 GLDOUBLE collision2avatar[16], avatar2collision[16];
157 int checkPenetration;
161 GLDOUBLE penMin[3], penMax[3];
168int fast_ycylinder_box_intersect(
double y1,
double y2,
double r,
struct point_XYZ pcenter,
double xs,
double ys,
double zs);
169int fast_sphere_MBB_intersect_shapeSpace(
double r, GLDOUBLE *collision2shape, GLDOUBLE *shapeMBBmin, GLDOUBLE *shapeMBBmax );
170int fast_ycylinder_MBB_intersect_shapeSpace(
double y1,
double y2,
double r, GLDOUBLE *collision2shape, GLDOUBLE *shapeMBBmin, GLDOUBLE *shapeMBBmax );
171int fast_ycylinder_MBB_intersect_collisionSpace(
double y1,
double y2,
double r, GLDOUBLE *shape2collision, GLDOUBLE *shapeMBBmin, GLDOUBLE *shapeMBBmax );
172int fast_sphere_MBB_intersect_collisionSpace(
double r, GLDOUBLE *shape2collision, GLDOUBLE *shapeMBBmin, GLDOUBLE *shapeMBBmax );
173int overlapMBBs(GLDOUBLE *MBBmin1, GLDOUBLE *MBBmax1, GLDOUBLE *MBBmin2, GLDOUBLE* MBBmax2);
174int fast_ycylinder_polyrep_intersect2(
double y1,
double y2,
double AVr,
struct point_XYZ pcenter,
double scale,
double *minVals,
double *maxVals);
177struct sCollisionGPU* GPUCollisionInfo();
178struct point_XYZ run_non_walk_collide_program(GLuint vertex_vbo, GLuint index_vbo, float *modelMat,
int ntri,
179 int face_ccw,
int face_flags,
float avatar_radius);
180bool collision_initGPUCollide (
struct sCollisionGPU*);
181void createGPUCollisionProgram();