+#include <stdio.h>
#include "geom.h"
#include "dynarr.h"
{
static const float corn[][2] = {{1,1}, {-1,1}, {-1,-1}, {1, -1}};
int i;
- cgm_vec3 pos, up, right, dir;
+ cgm_vec3 up, right;
+ struct vertex *vptr;
size *= 0.5f;
if(!(poly->verts = dynarr_alloc(4, sizeof *poly->verts))) {
}
cgm_vcross(&right, &up, &plane->norm);
cgm_vnormalize(&right);
- cgm_vcross(&up, &plane.norm, &right);
+ cgm_vcross(&up, &plane->norm, &right);
cgm_vnormalize(&up);
+ vptr = poly->verts;
for(i=0; i<4; i++) {
- v.x = plane->pt.x + (right.x * corn[i][0] + up.x * corn[i][1]) * size;
- v.y = plane->pt.y + (right.y * corn[i][0] + up.y * corn[i][1]) * size;
- v.z = plane->pt.z + (right.z * corn[i][0] + up.z * corn[i][1]) * size;
-
-
-
+ vptr->pos.x = plane->pt.x + (right.x * corn[i][0] + up.x * corn[i][1]) * size;
+ vptr->pos.y = plane->pt.y + (right.y * corn[i][0] + up.y * corn[i][1]) * size;
+ vptr->pos.z = plane->pt.z + (right.z * corn[i][0] + up.z * corn[i][1]) * size;
+ vptr->norm = plane->norm;
+ vptr->uv.x = vptr->uv.y = 0;
+ vptr++;
+ }
+ return 0;
}
float ray_plane(const cgm_ray *ray, const struct plane *plane)
{
float d0, d1, t;
cgm_ray ray;
- int i, vnum = dynarr_size(pout->verts);
struct vertex vnew;
d0 = plane_sdist(plane, &v0->pos);
d1 = plane_sdist(plane, &v1->pos);
- ray.orig = v0->pos;
+ ray.origin = v0->pos;
ray.dir = v1->pos;
cgm_vsub(&ray.dir, &v0->pos);
- for(i=0; i<3; i++) {
- ray.origin[i] = pos0[i];
- ray.dir[i] = pos1[i] - pos0[i];
- }
-
if(d0 >= 0.0) {
/* start inside */
if(d1 >= 0.0) {
} else {
/* going out */
t = ray_plane(&ray, plane);
- cgm_raypos(&vnew->pos, &ray, t);
+ cgm_raypos(&vnew.pos, &ray, t);
- cgm_vlerp(&vnew->norm, &v0->norm, &v1->norm, t);
- vnew->uv.x = cgm_lerp(v0->uv.x, v1->uv.x, t);
- vnew->uv.y = cgm_lerp(v0->uv.y, v1->uv.y, t);
+ cgm_vlerp(&vnew.norm, &v0->norm, &v1->norm, t);
+ vnew.uv.x = cgm_lerp(v0->uv.x, v1->uv.x, t);
+ vnew.uv.y = cgm_lerp(v0->uv.y, v1->uv.y, t);
/* append new vertex on the intersection point */
DYNARR_PUSH(pout->verts, &vnew);
}
if(d1 >= 0) {
/* going in */
t = ray_plane(&ray, plane);
- cgm_raypos(&vnew->pos, &ray, t);
+ cgm_raypos(&vnew.pos, &ray, t);
- cgm_vlerp(&vnew->norm, &v0->norm, &v1->norm, t);
- vnew->uv.x = cgm_lerp(v0->uv.x, v1->uv.x, t);
- vnew->uv.y = cgm_lerp(v0->uv.y, v1->uv.y, t);
+ cgm_vlerp(&vnew.norm, &v0->norm, &v1->norm, t);
+ vnew.uv.x = cgm_lerp(v0->uv.x, v1->uv.x, t);
+ vnew.uv.y = cgm_lerp(v0->uv.y, v1->uv.y, t);
/* append new vertex on the intersection point */
DYNARR_PUSH(pout->verts, &vnew);
/* then append v1 ... */