This is plane.c in view mode; [Download] [Up]
/* * plane.c * * Copyright (C) 1989, 1991, Craig E. Kolb * All rights reserved. * * This software may be freely copied, modified, and redistributed * provided that this copyright notice is preserved on all copies. * * You may not distribute this software, in whole or in part, as part of * any commercial product without the express consent of the authors. * * There is no warranty or other guarantee of fitness of this software * for any purpose. It is provided solely "as is". * * $Id$ * * $Log$ */ #include "object.h" #include "plane.h" static Methods *iPlaneMethods = NULL; static char planeName[] = "plane"; unsigned long PlaneTests, PlaneHits; /* * create plane primitive */ Plane * PlaneCreate(pos, norm) Vector *pos, *norm; { Plane *plane; Vector tmpnrm; tmpnrm = *norm; if (VecNormalize(&tmpnrm) == 0.) { RLerror(RL_WARN, "Degenerate plane normal.\n"); return (Plane *)NULL; } plane = (Plane *)Malloc(sizeof(Plane)); plane->norm = tmpnrm; plane->pos = *pos; plane->d = dotp(&plane->norm, pos); return plane; } Methods * PlaneMethods() { if (iPlaneMethods == (Methods *)NULL) { iPlaneMethods = MethodsCreate(); iPlaneMethods->name = PlaneName; iPlaneMethods->create = (ObjCreateFunc *)PlaneCreate; iPlaneMethods->methods = PlaneMethods; iPlaneMethods->intersect = PlaneIntersect; iPlaneMethods->normal = PlaneNormal; iPlaneMethods->uv = PlaneUV; iPlaneMethods->bounds = PlaneBounds; iPlaneMethods->stats = PlaneStats; iPlaneMethods->checkbounds = FALSE; iPlaneMethods->closed = FALSE; } return iPlaneMethods; } int PlaneIntersect(plane, ray, mindist, maxdist) Plane *plane; Ray *ray; Float mindist, *maxdist; { Float d; PlaneTests++; d = dotp(&plane->norm, &ray->dir); if (fabs(d) < EPSILON) return FALSE; d = (plane->d - dotp(&plane->norm, &ray->pos)) / d; if (d > mindist && d < *maxdist) { *maxdist = d; PlaneHits++; return TRUE; } return FALSE; } /*ARGSUSED*/ int PlaneNormal(plane, pos, nrm, gnrm) Plane *plane; Vector *pos, *nrm, *gnrm; { *gnrm = *nrm = plane->norm; return FALSE; } void PlaneUV(plane, pos, norm, uv, dpdu, dpdv) Plane *plane; Vector *pos, *norm, *dpdu, *dpdv; Vec2d *uv; { Vector vec, du, dv; VecCoordSys(norm, &du, &dv); VecSub(*pos, plane->pos, &vec); uv->u = dotp(&vec, &du); uv->v = dotp(&vec, &dv); if (dpdu) *dpdu = du; if (dpdv) *dpdv = dv; } /*ARGSUSED*/ void PlaneBounds(plane, bounds) Plane *plane; Float bounds[2][3]; { /* * Planes are unbounded by nature. minx > maxx signifies * this. */ bounds[LOW][X] = 1.0; bounds[HIGH][X] = -1.0; } char * PlaneName() { return planeName; } void PlaneStats(tests, hits) unsigned long *tests, *hits; { *tests = PlaneTests; *hits = PlaneHits; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.