Skip to content

Commit

Permalink
#5767: Create separate test fixture to test Texture Manipulation
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed Oct 1, 2021
1 parent d3aa245 commit d850f7c
Show file tree
Hide file tree
Showing 9 changed files with 155 additions and 123 deletions.
6 changes: 6 additions & 0 deletions radiantcore/selection/algorithm/Texturing.cpp
Expand Up @@ -6,6 +6,12 @@ namespace selection
namespace algorithm
{

bool TextureBoundsAccumulator::operator()(const textool::INode::Ptr& node)
{
_bounds.includeAABB(node->localAABB());
return true;
}

TextureFlipper::TextureFlipper(const Vector2& flipCenter, int axis)
{
auto flipMatrix = Matrix3::getIdentity();
Expand Down
16 changes: 16 additions & 0 deletions radiantcore/selection/algorithm/Texturing.h
@@ -1,6 +1,7 @@
#pragma once

#include "itexturetoolmodel.h"
#include "math/AABB.h"
#include "math/Matrix3.h"

namespace selection
Expand All @@ -9,6 +10,21 @@ namespace selection
namespace algorithm
{

class TextureBoundsAccumulator
{
private:
AABB _bounds;

public:
// Textool node visitor
bool operator()(const textool::INode::Ptr& node);

const AABB& getBounds() const
{
return _bounds;
}
};

// Flips all the visited node about the given axis and the given flip center point (in UV space)
class TextureFlipper
{
Expand Down
12 changes: 3 additions & 9 deletions radiantcore/selection/textool/TextureToolSelectionSystem.cpp
Expand Up @@ -682,22 +682,16 @@ void TextureToolSelectionSystem::flipSelected(int axis)
return;
}

AABB selectionBounds;

// Calculate the center based on the selection
foreachSelectedNode([&](const INode::Ptr& node)
{
selectionBounds.includeAABB(node->localAABB());
return true;
});
selection::algorithm::TextureBoundsAccumulator accumulator;

if (!selectionBounds.isValid())
if (!accumulator.getBounds().isValid())
{
return;
}

// Move center to origin, flip around the specified axis, and move back
Vector2 flipCenter(selectionBounds.origin.x(), selectionBounds.origin.y());
Vector2 flipCenter(accumulator.getBounds().origin.x(), accumulator.getBounds().origin.y());

UndoableCommand cmd("flipSelectedTexcoords " + string::to_string(axis));

Expand Down
146 changes: 32 additions & 114 deletions test/Brush.cpp
Expand Up @@ -24,14 +24,6 @@ void expectNear(const Plane3& p1, const Plane3& p2, double epsilon)
EXPECT_NEAR(p1.dist(), p2.dist(), epsilon);
}

inline bool faceHasVertex(const IFace* face, const Vector3& expectedXYZ, const Vector2& expectedUV)
{
return algorithm::faceHasVertex(face, [&](const WindingVertex& vertex)
{
return math::isNear(vertex.vertex, expectedXYZ, 0.01) && math::isNear(vertex.texcoord, expectedUV, 0.01);
});
}

using Quake3BrushTest = RadiantTest;

class BrushTest: public RadiantTest
Expand Down Expand Up @@ -192,80 +184,6 @@ TEST_F(BrushTest, FacePlaneTranslate)
});
}

TEST_F(BrushTest, FaceRotateTexDef)
{
std::string mapPath = "maps/simple_brushes.map";
GlobalCommandSystem().executeCommand("OpenMap", mapPath);

auto worldspawn = GlobalMapModule().findOrInsertWorldspawn();

// Find the brush that is centered at origin
auto brushNode = algorithm::findFirstBrushWithMaterial(worldspawn, "textures/numbers/2");
EXPECT_TRUE(brushNode && brushNode->getNodeType() == scene::INode::Type::Brush) << "Couldn't locate the test brush";

// Pick a few faces and run the algorithm against it, checking hardcoded results

// Facing 0,0,1
auto face = algorithm::findBrushFaceWithNormal(Node_getIBrush(brushNode), Vector3(0, 0, 1));

EXPECT_TRUE(faceHasVertex(face, Vector3(64, -64, -160), Vector2(0, 1)));
EXPECT_TRUE(faceHasVertex(face, Vector3(-64, -64, -160), Vector2(0, 0)));
EXPECT_TRUE(faceHasVertex(face, Vector3(-64, 64, -160), Vector2(1, 0)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, 64, -160), Vector2(1, 1)));

