diff --git a/.gitattributes b/.gitattributes index ec3bfe3d..bf8bf302 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,5 +1,4 @@ * -crlf - *.0 -diff -crlf *.1 crlf=input *.3 crlf=input @@ -27,7 +26,7 @@ branch-manager crlf=input BSDmakefile crlf=input bsp2ent crlf=input *.bsp -diff -crlf -*.cache -diff -crlf +*.cache crlf=input *.cbp -crlf *.cbp -diff -crlf *.c crlf=input @@ -44,15 +43,20 @@ COPYING crlf=input *.cpp crlf=input create crlf=input *.cron crlf=input +crypto-keygen-standalone -diff -crlf *.css crlf=input *.cvswrappers crlf=input +*.d0ir crlf=input *.d0pk -diff -crlf -*.db -diff -crlf +*.db crlf=input +*.db.* crlf=input +*.def2ent crlf=input *.default crlf=input *.def crlf=input *.dem -diff -crlf *.dev -crlf dir -diff -crlf +*.directory crlf=input djpeg -diff -crlf *.dll -diff -crlf DOCS -diff -crlf @@ -68,9 +72,13 @@ Doxyfile crlf=input *.dylib -diff -crlf empty -diff -crlf *.EncoderPlugin crlf=input +*.ent crlf=input +etc_svc_git-daemon_run crlf=input *.flac -diff -crlf +*.flp -diff -crlf *.form crlf=input *.framegroups crlf=input +*.fteqccfail -diff -crlf *.game crlf=input *.gdb crlf=input gendox crlf=input @@ -92,10 +100,13 @@ git-svn-update crlf=input git-update-octopus crlf=input *.glp crlf=input *.glsl crlf=input +GPL-2 crlf=input +GPL-3 crlf=input GPL crlf=input *.hardwired crlf=input *.h crlf=input *.hs crlf=input +*.htaccess crlf=input *.html crlf=input *.html-part crlf=input *.icns -diff -crlf @@ -108,7 +119,7 @@ GPL crlf=input *.info-2 -diff -crlf *.info -diff -crlf *.inl crlf=input -*.instantaction crlf=input +*.iOS crlf=input *.iqm -diff -crlf *.java crlf=input *.jhm crlf=input @@ -140,25 +151,31 @@ makespr32 crlf=input *.mkdir -diff -crlf *.mmpz -diff -crlf *.modules crlf=input +*.mp3 -diff -crlf *.nib -crlf *.obj -crlf OFFSETS -diff -crlf *.ogg -diff -crlf *.options crlf=input +*.otf -diff -crlf pangorc crlf=input +*.part crlf=input *.patch crlf=input *.patchsets crlf=input +*.pbxproj crlf=input *.pc crlf=input -*.pcx -diff -crlf *.pfb -diff -crlf *.pfm -diff -crlf +*.php crlf=input *.pk3 -diff -crlf PkgInfo crlf=input *.pl crlf=input *.plist crlf=input *.pm crlf=input *.png -diff -crlf +*.po crlf=input POSITIONS -diff -crlf +*.pot crlf=input *.proj -crlf *.properties crlf=input *.psd -diff -crlf @@ -167,17 +184,19 @@ POSITIONS -diff -crlf *.qc crlf=input *.qdt crlf=input *.qh crlf=input +*.rar -diff -crlf *.rb crlf=input *.rc2 crlf=input *.rc -crlf rdjpgcom -diff -crlf *.readme crlf=input README crlf=input -*.rtlights -diff -crlf +*.rtlights crlf=input SCHEMA crlf=input *.scm crlf=input sdl-config crlf=input SDL -diff -crlf +*.sfd -diff -crlf *.shader crlf=input *.sh crlf=input *.skin crlf=input @@ -196,15 +215,16 @@ TMAP -diff -crlf todo crlf=input TODO crlf=input *.ttf -diff -crlf -*.TTF -diff -crlf *.txt crlf=input +*.txt.* crlf=input update-shaderlists crlf=input *.vbs -crlf *.vcproj -crlf +*.vcxproj crlf=input versionbuilder crlf=input +*.vhost crlf=input *.wav -diff -crlf -*.waypoints -diff -crlf -w crlf=input +*.waypoints crlf=input *.width crlf=input *.workspace -crlf wrjpgcom -diff -crlf @@ -214,9 +234,9 @@ wrjpgcom -diff -crlf xonotic-map-compiler-autobuild crlf=input xonotic-map-compiler crlf=input xonotic-map-screenshot crlf=input -xonotic-osx-agl crlf=input xonotic-osx-sdl crlf=input *.xpm crlf=input +*.xrns -diff -crlf *.zip -diff -crlf zipdiff crlf=input *.zym -diff -crlf diff --git a/radiant/patch.cpp b/radiant/patch.cpp index ac96240f..5b2622bb 100644 --- a/radiant/patch.cpp +++ b/radiant/patch.cpp @@ -1400,6 +1400,90 @@ void Patch::ConstructPrefab(const AABB& aabb, EPatchPrefab eType, int axis, std: return; } } + else if (eType == eXactCylinder) + { + int n = (width - 1) / 2; // n = number of segments + setDims(width, height); + + // vPos[0] = vector3_subtracted(aabb.origin, aabb.extents); + // vPos[1] = aabb.origin; + // vPos[2] = vector3_added(aabb.origin, aabb.extents); + + int i, j; + float f = 1 / cos(M_PI / n); + for(i = 0; i < width; ++i) + { + float angle = (M_PI * i) / n; // 0 to 2pi + float x = vPos[1][0] + (vPos[2][0] - vPos[1][0]) * cos(angle) * ((i&1) ? f : 1.0f); + float y = vPos[1][1] + (vPos[2][1] - vPos[1][1]) * sin(angle) * ((i&1) ? f : 1.0f); + for(j = 0; j < height; ++j) + { + float z = vPos[0][2] + (vPos[2][2] - vPos[0][2]) * (j / (float)(height - 1)); + PatchControl *v; + v = &m_ctrl.data()[j*width+i]; + v->m_vertex[0] = x; + v->m_vertex[1] = y; + v->m_vertex[2] = z; + } + } + } + else if (eType == eXactCone) + { + int n = (width - 1) / 2; // n = number of segments + setDims(width, height); + + // vPos[0] = vector3_subtracted(aabb.origin, aabb.extents); + // vPos[1] = aabb.origin; + // vPos[2] = vector3_added(aabb.origin, aabb.extents); + + int i, j; + float f = 1 / cos(M_PI / n); + for(i = 0; i < width; ++i) + { + float angle = (M_PI * i) / n; + for(j = 0; j < height; ++j) + { + float x = vPos[1][0] + (1.0f - (j / (float)(height - 1))) * (vPos[2][0] - vPos[1][0]) * cos(angle) * ((i&1) ? f : 1.0f); + float y = vPos[1][1] + (1.0f - (j / (float)(height - 1))) * (vPos[2][1] - vPos[1][1]) * sin(angle) * ((i&1) ? f : 1.0f); + float z = vPos[0][2] + (vPos[2][2] - vPos[0][2]) * (j / (float)(height - 1)); + PatchControl *v; + v = &m_ctrl.data()[j*width+i]; + v->m_vertex[0] = x; + v->m_vertex[1] = y; + v->m_vertex[2] = z; + } + } + } + else if (eType == eXactSphere) + { + int n = (width - 1) / 2; // n = number of segments (yaw) + int m = (height - 1) / 2; // m = number of segments (pitch) + setDims(width, height); + + // vPos[0] = vector3_subtracted(aabb.origin, aabb.extents); + // vPos[1] = aabb.origin; + // vPos[2] = vector3_added(aabb.origin, aabb.extents); + + int i, j; + float f = 1 / cos(M_PI / n); + float g = 1 / cos(M_PI / (2*m)); + for(i = 0; i < width; ++i) + { + float angle = (M_PI * i) / n; + for(j = 0; j < height; ++j) + { + float angle2 = (M_PI * j) / (2*m); + float x = vPos[1][0] + (vPos[2][0] - vPos[1][0]) * sin(angle2) * ((j&1) ? g : 1.0f) * cos(angle) * ((i&1) ? f : 1.0f); + float y = vPos[1][1] + (vPos[2][1] - vPos[1][1]) * sin(angle2) * ((j&1) ? g : 1.0f) * sin(angle) * ((i&1) ? f : 1.0f); + float z = vPos[1][2] + (vPos[2][2] - vPos[1][2]) * -cos(angle2) * ((j&1) ? g : 1.0f); + PatchControl *v; + v = &m_ctrl.data()[j*width+i]; + v->m_vertex[0] = x; + v->m_vertex[1] = y; + v->m_vertex[2] = z; + } + } + } else if (eType == eBevel) { unsigned char *pIndex; diff --git a/radiant/patch.h b/radiant/patch.h index d55e712b..403c43bc 100644 --- a/radiant/patch.h +++ b/radiant/patch.h @@ -102,6 +102,9 @@ enum EPatchPrefab eSqCylinder, eCone, eSphere, + eXactCylinder, + eXactSphere, + eXactCone, }; enum EMatrixMajor diff --git a/radiant/patchmanip.cpp b/radiant/patchmanip.cpp index b8bccee6..6829fee7 100644 --- a/radiant/patchmanip.cpp +++ b/radiant/patchmanip.cpp @@ -432,6 +432,29 @@ AABB PatchCreator_getBounds() return AABB(Vector3(0, 0, 0), Vector3(64, 64, 64)); } +void DoNewPatchDlg(EPatchPrefab prefab, int minrows, int mincols, int defrows, int defcols, int maxrows, int maxcols); + +void Patch_XactCylinder() +{ + UndoableCommand undo("patchCreateXactCylinder"); + + DoNewPatchDlg(eXactCylinder, 3, 7, 3, 13, 0, 0); +} + +void Patch_XactSphere() +{ + UndoableCommand undo("patchCreateXactSphere"); + + DoNewPatchDlg(eXactSphere, 5, 7, 7, 13, 0, 0); +} + +void Patch_XactCone() +{ + UndoableCommand undo("patchCreateXactCone"); + + DoNewPatchDlg(eXactCone, 3, 7, 3, 13, 0, 0); +} + void Patch_Cylinder() { UndoableCommand undo("patchCreateCylinder"); @@ -496,13 +519,11 @@ void Patch_Cone() Scene_PatchConstructPrefab(GlobalSceneGraph(), PatchCreator_getBounds(), TextureBrowser_GetSelectedShader(GlobalTextureBrowser()), eCone, GlobalXYWnd_getCurrentViewType()); } -void DoNewPatchDlg(); - void Patch_Plane() { UndoableCommand undo("patchCreatePlane"); - DoNewPatchDlg(); + DoNewPatchDlg(ePlane, 3, 3, 3, 3, 0, 0); } void Patch_InsertInsertColumn() @@ -746,6 +767,9 @@ void Patch_registerCommands() GlobalCommands_insert("PatchDenseCylinder", FreeCaller()); GlobalCommands_insert("PatchVeryDenseCylinder", FreeCaller()); GlobalCommands_insert("PatchSquareCylinder", FreeCaller()); + GlobalCommands_insert("PatchXactCylinder", FreeCaller()); + GlobalCommands_insert("PatchXactSphere", FreeCaller()); + GlobalCommands_insert("PatchXactCone", FreeCaller()); GlobalCommands_insert("PatchEndCap", FreeCaller()); GlobalCommands_insert("PatchBevel", FreeCaller()); GlobalCommands_insert("PatchSquareBevel", FreeCaller()); @@ -788,6 +812,7 @@ void Patch_constructMenu(GtkMenu* menu) create_menu_item_with_mnemonic(menu_in_menu, "Dense Cylinder", "PatchDenseCylinder"); create_menu_item_with_mnemonic(menu_in_menu, "Very Dense Cylinder", "PatchVeryDenseCylinder"); create_menu_item_with_mnemonic(menu_in_menu, "Square Cylinder", "PatchSquareCylinder"); + create_menu_item_with_mnemonic(menu_in_menu, "Exact Cylinder...", "PatchXactCylinder"); } menu_separator (menu); create_menu_item_with_mnemonic(menu, "End cap", "PatchEndCap"); @@ -801,7 +826,10 @@ void Patch_constructMenu(GtkMenu* menu) } menu_separator (menu); create_menu_item_with_mnemonic(menu, "Cone", "PatchCone"); + create_menu_item_with_mnemonic(menu, "Exact Cone...", "PatchXactCone"); + menu_separator (menu); create_menu_item_with_mnemonic(menu, "Sphere", "PatchSphere"); + create_menu_item_with_mnemonic(menu, "Exact Sphere...", "PatchXactSphere"); menu_separator (menu); create_menu_item_with_mnemonic(menu, "Simple Patch Mesh...", "SimplePatchMesh"); menu_separator (menu); @@ -866,7 +894,7 @@ void Patch_constructMenu(GtkMenu* menu) #include "gtkutil/dialog.h" #include "gtkutil/widget.h" -void DoNewPatchDlg() +void DoNewPatchDlg(EPatchPrefab prefab, int minrows, int mincols, int defrows, int defcols, int maxrows, int maxcols) { ModalDialog dialog; GtkComboBox* width; @@ -902,21 +930,23 @@ void DoNewPatchDlg() { GtkComboBox* combo = GTK_COMBO_BOX(gtk_combo_box_new_text()); - gtk_combo_box_append_text(combo, "3"); - gtk_combo_box_append_text(combo, "5"); - gtk_combo_box_append_text(combo, "7"); - gtk_combo_box_append_text(combo, "9"); - gtk_combo_box_append_text(combo, "11"); - gtk_combo_box_append_text(combo, "13"); - gtk_combo_box_append_text(combo, "15"); - gtk_combo_box_append_text(combo, "17"); - gtk_combo_box_append_text(combo, "19"); - gtk_combo_box_append_text(combo, "21"); - gtk_combo_box_append_text(combo, "23"); - gtk_combo_box_append_text(combo, "25"); - gtk_combo_box_append_text(combo, "27"); - gtk_combo_box_append_text(combo, "29"); - gtk_combo_box_append_text(combo, "31"); // MAX_PATCH_SIZE is 32, so we should be able to do 31... +#define D_ITEM(x) if(x >= mincols && (!maxcols || x <= maxcols)) gtk_combo_box_append_text(combo, #x) + D_ITEM(3); + D_ITEM(5); + D_ITEM(7); + D_ITEM(9); + D_ITEM(11); + D_ITEM(13); + D_ITEM(15); + D_ITEM(17); + D_ITEM(19); + D_ITEM(21); + D_ITEM(23); + D_ITEM(25); + D_ITEM(27); + D_ITEM(29); + D_ITEM(31); // MAX_PATCH_SIZE is 32, so we should be able to do 31... +#undef D_ITEM gtk_widget_show(GTK_WIDGET(combo)); gtk_table_attach(table, GTK_WIDGET(combo), 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), @@ -926,21 +956,23 @@ void DoNewPatchDlg() } { GtkComboBox* combo = GTK_COMBO_BOX(gtk_combo_box_new_text()); - gtk_combo_box_append_text(combo, "3"); - gtk_combo_box_append_text(combo, "5"); - gtk_combo_box_append_text(combo, "7"); - gtk_combo_box_append_text(combo, "9"); - gtk_combo_box_append_text(combo, "11"); - gtk_combo_box_append_text(combo, "13"); - gtk_combo_box_append_text(combo, "15"); - gtk_combo_box_append_text(combo, "17"); - gtk_combo_box_append_text(combo, "19"); - gtk_combo_box_append_text(combo, "21"); - gtk_combo_box_append_text(combo, "23"); - gtk_combo_box_append_text(combo, "25"); - gtk_combo_box_append_text(combo, "27"); - gtk_combo_box_append_text(combo, "29"); - gtk_combo_box_append_text(combo, "31"); // MAX_PATCH_SIZE is 32, so we should be able to do 31... +#define D_ITEM(x) if(x >= minrows && (!maxrows || x <= maxrows)) gtk_combo_box_append_text(combo, #x) + D_ITEM(3); + D_ITEM(5); + D_ITEM(7); + D_ITEM(9); + D_ITEM(11); + D_ITEM(13); + D_ITEM(15); + D_ITEM(17); + D_ITEM(19); + D_ITEM(21); + D_ITEM(23); + D_ITEM(25); + D_ITEM(27); + D_ITEM(29); + D_ITEM(31); // MAX_PATCH_SIZE is 32, so we should be able to do 31... +#undef D_ITEM gtk_widget_show(GTK_WIDGET(combo)); gtk_table_attach(table, GTK_WIDGET(combo), 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), @@ -969,15 +1001,15 @@ void DoNewPatchDlg() } // Initialize dialog - gtk_combo_box_set_active(width, 0); - gtk_combo_box_set_active(height, 0); + gtk_combo_box_set_active(width, (defcols - mincols) / 2); + gtk_combo_box_set_active(height, (defrows - minrows) / 2); if(modal_dialog_show(window, dialog) == eIDOK) { - int w = gtk_combo_box_get_active(width) * 2 + 3; - int h = gtk_combo_box_get_active(height) * 2 + 3; + int w = gtk_combo_box_get_active(width) * 2 + mincols; + int h = gtk_combo_box_get_active(height) * 2 + minrows; - Scene_PatchConstructPrefab(GlobalSceneGraph(), PatchCreator_getBounds(), TextureBrowser_GetSelectedShader(GlobalTextureBrowser()), ePlane, GlobalXYWnd_getCurrentViewType(), w, h); + Scene_PatchConstructPrefab(GlobalSceneGraph(), PatchCreator_getBounds(), TextureBrowser_GetSelectedShader(GlobalTextureBrowser()), prefab, GlobalXYWnd_getCurrentViewType(), w, h); } gtk_widget_destroy(GTK_WIDGET(window)); diff --git a/radiant/renderstate.cpp b/radiant/renderstate.cpp index 2f5596d1..2ec1f7b6 100644 --- a/radiant/renderstate.cpp +++ b/radiant/renderstate.cpp @@ -1827,7 +1827,7 @@ void OpenGLState_apply(const OpenGLState& self, OpenGLState& current, unsigned i { glEnable(GL_LIGHTING); glEnable(GL_COLOR_MATERIAL); - //qglEnable(GL_RESCALE_NORMAL); + glEnable(GL_RESCALE_NORMAL); glEnableClientState(GL_NORMAL_ARRAY); GlobalOpenGL_debugAssertNoErrors(); g_normalArray_enabled = true; @@ -1836,7 +1836,7 @@ void OpenGLState_apply(const OpenGLState& self, OpenGLState& current, unsigned i { glDisable(GL_LIGHTING); glDisable(GL_COLOR_MATERIAL); - //qglDisable(GL_RESCALE_NORMAL); + glDisable(GL_RESCALE_NORMAL); glDisableClientState(GL_NORMAL_ARRAY); GlobalOpenGL_debugAssertNoErrors(); g_normalArray_enabled = false; diff --git a/tools/quake3/q3map2/bsp.c b/tools/quake3/q3map2/bsp.c index 79019792..54e14bf1 100644 --- a/tools/quake3/q3map2/bsp.c +++ b/tools/quake3/q3map2/bsp.c @@ -810,7 +810,7 @@ int BSPMain( int argc, char **argv ) { npDegrees = atof( argv[ i + 1 ] ); if( npDegrees < 0.0f ) - shadeAngleDegrees = 0.0f; + npDegrees = 0.0f; else if( npDegrees > 0.0f ) Sys_Printf( "Forcing nonplanar surfaces with a breaking angle of %f degrees\n", npDegrees ); i++; @@ -856,6 +856,33 @@ int BSPMain( int argc, char **argv ) Sys_Printf( "Creating meta surfaces from brush faces\n" ); meta = qtrue; } + else if( !strcmp( argv[ i ], "-metaadequatescore" ) ) + { + metaAdequateScore = atoi( argv[ i + 1 ]); + if( metaAdequateScore < 0 ) + metaAdequateScore = -1; + i++; + if( metaAdequateScore >= 0 ) + Sys_Printf( "Setting ADEQUATE meta score to %d (see surface_meta.c)\n", metaAdequateScore ); + } + else if( !strcmp( argv[ i ], "-metagoodscore" ) ) + { + metaGoodScore = atoi( argv[ i + 1 ]); + if( metaGoodScore < 0 ) + metaGoodScore = -1; + i++; + if( metaGoodScore >= 0 ) + Sys_Printf( "Setting GOOD meta score to %d (see surface_meta.c)\n", metaGoodScore ); + } + else if( !strcmp( argv[ i ], "-metamaxbboxdistance" ) ) + { + metaMaxBBoxDistance = atof( argv[ i + 1 ]); + if( metaMaxBBoxDistance < 0 ) + metaMaxBBoxDistance = -1; + i++; + if( metaMaxBBoxDistance >= 0 ) + Sys_Printf( "Setting meta maximum bounding box distance to %f\n", metaMaxBBoxDistance ); + } else if( !strcmp( argv[ i ], "-patchmeta" ) ) { Sys_Printf( "Creating meta surfaces from patches\n" ); diff --git a/tools/quake3/q3map2/q3map2.h b/tools/quake3/q3map2/q3map2.h index 4b020fdd..64494462 100644 --- a/tools/quake3/q3map2/q3map2.h +++ b/tools/quake3/q3map2/q3map2.h @@ -2034,6 +2034,9 @@ Q_EXTERN qboolean debugPortals Q_ASSIGN( qfalse ); Q_EXTERN qboolean lightmapTriangleCheck Q_ASSIGN(qfalse); Q_EXTERN qboolean lightmapExtraVisClusterNudge Q_ASSIGN(qfalse); Q_EXTERN qboolean lightmapFill Q_ASSIGN(qfalse); +Q_EXTERN int metaAdequateScore Q_ASSIGN( -1 ); +Q_EXTERN int metaGoodScore Q_ASSIGN( -1 ); +Q_EXTERN float metaMaxBBoxDistance Q_ASSIGN( -1 ); #if Q3MAP2_EXPERIMENTAL_SNAP_NORMAL_FIX // Increasing the normalEpsilon to compensate for new logic in SnapNormal(), where diff --git a/tools/quake3/q3map2/surface_meta.c b/tools/quake3/q3map2/surface_meta.c index 8a684855..7f7d0b74 100644 --- a/tools/quake3/q3map2/surface_meta.c +++ b/tools/quake3/q3map2/surface_meta.c @@ -1388,17 +1388,20 @@ returns the score of the triangle added #define AXIS_SCORE 100000 #define AXIS_MIN 100000 #define VERT_SCORE 10000 -#define SURFACE_SCORE 1000 +#define SURFACE_SCORE 1000 #define ST_SCORE 50 #define ST_SCORE2 (2 * (ST_SCORE)) -#define ADEQUATE_SCORE ((AXIS_MIN) + 1 * (VERT_SCORE)) -#define GOOD_SCORE ((AXIS_MIN) + 2 * (VERT_SCORE) + 4 * (ST_SCORE)) -#define PERFECT_SCORE ((AXIS_MIN) + 3 * (VERT_SCORE) + (SURFACE_SCORE) + 4 * (ST_SCORE)) -//#define MAX_BBOX_DISTANCE 16 +#define DEFAULT_ADEQUATE_SCORE ((AXIS_MIN) + 1 * (VERT_SCORE)) +#define DEFAULT_GOOD_SCORE ((AXIS_MIN) + 2 * (VERT_SCORE) + 4 * (ST_SCORE)) +#define PERFECT_SCORE ((AXIS_MIN) + 3 * (VERT_SCORE) + (SURFACE_SCORE) + 4 * (ST_SCORE)) + +#define ADEQUATE_SCORE (metaAdequateScore >= 0 ? metaAdequateScore : DEFAULT_ADEQUATE_SCORE) +#define GOOD_SCORE (metaGoodScore >= 0 ? metaGoodScore : DEFAULT_GOOD_SCORE) static int AddMetaTriangleToSurface( mapDrawSurface_t *ds, metaTriangle_t *tri, qboolean testAdd ) { + vec3_t p; int i, score, coincident, ai, bi, ci, oldTexRange[ 2 ]; float lmMax; vec3_t mins, maxs; @@ -1433,31 +1436,37 @@ static int AddMetaTriangleToSurface( mapDrawSurface_t *ds, metaTriangle_t *tri, return 0; } -#if MAX_BBOX_DISTANCE > 0 - VectorCopy( ds->mins, mins ); - VectorCopy( ds->maxs, maxs ); - mins[0] -= MAX_BBOX_DISTANCE; - mins[1] -= MAX_BBOX_DISTANCE; - mins[2] -= MAX_BBOX_DISTANCE; - maxs[0] += MAX_BBOX_DISTANCE; - maxs[1] += MAX_BBOX_DISTANCE; - maxs[2] += MAX_BBOX_DISTANCE; + + + if(metaMaxBBoxDistance >= 0) + { + if(ds->numIndexes > 0) + { + VectorCopy( ds->mins, mins ); + VectorCopy( ds->maxs, maxs ); + mins[0] -= metaMaxBBoxDistance; + mins[1] -= metaMaxBBoxDistance; + mins[2] -= metaMaxBBoxDistance; + maxs[0] += metaMaxBBoxDistance; + maxs[1] += metaMaxBBoxDistance; + maxs[2] += metaMaxBBoxDistance; #define CHECK_1D(mins, v, maxs) ((mins) <= (v) && (v) <= (maxs)) #define CHECK_3D(mins, v, maxs) (CHECK_1D((mins)[0], (v)[0], (maxs)[0]) && CHECK_1D((mins)[1], (v)[1], (maxs)[1]) && CHECK_1D((mins)[2], (v)[2], (maxs)[2])) - VectorCopy(metaVerts[ tri->indexes[ 0 ] ].xyz, p); - if(!CHECK_3D(mins, p, maxs)) - { - VectorCopy(metaVerts[ tri->indexes[ 1 ] ].xyz, p); - if(!CHECK_3D(mins, p, maxs)) - { - VectorCopy(metaVerts[ tri->indexes[ 2 ] ].xyz, p); + VectorCopy(metaVerts[ tri->indexes[ 0 ] ].xyz, p); if(!CHECK_3D(mins, p, maxs)) - return 0; - } - } + { + VectorCopy(metaVerts[ tri->indexes[ 1 ] ].xyz, p); + if(!CHECK_3D(mins, p, maxs)) + { + VectorCopy(metaVerts[ tri->indexes[ 2 ] ].xyz, p); + if(!CHECK_3D(mins, p, maxs)) + return 0; + } + } #undef CHECK_3D #undef CHECK_1D -#endif + } + } /* set initial score */ score = tri->surfaceNum == ds->surfaceNum ? SURFACE_SCORE : 0;