glVertex  5.5.2
glvertex_slicer.h
Go to the documentation of this file.
1 // (c) by Stefan Roettger, licensed under MIT license
2 
5 #ifndef GLVERTEX_SLICER_H
6 #define GLVERTEX_SLICER_H
7 
8 #include "glvertex.h"
9 
10 // extract 1 triangle from a tetrahedron
11 // v0 is the cutaway vertex
12 // d is distance of the respective point to the cutting plane
13 inline void lglSlice1Tri(const vec3 &v0,const double d0,
14  const vec3 &v1,const double d1,
15  const vec3 &v2,const double d2,
16  const vec3 &v3,const double d3)
17 {
18  vec3 p0,p1,p2;
19 
20  p0=(d1*v0+d0*v1)/(d0+d1);
21  p1=(d2*v0+d0*v2)/(d0+d2);
22  p2=(d3*v0+d0*v3)/(d0+d3);
23 
24  lglBegin(LGL_TRIANGLES);
25  lglTexCoord(p0);
26  lglVertex(p0);
27  lglTexCoord(p1);
28  lglVertex(p1);
29  lglTexCoord(p2);
30  lglVertex(p2);
31  lglEnd();
32 }
33 
34 // extract 2 triangles (a quad) from a tetrahedron
35 // v0 is the start point of the cutaway line segment
36 // v1 is the end point of the cutaway line segment
37 // d is distance of the respective point to the cutting plane
38 inline void lglSlice2Tri(const vec3 &v0,const double d0,
39  const vec3 &v1,const double d1,
40  const vec3 &v2,const double d2,
41  const vec3 &v3,const double d3)
42 {
43  vec3 p0,p1,p2,p3;
44 
45  p0=(d2*v0+d0*v2)/(d0+d2);
46  p1=(d2*v1+d1*v2)/(d1+d2);
47  p2=(d3*v0+d0*v3)/(d0+d3);
48  p3=(d3*v1+d1*v3)/(d1+d3);
49 
50  lglBegin(LGL_QUADS);
51  lglTexCoord(p0);
52  lglVertex(p0);
53  lglTexCoord(p1);
54  lglVertex(p1);
55  lglTexCoord(p3);
56  lglVertex(p3);
57  lglTexCoord(p2);
58  lglVertex(p2);
59  lglEnd();
60 }
61 
72 inline void lglSlice(const vec3 &v0, // vertex v0
73  const vec3 &v1, // vertex v1
74  const vec3 &v2, // vertex v2
75  const vec3 &v3, // vertex v3
76  const vec3 &o, // origin of cutting plane
77  const vec3 &n) // normal of cutting plane
78 {
79  double d0,d1,d2,d3;
80 
81  int ff;
82 
83  d0=(v0-o).dot(n);
84  d1=(v1-o).dot(n);
85  d2=(v2-o).dot(n);
86  d3=(v3-o).dot(n);
87 
88  ff=0;
89 
90  if (d0<0.0) ff|=1;
91  if (d1<0.0) ff|=2;
92  if (d2<0.0) ff|=4;
93  if (d3<0.0) ff|=8;
94 
95  switch (ff)
96  {
97  // 1 triangle
98  case 1: case 14: lglSlice1Tri(v0,fabs(d0),
99  v1,fabs(d1),
100  v2,fabs(d2),
101  v3,fabs(d3)); break;
102  case 2: case 13: lglSlice1Tri(v1,fabs(d1),
103  v0,fabs(d0),
104  v2,fabs(d2),
105  v3,fabs(d3)); break;
106  case 4: case 11: lglSlice1Tri(v2,fabs(d2),
107  v0,fabs(d0),
108  v1,fabs(d1),
109  v3,fabs(d3)); break;
110  case 8: case 7: lglSlice1Tri(v3,fabs(d3),
111  v0,fabs(d0),
112  v1,fabs(d1),
113  v2,fabs(d2)); break;
114 
115  // 2 triangles
116  case 3: lglSlice2Tri(v0,fabs(d0),
117  v1,fabs(d1),
118  v2,fabs(d2),
119  v3,fabs(d3)); break;
120  case 5: lglSlice2Tri(v0,fabs(d0),
121  v2,fabs(d2),
122  v1,fabs(d1),
123  v3,fabs(d3)); break;
124  case 6: lglSlice2Tri(v1,fabs(d1),
125  v2,fabs(d2),
126  v0,fabs(d0),
127  v3,fabs(d3)); break;
128  case 9: lglSlice2Tri(v0,fabs(d0),
129  v3,fabs(d3),
130  v1,fabs(d1),
131  v2,fabs(d2)); break;
132  case 10: lglSlice2Tri(v1,fabs(d1),
133  v3,fabs(d3),
134  v0,fabs(d0),
135  v2,fabs(d2)); break;
136  case 12: lglSlice2Tri(v2,fabs(d2),
137  v3,fabs(d3),
138  v0,fabs(d0),
139  v1,fabs(d1)); break;
140  }
141 }
142 
143 #endif
lglEnd
void lglEnd()
end vertex series (as defined by OpenGL 1.2)
Definition: glvertex_api.h:54
glvertex.h
lglSlice
void lglSlice(const vec3 &v0, const vec3 &v1, const vec3 &v2, const vec3 &v3, const vec3 &o, const vec3 &n)
extract a slice from a tetrahedron
Definition: glvertex_slicer.h:72
vec3
3D double vector
Definition: glslmath.h:372
lglBegin
void lglBegin(lgl_primitive_enum primitive)
begin vertex series (as defined by OpenGL 1.2)
Definition: glvertex_api.h:18
dot
double dot(const vec2 &a, const vec2 &b)
inner product
Definition: glslmath.h:241
lglTexCoord
void lglTexCoord(const vec4f &t)
specify vertex texture coordinate attribute (as defined by OpenGL 1.2)
Definition: glvertex_api.h:46
lglVertex
void lglVertex(const vec4 &v)
specify vertex (as defined by OpenGL 1.2)
Definition: glvertex_api.h:22