Skip to content

Commit

Permalink
Traktor: Blender inspired resizing of terrain modifier brush size.
Browse files Browse the repository at this point in the history
  • Loading branch information
apistol78 committed Jun 13, 2024
1 parent 02c6145 commit 199d130
Show file tree
Hide file tree
Showing 14 changed files with 201 additions and 150 deletions.
2 changes: 2 additions & 0 deletions code/Scene/Editor/IModifier.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ class T_DLLCLASS IModifier : public Object

virtual void selectionChanged() = 0;

virtual void buttonDown() = 0;

virtual CursorMovedResult cursorMoved(
const TransformChain& transformChain,
const Vector2& cursorPosition,
Expand Down
4 changes: 4 additions & 0 deletions code/Scene/Editor/Modifiers/RotateModifier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,10 @@ void RotateModifier::selectionChanged()
m_axisEnable = 0;
}

void RotateModifier::buttonDown()
{
}

IModifier::CursorMovedResult RotateModifier::cursorMoved(
const TransformChain& transformChain,
const Vector2& cursorPosition,
Expand Down
2 changes: 2 additions & 0 deletions code/Scene/Editor/Modifiers/RotateModifier.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ class RotateModifier : public IModifier

virtual void selectionChanged() override final;

virtual void buttonDown() override final;

virtual CursorMovedResult cursorMoved(
const TransformChain& transformChain,
const Vector2& cursorPosition,
Expand Down
4 changes: 4 additions & 0 deletions code/Scene/Editor/Modifiers/ScaleModifier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,10 @@ void ScaleModifier::selectionChanged()
m_deltaScale = Vector4::zero();
}

void ScaleModifier::buttonDown()
{
}

IModifier::CursorMovedResult ScaleModifier::cursorMoved(
const TransformChain& transformChain,
const Vector2& cursorPosition,
Expand Down
2 changes: 2 additions & 0 deletions code/Scene/Editor/Modifiers/ScaleModifier.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ class ScaleModifier : public IModifier

virtual void selectionChanged() override final;

virtual void buttonDown() override final;

virtual CursorMovedResult cursorMoved(
const TransformChain& transformChain,
const Vector2& cursorPosition,
Expand Down
4 changes: 4 additions & 0 deletions code/Scene/Editor/Modifiers/TranslateModifier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,10 @@ void TranslateModifier::selectionChanged()
}
}

void TranslateModifier::buttonDown()
{
}

IModifier::CursorMovedResult TranslateModifier::cursorMoved(
const TransformChain& transformChain,
const Vector2& cursorPosition,
Expand Down
2 changes: 2 additions & 0 deletions code/Scene/Editor/Modifiers/TranslateModifier.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ class TranslateModifier : public IModifier

virtual void selectionChanged() override final;

virtual void buttonDown() override final;

virtual CursorMovedResult cursorMoved(
const TransformChain& transformChain,
const Vector2& cursorPosition,
Expand Down
2 changes: 2 additions & 0 deletions code/Scene/Editor/RenderControlModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,8 @@ void RenderControlModel::eventButtonDown(ISceneRenderControl* renderControl, ui:
worldRayDirection
);

modifier->buttonDown();

modifierHit = modifier->cursorMoved(
transformChain,
screenPosition,
Expand Down
258 changes: 131 additions & 127 deletions code/Shape/Editor/Solid/PrimitiveEditModifier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@

namespace traktor
{
namespace shape
{
namespace shape
{

T_IMPLEMENT_RTTI_CLASS(L"traktor.shape.PrimitiveEditModifier", PrimitiveEditModifier, scene::IModifier)

Expand All @@ -48,98 +48,102 @@ void PrimitiveEditModifier::selectionChanged()
m_entityAdapters = m_context->getEntities(scene::SceneEditorContext::GfDefault | scene::SceneEditorContext::GfSelectedOnly | scene::SceneEditorContext::GfNoExternalChild);
}

void PrimitiveEditModifier::buttonDown()
{
}

scene::IModifier::CursorMovedResult PrimitiveEditModifier::cursorMoved(
const scene::TransformChain& transformChain,
const Vector2& cursorPosition,
const Vector4& worldRayOrigin,
const Vector4& worldRayDirection
const scene::TransformChain& transformChain,
const Vector2& cursorPosition,
const Vector4& worldRayOrigin,
const Vector4& worldRayDirection
)
{
return { true, true };
return { true, true };
}

bool PrimitiveEditModifier::handleCommand(const ui::Command& command)
{
if (command == L"Shape.Editor.BrowseMaterial")
{
Ref< db::Instance > materialInstance = m_context->getEditor()->browseInstance(type_of< model::Material >());
if (materialInstance)
{
for (auto entityAdapter : m_entityAdapters)
{
auto primitiveEntity = dynamic_type_cast< PrimitiveEntity* >(entityAdapter->getEntity());
if (!primitiveEntity || primitiveEntity->getSelectedMaterial() == model::c_InvalidIndex)
continue;

auto primitiveEntityData = mandatory_non_null_type_cast< PrimitiveEntityData* >(entityAdapter->getEntityData());
primitiveEntityData->setMaterial(
primitiveEntity->getSelectedMaterial(),
materialInstance->getGuid()
);
}
}
return true;
}
else
return false;
if (command == L"Shape.Editor.BrowseMaterial")
{
Ref< db::Instance > materialInstance = m_context->getEditor()->browseInstance(type_of< model::Material >());
if (materialInstance)
{
for (auto entityAdapter : m_entityAdapters)
{
auto primitiveEntity = dynamic_type_cast< PrimitiveEntity* >(entityAdapter->getEntity());
if (!primitiveEntity || primitiveEntity->getSelectedMaterial() == model::c_InvalidIndex)
continue;

auto primitiveEntityData = mandatory_non_null_type_cast< PrimitiveEntityData* >(entityAdapter->getEntityData());
primitiveEntityData->setMaterial(
primitiveEntity->getSelectedMaterial(),
materialInstance->getGuid()
);
}
}
return true;
}
else
return false;
}

bool PrimitiveEditModifier::begin(
const scene::TransformChain& transformChain,
const Vector2& cursorPosition,
const Vector4& worldRayOrigin,
const Vector4& worldRayDirection,
int32_t mouseButton
const scene::TransformChain& transformChain,
const Vector2& cursorPosition,
const Vector4& worldRayOrigin,
const Vector4& worldRayDirection,
int32_t mouseButton
)
{
for (auto entityAdapter : m_entityAdapters)
{
auto primitiveEntity = dynamic_type_cast< PrimitiveEntity* >(entityAdapter->getEntity());
if (!primitiveEntity)
continue;

const model::Model* model = primitiveEntity->getModel();
if (!model)
continue;

Transform transform = entityAdapter->getTransform();

Scalar minK(std::numeric_limits< float >::max());
uint32_t minMaterial = model::c_InvalidIndex;

for (uint32_t i = 0; i < model->getPolygonCount(); ++i)
{
const model::Polygon& polygon = model->getPolygon(i);
Winding3 w;
for (uint32_t j = 0; j < polygon.getVertexCount(); ++j)
w.push(transform * model->getVertexPosition(polygon.getVertex(j)));

Scalar k;
if (w.rayIntersection(worldRayOrigin, worldRayDirection, k))
{
if (k < minK)
{
minMaterial = polygon.getMaterial();
minK = k;
}
}
}

primitiveEntity->setSelectedMaterial(minMaterial);
}

return false;
for (auto entityAdapter : m_entityAdapters)
{
auto primitiveEntity = dynamic_type_cast< PrimitiveEntity* >(entityAdapter->getEntity());
if (!primitiveEntity)
continue;

const model::Model* model = primitiveEntity->getModel();
if (!model)
continue;

Transform transform = entityAdapter->getTransform();

Scalar minK(std::numeric_limits< float >::max());
uint32_t minMaterial = model::c_InvalidIndex;

for (uint32_t i = 0; i < model->getPolygonCount(); ++i)
{
const model::Polygon& polygon = model->getPolygon(i);
Winding3 w;
for (uint32_t j = 0; j < polygon.getVertexCount(); ++j)
w.push(transform * model->getVertexPosition(polygon.getVertex(j)));

Scalar k;
if (w.rayIntersection(worldRayOrigin, worldRayDirection, k))
{
if (k < minK)
{
minMaterial = polygon.getMaterial();
minK = k;
}
}
}

primitiveEntity->setSelectedMaterial(minMaterial);
}

return false;
}

void PrimitiveEditModifier::apply(
const scene::TransformChain& transformChain,
const Vector2& cursorPosition,
const Vector4& worldRayOrigin,
const Vector4& worldRayDirection,
const Vector4& screenDelta,
const Vector4& viewDelta,
bool snapOverrideEnable
const scene::TransformChain& transformChain,
const Vector2& cursorPosition,
const Vector4& worldRayOrigin,
const Vector4& worldRayDirection,
const Vector4& screenDelta,
const Vector4& viewDelta,
bool snapOverrideEnable
)
{
}
Expand All @@ -150,54 +154,54 @@ void PrimitiveEditModifier::end(const scene::TransformChain& transformChain)

void PrimitiveEditModifier::draw(render::PrimitiveRenderer* primitiveRenderer) const
{
for (auto entityAdapter : m_entityAdapters)
{
auto primitiveEntity = dynamic_type_cast< PrimitiveEntity* >(entityAdapter->getEntity());
if (!primitiveEntity)
continue;

uint32_t selected = primitiveEntity->getSelectedMaterial();
if (selected == model::c_InvalidIndex)
continue;

const model::Model* model = primitiveEntity->getModel();
if (!model)
continue;

for (uint32_t i = 0; i < model->getPolygonCount(); ++i)
{
const model::Polygon& polygon = model->getPolygon(i);
if (polygon.getMaterial() != selected)
continue;

Winding3 w;
for (uint32_t j = 0; j < polygon.getVertexCount(); ++j)
w.push(model->getVertexPosition(polygon.getVertex(j)));

Plane wp;
if (!w.getPlane(wp))
continue;

primitiveRenderer->pushWorld(entityAdapter->getTransform().toMatrix44());

Triangulator().freeze(
w.get(),
wp.normal(),
Triangulator::Mode::Sequential,
[&](size_t i0, size_t i1, size_t i2) {
primitiveRenderer->drawSolidTriangle(
w[(uint32_t)i0],
w[(uint32_t)i1],
w[(uint32_t)i2],
Color4ub(80, 120, 255, 120)
);
}
);

primitiveRenderer->popWorld();
}
}
for (auto entityAdapter : m_entityAdapters)
{
auto primitiveEntity = dynamic_type_cast< PrimitiveEntity* >(entityAdapter->getEntity());
if (!primitiveEntity)
continue;

uint32_t selected = primitiveEntity->getSelectedMaterial();
if (selected == model::c_InvalidIndex)
continue;

const model::Model* model = primitiveEntity->getModel();
if (!model)
continue;

for (uint32_t i = 0; i < model->getPolygonCount(); ++i)
{
const model::Polygon& polygon = model->getPolygon(i);
if (polygon.getMaterial() != selected)
continue;

Winding3 w;
for (uint32_t j = 0; j < polygon.getVertexCount(); ++j)
w.push(model->getVertexPosition(polygon.getVertex(j)));

Plane wp;
if (!w.getPlane(wp))
continue;

primitiveRenderer->pushWorld(entityAdapter->getTransform().toMatrix44());

Triangulator().freeze(
w.get(),
wp.normal(),
Triangulator::Mode::Sequential,
[&](size_t i0, size_t i1, size_t i2) {
primitiveRenderer->drawSolidTriangle(
w[(uint32_t)i0],
w[(uint32_t)i1],
w[(uint32_t)i2],
Color4ub(80, 120, 255, 120)
);
}
);

primitiveRenderer->popWorld();
}
}
}

}
}
}
2 changes: 2 additions & 0 deletions code/Shape/Editor/Solid/PrimitiveEditModifier.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ class PrimitiveEditModifier : public scene::IModifier

virtual void selectionChanged() override final;

virtual void buttonDown() override final;

virtual CursorMovedResult cursorMoved(
const scene::TransformChain& transformChain,
const Vector2& cursorPosition,
Expand Down
Loading

0 comments on commit 199d130

Please sign in to comment.