mirror of
https://codeberg.org/comaps/comaps
synced 2025-12-20 13:23:59 +00:00
Format all C++ and Java code via clang-format
Signed-off-by: Konstantin Pastbin <konstantin.pastbin@gmail.com>
This commit is contained in:
@@ -52,8 +52,8 @@ std::string const kDefaultArrowShadowMesh = "arrow_shadow.obj";
|
||||
|
||||
std::string_view const kMainFileId = "main_obj_file_id";
|
||||
|
||||
using TLoadingCompletion = std::function<void(
|
||||
std::vector<float> positions, std::vector<float> normals, std::vector<float> texCoords)>;
|
||||
using TLoadingCompletion =
|
||||
std::function<void(std::vector<float> positions, std::vector<float> normals, std::vector<float> texCoords)>;
|
||||
using TLoadingFailure = std::function<void(std::string const &)>;
|
||||
|
||||
namespace fast_obj_adapter
|
||||
@@ -102,10 +102,7 @@ unsigned long FileSize(void * file, void * userData)
|
||||
class FastObjMeshGuard
|
||||
{
|
||||
public:
|
||||
explicit FastObjMeshGuard(fastObjMesh * mesh)
|
||||
: m_mesh(mesh)
|
||||
{
|
||||
}
|
||||
explicit FastObjMeshGuard(fastObjMesh * mesh) : m_mesh(mesh) {}
|
||||
|
||||
~FastObjMeshGuard()
|
||||
{
|
||||
@@ -117,8 +114,8 @@ private:
|
||||
fastObjMesh * const m_mesh;
|
||||
};
|
||||
|
||||
bool LoadMesh(std::string const & pathToMesh, bool isDefaultResource,
|
||||
TLoadingCompletion const & completionHandler, TLoadingFailure const & failureHandler)
|
||||
bool LoadMesh(std::string const & pathToMesh, bool isDefaultResource, TLoadingCompletion const & completionHandler,
|
||||
TLoadingFailure const & failureHandler)
|
||||
{
|
||||
CHECK(completionHandler != nullptr, ());
|
||||
CHECK(failureHandler != nullptr, ());
|
||||
@@ -126,9 +123,8 @@ bool LoadMesh(std::string const & pathToMesh, bool isDefaultResource,
|
||||
fastObjMesh * meshData = nullptr;
|
||||
try
|
||||
{
|
||||
ReaderPtr<Reader> reader = isDefaultResource
|
||||
? GetStyleReader().GetDefaultResourceReader(pathToMesh)
|
||||
: GetPlatform().GetReader(pathToMesh);
|
||||
ReaderPtr<Reader> reader =
|
||||
isDefaultResource ? GetStyleReader().GetDefaultResourceReader(pathToMesh) : GetPlatform().GetReader(pathToMesh);
|
||||
ReaderSource source(reader);
|
||||
|
||||
// Read OBJ file.
|
||||
@@ -158,15 +154,13 @@ bool LoadMesh(std::string const & pathToMesh, bool isDefaultResource,
|
||||
{
|
||||
if (meshData->position_count > 1)
|
||||
{
|
||||
memcpy(&positions[i * kComponentsInVertex],
|
||||
&meshData->positions[meshData->indices[i].p * kComponentsInVertex],
|
||||
memcpy(&positions[i * kComponentsInVertex], &meshData->positions[meshData->indices[i].p * kComponentsInVertex],
|
||||
sizeof(float) * kComponentsInVertex);
|
||||
}
|
||||
|
||||
if (meshData->normal_count > 1)
|
||||
{
|
||||
memcpy(&normals[i * kComponentsInNormal],
|
||||
&meshData->normals[meshData->indices[i].n * kComponentsInNormal],
|
||||
memcpy(&normals[i * kComponentsInNormal], &meshData->normals[meshData->indices[i].n * kComponentsInNormal],
|
||||
sizeof(float) * kComponentsInNormal);
|
||||
}
|
||||
|
||||
@@ -201,44 +195,40 @@ Arrow3d::PreloadedData Arrow3d::PreloadMesh(std::optional<Arrow3dCustomDecl> con
|
||||
// Load arrow mesh.
|
||||
auto const & meshPath = customDecl ? customDecl->m_arrowMeshPath : kDefaultArrowMesh;
|
||||
data.m_meshData = PreloadedMeshData{};
|
||||
if (!LoadMesh(
|
||||
meshPath, useDefaultResource,
|
||||
[&](std::vector<float> positions, std::vector<float> normals,
|
||||
std::vector<float> texCoords)
|
||||
{
|
||||
if (!positions.empty())
|
||||
{
|
||||
if (normals.empty())
|
||||
normals =
|
||||
dp::MeshObject::GenerateNormalsForTriangles(positions, kComponentsInNormal);
|
||||
if (!LoadMesh(meshPath, useDefaultResource,
|
||||
[&](std::vector<float> positions, std::vector<float> normals, std::vector<float> texCoords)
|
||||
{
|
||||
if (!positions.empty())
|
||||
{
|
||||
if (normals.empty())
|
||||
normals = dp::MeshObject::GenerateNormalsForTriangles(positions, kComponentsInNormal);
|
||||
|
||||
data.m_meshData->m_positions = std::move(positions);
|
||||
data.m_meshData->m_normals = std::move(normals);
|
||||
data.m_meshData->m_positions = std::move(positions);
|
||||
data.m_meshData->m_normals = std::move(normals);
|
||||
|
||||
// Texture coordinates.
|
||||
ref_ptr<dp::StaticTexture> arrowTexture = texMng->GetArrowTexture();
|
||||
CHECK(arrowTexture != nullptr, ("Arrow texture must be initialized before the mesh"));
|
||||
// NOTE: texture must be loaded before the mesh.
|
||||
if (arrowTexture->IsLoadingCorrect() && !texCoords.empty())
|
||||
{
|
||||
data.m_arrowMeshTexturingEnabled = true;
|
||||
data.m_meshData->m_texCoords = std::move(texCoords);
|
||||
}
|
||||
else
|
||||
{
|
||||
data.m_arrowMeshTexturingEnabled = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
data.m_meshData.reset();
|
||||
}
|
||||
},
|
||||
[&](std::string const & reason)
|
||||
{
|
||||
data.m_meshData.reset();
|
||||
LOG(LERROR, ("Arrow3D mesh was not loaded:", reason));
|
||||
}))
|
||||
// Texture coordinates.
|
||||
ref_ptr<dp::StaticTexture> arrowTexture = texMng->GetArrowTexture();
|
||||
CHECK(arrowTexture != nullptr, ("Arrow texture must be initialized before the mesh"));
|
||||
// NOTE: texture must be loaded before the mesh.
|
||||
if (arrowTexture->IsLoadingCorrect() && !texCoords.empty())
|
||||
{
|
||||
data.m_arrowMeshTexturingEnabled = true;
|
||||
data.m_meshData->m_texCoords = std::move(texCoords);
|
||||
}
|
||||
else
|
||||
{
|
||||
data.m_arrowMeshTexturingEnabled = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
data.m_meshData.reset();
|
||||
}
|
||||
}, [&](std::string const & reason)
|
||||
{
|
||||
data.m_meshData.reset();
|
||||
LOG(LERROR, ("Arrow3D mesh was not loaded:", reason));
|
||||
}))
|
||||
{
|
||||
return {};
|
||||
}
|
||||
@@ -248,39 +238,34 @@ Arrow3d::PreloadedData Arrow3d::PreloadMesh(std::optional<Arrow3dCustomDecl> con
|
||||
if (!shadowMeshPath.empty())
|
||||
{
|
||||
data.m_shadowMeshData = PreloadedMeshData{};
|
||||
LoadMesh(
|
||||
shadowMeshPath, useDefaultResource,
|
||||
[&](std::vector<float> positions, std::vector<float> /* normals */,
|
||||
std::vector<float> texCoords)
|
||||
{
|
||||
// NOTE: Shadow mesh must contain texture coordinates. They're used to create soft shadow.
|
||||
if (!positions.empty() && !texCoords.empty())
|
||||
{
|
||||
data.m_shadowMeshData->m_positions = std::move(positions);
|
||||
data.m_shadowMeshData->m_texCoords = std::move(texCoords);
|
||||
}
|
||||
else
|
||||
{
|
||||
data.m_shadowMeshData.reset();
|
||||
}
|
||||
},
|
||||
[&](std::string const & reason)
|
||||
{
|
||||
data.m_shadowMeshData.reset();
|
||||
LOG(LWARNING, ("Arrow3D shadow mesh was not loaded:", reason));
|
||||
});
|
||||
LoadMesh(shadowMeshPath, useDefaultResource,
|
||||
[&](std::vector<float> positions, std::vector<float> /* normals */, std::vector<float> texCoords)
|
||||
{
|
||||
// NOTE: Shadow mesh must contain texture coordinates. They're used to create soft shadow.
|
||||
if (!positions.empty() && !texCoords.empty())
|
||||
{
|
||||
data.m_shadowMeshData->m_positions = std::move(positions);
|
||||
data.m_shadowMeshData->m_texCoords = std::move(texCoords);
|
||||
}
|
||||
else
|
||||
{
|
||||
data.m_shadowMeshData.reset();
|
||||
}
|
||||
}, [&](std::string const & reason)
|
||||
{
|
||||
data.m_shadowMeshData.reset();
|
||||
LOG(LWARNING, ("Arrow3D shadow mesh was not loaded:", reason));
|
||||
});
|
||||
}
|
||||
|
||||
if (customDecl.has_value())
|
||||
{
|
||||
data.m_texCoordFlipping = glsl::vec2{customDecl->m_flipTexCoordU ? 1.0f : 0.0f,
|
||||
customDecl->m_flipTexCoordV ? 1.0f : 0.0f};
|
||||
data.m_meshOffset =
|
||||
glsl::vec3{customDecl->m_offset.x, customDecl->m_offset.y, customDecl->m_offset.z};
|
||||
data.m_meshEulerAngles = glsl::vec3{customDecl->m_eulerAngles.x, customDecl->m_eulerAngles.y,
|
||||
customDecl->m_eulerAngles.z};
|
||||
data.m_meshScale =
|
||||
glsl::vec3{customDecl->m_scale.x, customDecl->m_scale.y, customDecl->m_scale.z};
|
||||
data.m_texCoordFlipping =
|
||||
glsl::vec2{customDecl->m_flipTexCoordU ? 1.0f : 0.0f, customDecl->m_flipTexCoordV ? 1.0f : 0.0f};
|
||||
data.m_meshOffset = glsl::vec3{customDecl->m_offset.x, customDecl->m_offset.y, customDecl->m_offset.z};
|
||||
data.m_meshEulerAngles =
|
||||
glsl::vec3{customDecl->m_eulerAngles.x, customDecl->m_eulerAngles.y, customDecl->m_eulerAngles.z};
|
||||
data.m_meshScale = glsl::vec3{customDecl->m_scale.x, customDecl->m_scale.y, customDecl->m_scale.z};
|
||||
data.m_enableShadow = customDecl->m_enableShadow;
|
||||
data.m_enableOutline = customDecl->m_enableOutline;
|
||||
}
|
||||
@@ -334,8 +319,7 @@ Arrow3d::Arrow3d(ref_ptr<dp::GraphicsContext> context, ref_ptr<dp::TextureManage
|
||||
|
||||
m_arrowMesh.SetBuffer(kTexCoordBufferInd, std::move(preloadedData.m_meshData->m_texCoords),
|
||||
sizeof(float) * kComponentsInTexCoord);
|
||||
m_arrowMesh.SetAttribute("a_texCoords", kTexCoordBufferInd, 0 /* offset */,
|
||||
kComponentsInTexCoord);
|
||||
m_arrowMesh.SetAttribute("a_texCoords", kTexCoordBufferInd, 0 /* offset */, kComponentsInTexCoord);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -347,22 +331,22 @@ Arrow3d::Arrow3d(ref_ptr<dp::GraphicsContext> context, ref_ptr<dp::TextureManage
|
||||
|
||||
// Positions.
|
||||
CHECK(!preloadedData.m_shadowMeshData->m_positions.empty(), ());
|
||||
m_shadowMesh->SetBuffer(kVerticesBufferInd,
|
||||
std::move(preloadedData.m_shadowMeshData->m_positions),
|
||||
m_shadowMesh->SetBuffer(kVerticesBufferInd, std::move(preloadedData.m_shadowMeshData->m_positions),
|
||||
sizeof(float) * kComponentsInVertex);
|
||||
m_shadowMesh->SetAttribute("a_pos", kVerticesBufferInd, 0 /* offset */, kComponentsInVertex);
|
||||
|
||||
// Texture coordinates.
|
||||
CHECK(!preloadedData.m_shadowMeshData->m_texCoords.empty(), ());
|
||||
m_shadowMesh->SetBuffer(kTexCoordShadowBufferInd,
|
||||
std::move(preloadedData.m_shadowMeshData->m_texCoords),
|
||||
m_shadowMesh->SetBuffer(kTexCoordShadowBufferInd, std::move(preloadedData.m_shadowMeshData->m_texCoords),
|
||||
sizeof(float) * kComponentsInTexCoord);
|
||||
m_shadowMesh->SetAttribute("a_texCoords", kTexCoordShadowBufferInd, 0 /* offset */,
|
||||
kComponentsInTexCoord);
|
||||
m_shadowMesh->SetAttribute("a_texCoords", kTexCoordShadowBufferInd, 0 /* offset */, kComponentsInTexCoord);
|
||||
}
|
||||
}
|
||||
|
||||
bool Arrow3d::IsValid() const { return m_isValid; }
|
||||
bool Arrow3d::IsValid() const
|
||||
{
|
||||
return m_isValid;
|
||||
}
|
||||
|
||||
// static
|
||||
double Arrow3d::GetMaxBottomSize()
|
||||
@@ -371,27 +355,48 @@ double Arrow3d::GetMaxBottomSize()
|
||||
return kBottomSize * arrow3d::kArrowSize * arrow3d::kArrow3dScaleMax * kOutlineScale;
|
||||
}
|
||||
|
||||
void Arrow3d::SetPosition(m2::PointD const & position) { m_position = position; }
|
||||
void Arrow3d::SetPosition(m2::PointD const & position)
|
||||
{
|
||||
m_position = position;
|
||||
}
|
||||
|
||||
void Arrow3d::SetAzimuth(double azimuth)
|
||||
{
|
||||
m_azimuth = azimuth;
|
||||
}
|
||||
|
||||
void Arrow3d::SetPositionObsolete(bool obsolete) { m_obsoletePosition = obsolete; }
|
||||
void Arrow3d::SetPositionObsolete(bool obsolete)
|
||||
{
|
||||
m_obsoletePosition = obsolete;
|
||||
}
|
||||
|
||||
void Arrow3d::SetMeshOffset(glsl::vec3 const & offset) { m_meshOffset = offset; }
|
||||
void Arrow3d::SetMeshOffset(glsl::vec3 const & offset)
|
||||
{
|
||||
m_meshOffset = offset;
|
||||
}
|
||||
|
||||
void Arrow3d::SetMeshRotation(glsl::vec3 const & eulerAngles) { m_meshEulerAngles = eulerAngles; }
|
||||
void Arrow3d::SetMeshRotation(glsl::vec3 const & eulerAngles)
|
||||
{
|
||||
m_meshEulerAngles = eulerAngles;
|
||||
}
|
||||
|
||||
void Arrow3d::SetMeshScale(glsl::vec3 const & scale) { m_meshScale = scale; }
|
||||
void Arrow3d::SetMeshScale(glsl::vec3 const & scale)
|
||||
{
|
||||
m_meshScale = scale;
|
||||
}
|
||||
|
||||
void Arrow3d::SetShadowEnabled(bool enabled) { m_enableShadow = enabled; }
|
||||
void Arrow3d::SetShadowEnabled(bool enabled)
|
||||
{
|
||||
m_enableShadow = enabled;
|
||||
}
|
||||
|
||||
void Arrow3d::SetOutlineEnabled(bool enabled) { m_enableOutline = enabled; }
|
||||
void Arrow3d::SetOutlineEnabled(bool enabled)
|
||||
{
|
||||
m_enableOutline = enabled;
|
||||
}
|
||||
|
||||
void Arrow3d::Render(ref_ptr<dp::GraphicsContext> context, ref_ptr<gpu::ProgramManager> mng,
|
||||
ScreenBase const & screen, bool routingMode)
|
||||
void Arrow3d::Render(ref_ptr<dp::GraphicsContext> context, ref_ptr<gpu::ProgramManager> mng, ScreenBase const & screen,
|
||||
bool routingMode)
|
||||
{
|
||||
// Render shadow.
|
||||
if (m_shadowMesh && m_enableShadow && screen.isPerspective())
|
||||
@@ -405,38 +410,34 @@ void Arrow3d::Render(ref_ptr<dp::GraphicsContext> context, ref_ptr<gpu::ProgramM
|
||||
if (m_shadowMesh && m_enableOutline && routingMode)
|
||||
{
|
||||
dp::Color const outlineColor = df::GetColorConstant(df::kArrow3DOutlineColor);
|
||||
RenderArrow(context, mng, *m_shadowMesh, screen, gpu::Program::Arrow3dOutline, outlineColor,
|
||||
0.0f /* dz */, kOutlineScale /* scaleFactor */);
|
||||
RenderArrow(context, mng, *m_shadowMesh, screen, gpu::Program::Arrow3dOutline, outlineColor, 0.0f /* dz */,
|
||||
kOutlineScale /* scaleFactor */);
|
||||
}
|
||||
|
||||
// Render arrow.
|
||||
if (m_arrowMeshTexturingEnabled)
|
||||
{
|
||||
// Use only alpha channel from arrow color for textured meshes.
|
||||
auto const color =
|
||||
dp::Color(255, 255, 255,
|
||||
m_obsoletePosition ? df::GetColorConstant(df::kArrow3DObsoleteColor).GetAlpha()
|
||||
: df::GetColorConstant(df::kArrow3DColor).GetAlpha());
|
||||
auto const color = dp::Color(255, 255, 255,
|
||||
m_obsoletePosition ? df::GetColorConstant(df::kArrow3DObsoleteColor).GetAlpha()
|
||||
: df::GetColorConstant(df::kArrow3DColor).GetAlpha());
|
||||
|
||||
RenderArrow(context, mng, m_arrowMesh, screen, gpu::Program::Arrow3dTextured, color,
|
||||
0.0f /* dz */, 1.0f /* scaleFactor */);
|
||||
RenderArrow(context, mng, m_arrowMesh, screen, gpu::Program::Arrow3dTextured, color, 0.0f /* dz */,
|
||||
1.0f /* scaleFactor */);
|
||||
}
|
||||
else
|
||||
{
|
||||
dp::Color const color =
|
||||
df::GetColorConstant(m_obsoletePosition ? df::kArrow3DObsoleteColor : df::kArrow3DColor);
|
||||
RenderArrow(context, mng, m_arrowMesh, screen, gpu::Program::Arrow3d, color, 0.0f /* dz */,
|
||||
1.0f /* scaleFactor */);
|
||||
dp::Color const color = df::GetColorConstant(m_obsoletePosition ? df::kArrow3DObsoleteColor : df::kArrow3DColor);
|
||||
RenderArrow(context, mng, m_arrowMesh, screen, gpu::Program::Arrow3d, color, 0.0f /* dz */, 1.0f /* scaleFactor */);
|
||||
}
|
||||
}
|
||||
|
||||
void Arrow3d::RenderArrow(ref_ptr<dp::GraphicsContext> context, ref_ptr<gpu::ProgramManager> mng,
|
||||
dp::MeshObject & mesh, ScreenBase const & screen, gpu::Program program,
|
||||
dp::Color const & color, float dz, float scaleFactor)
|
||||
void Arrow3d::RenderArrow(ref_ptr<dp::GraphicsContext> context, ref_ptr<gpu::ProgramManager> mng, dp::MeshObject & mesh,
|
||||
ScreenBase const & screen, gpu::Program program, dp::Color const & color, float dz,
|
||||
float scaleFactor)
|
||||
{
|
||||
gpu::Arrow3dProgramParams params;
|
||||
auto [transform, normalTransform] =
|
||||
CalculateTransform(screen, dz, scaleFactor, context->GetApiVersion());
|
||||
auto [transform, normalTransform] = CalculateTransform(screen, dz, scaleFactor, context->GetApiVersion());
|
||||
params.m_transform = std::move(transform);
|
||||
params.m_normalTransform = std::move(normalTransform);
|
||||
params.m_color = glsl::ToVec4(color);
|
||||
@@ -446,8 +447,7 @@ void Arrow3d::RenderArrow(ref_ptr<dp::GraphicsContext> context, ref_ptr<gpu::Pro
|
||||
mesh.Render(context, gpuProgram, m_state, mng->GetParamsSetter(), params);
|
||||
}
|
||||
|
||||
std::pair<glsl::mat4, glsl::mat4> Arrow3d::CalculateTransform(ScreenBase const & screen, float dz,
|
||||
float scaleFactor,
|
||||
std::pair<glsl::mat4, glsl::mat4> Arrow3d::CalculateTransform(ScreenBase const & screen, float dz, float scaleFactor,
|
||||
dp::ApiVersion apiVersion) const
|
||||
{
|
||||
double arrowScale = VisualParams::Instance().GetVisualScale() * arrow3d::kArrowSize * scaleFactor;
|
||||
@@ -459,36 +459,30 @@ std::pair<glsl::mat4, glsl::mat4> Arrow3d::CalculateTransform(ScreenBase const &
|
||||
|
||||
glm::quat const qx = glm::angleAxis(m_meshEulerAngles.x, glm::vec3{1.0f, 0.0f, 0.0f});
|
||||
glm::quat const qy = glm::angleAxis(m_meshEulerAngles.y, glm::vec3{0.0f, 1.0f, 0.0f});
|
||||
glm::quat qz =
|
||||
glm::angleAxis(static_cast<float>(m_azimuth + screen.GetAngle() + m_meshEulerAngles.z),
|
||||
glm::vec3{0.0f, 0.0f, -1.0f});
|
||||
glm::quat qz = glm::angleAxis(static_cast<float>(m_azimuth + screen.GetAngle() + m_meshEulerAngles.z),
|
||||
glm::vec3{0.0f, 0.0f, -1.0f});
|
||||
auto const rotationMatrix = glm::mat4_cast(qz * qy * qx);
|
||||
|
||||
qz = glm::angleAxis(static_cast<float>(m_meshEulerAngles.z), glm::vec3{0.0f, 0.0f, -1.0f});
|
||||
auto const normalMatrix = glm::mat4_cast(qz * qy * qx);
|
||||
|
||||
auto const scaleMatrix = glm::scale(
|
||||
glm::mat4(1.0f),
|
||||
glm::vec3{arrowScale, arrowScale, screen.isPerspective() ? arrowScale : 1.0} * m_meshScale);
|
||||
glm::mat4(1.0f), glm::vec3{arrowScale, arrowScale, screen.isPerspective() ? arrowScale : 1.0} * m_meshScale);
|
||||
|
||||
auto const translationMatrix = glm::translate(glm::mat4(1.0f), m_meshOffset);
|
||||
|
||||
auto postProjectionScale =
|
||||
glm::vec3{2.0f / screen.PixelRect().SizeX(), 2.0f / screen.PixelRect().SizeY(), 1.0f};
|
||||
auto postProjectionScale = glm::vec3{2.0f / screen.PixelRect().SizeX(), 2.0f / screen.PixelRect().SizeY(), 1.0f};
|
||||
postProjectionScale.z =
|
||||
screen.isPerspective()
|
||||
? std::min(postProjectionScale.x, postProjectionScale.y) * screen.GetScale3d()
|
||||
: 0.1f;
|
||||
screen.isPerspective() ? std::min(postProjectionScale.x, postProjectionScale.y) * screen.GetScale3d() : 0.1f;
|
||||
auto const postProjectionScaleMatrix = glm::scale(glm::mat4(1.0f), postProjectionScale);
|
||||
|
||||
m2::PointD const pos = screen.GtoP(m_position);
|
||||
auto const dX = static_cast<float>(2.0 * pos.x / screen.PixelRect().SizeX() - 1.0);
|
||||
auto const dY = static_cast<float>(2.0 * pos.y / screen.PixelRect().SizeY() - 1.0);
|
||||
auto const postProjectionTranslationMatrix =
|
||||
glm::translate(glm::mat4(1.0f), glm::vec3{dX, -dY, dz});
|
||||
auto const postProjectionTranslationMatrix = glm::translate(glm::mat4(1.0f), glm::vec3{dX, -dY, dz});
|
||||
|
||||
auto modelTransform = postProjectionTranslationMatrix * postProjectionScaleMatrix * scaleMatrix *
|
||||
translationMatrix * rotationMatrix;
|
||||
auto modelTransform =
|
||||
postProjectionTranslationMatrix * postProjectionScaleMatrix * scaleMatrix * translationMatrix * rotationMatrix;
|
||||
|
||||
if (screen.isPerspective())
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user