Experimental: add "XactCylinder" to make a better patch cylinder
This commit is contained in:
parent
9c436e5a25
commit
66cbc01bb8
|
|
@ -1400,6 +1400,33 @@ void Patch::ConstructPrefab(const AABB& aabb, EPatchPrefab eType, int axis, std:
|
||||||
return;
|
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)
|
else if (eType == eBevel)
|
||||||
{
|
{
|
||||||
unsigned char *pIndex;
|
unsigned char *pIndex;
|
||||||
|
|
|
||||||
|
|
@ -102,6 +102,7 @@ enum EPatchPrefab
|
||||||
eSqCylinder,
|
eSqCylinder,
|
||||||
eCone,
|
eCone,
|
||||||
eSphere,
|
eSphere,
|
||||||
|
eXactCylinder,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum EMatrixMajor
|
enum EMatrixMajor
|
||||||
|
|
|
||||||
|
|
@ -432,6 +432,13 @@ AABB PatchCreator_getBounds()
|
||||||
return AABB(Vector3(0, 0, 0), Vector3(64, 64, 64));
|
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()
|
void Patch_Cylinder()
|
||||||
{
|
{
|
||||||
UndoableCommand undo("patchCreateCylinder");
|
UndoableCommand undo("patchCreateCylinder");
|
||||||
|
|
@ -743,6 +750,7 @@ void Patch_registerCommands()
|
||||||
GlobalCommands_insert("DecPatchRow", FreeCaller<Patch_DeleteLastRow>(), Accelerator(GDK_KP_Subtract, (GdkModifierType)GDK_CONTROL_MASK));
|
GlobalCommands_insert("DecPatchRow", FreeCaller<Patch_DeleteLastRow>(), Accelerator(GDK_KP_Subtract, (GdkModifierType)GDK_CONTROL_MASK));
|
||||||
GlobalCommands_insert("NaturalizePatch", FreeCaller<Patch_NaturalTexture>(), Accelerator('N', (GdkModifierType)GDK_CONTROL_MASK));
|
GlobalCommands_insert("NaturalizePatch", FreeCaller<Patch_NaturalTexture>(), Accelerator('N', (GdkModifierType)GDK_CONTROL_MASK));
|
||||||
GlobalCommands_insert("PatchCylinder", FreeCaller<Patch_Cylinder>());
|
GlobalCommands_insert("PatchCylinder", FreeCaller<Patch_Cylinder>());
|
||||||
|
GlobalCommands_insert("PatchXactCylinder", FreeCaller<Patch_XactCylinder>());
|
||||||
GlobalCommands_insert("PatchDenseCylinder", FreeCaller<Patch_DenseCylinder>());
|
GlobalCommands_insert("PatchDenseCylinder", FreeCaller<Patch_DenseCylinder>());
|
||||||
GlobalCommands_insert("PatchVeryDenseCylinder", FreeCaller<Patch_VeryDenseCylinder>());
|
GlobalCommands_insert("PatchVeryDenseCylinder", FreeCaller<Patch_VeryDenseCylinder>());
|
||||||
GlobalCommands_insert("PatchSquareCylinder", FreeCaller<Patch_SquareCylinder>());
|
GlobalCommands_insert("PatchSquareCylinder", FreeCaller<Patch_SquareCylinder>());
|
||||||
|
|
@ -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, "Dense Cylinder", "PatchDenseCylinder");
|
||||||
create_menu_item_with_mnemonic(menu_in_menu, "Very Dense Cylinder", "PatchVeryDenseCylinder");
|
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, "Square Cylinder", "PatchSquareCylinder");
|
||||||
|
create_menu_item_with_mnemonic(menu_in_menu, "Exact Cylinder", "PatchXactCylinder");
|
||||||
}
|
}
|
||||||
menu_separator (menu);
|
menu_separator (menu);
|
||||||
create_menu_item_with_mnemonic(menu, "End cap", "PatchEndCap");
|
create_menu_item_with_mnemonic(menu, "End cap", "PatchEndCap");
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user