face->rotateTexdef(15); // degrees

EXPECT_TRUE(faceHasVertex(face, Vector3(64, -64, -160), Vector2(-0.112372, 0.853553)));
EXPECT_TRUE(faceHasVertex(face, Vector3(-64, -64, -160), Vector2(0.146447, -0.112372)));
EXPECT_TRUE(faceHasVertex(face, Vector3(-64, 64, -160), Vector2(1.11237, 0.146447)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, 64, -160), Vector2(0.853553, 1.11237)));

// Facing 1,0,0
face = algorithm::findBrushFaceWithNormal(Node_getIBrush(brushNode), Vector3(1, 0, 0));

EXPECT_TRUE(faceHasVertex(face, Vector3(64, -64, -288), Vector2(0, 65)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, -64, -160), Vector2(0, 64)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, 64, -160), Vector2(1, 64)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, 64, -288), Vector2(1, 65)));

face->rotateTexdef(15); // degrees

EXPECT_TRUE(faceHasVertex(face, Vector3(64, -64, -288), Vector2(-0.112372, 64.8536)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, -64, -160), Vector2(0.146447, 63.8876)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, 64, -160), Vector2(1.11237, 64.1464)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, 64, -288), Vector2(0.853553, 65.1124)));

// Facing 0,0,-1
face = algorithm::findBrushFaceWithNormal(Node_getIBrush(brushNode), Vector3(0, 0, -1));

EXPECT_TRUE(faceHasVertex(face, Vector3(-64, -64, -288), Vector2(0, 1)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, -64, -288), Vector2(0, 0)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, 64, -288), Vector2(1, 0)));
EXPECT_TRUE(faceHasVertex(face, Vector3(-64, 64, -288), Vector2(1, 1)));

face->rotateTexdef(15); // degrees

EXPECT_TRUE(faceHasVertex(face, Vector3(-64, -64, -288), Vector2(-0.112372, 0.853553)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, -64, -288), Vector2(0.146447, -0.112372)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, 64, -288), Vector2(1.11237, 0.146447)));
EXPECT_TRUE(faceHasVertex(face, Vector3(-64, 64, -288), Vector2(0.853553, 1.11237)));

// Facing 0,-1,0, this time rotate -15 degrees
face = algorithm::findBrushFaceWithNormal(Node_getIBrush(brushNode), Vector3(0, -1, 0));

EXPECT_TRUE(faceHasVertex(face, Vector3(-64, -64, -160), Vector2(0, 64)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, -64, -160), Vector2(1, 64)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, -64, -288), Vector2(1, 65)));
EXPECT_TRUE(faceHasVertex(face, Vector3(-64, -64, -288), Vector2(0, 65)));

face->rotateTexdef(-15); // degrees

EXPECT_TRUE(faceHasVertex(face, Vector3(-64, -64, -160), Vector2(-0.112372, 64.1464)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, -64, -160), Vector2(0.853553, 63.8876)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, -64, -288), Vector2(1.11237, 64.8536)));
EXPECT_TRUE(faceHasVertex(face, Vector3(-64, -64, -288), Vector2(0.146447, 65.1124)));
}

// Load a brush with one vertex at 0,0,0, and an identity shift/scale/rotation texdef
TEST_F(Quake3BrushTest, LoadBrushWithIdentityTexDef)
{
Expand All @@ -282,50 +200,50 @@ TEST_F(Quake3BrushTest, LoadBrushWithIdentityTexDef)
auto face = algorithm::findBrushFaceWithNormal(Node_getIBrush(brushNode), Vector3(0, 0, 1));
EXPECT_TRUE(face != nullptr) << "No brush plane is facing upwards?";

EXPECT_TRUE(faceHasVertex(face, Vector3(64, 0, 64), Vector2(0.0625, 0)));
EXPECT_TRUE(faceHasVertex(face, Vector3( 0, 0, 64), Vector2(0, 0)));
EXPECT_TRUE(faceHasVertex(face, Vector3( 0, 64, 64), Vector2(0, -0.125)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, 64, 64), Vector2(0.0625, -0.125)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, 0, 64), Vector2(0.0625, 0)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3( 0, 0, 64), Vector2(0, 0)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3( 0, 64, 64), Vector2(0, -0.125)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, 64, 64), Vector2(0.0625, -0.125)));

