From c07e9f66000e794148c802956294827dc823b043 Mon Sep 17 00:00:00 2001 From: mattijs Date: Wed, 23 Feb 2011 16:51:46 +0000 Subject: [PATCH 1/8] ENH: coupledPolyPatch: pass in transform type to enable 180 degree rotations --- .../basic/coupled/coupledPolyPatch.C | 38 +++++++++++++++---- .../basic/coupled/coupledPolyPatch.H | 21 +++++++++- .../constraint/cyclic/cyclicPolyPatch.C | 20 ++-------- .../constraint/cyclic/cyclicPolyPatch.H | 14 ------- 4 files changed, 53 insertions(+), 40 deletions(-) diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.C b/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.C index 34b2b091de..b26b225690 100644 --- a/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.C +++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -30,9 +30,24 @@ License // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -defineTypeNameAndDebug(Foam::coupledPolyPatch, 0); +namespace Foam +{ + defineTypeNameAndDebug(coupledPolyPatch, 0); -Foam::scalar Foam::coupledPolyPatch::matchTol = 1E-3; + scalar coupledPolyPatch::matchTol = 1E-3; + + template<> + const char* NamedEnum::names[] = + { + "unknown", + "rotational", + "translational", + "noOrdering" + }; + + const NamedEnum + coupledPolyPatch::transformTypeNames; +} // * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // @@ -204,12 +219,14 @@ void Foam::coupledPolyPatch::calcTransformTensors const vectorField& nf, const vectorField& nr, const scalarField& smallDist, - const scalar absTol + const scalar absTol, + const transformType transform ) const { if (debug) { Pout<< "coupledPolyPatch::calcTransformTensors : " << name() << endl + << " transform:" << transformTypeNames[transform] << nl << " (half)size:" << Cf.size() << nl << " absTol:" << absTol << nl << " smallDist min:" << min(smallDist) << nl @@ -242,9 +259,16 @@ void Foam::coupledPolyPatch::calcTransformTensors Pout<< " error:" << error << endl; } - if (sum(mag(nf & nr)) < Cf.size()-error) + if + ( + transform == ROTATIONAL + || ( + transform != TRANSLATIONAL + && (sum(mag(nf & nr)) < Cf.size()-error) + ) + ) { - // Rotation, no separation + // Type is rotation or unknown and normals not aligned // Assume per-face differing transformation, correct later @@ -284,7 +308,7 @@ void Foam::coupledPolyPatch::calcTransformTensors } else { - // No rotation, possible separation + // Translational or (unknown and normals aligned) forwardT_.setSize(0); reverseT_.setSize(0); diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.H b/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.H index 31fc9bcb1b..682e9962b6 100644 --- a/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.H +++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -53,6 +53,20 @@ class coupledPolyPatch : public polyPatch { +public: + + enum transformType + { + UNKNOWN, // unspecified; automatic ordering + ROTATIONAL, // rotation along coordinate axis + TRANSLATIONAL, // translation + NOORDERING // unspecified, no automatic ordering + }; + static const NamedEnum transformTypeNames; + + +private: + // Private data //- offset (distance) vector from one side of the couple to the other @@ -82,6 +96,8 @@ protected: //- Calculate the transformation tensors // smallDist : matching distance per face // absTol : absolute error in normal + // if transformType = unknown it first tries rotational, then + // translational transform void calcTransformTensors ( const vectorField& Cf, @@ -89,7 +105,8 @@ protected: const vectorField& nf, const vectorField& nr, const scalarField& smallDist, - const scalar absTol = matchTol + const scalar absTol = matchTol, + const transformType = UNKNOWN ) const; //- Initialise the calculation of the patch geometry diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.C b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.C index a5039132f9..03032fbb53 100644 --- a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.C +++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.C @@ -44,24 +44,8 @@ namespace Foam addToRunTimeSelectionTable(polyPatch, cyclicPolyPatch, word); addToRunTimeSelectionTable(polyPatch, cyclicPolyPatch, dictionary); - - template<> - const char* Foam::NamedEnum - < - Foam::cyclicPolyPatch::transformType, - 4 - >::names[] = - { - "unknown", - "rotational", - "translational", - "noOrdering" - }; } -const Foam::NamedEnum - Foam::cyclicPolyPatch::transformTypeNames; - // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -271,7 +255,9 @@ void Foam::cyclicPolyPatch::calcTransforms static_cast(half1Ctrs), half0Normals, half1Normals, - half0Tols + half0Tols, + matchTol, + transform_ ); if (transform_ == ROTATIONAL && !parallel() && forwardT().size() > 1) diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.H b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.H index dd0d14db86..68a008bded 100644 --- a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.H +++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.H @@ -64,20 +64,6 @@ class cyclicPolyPatch : public coupledPolyPatch { -public: - - enum transformType - { - UNKNOWN, // unspecified; automatic ordering - ROTATIONAL, // rotation along coordinate axis - TRANSLATIONAL, // translation - NOORDERING // unspecified, no automatic ordering - }; - static const NamedEnum transformTypeNames; - - -private: - // Private data //- Name of other half From acc8d7714af971bfd708b1b5ecabb4b5a262db74 Mon Sep 17 00:00:00 2001 From: mattijs Date: Thu, 24 Feb 2011 10:44:22 +0000 Subject: [PATCH 2/8] BUG: Time.C: adjustTimeStep overflow of scalar --- src/OpenFOAM/db/Time/Time.C | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/OpenFOAM/db/Time/Time.C b/src/OpenFOAM/db/Time/Time.C index f7566f5f93..af3b5544d8 100644 --- a/src/OpenFOAM/db/Time/Time.C +++ b/src/OpenFOAM/db/Time/Time.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -86,18 +86,25 @@ void Foam::Time::adjustDeltaT() (outputTimeIndex_ + 1)*writeInterval_ - (value() - startTime_) ); - label nStepsToNextWrite = label(timeToNextWrite/deltaT_ - SMALL) + 1; - scalar newDeltaT = timeToNextWrite/nStepsToNextWrite; + scalar nSteps = timeToNextWrite/deltaT_ - SMALL; - // Control the increase of the time step to within a factor of 2 - // and the decrease within a factor of 5. - if (newDeltaT >= deltaT_) + // For tiny deltaT the label can overflow! + if (nSteps < labelMax) { - deltaT_ = min(newDeltaT, 2.0*deltaT_); - } - else - { - deltaT_ = max(newDeltaT, 0.2*deltaT_); + label nStepsToNextWrite = label(nSteps) + 1; + + scalar newDeltaT = timeToNextWrite/nStepsToNextWrite; + + // Control the increase of the time step to within a factor of 2 + // and the decrease within a factor of 5. + if (newDeltaT >= deltaT_) + { + deltaT_ = min(newDeltaT, 2.0*deltaT_); + } + else + { + deltaT_ = max(newDeltaT, 0.2*deltaT_); + } } } } From 98f269edafba523a243ca4c97fcc6354308e0782 Mon Sep 17 00:00:00 2001 From: mattijs Date: Thu, 24 Feb 2011 10:45:01 +0000 Subject: [PATCH 3/8] STYLE: surfaceCoarsen: remove orhpaned files --- .../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 deletions(-) delete mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/README delete mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/bunnygut.C delete mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/bunnylod.dsp delete mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/bunnylod.dsw delete mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/font.h delete mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/list.h delete mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/progmesh.C delete mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/progmesh.h delete mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/rabdata.C delete mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/rabdata.h delete mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/vector.C delete mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/vector.h delete mode 100644 applications/utilities/surface/surfaceCoarsen/bunnylod/winmain.C delete 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 deleted file mode 100644 index f62b96bc25..0000000000 --- a/applications/utilities/surface/surfaceCoarsen/bunnylod/README +++ /dev/null @@ -1,12 +0,0 @@ - - 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 deleted file mode 100644 index 3e78b37861..0000000000 --- a/applications/utilities/surface/surfaceCoarsen/bunnylod/bunnygut.C +++ /dev/null @@ -1,282 +0,0 @@ -/* - * 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 deleted file mode 100644 index 0109cfe725..0000000000 --- a/applications/utilities/surface/surfaceCoarsen/bunnylod/bunnylod.dsp +++ /dev/null @@ -1,114 +0,0 @@ -# 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 deleted file mode 100644 index 8abda09402..0000000000 --- a/applications/utilities/surface/surfaceCoarsen/bunnylod/bunnylod.dsw +++ /dev/null @@ -1,29 +0,0 @@ -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 deleted file mode 100644 index 196f5de7f6..0000000000 --- a/applications/utilities/surface/surfaceCoarsen/bunnylod/font.h +++ /dev/null @@ -1,8 +0,0 @@ -#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 deleted file mode 100644 index 1c19f0d99c..0000000000 --- a/applications/utilities/surface/surfaceCoarsen/bunnylod/list.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - * 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 deleted file mode 100644 index 337095d7f9..0000000000 --- a/applications/utilities/surface/surfaceCoarsen/bunnylod/rabdata.C +++ /dev/null @@ -1,1383 +0,0 @@ -/* 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 deleted file mode 100644 index 6a408d7787..0000000000 --- a/applications/utilities/surface/surfaceCoarsen/bunnylod/rabdata.h +++ /dev/null @@ -1,32 +0,0 @@ -/* 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 deleted file mode 100644 index 9bdecbbd32..0000000000 --- a/applications/utilities/surface/surfaceCoarsen/bunnylod/vector.C +++ /dev/null @@ -1,117 +0,0 @@ -#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 deleted file mode 100644 index 26dd9bbe71..0000000000 --- a/applications/utilities/surface/surfaceCoarsen/bunnylod/vector.h +++ /dev/null @@ -1,79 +0,0 @@ -// -// 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 deleted file mode 100644 index 721460cbf6..0000000000 --- a/applications/utilities/surface/surfaceCoarsen/bunnylod/winmain.C +++ /dev/null @@ -1,453 +0,0 @@ -/* - * 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 deleted file mode 100644 index 092c65fdd9..0000000000 --- a/tutorials/incompressible/simpleSRFFoam/mixer/constant/polyMesh/boundary +++ /dev/null @@ -1,60 +0,0 @@ -/*--------------------------------*- 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; - } -) - -// ************************************************************************* // From b130e62ccaa3a4cd2d6fa0a04c218cc33bc70701 Mon Sep 17 00:00:00 2001 From: mattijs Date: Thu, 24 Feb 2011 12:04:23 +0000 Subject: [PATCH 4/8] ENH: simpleSRFSimpleFoam: blockMeshDict new syntax --- .../mixer/constant/polyMesh/blockMeshDict | 67 ++++++++++++++----- 1 file changed, 51 insertions(+), 16 deletions(-) diff --git a/tutorials/incompressible/simpleSRFFoam/mixer/constant/polyMesh/blockMeshDict b/tutorials/incompressible/simpleSRFFoam/mixer/constant/polyMesh/blockMeshDict index 8decdddd8c..204134e5b4 100644 --- a/tutorials/incompressible/simpleSRFFoam/mixer/constant/polyMesh/blockMeshDict +++ b/tutorials/incompressible/simpleSRFFoam/mixer/constant/polyMesh/blockMeshDict @@ -70,45 +70,80 @@ edges arc 23 19 ( 0.034 0.094 2.000 ) ); -patches +boundary ( - patch inlet - ( + inlet + { + type patch; + faces + ( (13 12 21 16) (14 13 16 18) (15 14 18 20) (17 22 12 13) (23 19 14 15) - ) - patch outlet - ( + ); + } + outlet + { + type patch; + faces + ( (1 4 9 0) (2 6 4 1) (3 8 6 2) (5 1 0 10) (11 3 2 7) - ) - wall innerWall - ( + ); + } + innerWall + { + type wall; + faces + ( (2 1 13 14) (5 10 22 17) (5 17 13 1) (11 7 19 23) (7 2 14 19) - ) - wall outerWall - ( + ); + } + outerWall + { + type wall; + faces + ( (4 16 21 9) (6 18 16 4) (8 20 18 6) - ) - cyclic cyclic - ( + ); + } + cyclic_half0 + { + type cyclic; + neighbourPatch cyclic_half1; + transform rotational; + rotationAxis (0 0 1); + rotationCentre (0 0 0); + faces + ( (0 9 21 12) (10 0 12 22) + ); + } + cyclic_half1 + { + type cyclic; + neighbourPatch cyclic_half0; + transform rotational; + rotationAxis (0 0 1); + rotationCentre (0 0 0); + faces + ( (3 15 20 8) (11 23 15 3) - ) + ); + } ); mergeMatchPairs From e4f00d6b83a78d7cc373a33a6cbbd44dd84bf489 Mon Sep 17 00:00:00 2001 From: mattijs Date: Tue, 1 Mar 2011 15:00:38 +0000 Subject: [PATCH 5/8] 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; + } +) + +// ************************************************************************* // From 63ecc03d760250f340c3ccfbc24818fb707aa1c0 Mon Sep 17 00:00:00 2001 From: mattijs Date: Tue, 1 Mar 2011 18:02:51 +0000 Subject: [PATCH 6/8] STYLE: snappyHexMeshDict: updated comment --- .../utilities/mesh/generation/snappyHexMesh/snappyHexMeshDict | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMeshDict b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMeshDict index 1a27956dbc..8ee2c4b74c 100644 --- a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMeshDict +++ b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMeshDict @@ -270,7 +270,7 @@ addLayersControls //- If points get not extruded do nGrow layers of connected faces that are // also not grown. This helps convergence of the layer addition process // close to features. - // Note: changed(corrected) w.r.t 16x! (didn't do anything in 16x) + // Note: changed(corrected) w.r.t 17x! (didn't do anything in 17x) nGrow 0; @@ -301,7 +301,7 @@ addLayersControls maxThicknessToMedialRatio 0.3; // Angle used to pick up medial axis points - // Note: changed(corrected) w.r.t 16x! 90 degrees corresponds to 130 in 16x. + // Note: changed(corrected) w.r.t 17x! 90 degrees corresponds to 130 in 17x. minMedianAxisAngle 90; // Create buffer region for new layer terminations From 9ae801944682dd1022e94d4629d550a209aceb08 Mon Sep 17 00:00:00 2001 From: mattijs Date: Tue, 1 Mar 2011 18:03:34 +0000 Subject: [PATCH 7/8] STYLE: directMappedPatchBase.C: date --- .../directMappedPolyPatch/directMappedPatchBase.C | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/meshTools/directMapped/directMappedPolyPatch/directMappedPatchBase.C b/src/meshTools/directMapped/directMappedPolyPatch/directMappedPatchBase.C index fee6f86ff4..544245faf5 100644 --- a/src/meshTools/directMapped/directMappedPolyPatch/directMappedPatchBase.C +++ b/src/meshTools/directMapped/directMappedPolyPatch/directMappedPatchBase.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -709,16 +709,17 @@ Foam::directMappedPatchBase::directMappedPatchBase } else { - FatalErrorIn + FatalIOErrorIn ( "directMappedPatchBase::directMappedPatchBase\n" "(\n" " const polyPatch& pp,\n" " const dictionary& dict\n" - ")\n" + ")\n", + dict ) << "Please supply the offsetMode as one of " << NamedEnum::words() - << exit(FatalError); + << exit(FatalIOError); } } From 1a3639371a0c38bcfb613ebc1f1bcc1e31a2ab96 Mon Sep 17 00:00:00 2001 From: mattijs Date: Tue, 1 Mar 2011 18:04:03 +0000 Subject: [PATCH 8/8] ENH: radiationCoupledBase.C: FatalIOError instead of FatalError --- .../radiationCoupledBase/radiationCoupledBase.C | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/thermophysicalModels/radiationModels/derivedFvPatchFields/radiationCoupledBase/radiationCoupledBase.C b/src/thermophysicalModels/radiationModels/derivedFvPatchFields/radiationCoupledBase/radiationCoupledBase.C index eab4624c29..f8d034ca34 100644 --- a/src/thermophysicalModels/radiationModels/derivedFvPatchFields/radiationCoupledBase/radiationCoupledBase.C +++ b/src/thermophysicalModels/radiationModels/derivedFvPatchFields/radiationCoupledBase/radiationCoupledBase.C @@ -81,17 +81,18 @@ Foam::radiationCoupledBase::radiationCoupledBase { if (!isA(patch_.patch())) { - FatalErrorIn + FatalIOErrorIn ( "radiationCoupledBase::radiationCoupledBase\n" "(\n" " const fvPatch& p,\n" " const dictionary& dict\n" - ")\n" + ")\n", + dict ) << "\n patch type '" << patch_.type() << "' not type '" << directMappedPatchBase::typeName << "'" << "\n for patch " << patch_.name() - << exit(FatalError); + << exit(FatalIOError); } emissivity_ = scalarField(patch_.size(), 0.0); @@ -102,16 +103,17 @@ Foam::radiationCoupledBase::radiationCoupledBase { if(!dict.found("emissivity")) { - FatalErrorIn + FatalIOErrorIn ( "radiationCoupledBase::radiationCoupledBase\n" "(\n" " const fvPatch& p,\n" " const dictionary& dict\n" - ")\n" + ")\n", + dict ) << "\n emissivity key does not exist for patch " << patch_.name() - << exit(FatalError); + << exit(FatalIOError); } else {