From e4f00d6b83a78d7cc373a33a6cbbd44dd84bf489 Mon Sep 17 00:00:00 2001 From: mattijs Date: Tue, 1 Mar 2011 15:00:38 +0000 Subject: [PATCH] Revert "STYLE: surfaceCoarsen: remove orhpaned files" This reverts commit 98f269edafba523a243ca4c97fcc6354308e0782. --- .../surface/surfaceCoarsen/bunnylod/README | 12 + .../surfaceCoarsen/bunnylod/bunnygut.C | 282 ++++ .../surfaceCoarsen/bunnylod/bunnylod.dsp | 114 ++ .../surfaceCoarsen/bunnylod/bunnylod.dsw | 29 + .../surface/surfaceCoarsen/bunnylod/font.h | 8 + .../surface/surfaceCoarsen/bunnylod/list.h | 130 ++ .../surfaceCoarsen/bunnylod/progmesh.C | 315 ++++ .../surfaceCoarsen/bunnylod/progmesh.h | 33 + .../surface/surfaceCoarsen/bunnylod/rabdata.C | 1383 +++++++++++++++++ .../surface/surfaceCoarsen/bunnylod/rabdata.h | 32 + .../surface/surfaceCoarsen/bunnylod/vector.C | 117 ++ .../surface/surfaceCoarsen/bunnylod/vector.h | 79 + .../surface/surfaceCoarsen/bunnylod/winmain.C | 453 ++++++ .../mixer/constant/polyMesh/boundary | 60 + 14 files changed, 3047 insertions(+) create mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/README create mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/bunnygut.C create mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/bunnylod.dsp create mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/bunnylod.dsw create mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/font.h create mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/list.h create mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/progmesh.C create mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/progmesh.h create mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/rabdata.C create mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/rabdata.h create mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/vector.C create mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/vector.h create mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/winmain.C create mode 100644 tutorials/incompressible/simpleSRFFoam/mixer/constant/polyMesh/boundary diff --git a/applications/utilities/surface/surfaceCoarsen/bunnylod/README b/applications/utilities/surface/surfaceCoarsen/bunnylod/README new file mode 100644 index 0000000000..f62b96bc25 --- /dev/null +++ b/applications/utilities/surface/surfaceCoarsen/bunnylod/README @@ -0,0 +1,12 @@ + + Polygon Reduction Demo + By Stan Melax (c) 1998 + mailto:melax@cs.ualberta.ca + http://www.cs.ualberta.ca/~melax + +The PC executable bunnylod.exe should run +on a standard PC. +Just run it and enjoy. +Mouse dragging spins the rabbit. + + diff --git a/applications/utilities/surface/surfaceCoarsen/bunnylod/bunnygut.C b/applications/utilities/surface/surfaceCoarsen/bunnylod/bunnygut.C new file mode 100644 index 0000000000..3e78b37861 --- /dev/null +++ b/applications/utilities/surface/surfaceCoarsen/bunnylod/bunnygut.C @@ -0,0 +1,282 @@ +/* + * Polygon Reduction Demo by Stan Melax (c) 1998 + * Permission to use any of this code wherever you want is granted.. + * Although, please do acknowledge authorship if appropriate. + * + * This module initializes the bunny model data and calls + * the polygon reduction routine. At each frame the RenderModel() + * routine is called to draw the model. This module also + * animates the parameters (such as number of vertices to + * use) to show the model at various levels of detail. + */ + +#include +#include +#include +#include +#include +#include +#include +#pragma warning(disable : 4244) + +#include "vector.h" +#include "font.h" +#include "progmesh.h" +#include "rabdata.h" + +extern float DeltaT; // change in time since last frame +int render_num; // number of vertices to draw with +float lodbase=0.5f; // the fraction of vertices used to morph toward +float morph=1.0f; // where to render between 2 levels of detail +List vert; // global list of vertices +List tri; // global list of triangles +List collapse_map; // to which neighbor each vertex collapses +int renderpolycount=0; // polygons rendered in the current frame +Vector model_position; // position of bunny +Quaternion model_orientation; // orientation of bunny + +// Note that the use of the Map() function and the collapse_map +// list isn't part of the polygon reduction algorithm. +// We just set up this system here in this module +// so that we could retrieve the model at any desired vertex count. +// Therefore if this part of the program confuses you, then +// dont worry about it. It might help to look over the progmesh.cpp +// module first. + +// Map() +// +// When the model is rendered using a maximum of mx vertices +// then it is vertices 0 through mx-1 that are used. +// We are able to do this because the vertex list +// gets sorted according to the collapse order. +// The Map() routine takes a vertex number 'a' and the +// maximum number of vertices 'mx' and returns the +// appropriate vertex in the range 0 to mx-1. +// When 'a' is greater than 'mx' the Map() routine +// follows the chain of edge collapses until a vertex +// within the limit is reached. +// An example to make this clear: assume there is +// a triangle with vertices 1, 3 and 12. But when +// rendering the model we limit ourselves to 10 vertices. +// In that case we find out how vertex 12 was removed +// by the polygon reduction algorithm. i.e. which +// edge was collapsed. Lets say that vertex 12 was collapsed +// to vertex number 7. This number would have been stored +// in the collapse_map array (i.e. collapse_map[12]==7). +// Since vertex 7 is in range (less than max of 10) we +// will want to render the triangle 1,3,7. +// Pretend now that we want to limit ourselves to 5 vertices. +// and vertex 7 was collapsed to vertex 3 +// (i.e. collapse_map[7]==3). Then triangle 1,3,12 would now be +// triangle 1,3,3. i.e. this polygon was removed by the +// progressive mesh polygon reduction algorithm by the time +// it had gotten down to 5 vertices. +// No need to draw a one dimensional polygon. :-) +int Map(int a,int mx) { + if(mx<=0) return 0; + while(a>=mx) { + a=collapse_map[a]; + } + return a; +} + +void DrawModelTriangles() { + assert(collapse_map.num); + renderpolycount=0; + int i=0; + for(i=0;i &permutation) { + // rearrange the vertex list + List temp_list; + int i; + assert(permutation.num==vert.num); + for(i=0;i permutation; + GetRabbitData(); + ProgressiveMesh(vert,tri,collapse_map,permutation); + PermuteVertices(permutation); + model_position = Vector(0,0,-3); + Quaternion yaw(Vector(0,1,0),-3.14f/4); // 45 degrees + Quaternion pitch(Vector(1,0,0),3.14f/12); // 15 degrees + model_orientation = pitch*yaw; +} + +void StatusDraw() { + // Draw a slider type widget looking thing + // to show portion of vertices being used + float b = (float)render_num/(float)vert.num; + float a = b*(lodbase ); + glDisable(GL_LIGHTING); + glMatrixMode( GL_PROJECTION ); + glPushMatrix(); + glLoadIdentity(); + glOrtho(-0.15,15,-0.1,1.1,-0.1,100); + glMatrixMode( GL_MODELVIEW ); + + glPushMatrix(); + glLoadIdentity(); + glBegin(GL_POLYGON); + glColor3f(1,0,0); + glVertex2f(0,0); + glVertex2f(1,0); + glVertex2f(1,a); + glVertex2f(0,a); + glEnd(); + glBegin(GL_POLYGON); + glColor3f(1,0,0); + glVertex2f(0,a); + glVertex2f(morph,a); + glVertex2f(morph,b); + glVertex2f(0,b); + glEnd(); + glBegin(GL_POLYGON); + glColor3f(0,0,1); + glVertex2f(morph,a); + glVertex2f(1,a); + glVertex2f(1,b); + glVertex2f(morph,b); + glEnd(); + glBegin(GL_POLYGON); + glColor3f(0,0,1); + glVertex2f(0,b); + glVertex2f(1,b); + glVertex2f(1,1); + glVertex2f(0,1); + glEnd(); + glPopMatrix(); + glMatrixMode( GL_PROJECTION ); + glPopMatrix(); + glMatrixMode( GL_MODELVIEW ); +} + +/* + * The following is just a quick hack to animate + * the object through various polygon reduced versions. + */ +struct keyframethings { + float t; // timestamp + float n; // portion of vertices used to start + float dn; // rate of change in "n" + float m; // morph value + float dm; // rate of change in "m" +} keys[]={ + {0 ,1 ,0 ,1, 0}, + {2 ,1 ,-1,1, 0}, + {10,0 ,1 ,1, 0}, + {18,1 ,0 ,1, 0}, + {20,1 ,0 ,1,-1}, + {24,0.5 ,0 ,1, 0}, + {26,0.5 ,0 ,1,-1}, + {30,0.25,0 ,1, 0}, + {32,0.25,0 ,1,-1}, + {36,0.125,0,1, 0}, + {38,0.25,0 ,0, 1}, + {42,0.5 ,0 ,0, 1}, + {46,1 ,0 ,0, 1}, + {50,1 ,0 ,1, 0}, +}; +void AnimateParameters() { + static float time=0; // global time - used for animation + time+=DeltaT; + if(time>=50) time=0; // repeat cycle every so many seconds + int k=0; + while(time>keys[k+1].t) { + k++; + } + float interp = (time-keys[k].t)/(keys[k+1].t-keys[k].t); + render_num = vert.num*(keys[k].n + interp*keys[k].dn); + morph = keys[k].m + interp*keys[k].dm; + morph = (morph>1.0f) ? 1.0f : morph; // clamp value + if(render_num>vert.num) render_num=vert.num; + if(render_num<0 ) render_num=0; +} + +void RenderModel() { + AnimateParameters(); + + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glColor3f(1,1,1); + glPushMatrix(); + glTranslatef(model_position.x,model_position.y,model_position.z); + // Rotate by quaternion: model_orientation + Vector axis=model_orientation.axis(); + float angle=model_orientation.angle()*180.0f/3.14f; + glRotatef(angle,axis.x,axis.y,axis.z); + DrawModelTriangles(); + StatusDraw(); + glPopMatrix(); + + char buf[256]; + sprintf(buf,"Polys: %d Vertices: %d ",renderpolycount,render_num); + if(morph<1.0) { + sprintf(buf+strlen(buf),"<-> %d morph: %4.2f ", + (int)(lodbase *render_num),morph); + } + PostString(buf,0,-2,5); +} diff --git a/applications/utilities/surface/surfaceCoarsen/bunnylod/bunnylod.dsp b/applications/utilities/surface/surfaceCoarsen/bunnylod/bunnylod.dsp new file mode 100644 index 0000000000..0109cfe725 --- /dev/null +++ b/applications/utilities/surface/surfaceCoarsen/bunnylod/bunnylod.dsp @@ -0,0 +1,114 @@ +# Microsoft Developer Studio Project File - Name="bunnylod" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 5.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=bunnylod - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "bunnylod.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "bunnylod.mak" CFG="bunnylod - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "bunnylod - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "bunnylod - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "bunnylod - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib opengl32.lib glu32.lib winmm.lib /nologo /subsystem:windows /machine:I386 + +!ELSEIF "$(CFG)" == "bunnylod - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib opengl32.lib glu32.lib winmm.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "bunnylod - Win32 Release" +# Name "bunnylod - Win32 Debug" +# Begin Source File + +SOURCE=.\bunnygut.cpp +# End Source File +# Begin Source File + +SOURCE=.\font.cpp +# End Source File +# Begin Source File + +SOURCE=.\progmesh.cpp +# End Source File +# Begin Source File + +SOURCE=.\rabdata.cpp +# End Source File +# Begin Source File + +SOURCE=.\vector.cpp +# End Source File +# Begin Source File + +SOURCE=.\winmain.cpp +# End Source File +# End Target +# End Project diff --git a/applications/utilities/surface/surfaceCoarsen/bunnylod/bunnylod.dsw b/applications/utilities/surface/surfaceCoarsen/bunnylod/bunnylod.dsw new file mode 100644 index 0000000000..8abda09402 --- /dev/null +++ b/applications/utilities/surface/surfaceCoarsen/bunnylod/bunnylod.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 5.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "bunnylod"=.\bunnylod.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/applications/utilities/surface/surfaceCoarsen/bunnylod/font.h b/applications/utilities/surface/surfaceCoarsen/bunnylod/font.h new file mode 100644 index 0000000000..196f5de7f6 --- /dev/null +++ b/applications/utilities/surface/surfaceCoarsen/bunnylod/font.h @@ -0,0 +1,8 @@ +#ifndef FONT_H +#define FONT_H + +void PrintString(char *s,int x=0,int y=-1); +void PostString(char *_s,int _x,int _y,float _life=5.0); +void RenderStrings(); + +#endif diff --git a/applications/utilities/surface/surfaceCoarsen/bunnylod/list.h b/applications/utilities/surface/surfaceCoarsen/bunnylod/list.h new file mode 100644 index 0000000000..1c19f0d99c --- /dev/null +++ b/applications/utilities/surface/surfaceCoarsen/bunnylod/list.h @@ -0,0 +1,130 @@ +/* + * A generic template list class. + * Fairly typical of the list example you would + * find in any c++ book. + */ +#ifndef GENERIC_LIST_H +#define GENERIC_LIST_H + +#include +#include + +template class List { + public: + List(int s=0); + ~List(); + void allocate(int s); + void SetSize(int s); + void Pack(); + void Add(Type); + void AddUnique(Type); + int Contains(Type); + void Remove(Type); + void DelIndex(int i); + Type * element; + int num; + int array_size; + Type &operator[](int i){ + assert(i>=0 && i +List::List(int s){ + num=0; + array_size = 0; + element = NULL; + if(s) { + allocate(s); + } +} + +template +List::~List(){ + delete element; +} + +template +void List::allocate(int s){ + assert(s>0); + assert(s>=num); + Type *old = element; + array_size =s; + element = new Type[array_size]; + assert(element); + for(int i=0;i +void List::SetSize(int s){ + if(s==0) { if(element) delete element;} + else { allocate(s); } + num=s; +} +template +void List::Pack(){ + allocate(num); +} + +template +void List::Add(Type t){ + assert(num<=array_size); + if(num==array_size) { + allocate((array_size)?array_size *2:16); + } + //int i; + //for(i=0;i +int List::Contains(Type t){ + int i; + int count=0; + for(i=0;i +void List::AddUnique(Type t){ + if(!Contains(t)) Add(t); +} + + +template +void List::DelIndex(int i){ + assert(i +void List::Remove(Type t){ + int i; + for(i=0;i +#include +#include +#include +//#include + +#include "vector.h" +#include "list.h" +#include "progmesh.h" + +#define min(x,y) (((x) <= (y)) ? (x) : (y)) +#define max(x,y) (((x) >= (y)) ? (x) : (y)) + + +/* + * For the polygon reduction algorithm we use data structures + * that contain a little bit more information than the usual + * indexed face set type of data structure. + * From a vertex we wish to be able to quickly get the + * neighboring faces and vertices. + */ +class Triangle; +class Vertex; + +class Triangle { + public: + Vertex * vertex[3]; // the 3 points that make this tri + Vector normal; // unit vector othogonal to this face + Triangle(Vertex *v0,Vertex *v1,Vertex *v2); + ~Triangle(); + void ComputeNormal(); + void ReplaceVertex(Vertex *vold,Vertex *vnew); + int HasVertex(Vertex *v); +}; +class Vertex { + public: + Vector position; // location of point in euclidean space + int id; // place of vertex in original list + List neighbor; // adjacent vertices + List face; // adjacent triangles + float objdist; // cached cost of collapsing edge + Vertex * collapse; // candidate vertex for collapse + Vertex(Vector v,int _id); + ~Vertex(); + void RemoveIfNonNeighbor(Vertex *n); +}; +List vertices; +List triangles; + + +Triangle::Triangle(Vertex *v0,Vertex *v1,Vertex *v2){ + assert(v0!=v1 && v1!=v2 && v2!=v0); + vertex[0]=v0; + vertex[1]=v1; + vertex[2]=v2; + ComputeNormal(); + triangles.Add(this); + for(int i=0;i<3;i++) { + vertex[i]->face.Add(this); + for(int j=0;j<3;j++) if(i!=j) { + vertex[i]->neighbor.AddUnique(vertex[j]); + } + } +} +Triangle::~Triangle(){ + int i; + triangles.Remove(this); + for(i=0;i<3;i++) { + if(vertex[i]) vertex[i]->face.Remove(this); + } + for(i=0;i<3;i++) { + int i2 = (i+1)%3; + if(!vertex[i] || !vertex[i2]) continue; + vertex[i ]->RemoveIfNonNeighbor(vertex[i2]); + vertex[i2]->RemoveIfNonNeighbor(vertex[i ]); + } +} +int Triangle::HasVertex(Vertex *v) { + return (v==vertex[0] ||v==vertex[1] || v==vertex[2]); +} +void Triangle::ComputeNormal(){ + Vector v0=vertex[0]->position; + Vector v1=vertex[1]->position; + Vector v2=vertex[2]->position; + normal = (v1-v0)*(v2-v1); + if(magnitude(normal)==0)return; + normal = normalize(normal); +} +void Triangle::ReplaceVertex(Vertex *vold,Vertex *vnew) { + assert(vold && vnew); + assert(vold==vertex[0] || vold==vertex[1] || vold==vertex[2]); + assert(vnew!=vertex[0] && vnew!=vertex[1] && vnew!=vertex[2]); + if(vold==vertex[0]){ + vertex[0]=vnew; + } + else if(vold==vertex[1]){ + vertex[1]=vnew; + } + else { + assert(vold==vertex[2]); + vertex[2]=vnew; + } + int i; + vold->face.Remove(this); + assert(!vnew->face.Contains(this)); + vnew->face.Add(this); + for(i=0;i<3;i++) { + vold->RemoveIfNonNeighbor(vertex[i]); + vertex[i]->RemoveIfNonNeighbor(vold); + } + for(i=0;i<3;i++) { + assert(vertex[i]->face.Contains(this)==1); + for(int j=0;j<3;j++) if(i!=j) { + vertex[i]->neighbor.AddUnique(vertex[j]); + } + } + ComputeNormal(); +} + +Vertex::Vertex(Vector v,int _id) { + position =v; + id=_id; + vertices.Add(this); +} + +Vertex::~Vertex(){ + assert(face.num==0); + while(neighbor.num) { + neighbor[0]->neighbor.Remove(this); + neighbor.Remove(neighbor[0]); + } + vertices.Remove(this); +} +void Vertex::RemoveIfNonNeighbor(Vertex *n) { + // removes n from neighbor list if n isn't a neighbor. + if(!neighbor.Contains(n)) return; + for(int i=0;iHasVertex(n)) return; + } + neighbor.Remove(n); +} + + +float ComputeEdgeCollapseCost(Vertex *u,Vertex *v) { + // if we collapse edge uv by moving u to v then how + // much different will the model change, i.e. how much "error". + // Texture, vertex normal, and border vertex code was removed + // to keep this demo as simple as possible. + // The method of determining cost was designed in order + // to exploit small and coplanar regions for + // effective polygon reduction. + // Is is possible to add some checks here to see if "folds" + // would be generated. i.e. normal of a remaining face gets + // flipped. I never seemed to run into this problem and + // therefore never added code to detect this case. + int i; + float edgelength = magnitude(v->position - u->position); + float curvature=0; + + // find the "sides" triangles that are on the edge uv + List sides; + for(i=0;iface.num;i++) { + if(u->face[i]->HasVertex(v)){ + sides.Add(u->face[i]); + } + } + // use the triangle facing most away from the sides + // to determine our curvature term + for(i=0;iface.num;i++) { + float mincurv=1; // curve for face i and closer side to it + for(int j=0;jface[i]->normal ^ sides[j]->normal; + mincurv = min(mincurv,(1-dotprod)/2.0f); + } + curvature = max(curvature,mincurv); + } + // the more coplanar the lower the curvature term + return edgelength * curvature; +} + +void ComputeEdgeCostAtVertex(Vertex *v) { + // compute the edge collapse cost for all edges that start + // from vertex v. Since we are only interested in reducing + // the object by selecting the min cost edge at each step, we + // only cache the cost of the least cost edge at this vertex + // (in member variable collapse) as well as the value of the + // cost (in member variable objdist). + if(v->neighbor.num==0) { + // v doesn't have neighbors so it costs nothing to collapse + v->collapse=NULL; + v->objdist=-0.01f; + return; + } + v->objdist = 1000000; + v->collapse=NULL; + // search all neighboring edges for "least cost" edge + for(int i=0;ineighbor.num;i++) { + float dist; + dist = ComputeEdgeCollapseCost(v,v->neighbor[i]); + if(distobjdist) { + // candidate for edge collapse + v->collapse=v->neighbor[i]; + // cost of the collapse + v->objdist=dist; + } + } +} +void ComputeAllEdgeCollapseCosts() { + // For all the edges, compute the difference it would make + // to the model if it was collapsed. The least of these + // per vertex is cached in each vertex object. + for(int i=0;itmp; + // make tmp a list of all the neighbors of u + for(i=0;ineighbor.num;i++) { + tmp.Add(u->neighbor[i]); + } + // delete triangles on edge uv: + for(i=u->face.num-1;i>=0;i--) { + if(u->face[i]->HasVertex(v)) { + delete(u->face[i]); + } + } + // update remaining triangles to have v instead of u + for(i=u->face.num-1;i>=0;i--) { + u->face[i]->ReplaceVertex(u,v); + } + delete u; + // recompute the edge collapse costs for neighboring vertices + for(i=0;i &vert){ + for(int i=0;i &tri){ + for(int i=0;iobjdist < mn->objdist) { + mn = vertices[i]; + } + } + return mn; +} + +void ProgressiveMesh(List &vert, List &tri, + List &map, List &permutation) +{ + AddVertex(vert); // put input data into our data structures + AddFaces(tri); + ComputeAllEdgeCollapseCosts(); // cache all edge collapse costs + permutation.SetSize(vertices.num); // allocate space + map.SetSize(vertices.num); // allocate space + // reduce the object down to nothing: + while(vertices.num > 0) { + // get the next vertex to collapse + Vertex *mn = MinimumCostEdge(); + // keep track of this vertex, i.e. the collapse ordering + permutation[mn->id]=vertices.num-1; + // keep track of vertex to which we collapse to + map[vertices.num-1] = (mn->collapse)?mn->collapse->id:-1; + // Collapse this edge + Collapse(mn,mn->collapse); + } + // reorder the map list based on the collapse ordering + for(int i=0;i &vert, List &tri, + List &map, List &permutation ); + +#endif diff --git a/applications/utilities/surface/surfaceCoarsen/bunnylod/rabdata.C b/applications/utilities/surface/surfaceCoarsen/bunnylod/rabdata.C new file mode 100644 index 0000000000..337095d7f9 --- /dev/null +++ b/applications/utilities/surface/surfaceCoarsen/bunnylod/rabdata.C @@ -0,0 +1,1383 @@ +/* Copyright 1996, Viewpoint Datalabs Int'l, www.viewpoint.com, 1-800-DATASET */ +/* +# Usage Rights: You (the user) may use this model to help build +# cool personal vrml worlds, but please give us credit when you do +# ("3D model provided by Viewpoint Datalabs, www,viewpoint.com"). +# Please don't sell it or use it to make money indirectly. Don't +# redistribute it or put it on a web site except as a part of your +# personal, non-commerical vrml world. If you want to do a +# commercial project, give us a call at 1-800-DATASET or visit +# www.viewpoint.com and we'll help you obtain the rights to do so. +# */ + +/* + * Note that this data was put directly into the program + * to provide a demo program on the net that people could + * just run without having to fetch datafiles. + * i.e. more convienent for the user this way + */ + +#include "rabdata.h" + +#pragma warning(disable : 4305) +#pragma warning(disable : 4136) + +float rabbit_vertices[RABBIT_VERTEX_NUM][3]={ + {-0.334392,0.133007,0.062259}, + {-0.350189,0.150354,-0.147769}, + {-0.234201,0.343811,-0.174307}, + {-0.200259,0.285207,0.093749}, + {0.003520,0.475208,-0.159365}, + {0.001856,0.419203,0.098582}, + {-0.252802,0.093666,0.237538}, + {-0.162901,0.237984,0.206905}, + {0.000865,0.318141,0.235370}, + {-0.414624,0.164083,-0.278254}, + {-0.262213,0.357334,-0.293246}, + {0.004628,0.482694,-0.338626}, + {-0.402162,0.133528,-0.443247}, + {-0.243781,0.324275,-0.436763}, + {0.005293,0.437592,-0.458332}, + {-0.339884,-0.041150,-0.668211}, + {-0.248382,0.255825,-0.627493}, + {0.006261,0.376103,-0.631506}, + {-0.216201,-0.126776,-0.886936}, + {-0.171075,0.011544,-0.881386}, + {-0.181074,0.098223,-0.814779}, + {-0.119891,0.218786,-0.760153}, + {-0.078895,0.276780,-0.739281}, + {0.006801,0.310959,-0.735661}, + {-0.168842,0.102387,-0.920381}, + {-0.104072,0.177278,-0.952530}, + {-0.129704,0.211848,-0.836678}, + {-0.099875,0.310931,-0.799381}, + {0.007237,0.361687,-0.794439}, + {-0.077913,0.258753,-0.921640}, + {0.007957,0.282241,-0.931680}, + {-0.252222,-0.550401,-0.557810}, + {-0.267633,-0.603419,-0.655209}, + {-0.446838,-0.118517,-0.466159}, + {-0.459488,-0.093017,-0.311341}, + {-0.370645,-0.100108,-0.159454}, + {-0.371984,-0.091991,-0.011044}, + {-0.328945,-0.098269,0.088659}, + {-0.282452,-0.018862,0.311501}, + {-0.352403,-0.131341,0.144902}, + {-0.364126,-0.200299,0.202388}, + {-0.283965,-0.231869,0.023668}, + {-0.298943,-0.155218,0.369716}, + {-0.293787,-0.121856,0.419097}, + {-0.290163,-0.290797,0.107824}, + {-0.264165,-0.272849,0.036347}, + {-0.228567,-0.372573,0.290309}, + {-0.190431,-0.286997,0.421917}, + {-0.191039,-0.240973,0.507118}, + {-0.287272,-0.276431,-0.065444}, + {-0.295675,-0.280818,-0.174200}, + {-0.399537,-0.313131,-0.376167}, + {-0.392666,-0.488581,-0.427494}, + {-0.331669,-0.570185,-0.466054}, + {-0.282290,-0.618140,-0.589220}, + {-0.374238,-0.594882,-0.323298}, + {-0.381071,-0.629723,-0.350777}, + {-0.382112,-0.624060,-0.221577}, + {-0.272701,-0.566522,0.259157}, + {-0.256702,-0.663406,0.286079}, + {-0.280948,-0.428359,0.055790}, + {-0.184974,-0.508894,0.326265}, + {-0.279971,-0.526918,0.395319}, + {-0.282599,-0.663393,0.412411}, + {-0.188329,-0.475093,0.417954}, + {-0.263384,-0.663396,0.466604}, + {-0.209063,-0.663393,0.509344}, + {-0.002044,-0.319624,0.553078}, + {-0.001266,-0.371260,0.413296}, + {-0.219753,-0.339762,-0.040921}, + {-0.256986,-0.282511,-0.006349}, + {-0.271706,-0.260881,0.001764}, + {-0.091191,-0.419184,-0.045912}, + {-0.114944,-0.429752,-0.124739}, + {-0.113970,-0.382987,-0.188540}, + {-0.243012,-0.464942,-0.242850}, + {-0.314815,-0.505402,-0.324768}, + {0.002774,-0.437526,-0.262766}, + {-0.072625,-0.417748,-0.221440}, + {-0.160112,-0.476932,-0.293450}, + {0.003859,-0.453425,-0.443916}, + {-0.120363,-0.581567,-0.438689}, + {-0.091499,-0.584191,-0.294511}, + {-0.116469,-0.599861,-0.188308}, + {-0.208032,-0.513640,-0.134649}, + {-0.235749,-0.610017,-0.040939}, + {-0.344916,-0.622487,-0.085380}, + {-0.336401,-0.531864,-0.212298}, + {0.001961,-0.459550,-0.135547}, + {-0.058296,-0.430536,-0.043440}, + {0.001378,-0.449511,-0.037762}, + {-0.130135,-0.510222,0.079144}, + {0.000142,-0.477549,0.157064}, + {-0.114284,-0.453206,0.304397}, + {-0.000592,-0.443558,0.285401}, + {-0.056215,-0.663402,0.326073}, + {-0.026248,-0.568010,0.273318}, + {-0.049261,-0.531064,0.389854}, + {-0.127096,-0.663398,0.479316}, + {-0.058384,-0.663401,0.372891}, + {-0.303961,0.054199,0.625921}, + {-0.268594,0.193403,0.502766}, + {-0.277159,0.126123,0.443289}, + {-0.287605,-0.005722,0.531844}, + {-0.231396,-0.121289,0.587387}, + {-0.253475,-0.081797,0.756541}, + {-0.195164,-0.137969,0.728011}, + {-0.167673,-0.156573,0.609388}, + {-0.145917,-0.169029,0.697600}, + {-0.077776,-0.214247,0.622586}, + {-0.076873,-0.214971,0.696301}, + {-0.002341,-0.233135,0.622859}, + {-0.002730,-0.213526,0.691267}, + {-0.003136,-0.192628,0.762731}, + {-0.056136,-0.201222,0.763806}, + {-0.114589,-0.166192,0.770723}, + {-0.155145,-0.129632,0.791738}, + {-0.183611,-0.058705,0.847012}, + {-0.165562,0.001980,0.833386}, + {-0.220084,0.019914,0.768935}, + {-0.255730,0.090306,0.670782}, + {-0.255594,0.113833,0.663389}, + {-0.226380,0.212655,0.617740}, + {-0.003367,-0.195342,0.799680}, + {-0.029743,-0.210508,0.827180}, + {-0.003818,-0.194783,0.873636}, + {-0.004116,-0.157907,0.931268}, + {-0.031280,-0.184555,0.889476}, + {-0.059885,-0.184448,0.841330}, + {-0.135333,-0.164332,0.878200}, + {-0.085574,-0.170948,0.925547}, + {-0.163833,-0.094170,0.897114}, + {-0.138444,-0.104250,0.945975}, + {-0.083497,-0.084934,0.979607}, + {-0.004433,-0.146642,0.985872}, + {-0.150715,0.032650,0.884111}, + {-0.135892,-0.035520,0.945455}, + {-0.070612,0.036849,0.975733}, + {-0.004458,-0.042526,1.015670}, + {-0.004249,0.046042,1.003240}, + {-0.086969,0.133224,0.947633}, + {-0.003873,0.161605,0.970499}, + {-0.125544,0.140012,0.917678}, + {-0.125651,0.250246,0.857602}, + {-0.003127,0.284070,0.878870}, + {-0.159174,0.125726,0.888878}, + {-0.183807,0.196970,0.844480}, + {-0.159890,0.291736,0.732480}, + {-0.199495,0.207230,0.779864}, + {-0.206182,0.164608,0.693257}, + {-0.186315,0.160689,0.817193}, + {-0.192827,0.166706,0.782271}, + {-0.175112,0.110008,0.860621}, + {-0.161022,0.057420,0.855111}, + {-0.172319,0.036155,0.816189}, + {-0.190318,0.064083,0.760605}, + {-0.195072,0.129179,0.731104}, + {-0.203126,0.410287,0.680536}, + {-0.216677,0.309274,0.642272}, + {-0.241515,0.311485,0.587832}, + {-0.002209,0.366663,0.749413}, + {-0.088230,0.396265,0.678635}, + {-0.170147,0.109517,0.840784}, + {-0.160521,0.067766,0.830650}, + {-0.181546,0.139805,0.812146}, + {-0.180495,0.148568,0.776087}, + {-0.180255,0.129125,0.744192}, + {-0.186298,0.078308,0.769352}, + {-0.167622,0.060539,0.806675}, + {-0.189876,0.102760,0.802582}, + {-0.108340,0.455446,0.657174}, + {-0.241585,0.527592,0.669296}, + {-0.265676,0.513366,0.634594}, + {-0.203073,0.478550,0.581526}, + {-0.266772,0.642330,0.602061}, + {-0.216961,0.564846,0.535435}, + {-0.202210,0.525495,0.475944}, + {-0.193888,0.467925,0.520606}, + {-0.265837,0.757267,0.500933}, + {-0.240306,0.653440,0.463215}, + {-0.309239,0.776868,0.304726}, + {-0.271009,0.683094,0.382018}, + {-0.312111,0.671099,0.286687}, + {-0.268791,0.624342,0.377231}, + {-0.302457,0.533996,0.360289}, + {-0.263656,0.529310,0.412564}, + {-0.282311,0.415167,0.447666}, + {-0.239201,0.442096,0.495604}, + {-0.220043,0.569026,0.445877}, + {-0.001263,0.395631,0.602029}, + {-0.057345,0.442535,0.572224}, + {-0.088927,0.506333,0.529106}, + {-0.125738,0.535076,0.612913}, + {-0.126251,0.577170,0.483159}, + {-0.149594,0.611520,0.557731}, + {-0.163188,0.660791,0.491080}, + {-0.172482,0.663387,0.415416}, + {-0.160464,0.591710,0.370659}, + {-0.156445,0.536396,0.378302}, + {-0.136496,0.444358,0.425226}, + {-0.095564,0.373768,0.473659}, + {-0.104146,0.315912,0.498104}, + {-0.000496,0.384194,0.473817}, + {-0.000183,0.297770,0.401486}, + {-0.129042,0.270145,0.434495}, + {0.000100,0.272963,0.349138}, + {-0.113060,0.236984,0.385554}, + {0.007260,0.016311,-0.883396}, + {0.007865,0.122104,-0.956137}, + {-0.032842,0.115282,-0.953252}, + {-0.089115,0.108449,-0.950317}, + {-0.047440,0.014729,-0.882756}, + {-0.104458,0.013137,-0.882070}, + {-0.086439,-0.584866,-0.608343}, + {-0.115026,-0.662605,-0.436732}, + {-0.071683,-0.665372,-0.606385}, + {-0.257884,-0.665381,-0.658052}, + {-0.272542,-0.665381,-0.592063}, + {-0.371322,-0.665382,-0.353620}, + {-0.372362,-0.665381,-0.224420}, + {-0.335166,-0.665380,-0.078623}, + {-0.225999,-0.665375,-0.038981}, + {-0.106719,-0.665374,-0.186351}, + {-0.081749,-0.665372,-0.292554}, + {0.006943,-0.091505,-0.858354}, + {0.006117,-0.280985,-0.769967}, + {0.004495,-0.502360,-0.559799}, + {-0.198638,-0.302135,-0.845816}, + {-0.237395,-0.542544,-0.587188}, + {-0.270001,-0.279489,-0.669861}, + {-0.134547,-0.119852,-0.959004}, + {-0.052088,-0.122463,-0.944549}, + {-0.124463,-0.293508,-0.899566}, + {-0.047616,-0.289643,-0.879292}, + {-0.168595,-0.529132,-0.654931}, + {-0.099793,-0.515719,-0.645873}, + {-0.186168,-0.605282,-0.724690}, + {-0.112970,-0.583097,-0.707469}, + {-0.108152,-0.665375,-0.700408}, + {-0.183019,-0.665378,-0.717630}, + {-0.349529,-0.334459,-0.511985}, + {-0.141182,-0.437705,-0.798194}, + {-0.212670,-0.448725,-0.737447}, + {-0.261111,-0.414945,-0.613835}, + {-0.077364,-0.431480,-0.778113}, + {0.005174,-0.425277,-0.651592}, + {0.089236,-0.431732,-0.777093}, + {0.271006,-0.415749,-0.610577}, + {0.223981,-0.449384,-0.734774}, + {0.153275,-0.438150,-0.796391}, + {0.358414,-0.335529,-0.507649}, + {0.193434,-0.665946,-0.715325}, + {0.118363,-0.665717,-0.699021}, + {0.123515,-0.583454,-0.706020}, + {0.196851,-0.605860,-0.722345}, + {0.109788,-0.516035,-0.644590}, + {0.178656,-0.529656,-0.652804}, + {0.061157,-0.289807,-0.878626}, + {0.138234,-0.293905,-0.897958}, + {0.066933,-0.122643,-0.943820}, + {0.149571,-0.120281,-0.957264}, + {0.280989,-0.280321,-0.666487}, + {0.246581,-0.543275,-0.584224}, + {0.211720,-0.302754,-0.843303}, + {0.086966,-0.665627,-0.291520}, + {0.110634,-0.665702,-0.185021}, + {0.228099,-0.666061,-0.036201}, + {0.337743,-0.666396,-0.074503}, + {0.376722,-0.666513,-0.219833}, + {0.377265,-0.666513,-0.349036}, + {0.281411,-0.666217,-0.588670}, + {0.267564,-0.666174,-0.654834}, + {0.080745,-0.665602,-0.605452}, + {0.122016,-0.662963,-0.435280}, + {0.095767,-0.585141,-0.607228}, + {0.118944,0.012799,-0.880702}, + {0.061944,0.014564,-0.882086}, + {0.104725,0.108156,-0.949130}, + {0.048513,0.115159,-0.952753}, + {0.112696,0.236643,0.386937}, + {0.128177,0.269757,0.436071}, + {0.102643,0.315600,0.499370}, + {0.094535,0.373481,0.474824}, + {0.136270,0.443946,0.426895}, + {0.157071,0.535923,0.380222}, + {0.161350,0.591224,0.372630}, + {0.173035,0.662865,0.417531}, + {0.162808,0.660299,0.493077}, + {0.148250,0.611070,0.559555}, + {0.125719,0.576790,0.484702}, + {0.123489,0.534699,0.614440}, + {0.087621,0.506066,0.530188}, + {0.055321,0.442365,0.572915}, + {0.219936,0.568361,0.448571}, + {0.238099,0.441375,0.498528}, + {0.281711,0.414315,0.451121}, + {0.263833,0.528513,0.415794}, + {0.303284,0.533081,0.363998}, + {0.269687,0.623528,0.380528}, + {0.314255,0.670153,0.290524}, + {0.272023,0.682273,0.385343}, + {0.311480,0.775931,0.308527}, + {0.240239,0.652714,0.466159}, + {0.265619,0.756464,0.504187}, + {0.192562,0.467341,0.522972}, + {0.201605,0.524885,0.478417}, + {0.215743,0.564193,0.538084}, + {0.264969,0.641527,0.605317}, + {0.201031,0.477940,0.584002}, + {0.263086,0.512567,0.637832}, + {0.238615,0.526867,0.672237}, + {0.105309,0.455123,0.658482}, + {0.183993,0.102195,0.804872}, + {0.161563,0.060042,0.808692}, + {0.180748,0.077754,0.771600}, + {0.175168,0.128588,0.746368}, + {0.175075,0.148030,0.778264}, + {0.175658,0.139265,0.814333}, + {0.154191,0.067291,0.832578}, + {0.163818,0.109013,0.842830}, + {0.084760,0.396004,0.679695}, + {0.238888,0.310760,0.590775}, + {0.213380,0.308625,0.644905}, + {0.199666,0.409678,0.683003}, + {0.190143,0.128597,0.733463}, + {0.184833,0.063516,0.762902}, + {0.166070,0.035644,0.818261}, + {0.154361,0.056943,0.857042}, + {0.168542,0.109489,0.862725}, + {0.187387,0.166131,0.784599}, + {0.180428,0.160135,0.819438}, + {0.201823,0.163991,0.695756}, + {0.194206,0.206635,0.782275}, + {0.155438,0.291260,0.734412}, + {0.177696,0.196424,0.846693}, + {0.152305,0.125256,0.890786}, + {0.119546,0.249876,0.859104}, + {0.118369,0.139643,0.919173}, + {0.079410,0.132973,0.948652}, + {0.062419,0.036648,0.976547}, + {0.127847,-0.035919,0.947070}, + {0.143624,0.032206,0.885913}, + {0.074888,-0.085173,0.980577}, + {0.130184,-0.104656,0.947620}, + {0.156201,-0.094653,0.899074}, + {0.077366,-0.171194,0.926545}, + {0.127722,-0.164729,0.879810}, + {0.052670,-0.184618,0.842019}, + {0.023477,-0.184638,0.889811}, + {0.022626,-0.210587,0.827500}, + {0.223089,0.211976,0.620493}, + {0.251444,0.113067,0.666494}, + {0.251419,0.089540,0.673887}, + {0.214360,0.019258,0.771595}, + {0.158999,0.001490,0.835374}, + {0.176696,-0.059249,0.849218}, + {0.148696,-0.130091,0.793599}, + {0.108290,-0.166528,0.772088}, + {0.049820,-0.201382,0.764454}, + {0.071341,-0.215195,0.697209}, + {0.073148,-0.214475,0.623510}, + {0.140502,-0.169461,0.699354}, + {0.163374,-0.157073,0.611416}, + {0.189466,-0.138550,0.730366}, + {0.247593,-0.082554,0.759610}, + {0.227468,-0.121982,0.590197}, + {0.284702,-0.006586,0.535347}, + {0.275741,0.125287,0.446676}, + {0.266650,0.192594,0.506044}, + {0.300086,0.053287,0.629620}, + {0.055450,-0.663935,0.375065}, + {0.122854,-0.664138,0.482323}, + {0.046520,-0.531571,0.391918}, + {0.024824,-0.568450,0.275106}, + {0.053855,-0.663931,0.328224}, + {0.112829,-0.453549,0.305788}, + {0.131265,-0.510617,0.080746}, + {0.061174,-0.430716,-0.042710}, + {0.341019,-0.532887,-0.208150}, + {0.347705,-0.623533,-0.081139}, + {0.238040,-0.610732,-0.038037}, + {0.211764,-0.514274,-0.132078}, + {0.120605,-0.600219,-0.186856}, + {0.096985,-0.584476,-0.293357}, + {0.127621,-0.581941,-0.437170}, + {0.165902,-0.477425,-0.291453}, + {0.077720,-0.417975,-0.220519}, + {0.320892,-0.506363,-0.320874}, + {0.248214,-0.465684,-0.239842}, + {0.118764,-0.383338,-0.187114}, + {0.118816,-0.430106,-0.123307}, + {0.094131,-0.419464,-0.044777}, + {0.274526,-0.261706,0.005110}, + {0.259842,-0.283292,-0.003185}, + {0.222861,-0.340431,-0.038210}, + {0.204445,-0.664380,0.513353}, + {0.259286,-0.664547,0.471281}, + {0.185402,-0.476020,0.421718}, + {0.279163,-0.664604,0.417328}, + {0.277157,-0.528122,0.400208}, + {0.183069,-0.509812,0.329995}, + {0.282599,-0.429210,0.059242}, + {0.254816,-0.664541,0.290687}, + {0.271436,-0.567707,0.263966}, + {0.386561,-0.625221,-0.216870}, + {0.387086,-0.630883,-0.346073}, + {0.380021,-0.596021,-0.318679}, + {0.291269,-0.619007,-0.585707}, + {0.339280,-0.571198,-0.461946}, + {0.400045,-0.489778,-0.422640}, + {0.406817,-0.314349,-0.371230}, + {0.300588,-0.281718,-0.170549}, + {0.290866,-0.277304,-0.061905}, + {0.187735,-0.241545,0.509437}, + {0.188032,-0.287569,0.424234}, + {0.227520,-0.373262,0.293102}, + {0.266526,-0.273650,0.039597}, + {0.291592,-0.291676,0.111386}, + {0.291914,-0.122741,0.422683}, + {0.297574,-0.156119,0.373368}, + {0.286603,-0.232731,0.027162}, + {0.364663,-0.201399,0.206850}, + {0.353855,-0.132408,0.149228}, + {0.282208,-0.019715,0.314960}, + {0.331187,-0.099266,0.092701}, + {0.375463,-0.093120,-0.006467}, + {0.375917,-0.101236,-0.154882}, + {0.466635,-0.094416,-0.305669}, + {0.455805,-0.119881,-0.460632}, + {0.277465,-0.604242,-0.651871}, + {0.261022,-0.551176,-0.554667}, + {0.093627,0.258494,-0.920589}, + {0.114248,0.310608,-0.798070}, + {0.144232,0.211434,-0.835001}, + {0.119916,0.176940,-0.951159}, + {0.184061,0.101854,-0.918220}, + {0.092431,0.276521,-0.738231}, + {0.133504,0.218403,-0.758602}, + {0.194987,0.097655,-0.812476}, + {0.185542,0.011005,-0.879202}, + {0.230315,-0.127450,-0.884202}, + {0.260471,0.255056,-0.624378}, + {0.351567,-0.042194,-0.663976}, + {0.253742,0.323524,-0.433716}, + {0.411612,0.132299,-0.438264}, + {0.270513,0.356530,-0.289984}, + {0.422146,0.162819,-0.273130}, + {0.164724,0.237490,0.208912}, + {0.253806,0.092900,0.240640}, + {0.203608,0.284597,0.096223}, + {0.241006,0.343093,-0.171396}, + {0.356076,0.149288,-0.143443}, + {0.337656,0.131992,0.066374} +}; +int rabbit_triangles[RABBIT_TRIANGLE_NUM][3]={ + {126,134,133}, + {342,138,134}, + {133,134,138}, + {126,342,134}, + {312,316,317}, + {169,163,162}, + {312,317,319}, + {312,319,318}, + {169,162,164}, + {169,168,163}, + {312,314,315}, + {169,164,165}, + {169,167,168}, + {312,315,316}, + {312,313,314}, + {169,165,166}, + {169,166,167}, + {312,318,313}, + {308,304,305}, + {308,305,306}, + {179,181,188}, + {177,173,175}, + {177,175,176}, + {302,293,300}, + {322,294,304}, + {188,176,175}, + {188,175,179}, + {158,177,187}, + {305,293,302}, + {305,302,306}, + {322,304,308}, + {188,181,183}, + {158,173,177}, + {293,298,300}, + {304,294,296}, + {304,296,305}, + {185,176,188}, + {185,188,183}, + {187,177,176}, + {187,176,185}, + {305,296,298}, + {305,298,293}, + {436,432, 28}, + {436, 28, 23}, + {434,278,431}, + { 30,208,209}, + { 30,209, 29}, + { 19, 20, 24}, + {208,207,211}, + {208,211,209}, + { 19,210,212}, + {433,434,431}, + {433,431,432}, + {433,432,436}, + {436,437,433}, + {277,275,276}, + {277,276,278}, + {209,210, 25}, + { 21, 26, 24}, + { 21, 24, 20}, + { 25, 26, 27}, + { 25, 27, 29}, + {435,439,277}, + {439,275,277}, + {432,431, 30}, + {432, 30, 28}, + {433,437,438}, + {433,438,435}, + {434,277,278}, + { 24, 25,210}, + { 24, 26, 25}, + { 29, 27, 28}, + { 29, 28, 30}, + { 19, 24,210}, + {208, 30,431}, + {208,431,278}, + {435,434,433}, + {435,277,434}, + { 25, 29,209}, + { 27, 22, 23}, + { 27, 23, 28}, + { 26, 22, 27}, + { 26, 21, 22}, + {212,210,209}, + {212,209,211}, + {207,208,278}, + {207,278,276}, + {439,435,438}, + { 12, 9, 10}, + { 12, 10, 13}, + { 2, 3, 5}, + { 2, 5, 4}, + { 16, 13, 14}, + { 16, 14, 17}, + { 22, 21, 16}, + { 13, 10, 11}, + { 13, 11, 14}, + { 1, 0, 3}, + { 1, 3, 2}, + { 15, 12, 16}, + { 19, 18, 15}, + { 19, 15, 16}, + { 19, 16, 20}, + { 9, 1, 2}, + { 9, 2, 10}, + { 3, 7, 8}, + { 3, 8, 5}, + { 16, 17, 23}, + { 16, 23, 22}, + { 21, 20, 16}, + { 10, 2, 4}, + { 10, 4, 11}, + { 0, 6, 7}, + { 0, 7, 3}, + { 12, 13, 16}, + {451,446,445}, + {451,445,450}, + {442,440,439}, + {442,439,438}, + {442,438,441}, + {421,420,422}, + {412,411,426}, + {412,426,425}, + {408,405,407}, + {413, 67, 68}, + {413, 68,414}, + {391,390,412}, + { 80,384,386}, + {404,406,378}, + {390,391,377}, + {390,377, 88}, + {400,415,375}, + {398,396,395}, + {398,395,371}, + {398,371,370}, + {112,359,358}, + {112,358,113}, + {351,352,369}, + {125,349,348}, + {345,343,342}, + {342,340,339}, + {341,335,337}, + {328,341,327}, + {331,323,333}, + {331,322,323}, + {327,318,319}, + {327,319,328}, + {315,314,324}, + {302,300,301}, + {302,301,303}, + {320,311,292}, + {285,284,289}, + {310,307,288}, + {310,288,290}, + {321,350,281}, + {321,281,282}, + {423,448,367}, + {272,273,384}, + {272,384,274}, + {264,265,382}, + {264,382,383}, + {440,442,261}, + {440,261,263}, + {252,253,254}, + {252,254,251}, + {262,256,249}, + {262,249,248}, + {228,243,242}, + {228, 31,243}, + {213,215,238}, + {213,238,237}, + { 19,212,230}, + {224,225,233}, + {224,233,231}, + {217,218, 56}, + {217, 56, 54}, + {217,216,239}, + {217,239,238}, + {217,238,215}, + {218,217,215}, + {218,215,214}, + { 6,102,206}, + {186,199,200}, + {197,182,180}, + {170,171,157}, + {201,200,189}, + {170,190,191}, + {170,191,192}, + {175,174,178}, + {175,178,179}, + {168,167,155}, + {122,149,158}, + {122,158,159}, + {135,153,154}, + {135,154,118}, + {143,140,141}, + {143,141,144}, + {132,133,136}, + {130,126,133}, + {124,125,127}, + {122,101,100}, + {122,100,121}, + {110,108,107}, + {110,107,109}, + { 98, 99, 97}, + { 98, 97, 64}, + { 98, 64, 66}, + { 87, 55, 57}, + { 83, 82, 79}, + { 83, 79, 84}, + { 78, 74, 50}, + { 49, 71, 41}, + { 49, 41, 37}, + { 49, 37, 36}, + { 58, 44, 60}, + { 60, 59, 58}, + { 51, 34, 33}, + { 39, 40, 42}, + { 39, 42, 38}, + {243,240, 33}, + {243, 33,229}, + { 39, 38, 6}, + { 44, 46, 40}, + { 55, 56, 57}, + { 64, 62, 65}, + { 64, 65, 66}, + { 41, 71, 45}, + { 75, 50, 51}, + { 81, 79, 82}, + { 77, 88, 73}, + { 93, 92, 94}, + { 68, 47, 46}, + { 96, 97, 99}, + { 96, 99, 95}, + {110,109,111}, + {111,112,110}, + {114,113,123}, + {114,123,124}, + {132,131,129}, + {133,137,136}, + {135,142,145}, + {145,152,135}, + {149,147,157}, + {157,158,149}, + {164,150,151}, + {153,163,168}, + {153,168,154}, + {185,183,182}, + {185,182,184}, + {161,189,190}, + {200,199,191}, + {200,191,190}, + {180,178,195}, + {180,195,196}, + {102,101,204}, + {102,204,206}, + { 43, 48,104}, + { 43,104,103}, + {216,217, 54}, + {216, 54, 32}, + {207,224,231}, + {230,212,211}, + {230,211,231}, + {227,232,241}, + {227,241,242}, + {235,234,241}, + {235,241,244}, + {430,248,247}, + {272,274,253}, + {272,253,252}, + {439,260,275}, + {225,224,259}, + {225,259,257}, + {269,270,407}, + {269,407,405}, + {270,269,273}, + {270,273,272}, + {273,269,268}, + {273,268,267}, + {273,267,266}, + {273,266,265}, + {273,265,264}, + {448,279,367}, + {281,350,368}, + {285,286,301}, + {290,323,310}, + {290,311,323}, + {282,281,189}, + {292,311,290}, + {292,290,291}, + {307,306,302}, + {307,302,303}, + {316,315,324}, + {316,324,329}, + {331,351,350}, + {330,334,335}, + {330,335,328}, + {341,337,338}, + {344,355,354}, + {346,345,348}, + {346,348,347}, + {364,369,352}, + {364,352,353}, + {365,363,361}, + {365,361,362}, + {376,401,402}, + {373,372,397}, + {373,397,400}, + {376, 92,377}, + {381,378,387}, + {381,387,385}, + {386, 77, 80}, + {390,389,412}, + {416,417,401}, + {403,417,415}, + {408,429,430}, + {419,423,418}, + {427,428,444}, + {427,444,446}, + {437,436,441}, + {450,445, 11}, + {450, 11, 4}, + {447,449, 5}, + {447, 5, 8}, + {441,438,437}, + {425,426,451}, + {425,451,452}, + {417,421,415}, + {408,407,429}, + {399,403,400}, + {399,400,397}, + {394,393,416}, + {389,411,412}, + {386,383,385}, + {408,387,378}, + {408,378,406}, + {377,391,376}, + { 94,375,415}, + {372,373,374}, + {372,374,370}, + {359,111,360}, + {359,112,111}, + {113,358,349}, + {113,349,123}, + {346,343,345}, + {343,340,342}, + {338,336,144}, + {338,144,141}, + {327,341,354}, + {327,354,326}, + {331,350,321}, + {331,321,322}, + {314,313,326}, + {314,326,325}, + {300,298,299}, + {300,299,301}, + {288,287,289}, + {189,292,282}, + {287,288,303}, + {284,285,297}, + {368,280,281}, + {448,447,279}, + {274,226,255}, + {267,268,404}, + {267,404,379}, + {429,262,430}, + {439,440,260}, + {257,258,249}, + {257,249,246}, + {430,262,248}, + {234,228,242}, + {234,242,241}, + {237,238,239}, + {237,239,236}, + { 15, 18,227}, + { 15,227,229}, + {222,223, 82}, + {222, 82, 83}, + {214,215,213}, + {214,213, 81}, + { 38,102, 6}, + {122,159,200}, + {122,200,201}, + {174,171,192}, + {174,192,194}, + {197,193,198}, + {190,170,161}, + {181,179,178}, + {181,178,180}, + {166,156,155}, + {163,153,152}, + {163,152,162}, + {120,156,149}, + {120,149,121}, + {152,153,135}, + {140,143,142}, + {135,131,132}, + {135,132,136}, + {130,129,128}, + {130,128,127}, + {100,105,119}, + {100,119,120}, + {106,104,107}, + {106,107,108}, + { 91, 95, 59}, + { 93, 94, 68}, + { 91, 89, 92}, + { 76, 53, 55}, + { 76, 55, 87}, + { 81, 78, 79}, + { 74, 73, 49}, + { 69, 60, 45}, + { 58, 62, 64}, + { 58, 64, 61}, + { 53, 31, 32}, + { 32, 54, 53}, + { 42, 43, 38}, + { 35, 36, 0}, + { 35, 0, 1}, + { 34, 35, 1}, + { 34, 1, 9}, + { 44, 40, 41}, + { 44, 41, 45}, + { 33,240, 51}, + { 63, 62, 58}, + { 63, 58, 59}, + { 45, 71, 70}, + { 76, 75, 51}, + { 76, 51, 52}, + { 86, 85, 84}, + { 86, 84, 87}, + { 89, 72, 73}, + { 89, 73, 88}, + { 91, 92, 96}, + { 91, 96, 95}, + { 72, 91, 60}, + { 72, 60, 69}, + {104,106,105}, + {119,105,117}, + {119,117,118}, + {124,127,128}, + {117,116,129}, + {117,129,131}, + {118,117,131}, + {135,140,142}, + {146,150,152}, + {146,152,145}, + {149,122,121}, + {166,165,151}, + {166,151,156}, + {158,172,173}, + {161,160,189}, + {199,198,193}, + {199,193,191}, + {204,201,202}, + {178,174,194}, + {200,159,186}, + {109, 48, 67}, + { 48,107,104}, + {216, 32,236}, + {216,236,239}, + {223,214, 81}, + {223, 81, 82}, + { 33, 12, 15}, + { 32,228,234}, + { 32,234,236}, + {240, 31, 52}, + {256,255,246}, + {256,246,249}, + {258,263,248}, + {258,248,249}, + {275,260,259}, + {275,259,276}, + {207,276,259}, + {270,271,429}, + {270,429,407}, + {413,418,366}, + {413,366,365}, + {368,367,279}, + {368,279,280}, + {303,301,286}, + {303,286,287}, + {283,282,292}, + {283,292,291}, + {320,292,189}, + {298,296,297}, + {298,297,299}, + {318,327,326}, + {318,326,313}, + {329,330,317}, + {336,333,320}, + {326,354,353}, + {334,332,333}, + {334,333,336}, + {342,339,139}, + {342,139,138}, + {345,342,126}, + {347,357,356}, + {369,368,351}, + {363,356,357}, + {363,357,361}, + {366,367,368}, + {366,368,369}, + {375,373,400}, + { 92, 90,377}, + {409,387,408}, + {386,385,387}, + {386,387,388}, + {412,394,391}, + {396,398,399}, + {408,406,405}, + {415,421,419}, + {415,419,414}, + {425,452,448}, + {425,448,424}, + {444,441,443}, + {448,452,449}, + {448,449,447}, + {446,444,443}, + {446,443,445}, + {250,247,261}, + {250,261,428}, + {421,422,423}, + {421,423,419}, + {427,410,250}, + {417,403,401}, + {403,402,401}, + {420,392,412}, + {420,412,425}, + {420,425,424}, + {386,411,389}, + {383,382,381}, + {383,381,385}, + {378,379,404}, + {372,371,395}, + {372,395,397}, + {371,372,370}, + {361,359,360}, + {361,360,362}, + {368,350,351}, + {349,347,348}, + {356,355,344}, + {356,344,346}, + {344,341,340}, + {344,340,343}, + {338,337,336}, + {328,335,341}, + {324,352,351}, + {324,351,331}, + {320,144,336}, + {314,325,324}, + {322,308,309}, + {310,309,307}, + {287,286,289}, + {203,280,279}, + {203,279,205}, + {297,295,283}, + {297,283,284}, + {447,205,279}, + {274,384, 80}, + {274, 80,226}, + {266,267,379}, + {266,379,380}, + {225,257,246}, + {225,246,245}, + {256,254,253}, + {256,253,255}, + {430,247,250}, + {226,235,244}, + {226,244,245}, + {232,233,244}, + {232,244,241}, + {230, 18, 19}, + { 32, 31,228}, + {219,220, 86}, + {219, 86, 57}, + {226,213,235}, + {206, 7, 6}, + {122,201,101}, + {201,204,101}, + {180,196,197}, + {170,192,171}, + {200,190,189}, + {194,193,195}, + {183,181,180}, + {183,180,182}, + {155,154,168}, + {149,156,151}, + {149,151,148}, + {155,156,120}, + {145,142,143}, + {145,143,146}, + {136,137,140}, + {133,132,130}, + {128,129,116}, + {100,120,121}, + {110,112,113}, + {110,113,114}, + { 66, 65, 63}, + { 66, 63, 99}, + { 66, 99, 98}, + { 96, 46, 61}, + { 89, 88, 90}, + { 86, 87, 57}, + { 80, 78, 81}, + { 72, 69, 49}, + { 67, 48, 47}, + { 67, 47, 68}, + { 56, 55, 53}, + { 50, 49, 36}, + { 50, 36, 35}, + { 40, 39, 41}, + {242,243,229}, + {242,229,227}, + { 6, 37, 39}, + { 42, 47, 48}, + { 42, 48, 43}, + { 61, 46, 44}, + { 45, 70, 69}, + { 69, 70, 71}, + { 69, 71, 49}, + { 74, 78, 77}, + { 83, 84, 85}, + { 73, 74, 77}, + { 93, 96, 92}, + { 68, 46, 93}, + { 95, 99, 63}, + { 95, 63, 59}, + {115,108,110}, + {115,110,114}, + {125,126,127}, + {129,130,132}, + {137,133,138}, + {137,138,139}, + {148,146,143}, + {148,143,147}, + {119,118,154}, + {161,147,143}, + {165,164,151}, + {158,157,171}, + {158,171,172}, + {159,158,187}, + {159,187,186}, + {194,192,191}, + {194,191,193}, + {189,202,201}, + {182,197,184}, + {205, 8, 7}, + { 48,109,107}, + {218,219, 57}, + {218, 57, 56}, + {207,231,211}, + {232,230,231}, + {232,231,233}, + { 53, 52, 31}, + {388,411,386}, + {409,430,250}, + {262,429,254}, + {262,254,256}, + {442,444,428}, + {273,264,383}, + {273,383,384}, + {429,271,251}, + {429,251,254}, + {413,365,362}, + { 67,413,360}, + {282,283,295}, + {285,301,299}, + {202,281,280}, + {284,283,291}, + {284,291,289}, + {320,189,160}, + {308,306,307}, + {307,309,308}, + {319,317,330}, + {319,330,328}, + {353,352,324}, + {332,331,333}, + {340,341,338}, + {354,341,344}, + {349,358,357}, + {349,357,347}, + {364,355,356}, + {364,356,363}, + {364,365,366}, + {364,366,369}, + {374,376,402}, + {375, 92,373}, + { 77,389,390}, + {382,380,381}, + {389, 77,386}, + {393,394,412}, + {393,412,392}, + {401,394,416}, + {415,400,403}, + {411,410,427}, + {411,427,426}, + {422,420,424}, + {247,248,263}, + {247,263,261}, + {445,443, 14}, + {445, 14, 11}, + {449,450, 4}, + {449, 4, 5}, + {443,441, 17}, + {443, 17, 14}, + {436, 23, 17}, + {436, 17,441}, + {424,448,422}, + {448,423,422}, + {414,419,418}, + {414,418,413}, + {406,404,405}, + {399,397,395}, + {399,395,396}, + {420,416,392}, + {388,410,411}, + {386,384,383}, + {390, 88, 77}, + {375, 94, 92}, + {415,414, 68}, + {415, 68, 94}, + {370,374,402}, + {370,402,398}, + {361,357,358}, + {361,358,359}, + {125,348,126}, + {346,344,343}, + {340,338,339}, + {337,335,334}, + {337,334,336}, + {325,353,324}, + {324,331,332}, + {324,332,329}, + {323,322,309}, + {323,309,310}, + {294,295,297}, + {294,297,296}, + {289,286,285}, + {202,280,203}, + {288,307,303}, + {282,295,321}, + { 67,360,111}, + {418,423,367}, + {418,367,366}, + {272,252,251}, + {272,251,271}, + {272,271,270}, + {255,253,274}, + {265,266,380}, + {265,380,382}, + {442,428,261}, + {440,263,258}, + {440,258,260}, + {409,250,410}, + {255,226,245}, + {255,245,246}, + { 31,240,243}, + {236,234,235}, + {236,235,237}, + {233,225,245}, + {233,245,244}, + {220,221, 85}, + {220, 85, 86}, + { 81,213,226}, + { 81,226, 80}, + { 7,206,205}, + {186,184,198}, + {186,198,199}, + {204,203,205}, + {204,205,206}, + {195,193,196}, + {171,174,172}, + {173,174,175}, + {173,172,174}, + {155,167,166}, + {160,161,143}, + {160,143,144}, + {119,154,155}, + {148,151,150}, + {148,150,146}, + {140,137,139}, + {140,139,141}, + {127,126,130}, + {114,124,128}, + {114,128,115}, + {117,105,106}, + {117,106,116}, + {104,105,100}, + {104,100,103}, + { 59, 60, 91}, + { 97, 96, 61}, + { 97, 61, 64}, + { 91, 72, 89}, + { 87, 84, 79}, + { 87, 79, 76}, + { 78, 80, 77}, + { 49, 50, 74}, + { 60, 44, 45}, + { 61, 44, 58}, + { 51, 50, 35}, + { 51, 35, 34}, + { 39, 37, 41}, + { 33, 34, 9}, + { 33, 9, 12}, + { 0, 36, 37}, + { 0, 37, 6}, + { 40, 46, 47}, + { 40, 47, 42}, + { 53, 54, 56}, + { 65, 62, 63}, + { 72, 49, 73}, + { 79, 78, 75}, + { 79, 75, 76}, + { 52, 53, 76}, + { 92, 89, 90}, + { 96, 93, 46}, + {102,103,100}, + {102,100,101}, + {116,106,108}, + {116,108,115}, + {123,125,124}, + {116,115,128}, + {118,131,135}, + {140,135,136}, + {148,147,149}, + {120,119,155}, + {164,162,152}, + {164,152,150}, + {157,147,161}, + {157,161,170}, + {186,187,185}, + {186,185,184}, + {193,197,196}, + {202,203,204}, + {194,195,178}, + {198,184,197}, + { 67,111,109}, + { 38, 43,103}, + { 38,103,102}, + {214,223,222}, + {214,222,221}, + {214,221,220}, + {214,220,219}, + {214,219,218}, + {213,237,235}, + {221,222, 83}, + {221, 83, 85}, + { 15,229, 33}, + {227, 18,230}, + {227,230,232}, + { 52, 51,240}, + { 75, 78, 50}, + {408,430,409}, + {260,258,257}, + {260,257,259}, + {224,207,259}, + {268,269,405}, + {268,405,404}, + {413,362,360}, + {447, 8,205}, + {299,297,285}, + {189,281,202}, + {290,288,289}, + {290,289,291}, + {322,321,295}, + {322,295,294}, + {333,323,311}, + {333,311,320}, + {317,316,329}, + {320,160,144}, + {353,325,326}, + {329,332,334}, + {329,334,330}, + {339,338,141}, + {339,141,139}, + {348,345,126}, + {347,356,346}, + {123,349,125}, + {364,353,354}, + {364,354,355}, + {365,364,363}, + {376,391,394}, + {376,394,401}, + { 92,376,374}, + { 92,374,373}, + {377, 90, 88}, + {380,379,378}, + {380,378,381}, + {388,387,409}, + {388,409,410}, + {416,393,392}, + {399,398,402}, + {399,402,403}, + {250,428,427}, + {421,417,416}, + {421,416,420}, + {426,427,446}, + {426,446,451}, + {444,442,441}, + {452,451,450}, + {452,450,449} +}; diff --git a/applications/utilities/surface/surfaceCoarsen/bunnylod/rabdata.h b/applications/utilities/surface/surfaceCoarsen/bunnylod/rabdata.h new file mode 100644 index 0000000000..6a408d7787 --- /dev/null +++ b/applications/utilities/surface/surfaceCoarsen/bunnylod/rabdata.h @@ -0,0 +1,32 @@ +/* Copyright 1996, Viewpoint Datalabs Int'l, www.viewpoint.com, 1-800-DATASET */ +/* +# Usage Rights: You (the user) may use this model to help build +# cool personal vrml worlds, but please give us credit when you do +# ("3D model provided by Viewpoint Datalabs, www,viewpoint.com"). +# Please don't sell it or use it to make money indirectly. Don't +# redistribute it or put it on a web site except as a part of your +# personal, non-commerical vrml world. If you want to do a +# commercial project, give us a call at 1-800-DATASET or visit +# www.viewpoint.com and we'll help you obtain the rights to do so. +# */ + +/* + * Note that this data was put directly into the program + * to provide a demo program on the net that people could + * just run without having to fetch datafiles. + * i.e. more convienent for the user this way + */ + + +#ifndef RABBIT_DATA_H +#define RABBIT_DATA_H + +#define RABBIT_VERTEX_NUM (453) +#define RABBIT_TRIANGLE_NUM (902) + +extern float rabbit_vertices[RABBIT_VERTEX_NUM][3]; +extern int rabbit_triangles[RABBIT_TRIANGLE_NUM][3]; + + + +#endif diff --git a/applications/utilities/surface/surfaceCoarsen/bunnylod/vector.C b/applications/utilities/surface/surfaceCoarsen/bunnylod/vector.C new file mode 100644 index 0000000000..9bdecbbd32 --- /dev/null +++ b/applications/utilities/surface/surfaceCoarsen/bunnylod/vector.C @@ -0,0 +1,117 @@ +#include +#include +#include + +#include "vector.h" + +float sqr(float a) {return a*a;} + +// vector (floating point) implementation + +float magnitude(Vector v) { + return float(sqrt(sqr(v.x) + sqr( v.y)+ sqr(v.z))); +} +Vector normalize(Vector v) { + float d=magnitude(v); + if (d==0) { + printf("Cant normalize ZERO vector\n"); + assert(0); + d=0.1f; + } + v.x/=d; + v.y/=d; + v.z/=d; + return v; +} + +Vector operator+(Vector v1,Vector v2) +{ + return Vector(v1.x+v2.x,v1.y+v2.y,v1.z+v2.z); +} +Vector operator-(Vector v1,Vector v2) +{ + return Vector(v1.x-v2.x,v1.y-v2.y,v1.z-v2.z); +} +Vector operator-(Vector v) {return Vector(-v.x,-v.y,-v.z);} +Vector operator*(Vector v1,float s) {return Vector(v1.x*s,v1.y*s,v1.z*s);} +Vector operator*(float s, Vector v1) {return Vector(v1.x*s,v1.y*s,v1.z*s);} +Vector operator/(Vector v1,float s) {return v1*(1.0f/s);} +float operator^(Vector v1,Vector v2) +{ + return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z; +} +Vector operator*(Vector v1,Vector v2) { + return Vector( + v1.y * v2.z - v1.z*v2.y, + v1.z * v2.x - v1.x*v2.z, + v1.x * v2.y - v1.y*v2.x); +} +Vector planelineintersection(Vector n,float d,Vector p1,Vector p2){ + // returns the point where the line p1-p2 intersects the plane n&d + Vector dif = p2-p1; + float dn= n^dif; + float t = -(d+(n^p1) )/dn; + return p1 + (dif*t); +} +int concurrent(Vector a,Vector b) { + return(a.x==b.x && a.y==b.y && a.z==b.z); +} + + +// Matrix Implementation +matrix transpose(matrix m) { + return matrix( Vector(m.x.x,m.y.x,m.z.x), + Vector(m.x.y,m.y.y,m.z.y), + Vector(m.x.z,m.y.z,m.z.z)); +} +Vector operator*(matrix m,Vector v){ + m=transpose(m); // since column ordered + return Vector(m.x^v,m.y^v,m.z^v); +} +matrix operator*(matrix m1,matrix m2){ + m1=transpose(m1); + return matrix(m1*m2.x,m1*m2.y,m1*m2.z); +} + +//Quaternion Implementation +Quaternion operator*(Quaternion a,Quaternion b) { + Quaternion c; + c.r = a.r*b.r - a.x*b.x - a.y*b.y - a.z*b.z; + c.x = a.r*b.x + a.x*b.r + a.y*b.z - a.z*b.y; + c.y = a.r*b.y - a.x*b.z + a.y*b.r + a.z*b.x; + c.z = a.r*b.z + a.x*b.y - a.y*b.x + a.z*b.r; + return c; +} +Quaternion operator-(Quaternion q) { + return Quaternion(q.r*-1,q.x,q.y,q.z); +} +Quaternion operator*(Quaternion a,float b) { + return Quaternion(a.r*b, a.x*b, a.y*b, a.z*b); +} +Vector operator*(Quaternion q,Vector v) { + return q.getmatrix() * v; +} +Vector operator*(Vector v,Quaternion q){ + assert(0); // must multiply with the quat on the left + return Vector(0.0f,0.0f,0.0f); +} + +Quaternion operator+(Quaternion a,Quaternion b) { + return Quaternion(a.r+b.r, a.x+b.x, a.y+b.y, a.z+b.z); +} +float operator^(Quaternion a,Quaternion b) { + return (a.r*b.r + a.x*b.x + a.y*b.y + a.z*b.z); +} +Quaternion slerp(Quaternion a,Quaternion b,float interp){ + if((a^b) <0.0) { + a.r=-a.r; + a.x=-a.x; + a.y=-a.y; + a.z=-a.z; + } + float theta = float(acos(a^b)); + if(theta==0.0f) { return(a);} + return + a*float(sin(theta-interp*theta)/sin(theta)) + + b*float(sin(interp*theta)/sin(theta)); +} diff --git a/applications/utilities/surface/surfaceCoarsen/bunnylod/vector.h b/applications/utilities/surface/surfaceCoarsen/bunnylod/vector.h new file mode 100644 index 0000000000..26dd9bbe71 --- /dev/null +++ b/applications/utilities/surface/surfaceCoarsen/bunnylod/vector.h @@ -0,0 +1,79 @@ +// +// This module contains a bunch of well understood functions +// I apologise if the conventions used here are slightly +// different than what you are used to. +// + +#ifndef GENERIC_VECTOR_H +#define GENERIC_VECTOR_H + +#include +#include + + +class Vector { + public: + float x,y,z; + Vector(float _x=0.0,float _y=0.0,float _z=0.0){x=_x;y=_y;z=_z;}; + operator float *() { return &x;}; +}; + +float magnitude(Vector v); +Vector normalize(Vector v); + +Vector operator+(Vector v1,Vector v2); +Vector operator-(Vector v); +Vector operator-(Vector v1,Vector v2); +Vector operator*(Vector v1,float s) ; +Vector operator*(float s,Vector v1) ; +Vector operator/(Vector v1,float s) ; +float operator^(Vector v1,Vector v2); // DOT product +Vector operator*(Vector v1,Vector v2); // CROSS product +Vector planelineintersection(Vector n,float d,Vector p1,Vector p2); + +class matrix{ + public: + Vector x,y,z; + matrix(){x=Vector(1.0f,0.0f,0.0f); + y=Vector(0.0f,1.0f,0.0f); + z=Vector(0.0f,0.0f,1.0f);}; + matrix(Vector _x,Vector _y,Vector _z){x=_x;y=_y;z=_z;}; +}; +matrix transpose(matrix m); +Vector operator*(matrix m,Vector v); +matrix operator*(matrix m1,matrix m2); + +class Quaternion{ + public: + float r,x,y,z; + Quaternion(){x=y=z=0.0f;r=1.0f;}; + Quaternion(Vector v,float t){ + v=normalize(v); + r=float(cos(t/2.0)); + v=v*float(sin(t/2.0)); + x=v.x; + y=v.y; + z=v.z; + }; + Quaternion(float _r,float _x,float _y,float _z){r=_r;x=_x;y=_y;z=_z;}; + float angle(){return float(acos(r)*2.0);} + Vector axis(){Vector a(x,y,z); return a*float(1/sin(angle()/2.0));} + Vector xdir(){ + return Vector(1-2*(y*y+z*z), 2*(x*y+r*z), 2*(x*z-r*y)); + } + Vector ydir(){ + return Vector( 2*(x*y-r*z),1-2*(x*x+z*z), 2*(y*z+r*x)); + } + Vector zdir(){ + return Vector( 2*(x*z+r*y), 2*(y*z-r*x),1-2*(x*x+y*y)); + } + matrix getmatrix(){return matrix(xdir(),ydir(),zdir());} + //operator matrix(){return getmatrix();} +}; +Quaternion operator-(Quaternion q); +Quaternion operator*(Quaternion a,Quaternion b); +Vector operator*(Quaternion q,Vector v); +Vector operator*(Vector v,Quaternion q); +Quaternion slerp(Quaternion a,Quaternion b,float interp); + +#endif diff --git a/applications/utilities/surface/surfaceCoarsen/bunnylod/winmain.C b/applications/utilities/surface/surfaceCoarsen/bunnylod/winmain.C new file mode 100644 index 0000000000..721460cbf6 --- /dev/null +++ b/applications/utilities/surface/surfaceCoarsen/bunnylod/winmain.C @@ -0,0 +1,453 @@ +/* + * Polygon Reduction Demo by Stan Melax (c) 1998 + * Permission to use any of this code wherever you want is granted.. + * Although, please do acknowledge authorship if appropriate. + * + * This module contains the window setup code, mouse input, timing + * routines, and that sort of stuff. The interesting modules + * to see are bunnygut.cpp and progmesh.cpp. + * + * The windows 95 specific code for this application was taken from + * an example of processing mouse events in an OpenGL program using + * the Win32 API from the www.opengl.org web site. + * + * Under Project->Settings, Link Options, General Category + * Add: + * Opengl32.lib glu32.lib winmm.lib + * to the Object/Library Modules + * + * You will need have OpenGL libs and include files to compile this + * Go to the www.opengl.org web site if you need help with this. + */ + + +#include /* must include this before GL/gl.h */ +#include /* OpenGL header file */ +#include /* OpenGL utilities header file */ +#include +#include +#include +#include + +#include "vector.h" +#include "font.h" + +// Functions and Variables from bunny module +extern void InitModel(); +extern void RenderModel(); +extern Vector model_position; // position of bunny +extern Quaternion model_orientation; // orientation of bunny + +// Global Variables +float DeltaT = 0.1f; +float FPS; +int Width = 512; +int Height = 512; +int MouseX = 0; +int MouseY = 0; +Vector MouseVector; // 3D direction mouse points +Vector OldMouseVector; +int MouseState=0; // true iff left button down +float ViewAngle=45.0f; + +HDC hDC; /* device context */ +HPALETTE hPalette = 0; /* custom palette (if needed) */ + + +void CalcFPSDeltaT(){ + static int timeinit=0; + static int start,start2,current,last; + static int frame=0, frame2=0; + if(!timeinit){ + frame=0; + start=timeGetTime(); + timeinit=1; + } + frame++; + frame2++; + current=timeGetTime(); // found in winmm.lib + double dif=(double)(current-start)/CLOCKS_PER_SEC; + double rv = (dif)? (double)frame/(double)dif:-1.0; + if(dif>2.0 && frame >10) { + start = start2; + frame = frame2; + start2 = timeGetTime(); + frame2 = 0; + } + DeltaT = (float)(current-last)/CLOCKS_PER_SEC; + if(current==last) { + DeltaT = 0.1f/CLOCKS_PER_SEC; // it just cant be 0 + } + // if(DeltaT>1.0) DeltaT=1.0; + FPS = (float)rv; + last = current; +} + + +void ComputeMouseVector(){ + OldMouseVector=MouseVector; + float spread = (float)tan(ViewAngle/2*3.14/180); + float y = spread * ((Height-MouseY)-Height/2.0f) /(Height/2.0f); + float x = spread * (MouseX-Width/2.0f) /(Height/2.0f); + Vector v(x ,y,-1); + // v=UserOrientation *v; + v=normalize(v); + MouseVector = v; +} + +Quaternion VirtualTrackBall(Vector cop,Vector cor,Vector dir1,Vector dir2) { + // Implement track ball functionality to spin stuf on the screen + // cop center of projection + // cor center of rotation + // dir1 old mouse direction + // dir2 new mouse direction + // pretend there is a sphere around cor. Then find the points + // where dir1 and dir2 intersect that sphere. Find the + // rotation that takes the first point to the second. + float m; + // compute plane + Vector nrml = cor - cop; + // since trackball proportional to distance from cop + float fudgefactor = 1.0f/(magnitude(nrml) * 0.25f); + nrml = normalize(nrml); + float dist = -(nrml^cor); + Vector u= planelineintersection(nrml,dist,cop,cop+dir1); + u=u-cor; + u=u*fudgefactor; + m= magnitude(u); + if(m>1) {u=u*1.0f/m;} + else { + u=u - (nrml * (float)sqrt(1-m*m)); + } + Vector v= planelineintersection(nrml,dist,cop,cop+dir2); + v=v-cor; + v=v*fudgefactor; + m= magnitude(v); + if(m>1) {v=v*1.0f/m;} + else { + v=v - (nrml * (float)sqrt(1-m*m)); + } + Vector axis = u*v; + float angle; + m=magnitude(axis); + if(m>1)m=1; // avoid potential floating point error + Quaternion q(Vector(1.0f,0.0f,0.0f),0.0f); + if(m>0 && (angle=(float)asin(m))>3.14/180) { + axis = normalize(axis); + q=Quaternion(axis,angle); + } + return q; +} + +void SpinIt(){ + // Change the orientation of the bunny according to mouse drag + Quaternion q=VirtualTrackBall(Vector(0,0,0),model_position, + OldMouseVector,MouseVector); + model_orientation=q*model_orientation; +} + +void Reshape(int width, int height){ + // called initially and when the window changes size + Width=width; + Height=height; + glViewport(0, 0, width, height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(ViewAngle, (float)width/height, 0.1, 50.0); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); +} + +void PrintStats(){ + char buf[1024];buf[0]='\0'; + sprintf(buf,"FPS: %5.2f ",FPS); + PostString(buf,0,-1,0); +} + +void Display(){ + // main drawing routine - called every frame + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glPushMatrix(); + glLoadIdentity(); + // camera at default (zero) position and orientation + RenderModel(); + PrintStats(); + glLoadIdentity(); + RenderStrings(); + glPopMatrix(); + glFlush(); + SwapBuffers(hDC); /* nop if singlebuffered */ +} + + +LONG WINAPI WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + static PAINTSTRUCT ps; + static GLboolean left = GL_FALSE; /* left button currently down? */ + static GLboolean right = GL_FALSE; /* right button currently down? */ + static int omx, omy, mx, my; + + switch(uMsg) { + case WM_PAINT: + BeginPaint(hWnd, &ps); + EndPaint(hWnd, &ps); + return 0; + case WM_SIZE: + Reshape(LOWORD(lParam), HIWORD(lParam)); + PostMessage(hWnd, WM_PAINT, 0, 0); + return 0; + case WM_CHAR: + switch (wParam) { + case 27: /* ESC key */ + PostQuitMessage(0); + break; + } + return 0; + + case WM_LBUTTONDOWN: + /* if we don't set the capture we won't get mouse move + messages when the mouse moves outside the window. */ + SetCapture(hWnd); + MouseX = LOWORD(lParam); + MouseY = HIWORD(lParam); + ComputeMouseVector(); + MouseState = 1; + return 0; + + case WM_LBUTTONUP: + MouseX = LOWORD(lParam); + MouseY = HIWORD(lParam); + if(MouseX & 1 << 15) MouseX -= (1 << 16); + if(MouseY & 1 << 15) MouseY -= (1 << 16); + ComputeMouseVector(); + if(MouseState) SpinIt(); + MouseState=0; + /* remember to release the capture when we are finished. */ + ReleaseCapture(); + return 0; + + case WM_MOUSEMOVE: + MouseX = LOWORD(lParam); + MouseY = HIWORD(lParam); + /* Win32 is pretty braindead about the x, y position that + it returns when the mouse is off the left or top edge + of the window (due to them being unsigned). therefore, + roll the Win32's 0..2^16 pointer co-ord range to the + more amenable (and useful) 0..+/-2^15. */ + if(MouseX & 1 << 15) MouseX -= (1 << 16); + if(MouseY & 1 << 15) MouseY -= (1 << 16); + ComputeMouseVector(); + if(MouseState) SpinIt(); + return 0; + + case WM_PALETTECHANGED: + if (hWnd == (HWND)wParam) break; + /* fall through to WM_QUERYNEWPALETTE */ + case WM_QUERYNEWPALETTE: + if (hPalette) { + UnrealizeObject(hPalette); + SelectPalette(hDC, hPalette, FALSE); + RealizePalette(hDC); + return TRUE; + } + return FALSE; + + case WM_CLOSE: + PostQuitMessage(0); + return 0; + } + return DefWindowProc(hWnd, uMsg, wParam, lParam); +} + +HWND CreateOpenGLWindow(char* title) +{ + // make a double-buffered, rgba, opengl window + int n, pf; + HWND hWnd; + WNDCLASS wc; + LOGPALETTE* lpPal; + PIXELFORMATDESCRIPTOR pfd; + static HINSTANCE hInstance = 0; + + /* only register the window class once - use hInstance as a flag. */ + if (!hInstance) { + hInstance = GetModuleHandle(NULL); + wc.style = CS_OWNDC; + wc.lpfnWndProc = (WNDPROC)WindowProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hInstance; + wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = NULL; + wc.lpszMenuName = NULL; + wc.lpszClassName = "OpenGL"; + + if (!RegisterClass(&wc)) { + MessageBox(NULL, "RegisterClass() failed: " + "Cannot register window class.", + "Error", MB_OK); + return NULL; + } + } + + hWnd = CreateWindow("OpenGL", title, WS_OVERLAPPEDWINDOW | + WS_CLIPSIBLINGS | WS_CLIPCHILDREN, + 0,0,Width,Height, NULL, NULL, hInstance, NULL); + + if (hWnd == NULL) { + MessageBox(NULL, + "CreateWindow() failed: Cannot create a window.", + "Error", MB_OK); + return NULL; + } + + hDC = GetDC(hWnd); + + /* there is no guarantee that the contents of the stack that become + the pfd are zeroed, therefore _make sure_ to clear these bits. */ + memset(&pfd, 0, sizeof(pfd)); + pfd.nSize = sizeof(pfd); + pfd.nVersion = 1; + pfd.dwFlags = PFD_DRAW_TO_WINDOW + | PFD_SUPPORT_OPENGL + | PFD_DOUBLEBUFFER; + pfd.iPixelType = PFD_TYPE_RGBA; + pfd.cDepthBits = 32; + pfd.cColorBits = 32; + + pf = ChoosePixelFormat(hDC, &pfd); + if (pf == 0) { + MessageBox(NULL, "ChoosePixelFormat() failed: " + "Cannot find a suitable pixel format.", + "Error", MB_OK); + return 0; + } + + if (SetPixelFormat(hDC, pf, &pfd) == FALSE) { + MessageBox(NULL, "SetPixelFormat() failed: " + "Cannot set format specified.", "Error", MB_OK); + return 0; + } + + DescribePixelFormat(hDC, pf, sizeof(PIXELFORMATDESCRIPTOR), &pfd); + + if (pfd.dwFlags & PFD_NEED_PALETTE || + pfd.iPixelType == PFD_TYPE_COLORINDEX) { + + n = 1 << pfd.cColorBits; + if (n > 256) n = 256; + + lpPal = (LOGPALETTE*)malloc(sizeof(LOGPALETTE) + + sizeof(PALETTEENTRY) * n); + memset(lpPal, 0, sizeof(LOGPALETTE) + sizeof(PALETTEENTRY) * n); + lpPal->palVersion = 0x300; + lpPal->palNumEntries = n; + + GetSystemPaletteEntries(hDC, 0, n, &lpPal->palPalEntry[0]); + + /* if the pixel type is RGBA, then we want to make an RGB ramp, + otherwise (color index) set individual colors. */ + if (pfd.iPixelType == PFD_TYPE_RGBA) { + int redMask = (1 << pfd.cRedBits) - 1; + int greenMask = (1 << pfd.cGreenBits) - 1; + int blueMask = (1 << pfd.cBlueBits) - 1; + int i; + + /* fill in the entries with an RGB color ramp. */ + for (i = 0; i < n; ++i) { + lpPal->palPalEntry[i].peRed = + (((i >> pfd.cRedShift) & redMask) * 255) + /redMask; + lpPal->palPalEntry[i].peGreen = + (((i >> pfd.cGreenShift) & greenMask) * 255) + /greenMask; + lpPal->palPalEntry[i].peBlue = + (((i >> pfd.cBlueShift) & blueMask) * 255) + /blueMask; + lpPal->palPalEntry[i].peFlags = 0; + } + } else { + lpPal->palPalEntry[0].peRed = 0; + lpPal->palPalEntry[0].peGreen = 0; + lpPal->palPalEntry[0].peBlue = 0; + lpPal->palPalEntry[0].peFlags = PC_NOCOLLAPSE; + lpPal->palPalEntry[1].peRed = 255; + lpPal->palPalEntry[1].peGreen = 0; + lpPal->palPalEntry[1].peBlue = 0; + lpPal->palPalEntry[1].peFlags = PC_NOCOLLAPSE; + lpPal->palPalEntry[2].peRed = 0; + lpPal->palPalEntry[2].peGreen = 255; + lpPal->palPalEntry[2].peBlue = 0; + lpPal->palPalEntry[2].peFlags = PC_NOCOLLAPSE; + lpPal->palPalEntry[3].peRed = 0; + lpPal->palPalEntry[3].peGreen = 0; + lpPal->palPalEntry[3].peBlue = 255; + lpPal->palPalEntry[3].peFlags = PC_NOCOLLAPSE; + } + + hPalette = CreatePalette(lpPal); + if (hPalette) { + SelectPalette(hDC, hPalette, FALSE); + RealizePalette(hDC); + } + + free(lpPal); + } + + ReleaseDC(hDC, hWnd); + return hWnd; +} + +int APIENTRY WinMain(HINSTANCE hCurrentInst, HINSTANCE hPreviousInst, + LPSTR lpszCmdLine, int nCmdShow) +{ + HGLRC hRC; /* opengl context */ + HWND hWnd; /* window */ + MSG msg; /* message */ + + // InitModel() initializes some data structures and + // does the progressive mesh polygon reduction algorithm + // on the model. + CalcFPSDeltaT(); // to time the algorithm + InitModel(); + CalcFPSDeltaT(); + + hWnd = CreateOpenGLWindow("bunnylod by Stan Melax"); + if (hWnd == NULL) exit(1); + + hDC = GetDC(hWnd); + hRC = wglCreateContext(hDC); + wglMakeCurrent(hDC, hRC); + ShowWindow(hWnd, nCmdShow); + glEnable(GL_DEPTH_TEST); + + PostString("Demo by Stan Melax (c)1998",5,-5,20); + PostString("Model by Viewpoint Datalabs (c)1996",5,-4,20); + char buf[128]; + PostString("Mesh Reduction Algorithm (non-optimized)",1,0,5); + sprintf(buf,"was executed in %5.3f seconds",DeltaT); + PostString(buf,2,1,6); + + while (1) { + while(PeekMessage(&msg, hWnd, 0, 0, PM_NOREMOVE)) { + if(GetMessage(&msg, hWnd, 0, 0)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } else { + // This 'goto' was in the sample code + goto quit; + } + } + CalcFPSDeltaT(); + Display(); + } + + quit: + wglMakeCurrent(NULL, NULL); + ReleaseDC(hDC, hWnd); + wglDeleteContext(hRC); + DestroyWindow(hWnd); + if (hPalette) DeleteObject(hPalette); + return msg.wParam; +} diff --git a/tutorials/incompressible/simpleSRFFoam/mixer/constant/polyMesh/boundary b/tutorials/incompressible/simpleSRFFoam/mixer/constant/polyMesh/boundary new file mode 100644 index 0000000000..092c65fdd9 --- /dev/null +++ b/tutorials/incompressible/simpleSRFFoam/mixer/constant/polyMesh/boundary @@ -0,0 +1,60 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class polyBoundaryMesh; + location "constant/polyMesh"; + object boundary; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +6 +( + inlet + { + type patch; + nFaces 840; + startFace 96680; + } + outlet + { + type patch; + nFaces 840; + startFace 97520; + } + innerWall + { + type wall; + nFaces 2480; + startFace 98360; + } + outerWall + { + type wall; + nFaces 880; + startFace 100840; + } + cyclic_half0 + { + type cyclic; + nFaces 1600; + startFace 101720; + neighbourPatch cyclic_half1; + } + cyclic_half1 + { + type cyclic; + nFaces 1600; + startFace 103320; + neighbourPatch cyclic_half0; + } +) + +// ************************************************************************* //