diff --git a/src/brush.h b/src/brush.h index 0b5a26e..118d97e 100644 --- a/src/brush.h +++ b/src/brush.h @@ -624,6 +624,10 @@ void fit(const Vector3 &normal, const Winding &winding, float s_repeat, float t_ { Texdef_FitTexture(m_projection, m_shader.width(), m_shader.height(), normal, winding, s_repeat, t_repeat); } +void align(const Plane3 &plane, const Vector3 &normal, const Winding &winding, int alignment) +{ + Texdef_AlignTexture(m_projection, plane, normal, winding, m_shader.width(), m_shader.height(), alignment); +} void emitTextureCoordinates(Winding &winding, const Vector3 &normal, const Matrix4 &localToWorld) { @@ -1317,6 +1321,13 @@ void FitTexture(float s_repeat, float t_repeat) texdefChanged(); } +void AlignTexture(int alignment) +{ + undoSave(); + m_texdef.align(m_plane.plane3(), m_plane.plane3().normal(), m_winding, alignment); + texdefChanged(); +} + void EmitTextureCoordinates() { Texdef_EmitTextureCoordinates(m_texdefTransformed, m_shader.width(), m_shader.height(), m_winding, diff --git a/src/brush_primit.cpp b/src/brush_primit.cpp index 5956bbb..ca48f06 100644 --- a/src/brush_primit.cpp +++ b/src/brush_primit.cpp @@ -1147,6 +1147,89 @@ void Texdef_FitTexture(TextureProjection &projection, std::size_t width, std::si Texdef_normalise(projection, (float) width, (float) height); } + +void Texdef_AlignTexture(TextureProjection &projection, const Plane3 &plane, const Vector3 &normal, const Winding &w, std::size_t width, std::size_t height, int alignment) +{ + if (w.numpoints < 3) { + return; + } + + Matrix4 st2tex; + Texdef_toTransform(projection, (float) width, (float) height, st2tex); + + // the current texture transform + Matrix4 local2tex = st2tex; + { + Matrix4 xyz2st; + Texdef_basisForNormal(projection, normal, xyz2st); + matrix4_multiply_by_matrix4(local2tex, xyz2st); + } + + // the bounds of the current texture transform + AABB bounds; + for (Winding::const_iterator i = w.begin(); i != w.end(); ++i) { + Vector3 texcoord = matrix4_transformed_point(local2tex, (*i).vertex); + aabb_extend_by_point_safe(bounds, texcoord); + } + bounds.extents.z() = 1; + + AABB perfect; + perfect.extents = bounds.extents; + printf("Bounds: %f %f %f\n", bounds.origin.x(), bounds.origin.y(), bounds.origin.z()); + + switch (alignment) { + case 0: + printf("Top Left\n"); + perfect.origin = Vector3(0, 0, 0); + break; + case 1: + printf("Top Center\n"); + perfect.origin = Vector3(width /2, 0, 0); + break; + case 2: + printf("Top Right\n"); + perfect.origin = Vector3(width, 0, 0); + break; + case 3: + printf("Middle Left\n"); + perfect.origin = Vector3(0.0, 0.5, 0); + break; + case 4: + printf("Middle Center\n"); + perfect.origin = Vector3(0.5, 0.5, 0); + break; + case 5: + printf("Middle Right\n"); + perfect.origin = Vector3(1.0, 0.5, 0); + break; + case 6: + printf("Bottom Left\n"); + perfect.origin = Vector3(0.0, 1.0, 0); + break; + case 7: + printf("Bottom Center\n"); + perfect.origin = Vector3(0.5, 1.0, 0); + break; + case 8: + printf("Bottom Right\n"); + perfect.origin = Vector3(1.0, 1.0, 0); + break; + } + + // the difference between the current texture transform and the perfectly fitted transform + Matrix4 matrix(matrix4_translation_for_vec3(bounds.origin - perfect.origin)); + + /* + matrix4_pivoted_scale_by_vec3(matrix, bounds.extents, perfect.origin); + matrix4_affine_invert(matrix); + */ + + // apply the difference to the current texture transform + matrix4_premultiply_by_matrix4(st2tex, matrix); + Texdef_fromTransform(projection, (float) width, (float) height, st2tex); + Texdef_normalise(projection, (float) width, (float) height); +} + float Texdef_getDefaultTextureScale() { return g_texdef_default_scale; diff --git a/src/brush_primit.h b/src/brush_primit.h index d7bf796..0714996 100644 --- a/src/brush_primit.h +++ b/src/brush_primit.h @@ -128,6 +128,7 @@ void Texdef_Rotate(TextureProjection &projection, float angle); void Texdef_FitTexture(TextureProjection &projection, std::size_t width, std::size_t height, const Vector3 &normal, const Winding &w, float s_repeat, float t_repeat); +void Texdef_AlignTexture(TextureProjection &projection, const Plane3 &plane, const Vector3 &normal, const Winding &w, std::size_t width, std::size_t height, int alignment); void Texdef_EmitTextureCoordinates(const TextureProjection &projection, std::size_t width, std::size_t height, Winding &w, diff --git a/src/brushmanip.cpp b/src/brushmanip.cpp index 7c1e0be..b94a909 100644 --- a/src/brushmanip.cpp +++ b/src/brushmanip.cpp @@ -591,7 +591,6 @@ void Scene_BrushFitTexture_Selected(scene::Graph &graph, float s_repeat, float t }); SceneChangeNotify(); } - void Scene_BrushFitTexture_Component_Selected(scene::Graph &graph, float s_repeat, float t_repeat) { Scene_ForEachSelectedBrushFace(graph, [&](Face &face) { @@ -600,6 +599,21 @@ void Scene_BrushFitTexture_Component_Selected(scene::Graph &graph, float s_repea SceneChangeNotify(); } +void Scene_BrushAlignTexture_Selected(scene::Graph &graph, int alignment) +{ + Scene_ForEachSelectedBrush_ForEachFace(graph, [&](Face &face) { + face.AlignTexture(alignment); + }); + SceneChangeNotify(); +} +void Scene_BrushAlignTexture_Component_Selected(scene::Graph &graph, int alignment) +{ + Scene_ForEachSelectedBrushFace(graph, [&](Face &face) { + face.AlignTexture(alignment); + }); + SceneChangeNotify(); +} + TextureProjection g_defaultTextureProjection; const TextureProjection &TextureTransform_getDefault() @@ -1300,30 +1314,30 @@ void Brush_registerCommands() GlobalCommands_insert("BrushRock", BrushPrefab::SetCaller(g_brushrock)); GlobalCommands_insert("Brush3Sided", BrushMakeSided::SetCaller(g_brushmakesided3), - Accelerator('3', (GdkModifierType) GDK_LOCK_MASK)); + Accelerator('3', (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("Brush4Sided", BrushMakeSided::SetCaller(g_brushmakesided4), - Accelerator('4', (GdkModifierType) GDK_LOCK_MASK)); + Accelerator('4', (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("Brush5Sided", BrushMakeSided::SetCaller(g_brushmakesided5), - Accelerator('5', (GdkModifierType) GDK_LOCK_MASK)); + Accelerator('5', (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("Brush6Sided", BrushMakeSided::SetCaller(g_brushmakesided6), - Accelerator('6', (GdkModifierType) GDK_LOCK_MASK)); + Accelerator('6', (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("Brush7Sided", BrushMakeSided::SetCaller(g_brushmakesided7), - Accelerator('7', (GdkModifierType) GDK_LOCK_MASK)); + Accelerator('7', (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("Brush8Sided", BrushMakeSided::SetCaller(g_brushmakesided8), - Accelerator('8', (GdkModifierType) GDK_LOCK_MASK)); + Accelerator('8', (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("Brush9Sided", BrushMakeSided::SetCaller(g_brushmakesided9), - Accelerator('9', (GdkModifierType) GDK_LOCK_MASK)); + Accelerator('9', (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("ClipSelected", makeCallbackF(ClipSelected), Accelerator(GDK_KEY_Return)); GlobalCommands_insert("SplitSelected", makeCallbackF(SplitSelected), Accelerator(GDK_KEY_Return, (GdkModifierType) GDK_SHIFT_MASK)); GlobalCommands_insert("FlipClip", makeCallbackF(FlipClipper), - Accelerator(GDK_KEY_Return, (GdkModifierType) GDK_LOCK_MASK)); + Accelerator(GDK_KEY_Return, (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("MakeDetail", makeCallbackF(Select_MakeDetail), - Accelerator('M', (GdkModifierType) GDK_LOCK_MASK)); + Accelerator('M', (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("MakeStructural", makeCallbackF(Select_MakeStructural), - Accelerator('S', (GdkModifierType) (GDK_SHIFT_MASK | GDK_LOCK_MASK))); + Accelerator('S', (GdkModifierType) (GDK_SHIFT_MASK | GDK_CONTROL_MASK))); } void Brush_constructMenu(ui::Menu menu) diff --git a/src/brushmanip.h b/src/brushmanip.h index a6a6022..0ac2c65 100644 --- a/src/brushmanip.h +++ b/src/brushmanip.h @@ -100,6 +100,9 @@ void Scene_BrushFitTexture_Selected(scene::Graph &graph, float s_repeat, float t void Scene_BrushFitTexture_Component_Selected(scene::Graph &graph, float s_repeat, float t_repeat); +void Scene_BrushAlignTexture_Selected(scene::Graph &graph, int alignment); +void Scene_BrushAlignTexture_Component_Selected(scene::Graph &graph, int alignment); + void Brush_constructMenu(ui::Menu menu); extern Callback g_texture_lock_status_changed; diff --git a/src/camwindow.cpp b/src/camwindow.cpp index abddd27..d20b074 100644 --- a/src/camwindow.cpp +++ b/src/camwindow.cpp @@ -713,17 +713,17 @@ void Camera_motionDelta(int x, int y, unsigned int state, void *data) case 0: cam->m_strafe = (state & GDK_SHIFT_MASK) != 0; if (cam->m_strafe) { - cam->m_strafe_forward = (state & GDK_LOCK_MASK) != 0; + cam->m_strafe_forward = (state & GDK_CONTROL_MASK) != 0; } else { cam->m_strafe_forward = false; } break; case 1: - cam->m_strafe = (state & GDK_LOCK_MASK) != 0 && (state & GDK_SHIFT_MASK) == 0; + cam->m_strafe = (state & GDK_CONTROL_MASK) != 0 && (state & GDK_SHIFT_MASK) == 0; cam->m_strafe_forward = false; break; case 2: - cam->m_strafe = (state & GDK_LOCK_MASK) != 0 && (state & GDK_SHIFT_MASK) == 0; + cam->m_strafe = (state & GDK_CONTROL_MASK) != 0 && (state & GDK_SHIFT_MASK) == 0; cam->m_strafe_forward = cam->m_strafe; break; } @@ -2029,15 +2029,6 @@ void GlobalCamera_LookThroughCamera() CamWnd_LookThroughCamera(*g_camwnd); } - -void GlobalCamera_Refresh(void) -{ - CamWnd &camwnd = *g_camwnd; - Camera_updateModelview(camwnd.getCamera()); - Camera_updateProjection(camwnd.getCamera()); - CamWnd_Update(camwnd); -} - /* sets origin and angle to 0,0,0 coords */ void XYZ_SetOrigin(const Vector3 &origin); void GlobalCamera_GoToZero(void) @@ -2171,18 +2162,18 @@ void CamWnd_Construct() GlobalToggles_insert("ToggleCubicClip", makeCallbackF(Camera_ToggleFarClip), ToggleItem::AddCallbackCaller(g_getfarclip_item), - Accelerator('\\', (GdkModifierType) GDK_LOCK_MASK)); + Accelerator('\\', (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("CubicClipZoomIn", makeCallbackF(Camera_CubeIn), - Accelerator('[', (GdkModifierType) GDK_LOCK_MASK)); + Accelerator('[', (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("CubicClipZoomOut", makeCallbackF(Camera_CubeOut), - Accelerator(']', (GdkModifierType) GDK_LOCK_MASK)); + Accelerator(']', (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("UpFloor", makeCallbackF(Camera_ChangeFloorUp), Accelerator(GDK_KEY_Prior)); GlobalCommands_insert("DownFloor", makeCallbackF(Camera_ChangeFloorDown), Accelerator(GDK_KEY_Next)); GlobalToggles_insert("ToggleCamera", ToggleShown::ToggleCaller(g_camera_shown), ToggleItem::AddCallbackCaller(g_camera_shown.m_item), - Accelerator('C', (GdkModifierType) (GDK_SHIFT_MASK | GDK_LOCK_MASK))); + Accelerator('C', (GdkModifierType) (GDK_SHIFT_MASK | GDK_CONTROL_MASK))); GlobalCommands_insert("LookThroughSelected", makeCallbackF(GlobalCamera_LookThroughSelected)); GlobalCommands_insert("LookThroughCamera", makeCallbackF(GlobalCamera_LookThroughCamera)); diff --git a/src/entity.cpp b/src/entity.cpp index 2465a2c..2723fb0 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -619,7 +619,7 @@ void Entity_Construct() GlobalCommands_insert("EntityColor", makeCallbackF(Entity_setColour), Accelerator('K')); GlobalCommands_insert("NormalizeColor", makeCallbackF(Entity_normalizeColor)); GlobalCommands_insert("ConnectSelection", makeCallbackF(Entity_connectSelected), - Accelerator('K', (GdkModifierType) GDK_LOCK_MASK)); + Accelerator('K', (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("KillConnectSelection", makeCallbackF(Entity_killconnectSelected), Accelerator('K', (GdkModifierType) (GDK_SHIFT_MASK))); GlobalCommands_insert("GroupSelection", makeCallbackF(Entity_groupSelected)); diff --git a/src/filters.cpp b/src/filters.cpp index 209ec16..78cb0ea 100644 --- a/src/filters.cpp +++ b/src/filters.cpp @@ -251,16 +251,16 @@ void ConstructFilters() } add_filter_command(EXCLUDE_LIGHTS, "FilterLights", Accelerator('0', (GdkModifierType) GDK_MOD1_MASK)); add_filter_command(EXCLUDE_STRUCTURAL, "FilterStructural", - Accelerator('D', (GdkModifierType) (GDK_SHIFT_MASK | GDK_LOCK_MASK))); + Accelerator('D', (GdkModifierType) (GDK_SHIFT_MASK | GDK_CONTROL_MASK))); if (g_pGameDescription->mGameType != "doom3") { add_filter_command(EXCLUDE_LIGHTGRID, "FilterLightgrid", accelerator_null()); } - add_filter_command(EXCLUDE_CURVES, "FilterPatches", Accelerator('P', (GdkModifierType) GDK_LOCK_MASK)); - add_filter_command(EXCLUDE_DETAILS, "FilterDetails", Accelerator('D', (GdkModifierType) GDK_LOCK_MASK)); - add_filter_command(EXCLUDE_HINTSSKIPS, "FilterHintsSkips", Accelerator('H', (GdkModifierType) GDK_LOCK_MASK)); + add_filter_command(EXCLUDE_CURVES, "FilterPatches", Accelerator('P', (GdkModifierType) GDK_CONTROL_MASK)); + add_filter_command(EXCLUDE_DETAILS, "FilterDetails", Accelerator('D', (GdkModifierType) GDK_CONTROL_MASK)); + add_filter_command(EXCLUDE_HINTSSKIPS, "FilterHintsSkips", Accelerator('H', (GdkModifierType) GDK_CONTROL_MASK)); add_filter_command(EXCLUDE_MODELS, "FilterModels", Accelerator('M', (GdkModifierType) GDK_SHIFT_MASK)); add_filter_command(EXCLUDE_TRIGGERS, "FilterTriggers", - Accelerator('T', (GdkModifierType) (GDK_SHIFT_MASK | GDK_LOCK_MASK))); + Accelerator('T', (GdkModifierType) (GDK_SHIFT_MASK | GDK_CONTROL_MASK))); if (g_pGameDescription->mGameType != "doom3") { add_filter_command(EXCLUDE_BOTCLIP, "FilterBotClips", Accelerator('M', (GdkModifierType) GDK_MOD1_MASK)); add_filter_command(EXCLUDE_DECALS, "FilterDecals", Accelerator('D', (GdkModifierType) GDK_SHIFT_MASK)); diff --git a/src/mainframe.cpp b/src/mainframe.cpp index 6401319..575ed54 100644 --- a/src/mainframe.cpp +++ b/src/mainframe.cpp @@ -3021,7 +3021,7 @@ void Texdef_ToggleExpansion() void MainFrame_Construct() { /*GlobalCommands_insert("Sleep", makeCallbackF(thunk_OnSleep), - Accelerator('P', (GdkModifierType) (GDK_SHIFT_MASK | GDK_LOCK_MASK)));*/ + Accelerator('P', (GdkModifierType) (GDK_SHIFT_MASK | GDK_CONTROL_MASK)));*/ GlobalCommands_insert("NewMap", makeCallbackF(NewMap)); GlobalCommands_insert("OpenMap", makeCallbackF(OpenMap), Accelerator('O', (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("ImportMap", makeCallbackF(ImportMap)); @@ -3049,7 +3049,7 @@ void MainFrame_Construct() GlobalCommands_insert("SelectInside", makeCallbackF(Select_Inside)); GlobalCommands_insert("SelectTouching", makeCallbackF(Select_Touching)); GlobalCommands_insert("ExpandSelectionToEntities", makeCallbackF(Scene_ExpandSelectionToEntities), - Accelerator('E', (GdkModifierType) (GDK_MOD1_MASK | GDK_LOCK_MASK))); + Accelerator('E', (GdkModifierType) (GDK_MOD1_MASK | GDK_CONTROL_MASK))); GlobalCommands_insert("Preferences", makeCallbackF(PreferencesDialog_showDialog)); GlobalCommands_insert("ToggleEntityInspector", makeCallbackF(EntityInspector_ToggleShow), Accelerator('N')); @@ -3120,14 +3120,14 @@ void MainFrame_Construct() GlobalCommands_insert("CSGSubtract", makeCallbackF(CSG_Subtract), Accelerator('U', (GdkModifierType) GDK_SHIFT_MASK)); - GlobalCommands_insert("CSGMerge", makeCallbackF(CSG_Merge), Accelerator('U', (GdkModifierType) GDK_LOCK_MASK)); + GlobalCommands_insert("CSGMerge", makeCallbackF(CSG_Merge), Accelerator('U', (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("CSGMakeHollow", makeCallbackF(CSG_MakeHollow)); GlobalCommands_insert("CSGMakeRoom", makeCallbackF(CSG_MakeRoom)); Grid_registerCommands(); GlobalCommands_insert("SnapToGrid", makeCallbackF(Selection_SnapToGrid), - Accelerator('G', (GdkModifierType) GDK_LOCK_MASK)); + Accelerator('G', (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("SelectAllOfType", makeCallbackF(Select_AllOfType), Accelerator('A', (GdkModifierType) GDK_SHIFT_MASK)); @@ -3137,13 +3137,13 @@ void MainFrame_Construct() GlobalCommands_insert("TexRotateCounter", makeCallbackF(Texdef_RotateAntiClockwise), Accelerator(GDK_KEY_Prior, (GdkModifierType) GDK_SHIFT_MASK)); GlobalCommands_insert("TexScaleUp", makeCallbackF(Texdef_ScaleUp), - Accelerator(GDK_KEY_Up, (GdkModifierType) GDK_LOCK_MASK)); + Accelerator(GDK_KEY_Up, (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("TexScaleDown", makeCallbackF(Texdef_ScaleDown), - Accelerator(GDK_KEY_Down, (GdkModifierType) GDK_LOCK_MASK)); + Accelerator(GDK_KEY_Down, (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("TexScaleLeft", makeCallbackF(Texdef_ScaleLeft), - Accelerator(GDK_KEY_Left, (GdkModifierType) GDK_LOCK_MASK)); + Accelerator(GDK_KEY_Left, (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("TexScaleRight", makeCallbackF(Texdef_ScaleRight), - Accelerator(GDK_KEY_Right, (GdkModifierType) GDK_LOCK_MASK)); + Accelerator(GDK_KEY_Right, (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("TexShiftUp", makeCallbackF(Texdef_ShiftUp), Accelerator(GDK_KEY_Up, (GdkModifierType) GDK_SHIFT_MASK)); GlobalCommands_insert("TexShiftDown", makeCallbackF(Texdef_ShiftDown), diff --git a/src/map.cpp b/src/map.cpp index 245c94d..aa0907e 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -2369,7 +2369,7 @@ void Map_Construct() GlobalCommands_insert("RegionSetXY", makeCallbackF(RegionXY)); GlobalCommands_insert("RegionSetBrush", makeCallbackF(RegionBrush)); GlobalCommands_insert("RegionSetSelection", makeCallbackF(RegionSelected), - Accelerator('R', (GdkModifierType) (GDK_SHIFT_MASK | GDK_LOCK_MASK))); + Accelerator('R', (GdkModifierType) (GDK_SHIFT_MASK | GDK_CONTROL_MASK))); GlobalPreferenceSystem().registerPreference("LastMap", make_property_string(g_strLastMap)); GlobalPreferenceSystem().registerPreference("LoadLastMap", make_property_string(g_bLoadLastMap)); diff --git a/src/patchmanip.cpp b/src/patchmanip.cpp index 131f401..42c5e39 100644 --- a/src/patchmanip.cpp +++ b/src/patchmanip.cpp @@ -708,11 +708,11 @@ void PatchPreferences_construct() void Patch_registerCommands() { GlobalCommands_insert("InvertCurveTextureX", makeCallbackF(Patch_FlipTextureX), - Accelerator('I', (GdkModifierType) (GDK_SHIFT_MASK | GDK_LOCK_MASK))); + Accelerator('I', (GdkModifierType) (GDK_SHIFT_MASK | GDK_CONTROL_MASK))); GlobalCommands_insert("InvertCurveTextureY", makeCallbackF(Patch_FlipTextureY), Accelerator('I', (GdkModifierType) GDK_SHIFT_MASK)); GlobalCommands_insert("NaturalizePatch", makeCallbackF(Patch_NaturalTexture), - Accelerator('N', (GdkModifierType) GDK_LOCK_MASK)); + Accelerator('N', (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("PatchCylinder", makeCallbackF(Patch_Cylinder)); GlobalCommands_insert("PatchDenseCylinder", makeCallbackF(Patch_DenseCylinder)); GlobalCommands_insert("PatchVeryDenseCylinder", makeCallbackF(Patch_VeryDenseCylinder)); @@ -729,36 +729,36 @@ void Patch_registerCommands() GlobalCommands_insert("SimplePatchMesh", makeCallbackF(Patch_Plane), Accelerator('P', (GdkModifierType) GDK_SHIFT_MASK)); GlobalCommands_insert("PatchInsertInsertColumn", makeCallbackF(Patch_InsertInsertColumn), - Accelerator(GDK_KEY_KP_Add, (GdkModifierType) (GDK_SHIFT_MASK | GDK_LOCK_MASK))); + Accelerator(GDK_KEY_KP_Add, (GdkModifierType) (GDK_SHIFT_MASK | GDK_CONTROL_MASK))); GlobalCommands_insert("PatchInsertAddColumn", makeCallbackF(Patch_InsertAddColumn)); GlobalCommands_insert("PatchInsertInsertRow", makeCallbackF(Patch_InsertInsertRow), - Accelerator(GDK_KEY_KP_Add, (GdkModifierType) GDK_LOCK_MASK)); + Accelerator(GDK_KEY_KP_Add, (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("PatchInsertAddRow", makeCallbackF(Patch_InsertAddRow)); GlobalCommands_insert("PatchDeleteFirstColumn", makeCallbackF(Patch_DeleteFirstColumn)); GlobalCommands_insert("PatchDeleteLastColumn", makeCallbackF(Patch_DeleteLastColumn), - Accelerator(GDK_KEY_KP_Subtract, (GdkModifierType) (GDK_SHIFT_MASK | GDK_LOCK_MASK))); + Accelerator(GDK_KEY_KP_Subtract, (GdkModifierType) (GDK_SHIFT_MASK | GDK_CONTROL_MASK))); GlobalCommands_insert("PatchDeleteFirstRow", makeCallbackF(Patch_DeleteFirstRow), - Accelerator(GDK_KEY_KP_Subtract, (GdkModifierType) GDK_LOCK_MASK)); + Accelerator(GDK_KEY_KP_Subtract, (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("PatchDeleteLastRow", makeCallbackF(Patch_DeleteLastRow)); GlobalCommands_insert("InvertCurve", makeCallbackF(Patch_Invert), - Accelerator('I', (GdkModifierType) GDK_LOCK_MASK)); + Accelerator('I', (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("RedisperseRows", makeCallbackF(Patch_RedisperseRows), - Accelerator('E', (GdkModifierType) GDK_LOCK_MASK)); + Accelerator('E', (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("RedisperseCols", makeCallbackF(Patch_RedisperseCols), - Accelerator('E', (GdkModifierType) (GDK_SHIFT_MASK | GDK_LOCK_MASK))); + Accelerator('E', (GdkModifierType) (GDK_SHIFT_MASK | GDK_CONTROL_MASK))); GlobalCommands_insert("SmoothRows", makeCallbackF(Patch_SmoothRows), - Accelerator('W', (GdkModifierType) GDK_LOCK_MASK)); + Accelerator('W', (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("SmoothCols", makeCallbackF(Patch_SmoothCols), - Accelerator('W', (GdkModifierType) (GDK_SHIFT_MASK | GDK_LOCK_MASK))); + Accelerator('W', (GdkModifierType) (GDK_SHIFT_MASK | GDK_CONTROL_MASK))); GlobalCommands_insert("MatrixTranspose", makeCallbackF(Patch_Transpose), - Accelerator('M', (GdkModifierType) (GDK_SHIFT_MASK | GDK_LOCK_MASK))); + Accelerator('M', (GdkModifierType) (GDK_SHIFT_MASK | GDK_CONTROL_MASK))); GlobalCommands_insert("CapCurrentCurve", makeCallbackF(Patch_Cap), Accelerator('C', (GdkModifierType) GDK_SHIFT_MASK)); GlobalCommands_insert("CycleCapTexturePatch", makeCallbackF(Patch_CycleProjection), - Accelerator('N', (GdkModifierType) (GDK_SHIFT_MASK | GDK_LOCK_MASK))); + Accelerator('N', (GdkModifierType) (GDK_SHIFT_MASK | GDK_CONTROL_MASK))); GlobalCommands_insert("MakeOverlayPatch", makeCallbackF(Patch_OverlayOn), Accelerator('Y')); GlobalCommands_insert("ClearPatchOverlays", makeCallbackF(Patch_OverlayOff), - Accelerator('L', (GdkModifierType) GDK_LOCK_MASK)); + Accelerator('L', (GdkModifierType) GDK_CONTROL_MASK)); } void Patch_constructToolbar(ui::Toolbar toolbar) diff --git a/src/points.cpp b/src/points.cpp index 012107b..650a1fc 100644 --- a/src/points.cpp +++ b/src/points.cpp @@ -362,9 +362,9 @@ void Pointfile_Construct() GlobalCommands_insert("TogglePointfile", makeCallbackF(Pointfile_Toggle)); GlobalCommands_insert("NextLeakSpot", makeCallbackF(Pointfile_Next), - Accelerator('K', (GdkModifierType) (GDK_SHIFT_MASK | GDK_LOCK_MASK))); + Accelerator('K', (GdkModifierType) (GDK_SHIFT_MASK | GDK_CONTROL_MASK))); GlobalCommands_insert("PrevLeakSpot", makeCallbackF(Pointfile_Prev), - Accelerator('L', (GdkModifierType) (GDK_SHIFT_MASK | GDK_LOCK_MASK))); + Accelerator('L', (GdkModifierType) (GDK_SHIFT_MASK | GDK_CONTROL_MASK))); } void Pointfile_Destroy() diff --git a/src/select.cpp b/src/select.cpp index a808a02..a69a933 100644 --- a/src/select.cpp +++ b/src/select.cpp @@ -771,6 +771,17 @@ void Select_FitTexture(float horizontal, float vertical) SceneChangeNotify(); } + +void Select_AlignTexture(int alignment) +{ + if (GlobalSelectionSystem().Mode() != SelectionSystem::eComponent) { + Scene_BrushAlignTexture_Selected(GlobalSceneGraph(), alignment); + } + Scene_BrushAlignTexture_Component_Selected(GlobalSceneGraph(), alignment); + + SceneChangeNotify(); +} + inline void hide_node(scene::Node &node, bool hide) { hide diff --git a/src/select.h b/src/select.h index 6668635..2870558 100644 --- a/src/select.h +++ b/src/select.h @@ -80,6 +80,8 @@ void Select_ShiftTexture(float x, float y); void Select_FitTexture(float horizontal = 1, float vertical = 1); +void Select_AlignTexture(int alignment); + void FindReplaceTextures(const char *pFind, const char *pReplace, bool bSelected); void HideSelected(); diff --git a/src/surfacedialog.cpp b/src/surfacedialog.cpp index 45d023c..934c7a2 100644 --- a/src/surfacedialog.cpp +++ b/src/surfacedialog.cpp @@ -469,6 +469,43 @@ void SurfaceInspector_FitTexture() Select_FitTexture(getSurfaceInspector().m_fitHorizontal, getSurfaceInspector().m_fitVertical); } +void SurfaceInspector_AlignTopLeft() +{ + Select_AlignTexture(0); +} +void SurfaceInspector_AlignTop() +{ + Select_AlignTexture(1); +} +void SurfaceInspector_AlignTopRight() +{ + Select_AlignTexture(2); +} +void SurfaceInspector_AlignLeft() +{ + Select_AlignTexture(3); +} +void SurfaceInspector_AlignCenter() +{ + Select_AlignTexture(4); +} +void SurfaceInspector_AlignRight() +{ + Select_AlignTexture(5); +} +void SurfaceInspector_AlignBottomLeft() +{ + Select_AlignTexture(6); +} +void SurfaceInspector_AlignBottom() +{ + Select_AlignTexture(7); +} +void SurfaceInspector_AlignBottomRight() +{ + Select_AlignTexture(8); +} + static void OnBtnPatchdetails(ui::Widget widget, gpointer data) { Patch_CapTexture(); @@ -525,6 +562,57 @@ static void OnBtnFaceFit(ui::Widget widget, gpointer data) SurfaceInspector_FitTexture(); } + +static void OnBtnTopLeft(ui::Widget widget, gpointer data) +{ + getSurfaceInspector().exportData(); + SurfaceInspector_AlignTopLeft(); +} +static void OnBtnTopCenter(ui::Widget widget, gpointer data) +{ + getSurfaceInspector().exportData(); + SurfaceInspector_AlignTop(); +} +static void OnBtnTopRight(ui::Widget widget, gpointer data) +{ + getSurfaceInspector().exportData(); + SurfaceInspector_AlignTopRight(); +} + + +static void OnBtnMiddleLeft(ui::Widget widget, gpointer data) +{ + getSurfaceInspector().exportData(); + SurfaceInspector_AlignLeft(); +} +static void OnBtnMiddleCenter(ui::Widget widget, gpointer data) +{ + getSurfaceInspector().exportData(); + SurfaceInspector_AlignCenter(); +} +static void OnBtnMiddleRight(ui::Widget widget, gpointer data) +{ + getSurfaceInspector().exportData(); + SurfaceInspector_AlignRight(); +} + + +static void OnBtnBottomLeft(ui::Widget widget, gpointer data) +{ + getSurfaceInspector().exportData(); + SurfaceInspector_AlignBottomLeft(); +} +static void OnBtnBottomCenter(ui::Widget widget, gpointer data) +{ + getSurfaceInspector().exportData(); + SurfaceInspector_AlignBottom(); +} +static void OnBtnBottomRight(ui::Widget widget, gpointer data) +{ + getSurfaceInspector().exportData(); + SurfaceInspector_AlignBottomRight(); +} + typedef const char *FlagName; const FlagName surfaceflagNamesDefault[32] = { @@ -915,6 +1003,92 @@ ui::Window SurfaceInspector::BuildDialog() } } } + { + auto frame = ui::Frame("Alignment"); + frame.show(); + vbox.pack_start(frame, FALSE, FALSE, 0); + { + auto table = ui::Table(3, 3, FALSE); + table.show(); + frame.add(table); + gtk_table_set_row_spacings(table, 5); + gtk_table_set_col_spacings(table, 5); + gtk_container_set_border_width(GTK_CONTAINER(table), 5); + { + ui::Widget button = ui::Button("Top-Left"); + button.show(); + table.attach(button, {0, 1, 0, 1}, {GTK_EXPAND | GTK_FILL, 0}); + button.connect("clicked", + G_CALLBACK(OnBtnTopLeft), 0); + button.dimensions(60, -1); + } + { + ui::Widget button = ui::Button("Top"); + button.show(); + table.attach(button, {1, 2, 0, 1}, {GTK_EXPAND | GTK_FILL, 0}); + button.connect("clicked", + G_CALLBACK(OnBtnTopCenter), 0); + button.dimensions(60, -1); + } + { + ui::Widget button = ui::Button("Top-Right"); + button.show(); + table.attach(button, {2, 3, 0, 1}, {GTK_EXPAND | GTK_FILL, 0}); + button.connect("clicked", + G_CALLBACK(OnBtnTopRight), 0); + button.dimensions(60, -1); + } + { + ui::Widget button = ui::Button("Left"); + button.show(); + table.attach(button, {0, 1, 1, 2}, {GTK_EXPAND | GTK_FILL, 0}); + button.connect("clicked", + G_CALLBACK(OnBtnMiddleLeft), 0); + button.dimensions(60, -1); + } + { + ui::Widget button = ui::Button("Center"); + button.show(); + table.attach(button, {1, 2, 1, 2}, {GTK_EXPAND | GTK_FILL, 0}); + button.connect("clicked", + G_CALLBACK(OnBtnMiddleCenter), 0); + button.dimensions(60, -1); + } + { + ui::Widget button = ui::Button("Right"); + button.show(); + table.attach(button, {2, 3, 1, 2}, {GTK_EXPAND | GTK_FILL, 0}); + button.connect("clicked", + G_CALLBACK(OnBtnMiddleRight), 0); + button.dimensions(60, -1); + } + { + ui::Widget button = ui::Button("Bottom-Left"); + button.show(); + table.attach(button, {0, 1, 2, 3}, {GTK_EXPAND | GTK_FILL, 0}); + button.connect("clicked", + G_CALLBACK(OnBtnBottomLeft), 0); + button.dimensions(60, -1); + } + { + ui::Widget button = ui::Button("Bottom"); + button.show(); + table.attach(button, {1, 2, 2, 3}, {GTK_EXPAND | GTK_FILL, 0}); + button.connect("clicked", + G_CALLBACK(OnBtnBottomCenter), 0); + button.dimensions(60, -1); + } + { + ui::Widget button = ui::Button("Bottom-Right"); + button.show(); + table.attach(button, {2, 3, 2, 3}, {GTK_EXPAND | GTK_FILL, 0}); + button.connect("clicked", + G_CALLBACK(OnBtnBottomRight), 0); + button.dimensions(60, -1); + } + } + } + if (!string_empty(g_pGameDescription->getKeyValue("si_flags"))) { { auto frame = ui::Frame("Surface Flags"); diff --git a/src/texwindow.cpp b/src/texwindow.cpp index 1cacbb5..af0f16a 100644 --- a/src/texwindow.cpp +++ b/src/texwindow.cpp @@ -1987,7 +1987,9 @@ gboolean TextureBrowser_tagMoveHelper(ui::TreeModel model, ui::TreePath path, Gt g_assert(selected != NULL); auto rowref = gtk_tree_row_reference_new(model, path); - *selected = g_slist_append(*selected, rowref); + + if (rowref != NULL) + *selected = g_slist_append(*selected, rowref); return FALSE; } @@ -2920,7 +2922,7 @@ void TextureBrowser_Construct() GlobalToggles_insert("ShowInUse", makeCallbackF(TextureBrowser_ToggleHideUnused), ToggleItem::AddCallbackCaller(g_TextureBrowser.m_hideunused_item), Accelerator('U')); GlobalCommands_insert("ShowAllTextures", makeCallbackF(TextureBrowser_showAll), - Accelerator('A', (GdkModifierType) GDK_LOCK_MASK)); + Accelerator('A', (GdkModifierType) GDK_CONTROL_MASK)); GlobalCommands_insert("ToggleTextures", makeCallbackF(TextureBrowser_toggleShow), Accelerator('T')); GlobalToggles_insert("ToggleShowShaders", makeCallbackF(TextureBrowser_ToggleShowShaders), ToggleItem::AddCallbackCaller(g_TextureBrowser.m_showshaders_item)); diff --git a/src/windowobservers.cpp b/src/windowobservers.cpp index 29c13a9..6f01a68 100644 --- a/src/windowobservers.cpp +++ b/src/windowobservers.cpp @@ -164,7 +164,7 @@ ModifierFlags modifiers_for_state(unsigned int state) if (state & GDK_SHIFT_MASK) { modifiers |= c_modifierShift; } - if (state & GDK_LOCK_MASK) { + if (state & GDK_CONTROL_MASK) { modifiers |= c_modifierControl; } if (state & GDK_MOD1_MASK) { diff --git a/src/xywindow.cpp b/src/xywindow.cpp index 1823d9b..d2934bc 100644 --- a/src/xywindow.cpp +++ b/src/xywindow.cpp @@ -476,7 +476,7 @@ inline unsigned int buttons_for_event_button(GdkEventButton *event) break; } - if ((event->state & GDK_LOCK_MASK) != 0) { + if ((event->state & GDK_CONTROL_MASK) != 0) { flags |= RAD_CONTROL; } @@ -507,7 +507,7 @@ inline unsigned int buttons_for_state(guint state) flags |= RAD_RBUTTON; } - if ((state & GDK_LOCK_MASK) != 0) { + if ((state & GDK_CONTROL_MASK) != 0) { flags |= RAD_CONTROL; } @@ -2932,13 +2932,13 @@ void XYWindow_Construct() GlobalToggles_insert("ToggleView", ToggleShown::ToggleCaller(g_xy_top_shown), ToggleItem::AddCallbackCaller(g_xy_top_shown.m_item), - Accelerator('V', (GdkModifierType) (GDK_SHIFT_MASK | GDK_LOCK_MASK))); + Accelerator('V', (GdkModifierType) (GDK_SHIFT_MASK | GDK_CONTROL_MASK))); GlobalToggles_insert("ToggleSideView", ToggleShown::ToggleCaller(g_yz_side_shown), ToggleItem::AddCallbackCaller(g_yz_side_shown.m_item)); GlobalToggles_insert("ToggleFrontView", ToggleShown::ToggleCaller(g_xz_front_shown), ToggleItem::AddCallbackCaller(g_xz_front_shown.m_item)); GlobalCommands_insert("NextView", makeCallbackF(XY_Next), Accelerator(GDK_KEY_Tab, - (GdkModifierType) GDK_LOCK_MASK)); // fixme: doesn't show its shortcut + (GdkModifierType) GDK_CONTROL_MASK)); // fixme: doesn't show its shortcut GlobalCommands_insert("ZoomIn", makeCallbackF(XY_ZoomIn), Accelerator(GDK_KEY_Delete)); GlobalCommands_insert("ZoomOut", makeCallbackF(XY_ZoomOut), Accelerator(GDK_KEY_Insert)); GlobalCommands_insert("ViewTop", makeCallbackF(XY_Top), Accelerator(GDK_KEY_KP_Home)); @@ -2946,7 +2946,7 @@ void XYWindow_Construct() GlobalCommands_insert("ViewFront", makeCallbackF(XY_Front), Accelerator(GDK_KEY_KP_End)); GlobalCommands_insert("Zoom100", makeCallbackF(XY_Zoom100)); GlobalCommands_insert("CenterXYView", makeCallbackF(XY_Focus), - Accelerator(GDK_KEY_Tab, (GdkModifierType) (GDK_SHIFT_MASK | GDK_LOCK_MASK))); + Accelerator(GDK_KEY_Tab, (GdkModifierType) (GDK_SHIFT_MASK | GDK_CONTROL_MASK))); GlobalPreferenceSystem().registerPreference("ClipCaulk", make_property_string(g_clip_useCaulk));