face = algorithm::findBrushFaceWithNormal(Node_getIBrush(brushNode), Vector3(0, 0, -1));
EXPECT_TRUE(face != nullptr) << "No brush plane is facing down?";

EXPECT_TRUE(faceHasVertex(face, Vector3(0, 0, 0), Vector2(0, 0)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, 0, 0), Vector2(0.0625, 0)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, 64, 0), Vector2(0.0625, -0.125)));
EXPECT_TRUE(faceHasVertex(face, Vector3(0, 64, 0), Vector2(0, -0.125)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(0, 0, 0), Vector2(0, 0)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, 0, 0), Vector2(0.0625, 0)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, 64, 0), Vector2(0.0625, -0.125)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(0, 64, 0), Vector2(0, -0.125)));

face = algorithm::findBrushFaceWithNormal(Node_getIBrush(brushNode), Vector3(0, -1, 0));
EXPECT_TRUE(face != nullptr) << "No brush plane with normal 0,-1,0?";

EXPECT_TRUE(faceHasVertex(face, Vector3(64, 0, 0), Vector2(0.0625, 0)));
EXPECT_TRUE(faceHasVertex(face, Vector3(0, 0, 0), Vector2(0, 0)));
EXPECT_TRUE(faceHasVertex(face, Vector3(0, 0, 64), Vector2(0, -0.125)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, 0, 64), Vector2(0.0625, -0.125)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, 0, 0), Vector2(0.0625, 0)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(0, 0, 0), Vector2(0, 0)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(0, 0, 64), Vector2(0, -0.125)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, 0, 64), Vector2(0.0625, -0.125)));

face = algorithm::findBrushFaceWithNormal(Node_getIBrush(brushNode), Vector3(0, 1, 0));
EXPECT_TRUE(face != nullptr) << "No brush plane with normal 0,1,0?";

EXPECT_TRUE(faceHasVertex(face, Vector3(0, 64, 0), Vector2(0, 0)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, 64, 0), Vector2(0.0625, 0)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, 64, 64), Vector2(0.0625, -0.125)));
EXPECT_TRUE(faceHasVertex(face, Vector3(0, 64, 64), Vector2(0, -0.125)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(0, 64, 0), Vector2(0, 0)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, 64, 0), Vector2(0.0625, 0)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, 64, 64), Vector2(0.0625, -0.125)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(0, 64, 64), Vector2(0, -0.125)));

face = algorithm::findBrushFaceWithNormal(Node_getIBrush(brushNode), Vector3(1, 0, 0));
EXPECT_TRUE(face != nullptr) << "No brush plane with normal 1,0,0?";

EXPECT_TRUE(faceHasVertex(face, Vector3(64, 64, 0), Vector2(0.0625, 0)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, 0, 0), Vector2(0, 0)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, 0, 64), Vector2(0, -0.125)));
EXPECT_TRUE(faceHasVertex(face, Vector3(64, 64, 64), Vector2(0.0625, -0.125)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, 64, 0), Vector2(0.0625, 0)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, 0, 0), Vector2(0, 0)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, 0, 64), Vector2(0, -0.125)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, 64, 64), Vector2(0.0625, -0.125)));

face = algorithm::findBrushFaceWithNormal(Node_getIBrush(brushNode), Vector3(-1, 0, 0));
EXPECT_TRUE(face != nullptr) << "No brush plane with normal -1,0,0?";

EXPECT_TRUE(faceHasVertex(face, Vector3(0, 0, 0), Vector2(0, 0)));
EXPECT_TRUE(faceHasVertex(face, Vector3(0, 64, 0), Vector2(0.0625, 0)));
EXPECT_TRUE(faceHasVertex(face, Vector3(0, 64, 64), Vector2(0.0625, -0.125)));
EXPECT_TRUE(faceHasVertex(face, Vector3(0, 0, 64), Vector2(0, -0.125)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(0, 0, 0), Vector2(0, 0)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(0, 64, 0), Vector2(0.0625, 0)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(0, 64, 64), Vector2(0.0625, -0.125)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(0, 0, 64), Vector2(0, -0.125)));
}

