patch 1
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
#include <cstdlib>
|
||||
#include <iomanip>
|
||||
#include "renderer/3d/mesh/mesh_material.hpp"
|
||||
#include "file/file_utils.hpp"
|
||||
|
||||
namespace Tyra {
|
||||
|
||||
@@ -29,7 +30,7 @@ MeshMaterial::MeshMaterial(const MeshBuilderData& data,
|
||||
|
||||
id = rand() % 1000000;
|
||||
|
||||
if (data.lightMapEnabled) {
|
||||
if (data.loadLightmap) {
|
||||
lightmapFlag = true;
|
||||
TYRA_ASSERT(material->frames[0]->colors != nullptr,
|
||||
"Colors faces are required");
|
||||
@@ -38,8 +39,15 @@ MeshMaterial::MeshMaterial(const MeshBuilderData& data,
|
||||
}
|
||||
|
||||
ambient.set(material->ambient);
|
||||
|
||||
name = material->name;
|
||||
|
||||
if (material->texturePath.has_value()) {
|
||||
auto textureFilename =
|
||||
FileUtils::getFilenameFromPath(material->texturePath.value());
|
||||
|
||||
textureName = FileUtils::getFilenameWithoutExtension(textureFilename);
|
||||
}
|
||||
|
||||
TYRA_ASSERT(name.length() > 0, "MeshMaterial name cannot be empty");
|
||||
|
||||
u32 lastVertexCount = 0;
|
||||
@@ -71,7 +79,7 @@ MeshMaterial::MeshMaterial(const MeshMaterial& mesh) {
|
||||
|
||||
lightmapFlag = mesh.lightmapFlag;
|
||||
name = mesh.name;
|
||||
|
||||
textureName = mesh.textureName;
|
||||
ambient.set(128.0F, 128.0F, 128.0F, 128.0F);
|
||||
|
||||
for (u32 i = 0; i < mesh.frames.size(); i++) {
|
||||
@@ -112,9 +120,14 @@ std::string MeshMaterial::getPrint(const char* name) const {
|
||||
res << std::endl;
|
||||
res << std::fixed << std::setprecision(2);
|
||||
res << "Id: " << id << ", " << std::endl;
|
||||
res << "Name: " << name << ", " << std::endl;
|
||||
res << "Name: " << this->name << ", " << std::endl;
|
||||
|
||||
if (textureName.has_value()) {
|
||||
res << "Texture path: " << textureName.value() << ", " << std::endl;
|
||||
}
|
||||
|
||||
res << "Frames count: " << frames.size() << ", " << std::endl;
|
||||
res << "Single color?: " << static_cast<u32>(lightmapFlag) << std::endl;
|
||||
res << "Lightmap?: " << static_cast<u32>(lightmapFlag) << std::endl;
|
||||
res << ")";
|
||||
|
||||
return res.str();
|
||||
|
||||
@@ -36,11 +36,12 @@ MeshMaterialFrame::MeshMaterialFrame(const MeshBuilderData& data,
|
||||
TYRA_ASSERT(frame->count > 0, "Vertex count must be greater than 0",
|
||||
"Material name: ", material->name);
|
||||
TYRA_ASSERT(frame->vertices != nullptr, "Vertex array can't be null");
|
||||
TYRA_ASSERT(!data.normalsEnabled || frame->normals != nullptr,
|
||||
TYRA_ASSERT(!data.loadNormals || frame->normals != nullptr,
|
||||
"Normal array can't be null");
|
||||
TYRA_ASSERT(!data.textureCoordsEnabled || frame->textureCoords != nullptr,
|
||||
"Texture coordinate array can't be null");
|
||||
TYRA_ASSERT(!data.lightMapEnabled || frame->colors != nullptr,
|
||||
TYRA_ASSERT(
|
||||
!material->texturePath.has_value() || frame->textureCoords != nullptr,
|
||||
"Texture coordinate array can't be null");
|
||||
TYRA_ASSERT(!data.loadLightmap || frame->colors != nullptr,
|
||||
"Color array can't be null");
|
||||
|
||||
bbox = new BBox(frame->vertices, frame->count);
|
||||
@@ -48,7 +49,7 @@ MeshMaterialFrame::MeshMaterialFrame(const MeshBuilderData& data,
|
||||
count = frame->count;
|
||||
vertices = frame->vertices;
|
||||
|
||||
if (data.normalsEnabled) {
|
||||
if (data.loadNormals) {
|
||||
normals = frame->normals;
|
||||
} else {
|
||||
if (frame->normals != nullptr) delete[] frame->normals;
|
||||
@@ -56,7 +57,7 @@ MeshMaterialFrame::MeshMaterialFrame(const MeshBuilderData& data,
|
||||
normals = nullptr;
|
||||
}
|
||||
|
||||
if (data.textureCoordsEnabled) {
|
||||
if (material->texturePath.has_value()) {
|
||||
textureCoords = frame->textureCoords;
|
||||
} else {
|
||||
if (frame->textureCoords != nullptr) delete[] frame->textureCoords;
|
||||
@@ -64,7 +65,7 @@ MeshMaterialFrame::MeshMaterialFrame(const MeshBuilderData& data,
|
||||
textureCoords = nullptr;
|
||||
}
|
||||
|
||||
if (data.lightMapEnabled) {
|
||||
if (data.loadLightmap) {
|
||||
colors = frame->colors;
|
||||
} else {
|
||||
if (frame->colors != nullptr) delete[] frame->colors;
|
||||
|
||||
@@ -160,19 +160,19 @@ void DynPipRenderer::sendObjectData(
|
||||
void DynPipRenderer::render(DynPipBag** bags, const u32& count) {
|
||||
if (count <= 0) return;
|
||||
|
||||
auto* program = programsRepo->getProgramByBag(bags[0]);
|
||||
addBufferDataToPacket(program, bags, count);
|
||||
addBufferDataToPacket(bags, count);
|
||||
sendPacket();
|
||||
}
|
||||
|
||||
void DynPipRenderer::addBufferDataToPacket(DynPipVU1Program* program,
|
||||
DynPipBag** bags, const u32& count) {
|
||||
void DynPipRenderer::addBufferDataToPacket(DynPipBag** bags, const u32& count) {
|
||||
currentPacket = packets[context];
|
||||
packet2_reset(currentPacket, false);
|
||||
|
||||
for (u32 i = 0; i < count; i++) {
|
||||
if (bags[i]->count <= 0) continue;
|
||||
|
||||
auto* program = programsRepo->getProgramByBag(bags[i]);
|
||||
|
||||
program->addBufferDataToPacket(currentPacket, bags[i], prim);
|
||||
|
||||
if (lastProgramName != program->getName()) {
|
||||
|
||||
@@ -35,6 +35,11 @@ void DynamicPipeline::onUse() {
|
||||
|
||||
buffers = new DynPipBag[buffersCount];
|
||||
|
||||
for (u32 i = 0; i < buffersCount; i++) {
|
||||
buffers[i].texture = nullptr;
|
||||
buffers[i].lighting = nullptr;
|
||||
}
|
||||
|
||||
auto packetSize =
|
||||
buffersCount * 5.1F; // 5.1 = packet2_get_qw_count / buffersCount
|
||||
|
||||
@@ -96,11 +101,12 @@ void DynamicPipeline::render(const DynamicMesh* mesh,
|
||||
|
||||
for (u32 i = 0; i < mesh->materials.size(); i++) {
|
||||
auto* material = mesh->materials[i];
|
||||
|
||||
auto* frameFrom = material->frames[mesh->animation.getState().currentFrame];
|
||||
auto* frameTo = material->frames[mesh->animation.getState().nextFrame];
|
||||
|
||||
auto partSize = core.getMaxVertCountByParams(
|
||||
options && options->lighting, material->frames[0]->textureCoords);
|
||||
options && options->lighting, material->textureName.has_value());
|
||||
|
||||
u32 partsCount = ceil(frameFrom->count / static_cast<float>(partSize));
|
||||
|
||||
@@ -109,13 +115,17 @@ void DynamicPipeline::render(const DynamicMesh* mesh,
|
||||
setBuffersColorBag(buffers, colorBag);
|
||||
u8 isPartInitialized = false;
|
||||
|
||||
auto* texture =
|
||||
rendererCore->texture.repository.getByMeshMaterialId(material->id);
|
||||
Texture* texture = nullptr;
|
||||
|
||||
TYRA_ASSERT(texture, "Texture for material: ", material->name,
|
||||
"Id: ", material->id,
|
||||
"Was not found in texture repository! Did you forget to add "
|
||||
"texture or disable texture coords loading in mesh?");
|
||||
if (material->textureName.has_value()) {
|
||||
texture =
|
||||
rendererCore->texture.repository.getByMeshMaterialId(material->id);
|
||||
|
||||
TYRA_ASSERT(texture, "Texture for material: ", material->name,
|
||||
"Id: ", material->id,
|
||||
"Was not found in texture repository! Did you forget to add "
|
||||
"texture or disable texture coords loading in mesh?");
|
||||
}
|
||||
|
||||
for (u32 k = 0; k < partsCount; k++) {
|
||||
auto& buffer = buffers[bufferIndex];
|
||||
@@ -127,6 +137,7 @@ void DynamicPipeline::render(const DynamicMesh* mesh,
|
||||
u32 startIndex = k * partSize;
|
||||
|
||||
addVertices(frameFrom, frameTo, &buffer, startIndex);
|
||||
|
||||
buffer.texture = getTextureBag(texture, frameFrom, frameTo, startIndex);
|
||||
buffer.lighting = getLightingBag(frameFrom, frameTo, &model, options,
|
||||
dirLights, startIndex);
|
||||
@@ -139,11 +150,13 @@ void DynamicPipeline::render(const DynamicMesh* mesh,
|
||||
setBuffer(buffers, &buffer, &bufferIndex);
|
||||
}
|
||||
|
||||
sendRestOfBuffers(buffers, bufferIndex);
|
||||
bufferIndex = 0;
|
||||
core.begin(infoBag);
|
||||
|
||||
delete colorBag;
|
||||
}
|
||||
|
||||
sendRestOfBuffers(buffers, &bufferIndex);
|
||||
|
||||
if (dirLights) {
|
||||
delete dirLights;
|
||||
}
|
||||
@@ -177,11 +190,12 @@ void DynamicPipeline::setBuffer(DynPipBag* buffers, DynPipBag* buffer,
|
||||
*bufferIndex += 1;
|
||||
}
|
||||
|
||||
void DynamicPipeline::sendRestOfBuffers(DynPipBag* buffers, u16* bufferIndex) {
|
||||
auto isEndOf1stDBuffer = *bufferIndex <= halfBuffersCount - 1;
|
||||
void DynamicPipeline::sendRestOfBuffers(DynPipBag* buffers,
|
||||
const u16& bufferIndex) {
|
||||
auto isEndOf1stDBuffer = bufferIndex <= halfBuffersCount - 1;
|
||||
|
||||
u32 offset = isEndOf1stDBuffer ? 0 : halfBuffersCount;
|
||||
u32 size = *bufferIndex - offset;
|
||||
u32 size = bufferIndex - offset;
|
||||
|
||||
if (size <= 0) return;
|
||||
|
||||
@@ -258,7 +272,7 @@ DynPipColorBag* DynamicPipeline::getColorBag(
|
||||
DynPipTextureBag* DynamicPipeline::getTextureBag(
|
||||
Texture* texture, const MeshMaterialFrame* materialFrameFrom,
|
||||
const MeshMaterialFrame* materialFrameTo, const u32& startIndex) {
|
||||
if (!materialFrameFrom->textureCoords) return nullptr;
|
||||
if (!materialFrameFrom->textureCoords || texture == nullptr) return nullptr;
|
||||
|
||||
auto* result = new DynPipTextureBag();
|
||||
|
||||
|
||||
@@ -65,6 +65,7 @@ void StaticPipeline::render(const StaticMesh* mesh,
|
||||
!(options->frustumCulling != PipelineFrustumCulling_Precise &&
|
||||
infoBag->fullClipChecks == true),
|
||||
"Full clip checks are only supported with frustum culling == Precise!");
|
||||
|
||||
TYRA_ASSERT(options->transformationType == TyraMVP ||
|
||||
(!options->fullClipChecks &&
|
||||
options->frustumCulling == PipelineFrustumCulling_None),
|
||||
@@ -146,7 +147,8 @@ StaPipColorBag* StaticPipeline::getColorBag(
|
||||
|
||||
StaPipTextureBag* StaticPipeline::getTextureBag(
|
||||
const MeshMaterial* material, const MeshMaterialFrame* materialFrame) {
|
||||
if (!materialFrame->textureCoords) return nullptr;
|
||||
if (!materialFrame->textureCoords || !material->textureName.has_value())
|
||||
return nullptr;
|
||||
|
||||
auto* result = new StaPipTextureBag();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user