ftp.nice.ch/pub/next/graphics/3d/geomview.1.4.1.s.tar.gz#/Geomview/src/lib/gprim/discgrp/vec4.h

This is vec4.h in view mode; [Download] [Up]

#include <math.h>
typedef	double  point4[4];
typedef	double  plane4[4];
typedef	double  matrix4[4][4];

#define	ABS(aaa)	(( (aaa) > 0) ? (aaa) : -(aaa))
#define	VDOT3(v0,v1)	(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2])
#define	INPRO31(v0,v1)	(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] - v0[3]*v1[3])
#define	INPRO4(v0,v1)	(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] + v0[3]*v1[3])

#define MAGNITUDE3(v0)	(sqrt (VDOT3(v0, v0)))
#define MAGNITUDE31(v0)	(sqrt (ABS (INPRO31(v0, v0))))
#define MAGNITUDE4(v0)	(sqrt (INPRO4(v0, v0)))

#define PROJECT4(v0)	\
	{float d = v0[3];	\
	if (d)	{	\
	d = 1.0/d;	\
	v0[0] = v0[0] * d;	\
	v0[1] = v0[1] * d;	\
	v0[2] = v0[2] * d;	\
	v0[3] = 1.0; }}	

#define NORMALIZE3(v0)	\
	{double xxx;		\
	if (xxx = MAGNITUDE3(v0))	\
	{v0[0] /= xxx;  v0[1] /= xxx;  v0[2] /= xxx; }  }

#define 	NORMALIZE31(v)	\
 	{double tmp = INPRO31(v,v);		\
	if (tmp) { tmp = 1.0/sqrt(ABS(tmp)); v[0] *= tmp; v[1] *= tmp; v[2] *= tmp; v[3] *= tmp; }}

#define 	NORMALIZE4(v)	\
 	{double tmp = INPRO4(v,v);		\
	if (tmp) { tmp = 1.0/sqrt(ABS(tmp)); v[0] *= tmp; v[1] *= tmp; v[2] *= tmp; v[3] *= tmp; }}

#define VPRINT3(name,v)		printf("name\t%f %f %f\n",v[0],v[1],v[2]);
#define VPRINT4(name,v)		printf("name\t%f %f %f %f %f\n",v[0],v[1],v[2],v[3]);
#define VADD3(v0,v1,v2)	\
	{v2[0] = v0[0] + v1[0]; \
	v2[1] = v0[1] + v1[1]; \
	v2[2] = v0[2] + v1[2]; \
	v2[3] = 1.0; }
	
#define VADD4(v0,v1,v2)	\
	{v2[0] = v0[0] + v1[0]; \
	v2[1] = v0[1] + v1[1]; \
	v2[2] = v0[2] + v1[2]; \
	v2[3] = v0[3] + v1[3]; }

#define VSUB3(v0,v1,v2)	\
	{v2[0] = v0[0] - v1[0]; \
	v2[1] = v0[1] - v1[1]; \
	v2[2] = v0[2] - v1[2]; \
	v2[3] = 1.0;}
	
#define VSUB4(v0,v1,v2)	\
	{v2[0] = v0[0] - v1[0]; \
	v2[1] = v0[1] - v1[1]; \
	v2[2] = v0[2] - v1[2]; \
	v2[3] = v0[3] - v1[3];}

#define MIDPOINT4(v0,v1,v2)	\
	{v2[0] = (v0[0] + v1[0])/2.0; \
	v2[1] = (v0[1] + v1[1])/2.0; \
	v2[2] = (v0[2] + v1[2])/2.0; \
	v2[3] = (v0[3] + v1[3])/2.0; }

#define VISZERO4(v)	(v[0] == 0 && v[1] == 0 && v[2] == 0 && v[3] == 0)

#define MIDPOINT31(v0,v1,v2)	\
	{float m00, m11, a,v3[4];	\
	VSUB4(v0, v1, v3);	\
	if (VISZERO4(v3))	\
		VCOPY4(v0,v2)	\
	else	{		\
	m00 =  INPRO31(v0,v3);	\
	m11 = INPRO31(v1,v3);	\
	v2[0] = m11*v0[0] - m00*v1[0]; \
	v2[1] = m11*v0[1] - m00*v1[1]; \
	v2[2] = m11*v0[2] - m00*v1[2]; \
	v2[3] = m11*v0[3] - m00*v1[3]; }}

#define XPRO3(v0,v1,v2)	\
	{v2[0] = v0[1]*v1[2] - v0[2]*v1[1];	\
	v2[1] = v0[2]*v1[0] - v0[0]*v1[2];	\
	v2[2] = v0[0]*v1[1] - v0[1]*v1[0];  }

#define VSCALE3(v0, s, v1)	\
	{v1[0] = s * v0[0];	\
	v1[1] = s * v0[1];	\
	v1[2] = s * v0[2];	}

#define VSCALE4(v0, s, v1)	\
	{v1[0] = s * v0[0];	\
	v1[1] = s * v0[1];	\
	v1[2] = s * v0[2];	\
	v1[3] = s * v0[3];	}

#define VCOPY3(v0, v1)	\
	{v1[0] = v0[0];	\
	v1[1] = v0[1];	\
	v1[2] = v0[2];	}

#define VCOPY4(v0, v1)	\
	{v1[0] = v0[0];	\
	v1[1] = v0[1];	\
	v1[2] = v0[2];	\
	v1[3] = v0[3];}

#define VZERO3(v0)	\
	{v0[0] = 0;	\
	v0[1] = 0;	\
	v0[2] = 0;	\
	v0[3] = 1.0; }

#define COPYMAT4(m1, m2)	\
	bcopy(m1, m2, (sizeof(double) * 16));





These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.