Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/ode/ode-0.9/contrib/dRay/dRay.cpp @ 216

Last change on this file since 216 was 216, checked in by mathiask, 16 years ago

[Physik] add ode-0.9

File size: 2.7 KB
Line 
1#include "Include\dRay.h"
2#include "dxRay.h"
3
4int dRayClass = -1;
5
6void dAABBRay(dxGeom* Ray, dReal AABB[6]){
7        dVector3 Start, End;
8        dGeomRayGet(Ray, Start, End);
9        dReal Length = dGeomRayGetLength(Ray);
10
11        End[0] = Start[0] + End[0] * Length;
12        End[1] = Start[1] + End[1] * Length;
13        End[2] = Start[2] + End[2] * Length;
14        End[3] = Start[3] + End[3] * Length;
15
16        if (Start[0] < End[0]){
17                AABB[0] = Start[0];
18                AABB[1] = End[0];
19        }
20        else{
21                AABB[0] = End[0];
22                AABB[1] = Start[0];
23        }
24
25        if (Start[1] < End[1]){
26                AABB[2] = Start[1];
27                AABB[3] = End[1];
28        }
29        else{
30                AABB[2] = End[1];
31                AABB[3] = Start[1];
32        }
33
34        if (Start[2] < End[2]){
35                AABB[4] = Start[2];
36                AABB[5] = End[2];
37        }
38        else{
39                AABB[4] = End[2];
40                AABB[5] = Start[2];
41        }
42        // Should we tweak the box to have a minimum size for axis aligned lines? How small should it be?
43}
44
45dColliderFn* dRayColliderFn(int num){
46        if (num == dPlaneClass) return (dColliderFn*)&dCollidePR;
47        if (num == dSphereClass) return (dColliderFn*)&dCollideSR;
48        if (num == dBoxClass) return (dColliderFn*)&dCollideBR;
49        if (num == dCCylinderClass) return (dColliderFn*)&dCollideCCR;
50        return 0;
51}
52
53dxGeom* dGeomCreateRay(dSpaceID space, dReal Length){
54        if (dRayClass == -1){
55                dGeomClass c;
56                c.bytes = sizeof(dxRay);
57                c.collider = &dRayColliderFn;
58                c.aabb = &dAABBRay;
59                c.aabb_test = 0;
60                c.dtor = 0;
61
62                dRayClass = dCreateGeomClass(&c);
63        }
64
65        dxGeom* g = dCreateGeom(dRayClass);
66        if (space) dSpaceAdd(space, g);
67
68        dGeomRaySetLength(g, Length);
69        return g;
70}
71
72void dGeomRaySetLength(dxGeom* g, dReal Length){
73        ((dxRay*)dGeomGetClassData(g))->Length = Length;
74}
75
76dReal dGeomRayGetLength(dxGeom* g){
77        return ((dxRay*)dGeomGetClassData(g))->Length;
78}
79
80void dGeomRaySet(dxGeom* g, dVector3 Origin, dVector3 Direction){
81        dGeomSetPosition(g, Origin[0], Origin[1], Origin[2]);
82
83        dVector3 Up, Right;
84        dPlaneSpace(Direction, Up, Right);
85
86        Origin[3] = Up[3] = Right[3] = REAL(0.0);
87
88        dMatrix3 Rotation;
89        Rotation[0 * 4 + 0] = Right[0];
90        Rotation[1 * 4 + 0] = Right[1];
91        Rotation[2 * 4 + 0] = Right[2];
92        Rotation[3 * 4 + 0] = Right[3];
93
94        Rotation[0 * 4 + 1] = Up[0];
95        Rotation[1 * 4 + 1] = Up[1];
96        Rotation[2 * 4 + 1] = Up[2];
97        Rotation[3 * 4 + 1] = Up[3];
98
99        Rotation[0 * 4 + 2] = Direction[0];
100        Rotation[1 * 4 + 2] = Direction[1];
101        Rotation[2 * 4 + 2] = Direction[2];
102        Rotation[3 * 4 + 2] = Direction[3];
103
104        dGeomSetRotation(g, Rotation);
105}
106
107void dGeomRayGet(dxGeom* g, dVector3 Origin, dVector3 Direction){
108        const dReal* Position = dGeomGetPosition(g);
109        Origin[0] = Position[0];
110        Origin[1] = Position[1];
111        Origin[2] = Position[2];
112        Origin[3] = Position[3];
113
114        const dReal* Rotation = dGeomGetRotation(g);
115        Direction[0] = Rotation[0 * 4 + 2];
116        Direction[1] = Rotation[1 * 4 + 2];
117        Direction[2] = Rotation[2 * 4 + 2];
118        Direction[3] = Rotation[3 * 4 + 2];
119}
Note: See TracBrowser for help on using the repository browser.