// Load an axis-aligned brush somewhere at (-600 1000 56) and some shift/scale/rotation values
Expand All @@ -344,10 +262,10 @@ TEST_F(Quake3BrushTest, LoadAxisAlignedBrushWithTransform)
auto face = algorithm::findBrushFaceWithNormal(Node_getIBrush(brushNode), Vector3(0, 0, 1));
EXPECT_TRUE(face != nullptr) << "No brush plane is facing upwards?";

EXPECT_TRUE(faceHasVertex(face, Vector3(-624, 800, 64), Vector2(5, 13)));
EXPECT_TRUE(faceHasVertex(face, Vector3(-688, 800, 64), Vector2(5.5, 13)));
EXPECT_TRUE(faceHasVertex(face, Vector3(-688, 1024, 64), Vector2(5.5, 16.5)));
EXPECT_TRUE(faceHasVertex(face, Vector3(-624, 1024, 64), Vector2(5, 16.5)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(-624, 800, 64), Vector2(5, 13)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(-688, 800, 64), Vector2(5.5, 13)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(-688, 1024, 64), Vector2(5.5, 16.5)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(-624, 1024, 64), Vector2(5, 16.5)));
}

// This loads the same brush as in the LoadAxisAlignedBrushWithTransform test
Expand Down Expand Up @@ -410,10 +328,10 @@ TEST_F(Quake3BrushTest, TextureOnAngledBrush)
auto face = algorithm::findBrushFaceWithNormal(Node_getIBrush(brushNode), Vector3(0, -0.351123, +0.936329));
EXPECT_TRUE(face != nullptr) << "Couldn't find the upwards facing brush face?";

EXPECT_TRUE(faceHasVertex(face, Vector3(-624, 1040, 64), Vector2(5, 16.5)));
EXPECT_TRUE(faceHasVertex(face, Vector3(-688, 1040, 64), Vector2(5.5, 16.5)));
EXPECT_TRUE(faceHasVertex(face, Vector3(-688, 1168, 112), Vector2(5.5, 18.5)));
EXPECT_TRUE(faceHasVertex(face, Vector3(-624, 1168, 112), Vector2(5, 18.5)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(-624, 1040, 64), Vector2(5, 16.5)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(-688, 1040, 64), Vector2(5.5, 16.5)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(-688, 1168, 112), Vector2(5.5, 18.5)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(-624, 1168, 112), Vector2(5, 18.5)));
}
#endif

Expand Down
1 change: 1 addition & 0 deletions test/CMakeLists.txt
Expand Up @@ -34,6 +34,7 @@ add_executable(drtest
Renderer.cpp
SelectionAlgorithm.cpp
Selection.cpp
TextureManipulation.cpp
TextureTool.cpp
Transformation.cpp
VFS.cpp
Expand Down
85 changes: 85 additions & 0 deletions test/TextureManipulation.cpp
@@ -0,0 +1,85 @@
#include "RadiantTest.h"

#include "algorithm/Scene.h"
#include "algorithm/Primitives.h"

namespace test
{

using TextureManipulationTest = RadiantTest;

TEST_F(TextureManipulationTest, FaceRotateTexDef)
{
std::string mapPath = "maps/simple_brushes.map";
GlobalCommandSystem().executeCommand("OpenMap", mapPath);

auto worldspawn = GlobalMapModule().findOrInsertWorldspawn();

// Find the brush that is centered at origin
auto brushNode = algorithm::findFirstBrushWithMaterial(worldspawn, "textures/numbers/2");
EXPECT_TRUE(brushNode && brushNode->getNodeType() == scene::INode::Type::Brush) << "Couldn't locate the test brush";

// Pick a few faces and run the algorithm against it, checking hardcoded results

// Facing 0,0,1
auto face = algorithm::findBrushFaceWithNormal(Node_getIBrush(brushNode), Vector3(0, 0, 1));

EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, -64, -160), Vector2(0, 1)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(-64, -64, -160), Vector2(0, 0)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(-64, 64, -160), Vector2(1, 0)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, 64, -160), Vector2(1, 1)));

