메시를 구성하는 정점 배열, 인덱스 배열 만들어준다.
인덱스배열의 크기는 항상 삼각형 수 * 3이다. 정점의 인덱스 (순번)을 나타내야하기 때문에.
0, 1, 2
0, 2, 3
순이다.
이동, 회전, 크기 부분은 이전과 동일하게 이동 변환행렬, 회전 변환행렬, 크기 변환행렬을 곱해
크기->회전->이동 순으로 적용시킨 합성행렬을 통해 좌표들을 찍어낸다.
// 렌더링 로직을 담당하는 함수
void SoftRenderer::Render2D()
{
// 렌더링 로직에서 사용하는 모듈 내 주요 레퍼런스
auto& r = GetRenderer();
const auto& g = Get2DGameEngine();
// 배경에 격자 그리기
DrawGizmo2D();
// 메시 데이터의 선언
static constexpr float squareHalfSize = 0.5f;
static constexpr size_t vertexCount = 4;
static constexpr size_t triangleCount = 2;
// 메시를 구성하는 정점 배열 생성
static constexpr std::array<Vertex2D, vertexCount> rawVertices =
{
Vertex2D(Vector2(-squareHalfSize, -squareHalfSize)),
Vertex2D(Vector2(-squareHalfSize, squareHalfSize)),
Vertex2D(Vector2(squareHalfSize, squareHalfSize)),
Vertex2D(Vector2(squareHalfSize, -squareHalfSize))
};
// 메시를 구성하는 인덱스 배열 생성
static constexpr std::array<size_t, triangleCount * 3> indices =
{
0, 1, 2,
0, 2, 3
};
// 아핀 변환 행렬 ( 크기 )
Vector3 sBasis1(currentScale, 0.f, 0.f);
Vector3 sBasis2(0.f, currentScale, 0.f);
Vector3 sBasis3 = Vector3::UnitZ;
Matrix3x3 sMatrix(sBasis1, sBasis2, sBasis3);
// 아핀 변환 행렬 ( 회전 )
float sin = 0.f, cos = 0.f;
Math::GetSinCos(sin, cos, currentDegree);
Vector3 rBasis1(cos, sin, 0.f);
Vector3 rBasis2(-sin, cos, 0.f);
Vector3 rBasis3 = Vector3::UnitZ;
Matrix3x3 rMatrix(rBasis1, rBasis2, rBasis3);
// 아핀 변환 행렬 ( 이동 )
Vector3 tBasis1 = Vector3::UnitX;
Vector3 tBasis2 = Vector3::UnitY;
Vector3 tBasis3(currentPosition.X, currentPosition.Y, 1.f);
Matrix3x3 tMatrix(tBasis1, tBasis2, tBasis3);
// 모든 아핀 변환을 곱한 합성 행렬. 크기-회전-이동 순으로 적용
Matrix3x3 finalMatrix = tMatrix * rMatrix * sMatrix;
// 행렬을 적용한 메시 정보를 사용해 물체를 렌더링
static std::vector<Vertex2D> vertices(vertexCount);
for (size_t Vi = 0; Vi < vertexCount; ++Vi)
{
vertices[Vi].Position = finalMatrix * rawVertices[Vi].Position;
}
// 변화된 정점을 잇는 선 그리기
for (size_t ti = 0; ti < triangleCount; ++ti)
{
size_t bi = ti * 3;
r.DrawLine(vertices[indices[bi]].Position, vertices[indices[bi + 1]].Position, _WireframeColor);
r.DrawLine(vertices[indices[bi]].Position, vertices[indices[bi + 2]].Position, _WireframeColor);
r.DrawLine(vertices[indices[bi + 1]].Position, vertices[indices[bi + 2]].Position, _WireframeColor);
}
// 현재 위치, 크기, 각도를 화면에 출력
r.PushStatisticText(std::string("Position : ") + currentPosition.ToString());
r.PushStatisticText(std::string("Scale : ") + std::to_string(currentScale));
r.PushStatisticText(std::string("Degree : ") + std::to_string(currentDegree));
}