Shadowrun: Awakened 29 September 2011 - Build 871
Defines | Functions | Variables
ring.cpp File Reference
#include "machine.h"
#include "types.h"
#include "macros.h"
#include "vector.h"
#include "intersect.h"
#include "util.h"
#include "ring.h"
Include dependency graph for ring.cpp:

Go to the source code of this file.

Defines

#define RING_PRIVATE

Functions

objectnewring (void *tex, vector ctr, vector norm, flt inrad, flt outrad)
static int ring_bbox (void *obj, vector *min, vector *max)
static void ring_intersect (ring *rng, ray *ry)
static void ring_normal (ring *rng, vector *pnt, ray *incident, vector *N)

Variables

static object_methods ring_methods

Define Documentation

#define RING_PRIVATE

Definition at line 71 of file ring.cpp.


Function Documentation

object* newring ( void *  tex,
vector  ctr,
vector  norm,
flt  inrad,
flt  outrad 
)

Definition at line 81 of file ring.cpp.

References ring_methods, and rt_getmem().

Referenced by rt_ring().

                                                                             {
  ring * r;
  
  r=(ring *) rt_getmem(sizeof(ring));
  memset(r, 0, sizeof(ring));
  r->methods = &ring_methods;

  r->tex = (texture *)tex;
  r->ctr = ctr;
  r->norm = norm;
  r->inrad = inrad;
  r->outrad= outrad;

  return (object *) r;
}
static int ring_bbox ( void *  obj,
vector min,
vector max 
) [static]

Definition at line 97 of file ring.cpp.

References vector::x, vector::y, and vector::z.

                                                             {
  ring * r = (ring *) obj;

  min->x = r->ctr.x - r->outrad;
  min->y = r->ctr.y - r->outrad;
  min->z = r->ctr.z - r->outrad;
  max->x = r->ctr.x + r->outrad;
  max->y = r->ctr.y + r->outrad;
  max->z = r->ctr.z + r->outrad;

  return 1;
}
static void ring_intersect ( ring *  rng,
ray ry 
) [static]

Definition at line 110 of file ring.cpp.

References add_intersection(), ray::d, ray::o, Raypnt(), VDOT, VDot(), and VSUB.

                                                 {
  flt d;
  flt t,td;
  vector hit, pnt;
  
  d = -VDot(&(rng->ctr), &(rng->norm));
   
  t=-(d+VDot(&(rng->norm), &(ry->o)));
  td=VDot(&(rng->norm),&(ry->d)); 
  if (td != 0.0) {
    t= t / td;
    if (t>=0.0) {
      hit=Raypnt(ry, t);
      VSUB(hit, rng->ctr, pnt);
      VDOT(td, pnt, pnt);
      td=sqrt(td);
      if ((td > rng->inrad) && (td < rng->outrad)) 
        add_intersection(t,(object *) rng, ry);
    }
  }
}
static void ring_normal ( ring *  rng,
vector pnt,
ray incident,
vector N 
) [static]

Definition at line 132 of file ring.cpp.

References ray::d, VDot(), VNorm(), vector::x, vector::y, and vector::z.

                                                                               {
  *N=rng->norm;
  VNorm(N);
  if (VDot(N, &(incident->d)) > 0.0)  {
    N->x=-N->x;
    N->y=-N->y;
    N->z=-N->z;
  } 
}

Variable Documentation

Initial value:
 {
  (void (*)(void *, void *))(ring_intersect),
  (void (*)(void *, void *, void *, void *))(ring_normal),
  ring_bbox, 
  free 
}

Definition at line 74 of file ring.cpp.

Referenced by newring().


Copyright © 2007-2010 by The Shadowrun: Awakened Team. This work is licensed under the GNU Lesser General Public License 3.

GNU Lesser General Public License 3 Sourceforge.net