face->rotateTexdef(15); // degrees

EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, -64, -160), Vector2(-0.112372, 0.853553)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(-64, -64, -160), Vector2(0.146447, -0.112372)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(-64, 64, -160), Vector2(1.11237, 0.146447)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, 64, -160), Vector2(0.853553, 1.11237)));

// Facing 1,0,0
face = algorithm::findBrushFaceWithNormal(Node_getIBrush(brushNode), Vector3(1, 0, 0));

EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, -64, -288), Vector2(0, 65)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, -64, -160), Vector2(0, 64)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, 64, -160), Vector2(1, 64)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, 64, -288), Vector2(1, 65)));

face->rotateTexdef(15); // degrees

EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, -64, -288), Vector2(-0.112372, 64.8536)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, -64, -160), Vector2(0.146447, 63.8876)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, 64, -160), Vector2(1.11237, 64.1464)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, 64, -288), Vector2(0.853553, 65.1124)));

// Facing 0,0,-1
face = algorithm::findBrushFaceWithNormal(Node_getIBrush(brushNode), Vector3(0, 0, -1));

EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(-64, -64, -288), Vector2(0, 1)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, -64, -288), Vector2(0, 0)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, 64, -288), Vector2(1, 0)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(-64, 64, -288), Vector2(1, 1)));

face->rotateTexdef(15); // degrees

EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(-64, -64, -288), Vector2(-0.112372, 0.853553)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, -64, -288), Vector2(0.146447, -0.112372)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, 64, -288), Vector2(1.11237, 0.146447)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(-64, 64, -288), Vector2(0.853553, 1.11237)));

// Facing 0,-1,0, this time rotate -15 degrees
face = algorithm::findBrushFaceWithNormal(Node_getIBrush(brushNode), Vector3(0, -1, 0));

EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(-64, -64, -160), Vector2(0, 64)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, -64, -160), Vector2(1, 64)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, -64, -288), Vector2(1, 65)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(-64, -64, -288), Vector2(0, 65)));

face->rotateTexdef(-15); // degrees

EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(-64, -64, -160), Vector2(-0.112372, 64.1464)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, -64, -160), Vector2(0.853553, 63.8876)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(64, -64, -288), Vector2(1.11237, 64.8536)));
EXPECT_TRUE(algorithm::faceHasVertex(face, Vector3(-64, -64, -288), Vector2(0.146447, 65.1124)));
}

}
10 changes: 10 additions & 0 deletions test/algorithm/Primitives.h
Expand Up @@ -2,7 +2,9 @@

#include "ibrush.h"
#include "ipatch.h"
#include "math/Vector3.h"
#include "math/Plane3.h"
#include "render/TexCoord2f.h"
#include "math/AABB.h"

namespace test
Expand Down Expand Up @@ -135,6 +137,14 @@ inline scene::INodePtr createPatchFromBounds(const scene::INodePtr& parent,
return patchNode;
}

inline bool faceHasVertex(const IFace* face, const Vector3& expectedXYZ, const Vector2& expectedUV)
{
return algorithm::faceHasVertex(face, [&](const WindingVertex& vertex)
{
return math::isNear(vertex.vertex, expectedXYZ, 0.01) && math::isNear(vertex.texcoord, expectedUV, 0.01);
});
}

}

}
1 change: 1 addition & 0 deletions tools/msvc/Tests/Tests.vcxproj
Expand Up @@ -106,6 +106,7 @@
<ClCompile Include="..\..\..\test\Renderer.cpp" />
<ClCompile Include="..\..\..\test\Selection.cpp" />
<ClCompile Include="..\..\..\test\SelectionAlgorithm.cpp" />
<ClCompile Include="..\..\..\test\TextureManipulation.cpp" />
<ClCompile Include="..\..\..\test\TextureTool.cpp" />
<ClCompile Include="..\..\..\test\Transformation.cpp" />
<ClCompile Include="..\..\..\test\VFS.cpp" />
Expand Down

0 comments on commit d850f7c

Please sign in to comment.