From 66cbc01bb8a5c4962df2a447836841d90329ea29 Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Fri, 7 Oct 2011 11:56:48 +0200 Subject: [PATCH] Experimental: add "XactCylinder" to make a better patch cylinder --- radiant/patch.cpp | 27 +++++++++++++++++++++++++++ radiant/patch.h | 1 + radiant/patchmanip.cpp | 9 +++++++++ 3 files changed, 37 insertions(+) diff --git a/radiant/patch.cpp b/radiant/patch.cpp index ac96240f..221d3333 100644 --- a/radiant/patch.cpp +++ b/radiant/patch.cpp @@ -1400,6 +1400,33 @@ void Patch::ConstructPrefab(const AABB& aabb, EPatchPrefab eType, int axis, std: return; } } + else if (eType == eXactCylinder) + { + int n = 6; // n = number of segments + setDims(2 * n + 1, 3); + + // 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 < 2*n+1; ++i) + { + float angle = (M_PI * i) / n; + float x = vPos[1][0] + cos(angle) * (vPos[2][0] - vPos[1][0]) * ((i&1) ? f : 1.0f); + float y = vPos[1][1] + sin(angle) * (vPos[2][1] - vPos[1][1]) * ((i&1) ? f : 1.0f); + for(j = 0; j < 3; ++j) + { + float z = vPos[j][2]; + PatchControl *v; + v = &m_ctrl.data()[j*(2*n+1)+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..61ecba9b 100644 --- a/radiant/patch.h +++ b/radiant/patch.h @@ -102,6 +102,7 @@ enum EPatchPrefab eSqCylinder, eCone, eSphere, + eXactCylinder, }; enum EMatrixMajor diff --git a/radiant/patchmanip.cpp b/radiant/patchmanip.cpp index b8bccee6..46818cf0 100644 --- a/radiant/patchmanip.cpp +++ b/radiant/patchmanip.cpp @@ -432,6 +432,13 @@ AABB PatchCreator_getBounds() return AABB(Vector3(0, 0, 0), Vector3(64, 64, 64)); } +void Patch_XactCylinder() +{ + UndoableCommand undo("patchCreateXactCylinder"); + + Scene_PatchConstructPrefab(GlobalSceneGraph(), PatchCreator_getBounds(), TextureBrowser_GetSelectedShader(GlobalTextureBrowser()), eXactCylinder, GlobalXYWnd_getCurrentViewType()); +} + void Patch_Cylinder() { UndoableCommand undo("patchCreateCylinder"); @@ -743,6 +750,7 @@ void Patch_registerCommands() GlobalCommands_insert("DecPatchRow", FreeCaller(), Accelerator(GDK_KP_Subtract, (GdkModifierType)GDK_CONTROL_MASK)); GlobalCommands_insert("NaturalizePatch", FreeCaller(), Accelerator('N', (GdkModifierType)GDK_CONTROL_MASK)); GlobalCommands_insert("PatchCylinder", FreeCaller()); + GlobalCommands_insert("PatchXactCylinder", FreeCaller()); GlobalCommands_insert("PatchDenseCylinder", FreeCaller()); GlobalCommands_insert("PatchVeryDenseCylinder", FreeCaller()); GlobalCommands_insert("PatchSquareCylinder", FreeCaller()); @@ -788,6 +796,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"); -- 2.39.2