finish build in linux
This commit is contained in:
parent
9db7e06aa1
commit
a56bbe6f76
|
|
@ -55,4 +55,5 @@ AGENTS.md
|
||||||
omc
|
omc
|
||||||
omx
|
omx
|
||||||
|
|
||||||
build-win
|
build-win
|
||||||
|
build-linux
|
||||||
96
src/main.cpp
96
src/main.cpp
|
|
@ -43,9 +43,9 @@ struct CubeTriangle
|
||||||
};
|
};
|
||||||
|
|
||||||
static ProjectedVertex ProjectToScreen(
|
static ProjectedVertex ProjectToScreen(
|
||||||
const Math::Vector3& vertex,
|
const Math::Vector3 &vertex,
|
||||||
const Math::Matrix4x4& mvp,
|
const Math::Matrix4x4 &mvp,
|
||||||
const Math::Matrix4x4& viewport)
|
const Math::Matrix4x4 &viewport)
|
||||||
{
|
{
|
||||||
using namespace Math;
|
using namespace Math;
|
||||||
|
|
||||||
|
|
@ -66,45 +66,49 @@ static ProjectedVertex ProjectToScreen(
|
||||||
}
|
}
|
||||||
|
|
||||||
const Vector4 screen = viewport * Vector4(ndcX, ndcY, ndcZ, 1.0f);
|
const Vector4 screen = viewport * Vector4(ndcX, ndcY, ndcZ, 1.0f);
|
||||||
return { Math::Vector3(screen.x, screen.y, screen.z), true };
|
ProjectedVertex result;
|
||||||
|
result.screen = Vector3(screen.x, screen.y, screen.z);
|
||||||
|
result.visible = true;
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool IsFaceVisible(const CubeFace& face, const std::array<Math::Vector3, 8>& viewSpaceVertices)
|
static bool IsFaceVisible(const CubeFace &face, const std::array<Math::Vector3, 8> &viewSpaceVertices)
|
||||||
{
|
{
|
||||||
using namespace Math;
|
using namespace Math;
|
||||||
|
|
||||||
const Vector3& v0 = viewSpaceVertices[face.vertices[0]];
|
const Vector3 &v0 = viewSpaceVertices[face.vertices[0]];
|
||||||
const Vector3& v1 = viewSpaceVertices[face.vertices[1]];
|
const Vector3 &v1 = viewSpaceVertices[face.vertices[1]];
|
||||||
const Vector3& v2 = viewSpaceVertices[face.vertices[2]];
|
const Vector3 &v2 = viewSpaceVertices[face.vertices[2]];
|
||||||
const Vector3 faceNormal = (v1 - v0).cross(v2 - v0);
|
const Vector3 faceNormal = (v1 - v0).cross(v2 - v0);
|
||||||
const Vector3 faceCenter =
|
const Vector3 faceCenter =
|
||||||
(viewSpaceVertices[face.vertices[0]] +
|
(viewSpaceVertices[face.vertices[0]] +
|
||||||
viewSpaceVertices[face.vertices[1]] +
|
viewSpaceVertices[face.vertices[1]] +
|
||||||
viewSpaceVertices[face.vertices[2]] +
|
viewSpaceVertices[face.vertices[2]] +
|
||||||
viewSpaceVertices[face.vertices[3]]) / 4.0f;
|
viewSpaceVertices[face.vertices[3]]) /
|
||||||
|
4.0f;
|
||||||
|
|
||||||
return faceNormal.dot(faceCenter) > 0.0f;
|
return faceNormal.dot(faceCenter) > 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool IsTriangleVisible(const CubeTriangle& triangle, const std::array<Math::Vector3, 8>& viewSpaceVertices)
|
static bool IsTriangleVisible(const CubeTriangle &triangle, const std::array<Math::Vector3, 8> &viewSpaceVertices)
|
||||||
{
|
{
|
||||||
using namespace Math;
|
using namespace Math;
|
||||||
|
|
||||||
const Vector3& v0 = viewSpaceVertices[triangle.vertices[0]];
|
const Vector3 &v0 = viewSpaceVertices[triangle.vertices[0]];
|
||||||
const Vector3& v1 = viewSpaceVertices[triangle.vertices[1]];
|
const Vector3 &v1 = viewSpaceVertices[triangle.vertices[1]];
|
||||||
const Vector3& v2 = viewSpaceVertices[triangle.vertices[2]];
|
const Vector3 &v2 = viewSpaceVertices[triangle.vertices[2]];
|
||||||
const Vector3 faceNormal = (v1 - v0).cross(v2 - v0);
|
const Vector3 faceNormal = (v1 - v0).cross(v2 - v0);
|
||||||
const Vector3 faceCenter = (v0 + v1 + v2) / 3.0f;
|
const Vector3 faceCenter = (v0 + v1 + v2) / 3.0f;
|
||||||
|
|
||||||
return faceNormal.dot(faceCenter) > 0.0f;
|
return faceNormal.dot(faceCenter) > 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
#ifdef USE_FRAMEBUFFER
|
#ifdef USE_FRAMEBUFFER
|
||||||
Platform::IDisplay* display = new Platform::FBDisplay();
|
Platform::IDisplay *display = new Platform::FBDisplay();
|
||||||
#else
|
#else
|
||||||
Platform::IDisplay* display = new Platform::SDLDisplay();
|
Platform::IDisplay *display = new Platform::SDLDisplay();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!display->init(width, height))
|
if (!display->init(width, height))
|
||||||
|
|
@ -113,8 +117,8 @@ int main(int argc, char* argv[])
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::FrameBuffer* frameBuffer = new Core::FrameBuffer(width, height);
|
Core::FrameBuffer *frameBuffer = new Core::FrameBuffer(width, height);
|
||||||
Core::DepthBuffer* depthBuffer = new Core::DepthBuffer(width, height);
|
Core::DepthBuffer *depthBuffer = new Core::DepthBuffer(width, height);
|
||||||
Rasterizer::Rasterizer rasterizer(frameBuffer, depthBuffer);
|
Rasterizer::Rasterizer rasterizer(frameBuffer, depthBuffer);
|
||||||
Rasterizer::TriangleRasterizer triangleRasterizer(frameBuffer, depthBuffer);
|
Rasterizer::TriangleRasterizer triangleRasterizer(frameBuffer, depthBuffer);
|
||||||
|
|
||||||
|
|
@ -130,25 +134,22 @@ int main(int argc, char* argv[])
|
||||||
Math::Vector3(-0.5f, -0.5f, 0.5f),
|
Math::Vector3(-0.5f, -0.5f, 0.5f),
|
||||||
Math::Vector3(0.5f, -0.5f, 0.5f),
|
Math::Vector3(0.5f, -0.5f, 0.5f),
|
||||||
Math::Vector3(0.5f, 0.5f, 0.5f),
|
Math::Vector3(0.5f, 0.5f, 0.5f),
|
||||||
Math::Vector3(-0.5f, 0.5f, 0.5f)
|
Math::Vector3(-0.5f, 0.5f, 0.5f)};
|
||||||
};
|
|
||||||
|
|
||||||
const std::array<CubeFace, 6> cubeFaces = {
|
const std::array<CubeFace, 6> cubeFaces = {
|
||||||
CubeFace{ { 0, 3, 2, 1 } },
|
CubeFace{{0, 3, 2, 1}},
|
||||||
CubeFace{ { 4, 5, 6, 7 } },
|
CubeFace{{4, 5, 6, 7}},
|
||||||
CubeFace{ { 0, 4, 7, 3 } },
|
CubeFace{{0, 4, 7, 3}},
|
||||||
CubeFace{ { 1, 2, 6, 5 } },
|
CubeFace{{1, 2, 6, 5}},
|
||||||
CubeFace{ { 0, 1, 5, 4 } },
|
CubeFace{{0, 1, 5, 4}},
|
||||||
CubeFace{ { 3, 7, 6, 2 } }
|
CubeFace{{3, 7, 6, 2}}};
|
||||||
};
|
|
||||||
const std::array<CubeTriangle, 12> cubeTriangles = {
|
const std::array<CubeTriangle, 12> cubeTriangles = {
|
||||||
CubeTriangle{ { 0, 3, 2 } }, CubeTriangle{ { 0, 2, 1 } },
|
CubeTriangle{{0, 3, 2}}, CubeTriangle{{0, 2, 1}},
|
||||||
CubeTriangle{ { 4, 5, 6 } }, CubeTriangle{ { 4, 6, 7 } },
|
CubeTriangle{{4, 5, 6}}, CubeTriangle{{4, 6, 7}},
|
||||||
CubeTriangle{ { 0, 4, 7 } }, CubeTriangle{ { 0, 7, 3 } },
|
CubeTriangle{{0, 4, 7}}, CubeTriangle{{0, 7, 3}},
|
||||||
CubeTriangle{ { 1, 2, 6 } }, CubeTriangle{ { 1, 6, 5 } },
|
CubeTriangle{{1, 2, 6}}, CubeTriangle{{1, 6, 5}},
|
||||||
CubeTriangle{ { 0, 1, 5 } }, CubeTriangle{ { 0, 5, 4 } },
|
CubeTriangle{{0, 1, 5}}, CubeTriangle{{0, 5, 4}},
|
||||||
CubeTriangle{ { 3, 7, 6 } }, CubeTriangle{ { 3, 6, 2 } }
|
CubeTriangle{{3, 7, 6}}, CubeTriangle{{3, 6, 2}}};
|
||||||
};
|
|
||||||
|
|
||||||
const RenderData::Color clearColor(18, 18, 24, 255);
|
const RenderData::Color clearColor(18, 18, 24, 255);
|
||||||
const RenderData::Color cubeColor(240, 240, 240, 255);
|
const RenderData::Color cubeColor(240, 240, 240, 255);
|
||||||
|
|
@ -188,31 +189,30 @@ int main(int argc, char* argv[])
|
||||||
|
|
||||||
std::array<RenderData::Triangle, 12> drawTriangles;
|
std::array<RenderData::Triangle, 12> drawTriangles;
|
||||||
size_t drawCommandCount = 0;
|
size_t drawCommandCount = 0;
|
||||||
for (const CubeTriangle& cubeTriangle : cubeTriangles)
|
for (const CubeTriangle &cubeTriangle : cubeTriangles)
|
||||||
{
|
{
|
||||||
if (!IsTriangleVisible(cubeTriangle, viewSpaceVertices))
|
if (!IsTriangleVisible(cubeTriangle, viewSpaceVertices))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ProjectedVertex& v0 = projectedVertices[cubeTriangle.vertices[0]];
|
const ProjectedVertex &v0 = projectedVertices[cubeTriangle.vertices[0]];
|
||||||
const ProjectedVertex& v1 = projectedVertices[cubeTriangle.vertices[1]];
|
const ProjectedVertex &v1 = projectedVertices[cubeTriangle.vertices[1]];
|
||||||
const ProjectedVertex& v2 = projectedVertices[cubeTriangle.vertices[2]];
|
const ProjectedVertex &v2 = projectedVertices[cubeTriangle.vertices[2]];
|
||||||
if (!v0.visible || !v1.visible || !v2.visible)
|
if (!v0.visible || !v1.visible || !v2.visible)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Math::Vector3& viewV0 = viewSpaceVertices[cubeTriangle.vertices[0]];
|
const Math::Vector3 &viewV0 = viewSpaceVertices[cubeTriangle.vertices[0]];
|
||||||
const Math::Vector3& viewV1 = viewSpaceVertices[cubeTriangle.vertices[1]];
|
const Math::Vector3 &viewV1 = viewSpaceVertices[cubeTriangle.vertices[1]];
|
||||||
const Math::Vector3& viewV2 = viewSpaceVertices[cubeTriangle.vertices[2]];
|
const Math::Vector3 &viewV2 = viewSpaceVertices[cubeTriangle.vertices[2]];
|
||||||
|
|
||||||
drawTriangles[drawCommandCount++] =
|
drawTriangles[drawCommandCount++] =
|
||||||
RenderData::Triangle(
|
RenderData::Triangle(
|
||||||
Scene::Vertex(v0.screen),
|
Scene::Vertex(v0.screen),
|
||||||
Scene::Vertex(v1.screen),
|
Scene::Vertex(v1.screen),
|
||||||
Scene::Vertex(v2.screen)
|
Scene::Vertex(v2.screen));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < drawCommandCount; ++i)
|
for (size_t i = 0; i < drawCommandCount; ++i)
|
||||||
|
|
@ -227,13 +227,13 @@ int main(int argc, char* argv[])
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const CubeFace& face = cubeFaces[faceIndex];
|
const CubeFace &face = cubeFaces[faceIndex];
|
||||||
for (size_t edgeOffset = 0; edgeOffset < face.vertices.size(); ++edgeOffset)
|
for (size_t edgeOffset = 0; edgeOffset < face.vertices.size(); ++edgeOffset)
|
||||||
{
|
{
|
||||||
const int startIndex = face.vertices[edgeOffset];
|
const int startIndex = face.vertices[edgeOffset];
|
||||||
const int endIndex = face.vertices[(edgeOffset + 1) % face.vertices.size()];
|
const int endIndex = face.vertices[(edgeOffset + 1) % face.vertices.size()];
|
||||||
const ProjectedVertex& start = projectedVertices[startIndex];
|
const ProjectedVertex &start = projectedVertices[startIndex];
|
||||||
const ProjectedVertex& end = projectedVertices[endIndex];
|
const ProjectedVertex &end = projectedVertices[endIndex];
|
||||||
if (!start.visible || !end.visible)
|
if (!start.visible || !end.visible)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue