mirror of
https://github.com/overte-org/overte.git
synced 2025-08-04 06:03:26 +02:00
Starting to clean the mesh part of the RenderItem....
This commit is contained in:
parent
00e0523872
commit
518f5fe17c
6 changed files with 58 additions and 27 deletions
|
@ -181,7 +181,7 @@ public:
|
||||||
|
|
||||||
unsigned int meshIndex; // the order the meshes appeared in the object file
|
unsigned int meshIndex; // the order the meshes appeared in the object file
|
||||||
# if USE_MODEL_MESH
|
# if USE_MODEL_MESH
|
||||||
model::Mesh _mesh;
|
model::MeshPointer _mesh;
|
||||||
# endif
|
# endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -370,19 +370,19 @@ void FBXReader::buildModelMesh(ExtractedMesh& extracted, const QString& url) {
|
||||||
static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex("buildModelMesh failed -- .*");
|
static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex("buildModelMesh failed -- .*");
|
||||||
|
|
||||||
if (extracted.mesh.vertices.size() == 0) {
|
if (extracted.mesh.vertices.size() == 0) {
|
||||||
extracted.mesh._mesh = model::Mesh();
|
extracted.mesh._mesh;
|
||||||
qCDebug(modelformat) << "buildModelMesh failed -- no vertices, url = " << url;
|
qCDebug(modelformat) << "buildModelMesh failed -- no vertices, url = " << url;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
FBXMesh& fbxMesh = extracted.mesh;
|
FBXMesh& fbxMesh = extracted.mesh;
|
||||||
model::Mesh mesh;
|
model::MeshPointer mesh(new model::Mesh());
|
||||||
|
|
||||||
// Grab the vertices in a buffer
|
// Grab the vertices in a buffer
|
||||||
auto vb = std::make_shared<gpu::Buffer>();
|
auto vb = std::make_shared<gpu::Buffer>();
|
||||||
vb->setData(extracted.mesh.vertices.size() * sizeof(glm::vec3),
|
vb->setData(extracted.mesh.vertices.size() * sizeof(glm::vec3),
|
||||||
(const gpu::Byte*) extracted.mesh.vertices.data());
|
(const gpu::Byte*) extracted.mesh.vertices.data());
|
||||||
gpu::BufferView vbv(vb, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ));
|
gpu::BufferView vbv(vb, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ));
|
||||||
mesh.setVertexBuffer(vbv);
|
mesh->setVertexBuffer(vbv);
|
||||||
|
|
||||||
// evaluate all attribute channels sizes
|
// evaluate all attribute channels sizes
|
||||||
int normalsSize = fbxMesh.normals.size() * sizeof(glm::vec3);
|
int normalsSize = fbxMesh.normals.size() * sizeof(glm::vec3);
|
||||||
|
@ -414,37 +414,37 @@ void FBXReader::buildModelMesh(ExtractedMesh& extracted, const QString& url) {
|
||||||
attribBuffer->setSubData(clusterWeightsOffset, clusterWeightsSize, (gpu::Byte*) fbxMesh.clusterWeights.constData());
|
attribBuffer->setSubData(clusterWeightsOffset, clusterWeightsSize, (gpu::Byte*) fbxMesh.clusterWeights.constData());
|
||||||
|
|
||||||
if (normalsSize) {
|
if (normalsSize) {
|
||||||
mesh.addAttribute(gpu::Stream::NORMAL,
|
mesh->addAttribute(gpu::Stream::NORMAL,
|
||||||
model::BufferView(attribBuffer, normalsOffset, normalsSize,
|
model::BufferView(attribBuffer, normalsOffset, normalsSize,
|
||||||
gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ)));
|
gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ)));
|
||||||
}
|
}
|
||||||
if (tangentsSize) {
|
if (tangentsSize) {
|
||||||
mesh.addAttribute(gpu::Stream::TANGENT,
|
mesh->addAttribute(gpu::Stream::TANGENT,
|
||||||
model::BufferView(attribBuffer, tangentsOffset, tangentsSize,
|
model::BufferView(attribBuffer, tangentsOffset, tangentsSize,
|
||||||
gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ)));
|
gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ)));
|
||||||
}
|
}
|
||||||
if (colorsSize) {
|
if (colorsSize) {
|
||||||
mesh.addAttribute(gpu::Stream::COLOR,
|
mesh->addAttribute(gpu::Stream::COLOR,
|
||||||
model::BufferView(attribBuffer, colorsOffset, colorsSize,
|
model::BufferView(attribBuffer, colorsOffset, colorsSize,
|
||||||
gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::RGB)));
|
gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::RGB)));
|
||||||
}
|
}
|
||||||
if (texCoordsSize) {
|
if (texCoordsSize) {
|
||||||
mesh.addAttribute(gpu::Stream::TEXCOORD,
|
mesh->addAttribute(gpu::Stream::TEXCOORD,
|
||||||
model::BufferView( attribBuffer, texCoordsOffset, texCoordsSize,
|
model::BufferView( attribBuffer, texCoordsOffset, texCoordsSize,
|
||||||
gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV)));
|
gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV)));
|
||||||
}
|
}
|
||||||
if (texCoords1Size) {
|
if (texCoords1Size) {
|
||||||
mesh.addAttribute(gpu::Stream::TEXCOORD1,
|
mesh->addAttribute(gpu::Stream::TEXCOORD1,
|
||||||
model::BufferView(attribBuffer, texCoords1Offset, texCoords1Size,
|
model::BufferView(attribBuffer, texCoords1Offset, texCoords1Size,
|
||||||
gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV)));
|
gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV)));
|
||||||
}
|
}
|
||||||
if (clusterIndicesSize) {
|
if (clusterIndicesSize) {
|
||||||
mesh.addAttribute(gpu::Stream::SKIN_CLUSTER_INDEX,
|
mesh->addAttribute(gpu::Stream::SKIN_CLUSTER_INDEX,
|
||||||
model::BufferView(attribBuffer, clusterIndicesOffset, clusterIndicesSize,
|
model::BufferView(attribBuffer, clusterIndicesOffset, clusterIndicesSize,
|
||||||
gpu::Element(gpu::VEC4, gpu::FLOAT, gpu::XYZW)));
|
gpu::Element(gpu::VEC4, gpu::FLOAT, gpu::XYZW)));
|
||||||
}
|
}
|
||||||
if (clusterWeightsSize) {
|
if (clusterWeightsSize) {
|
||||||
mesh.addAttribute(gpu::Stream::SKIN_CLUSTER_WEIGHT,
|
mesh->addAttribute(gpu::Stream::SKIN_CLUSTER_WEIGHT,
|
||||||
model::BufferView(attribBuffer, clusterWeightsOffset, clusterWeightsSize,
|
model::BufferView(attribBuffer, clusterWeightsOffset, clusterWeightsSize,
|
||||||
gpu::Element(gpu::VEC4, gpu::FLOAT, gpu::XYZW)));
|
gpu::Element(gpu::VEC4, gpu::FLOAT, gpu::XYZW)));
|
||||||
}
|
}
|
||||||
|
@ -457,7 +457,6 @@ void FBXReader::buildModelMesh(ExtractedMesh& extracted, const QString& url) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! totalIndices) {
|
if (! totalIndices) {
|
||||||
extracted.mesh._mesh = model::Mesh();
|
|
||||||
qCDebug(modelformat) << "buildModelMesh failed -- no indices, url = " << url;
|
qCDebug(modelformat) << "buildModelMesh failed -- no indices, url = " << url;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -489,21 +488,20 @@ void FBXReader::buildModelMesh(ExtractedMesh& extracted, const QString& url) {
|
||||||
}
|
}
|
||||||
|
|
||||||
gpu::BufferView ibv(ib, gpu::Element(gpu::SCALAR, gpu::UINT32, gpu::XYZ));
|
gpu::BufferView ibv(ib, gpu::Element(gpu::SCALAR, gpu::UINT32, gpu::XYZ));
|
||||||
mesh.setIndexBuffer(ibv);
|
mesh->setIndexBuffer(ibv);
|
||||||
|
|
||||||
if (parts.size()) {
|
if (parts.size()) {
|
||||||
auto pb = std::make_shared<gpu::Buffer>();
|
auto pb = std::make_shared<gpu::Buffer>();
|
||||||
pb->setData(parts.size() * sizeof(model::Mesh::Part), (const gpu::Byte*) parts.data());
|
pb->setData(parts.size() * sizeof(model::Mesh::Part), (const gpu::Byte*) parts.data());
|
||||||
gpu::BufferView pbv(pb, gpu::Element(gpu::VEC4, gpu::UINT32, gpu::XYZW));
|
gpu::BufferView pbv(pb, gpu::Element(gpu::VEC4, gpu::UINT32, gpu::XYZW));
|
||||||
mesh.setPartBuffer(pbv);
|
mesh->setPartBuffer(pbv);
|
||||||
} else {
|
} else {
|
||||||
extracted.mesh._mesh = model::Mesh();
|
|
||||||
qCDebug(modelformat) << "buildModelMesh failed -- no parts, url = " << url;
|
qCDebug(modelformat) << "buildModelMesh failed -- no parts, url = " << url;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// model::Box box =
|
// model::Box box =
|
||||||
mesh.evalPartBound(0);
|
mesh->evalPartBound(0);
|
||||||
|
|
||||||
extracted.mesh._mesh = mesh;
|
extracted.mesh._mesh = mesh;
|
||||||
}
|
}
|
||||||
|
|
|
@ -269,6 +269,7 @@ static NetworkMesh* buildNetworkMesh(const FBXMesh& mesh, const QUrl& textureBas
|
||||||
auto textureCache = DependencyManager::get<TextureCache>();
|
auto textureCache = DependencyManager::get<TextureCache>();
|
||||||
NetworkMesh* networkMesh = new NetworkMesh();
|
NetworkMesh* networkMesh = new NetworkMesh();
|
||||||
|
|
||||||
|
networkMesh->_mesh = mesh._mesh;
|
||||||
int totalIndices = 0;
|
int totalIndices = 0;
|
||||||
bool checkForTexcoordLightmap = false;
|
bool checkForTexcoordLightmap = false;
|
||||||
|
|
||||||
|
|
|
@ -191,15 +191,14 @@ public:
|
||||||
/// The state associated with a single mesh.
|
/// The state associated with a single mesh.
|
||||||
class NetworkMesh {
|
class NetworkMesh {
|
||||||
public:
|
public:
|
||||||
|
model::MeshPointer _mesh;
|
||||||
|
|
||||||
gpu::BufferPointer _indexBuffer;
|
gpu::BufferPointer _indexBuffer;
|
||||||
gpu::BufferPointer _vertexBuffer;
|
gpu::BufferPointer _vertexBuffer;
|
||||||
|
|
||||||
gpu::BufferStreamPointer _vertexStream;
|
gpu::BufferStreamPointer _vertexStream;
|
||||||
|
|
||||||
gpu::Stream::FormatPointer _vertexFormat;
|
gpu::Stream::FormatPointer _vertexFormat;
|
||||||
|
|
||||||
int getTranslucentPartCount(const FBXMesh& fbxMesh) const;
|
|
||||||
bool isPartTranslucent(const FBXMesh& fbxMesh, int partIndex) const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_GeometryCache_h
|
#endif // hifi_GeometryCache_h
|
||||||
|
|
|
@ -754,6 +754,16 @@ public:
|
||||||
int meshIndex;
|
int meshIndex;
|
||||||
int partIndex;
|
int partIndex;
|
||||||
int _shapeID;
|
int _shapeID;
|
||||||
|
|
||||||
|
render::Item::Bound getBound() const {
|
||||||
|
if (_isBoundInvalid) {
|
||||||
|
model->getPartBounds(meshIndex, partIndex);
|
||||||
|
_isBoundInvalid = false;
|
||||||
|
}
|
||||||
|
return _bound;
|
||||||
|
}
|
||||||
|
mutable render::Item::Bound _bound;
|
||||||
|
mutable bool _isBoundInvalid = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace render {
|
namespace render {
|
||||||
|
@ -780,7 +790,7 @@ namespace render {
|
||||||
|
|
||||||
template <> const Item::Bound payloadGetBound(const MeshPartPayload::Pointer& payload) {
|
template <> const Item::Bound payloadGetBound(const MeshPartPayload::Pointer& payload) {
|
||||||
if (payload) {
|
if (payload) {
|
||||||
return payload->model->getPartBounds(payload->meshIndex, payload->partIndex);
|
return payload->getBound(); // model->getPartBounds(payload->meshIndex, payload->partIndex);
|
||||||
}
|
}
|
||||||
return render::Item::Bound();
|
return render::Item::Bound();
|
||||||
}
|
}
|
||||||
|
@ -1486,6 +1496,9 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, int shape
|
||||||
const FBXMesh& mesh = geometry.meshes.at(meshIndex);
|
const FBXMesh& mesh = geometry.meshes.at(meshIndex);
|
||||||
const MeshState& state = _meshStates.at(meshIndex);
|
const MeshState& state = _meshStates.at(meshIndex);
|
||||||
|
|
||||||
|
auto drawMesh = networkMesh._mesh;
|
||||||
|
|
||||||
|
|
||||||
auto drawMaterialKey = material->getKey();
|
auto drawMaterialKey = material->getKey();
|
||||||
bool translucentMesh = drawMaterialKey.isTransparent() || drawMaterialKey.isTransparentMap();
|
bool translucentMesh = drawMaterialKey.isTransparent() || drawMaterialKey.isTransparentMap();
|
||||||
|
|
||||||
|
@ -1541,7 +1554,9 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, int shape
|
||||||
return; // FIXME!
|
return; // FIXME!
|
||||||
}
|
}
|
||||||
|
|
||||||
batch.setIndexBuffer(gpu::UINT32, (networkMesh._indexBuffer), 0);
|
// Assign index buffer:
|
||||||
|
batch.setIndexBuffer(gpu::UINT32, (drawMesh->getIndexBuffer()._buffer), 0);
|
||||||
|
// batch.setIndexBuffer(gpu::UINT32, (networkMesh._indexBuffer), 0);
|
||||||
int vertexCount = mesh.vertices.size();
|
int vertexCount = mesh.vertices.size();
|
||||||
if (vertexCount == 0) {
|
if (vertexCount == 0) {
|
||||||
// sanity check
|
// sanity check
|
||||||
|
@ -1574,10 +1589,21 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, int shape
|
||||||
batch.setModelTransform(_transforms[0]);
|
batch.setModelTransform(_transforms[0]);
|
||||||
|
|
||||||
if (mesh.blendshapes.isEmpty()) {
|
if (mesh.blendshapes.isEmpty()) {
|
||||||
batch.setInputFormat(networkMesh._vertexFormat);
|
batch.setInputFormat((drawMesh->getVertexFormat()));
|
||||||
batch.setInputStream(0, *networkMesh._vertexStream);
|
auto inputStream = drawMesh->makeBufferStream();
|
||||||
|
|
||||||
|
batch.setInputStream(0, inputStream);
|
||||||
|
|
||||||
|
// batch.setInputFormat(networkMesh._vertexFormat);
|
||||||
|
// batch.setInputStream(0, *networkMesh._vertexStream);
|
||||||
} else {
|
} else {
|
||||||
|
/* batch.setInputFormat((drawMesh->getVertexFormat()));
|
||||||
|
auto inputStream = drawMesh->makeBufferStream();
|
||||||
|
|
||||||
|
batch.setInputStream(0, inputStream);
|
||||||
|
*/
|
||||||
batch.setInputFormat(networkMesh._vertexFormat);
|
batch.setInputFormat(networkMesh._vertexFormat);
|
||||||
|
|
||||||
batch.setInputBuffer(0, _blendedVertexBuffers[meshIndex], 0, sizeof(glm::vec3));
|
batch.setInputBuffer(0, _blendedVertexBuffers[meshIndex], 0, sizeof(glm::vec3));
|
||||||
batch.setInputBuffer(1, _blendedVertexBuffers[meshIndex], vertexCount * sizeof(glm::vec3), sizeof(glm::vec3));
|
batch.setInputBuffer(1, _blendedVertexBuffers[meshIndex], vertexCount * sizeof(glm::vec3), sizeof(glm::vec3));
|
||||||
batch.setInputStream(2, *networkMesh._vertexStream);
|
batch.setInputStream(2, *networkMesh._vertexStream);
|
||||||
|
@ -1702,9 +1728,12 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, int shape
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
batch.setIndexBuffer(gpu::UINT32, part.getMergedTriangles(), 0);
|
auto& drawPart = drawMesh->getPartBuffer().get<model::Mesh::Part>();
|
||||||
batch.drawIndexed(gpu::TRIANGLES, part.mergedTrianglesIndicesCount, 0);
|
batch.drawIndexed(model::Mesh::topologyToPrimitive(drawPart._topology), drawPart._numIndices, drawPart._startIndex);
|
||||||
|
|
||||||
|
/* batch.setIndexBuffer(gpu::UINT32, part.getMergedTriangles(), 0);
|
||||||
|
batch.drawIndexed(gpu::TRIANGLES, part.mergedTrianglesIndicesCount, 0);
|
||||||
|
*/
|
||||||
if (args) {
|
if (args) {
|
||||||
const int INDICES_PER_TRIANGLE = 3;
|
const int INDICES_PER_TRIANGLE = 3;
|
||||||
args->_details._trianglesRendered += part.mergedTrianglesIndicesCount / INDICES_PER_TRIANGLE;
|
args->_details._trianglesRendered += part.mergedTrianglesIndicesCount / INDICES_PER_TRIANGLE;
|
||||||
|
|
|
@ -189,8 +189,12 @@ void DrawOpaqueDeferred::run(const SceneContextPointer& sceneContext, const Rend
|
||||||
|
|
||||||
renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnOpaqueItems);
|
renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnOpaqueItems);
|
||||||
|
|
||||||
|
{
|
||||||
|
PerformanceTimer perfTimer("DrawOpaqueDeferred::run::renderBatch");
|
||||||
|
|
||||||
args->_context->render((*args->_batch));
|
args->_context->render((*args->_batch));
|
||||||
args->_batch = nullptr;
|
args->_batch = nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems) {
|
void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems) {
|
||||||
|
|
Loading…
Reference in a new issue