mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-04 04:13:11 +02:00
bringing the blendshape in skin shader only work in master
This commit is contained in:
parent
d768809fbc
commit
ec6117e9bb
35 changed files with 141 additions and 198 deletions
|
@ -31,7 +31,7 @@
|
||||||
#if defined(Q_OS_ANDROID)
|
#if defined(Q_OS_ANDROID)
|
||||||
#define FBX_PACK_NORMALS 0
|
#define FBX_PACK_NORMALS 0
|
||||||
#else
|
#else
|
||||||
#define FBX_PACK_NORMALS 1
|
#define FBX_PACK_NORMALS 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if FBX_PACK_NORMALS
|
#if FBX_PACK_NORMALS
|
||||||
|
|
|
@ -765,7 +765,7 @@ void FBXReader::buildModelMesh(FBXMesh& extractedMesh, const QString& url) {
|
||||||
// This work is going into rc73 release which is meant to be used for the SPot500 event and we are picking the format
|
// This work is going into rc73 release which is meant to be used for the SPot500 event and we are picking the format
|
||||||
// that works best for blendshaped and skinned meshes aka the avatars.
|
// that works best for blendshaped and skinned meshes aka the avatars.
|
||||||
// We will improve this technique in a hot fix to 73.
|
// We will improve this technique in a hot fix to 73.
|
||||||
hasBlendShapes = true;
|
hasBlendShapes = false;
|
||||||
|
|
||||||
// If has blend shapes allocate and assign buffers for pos and tangents now
|
// If has blend shapes allocate and assign buffers for pos and tangents now
|
||||||
if (hasBlendShapes) {
|
if (hasBlendShapes) {
|
||||||
|
|
|
@ -214,6 +214,18 @@ TransformObject getTransformObject() {
|
||||||
}
|
}
|
||||||
<@endfunc@>
|
<@endfunc@>
|
||||||
|
|
||||||
|
<@func transformModelToWorldAndEyeAndClipPos(cameraTransform, objectTransform, modelPos, worldPos, eyePos, clipPos)@>
|
||||||
|
{ // transformModelToEyeAndClipPos
|
||||||
|
vec4 eyeWAPos;
|
||||||
|
<$transformModelToEyeWorldAlignedPos($cameraTransform$, $objectTransform$, $modelPos$, eyeWAPos)$>
|
||||||
|
<$worldPos$> = vec4(eyeWAPos.xyz - <$cameraTransform$>._view[3].xyz, 1.0);
|
||||||
|
<$clipPos$> = <$cameraTransform$>._projectionViewUntranslated * eyeWAPos;
|
||||||
|
<$eyePos$> = vec4((<$cameraTransform$>._view * vec4(eyeWAPos.xyz, 0.0)).xyz, 1.0);
|
||||||
|
|
||||||
|
<$transformStereoClipsSpace($cameraTransform$, $clipPos$)$>
|
||||||
|
}
|
||||||
|
<@endfunc@>
|
||||||
|
|
||||||
<@func transformModelToEyePos(cameraTransform, objectTransform, modelPos, eyePos)@>
|
<@func transformModelToEyePos(cameraTransform, objectTransform, modelPos, eyePos)@>
|
||||||
{ // transformModelToEyePos
|
{ // transformModelToEyePos
|
||||||
vec4 eyeWAPos;
|
vec4 eyeWAPos;
|
||||||
|
|
|
@ -86,7 +86,7 @@ void CauterizedModel::createRenderItemSet() {
|
||||||
// Create the render payloads
|
// Create the render payloads
|
||||||
int numParts = (int)mesh->getNumParts();
|
int numParts = (int)mesh->getNumParts();
|
||||||
for (int partIndex = 0; partIndex < numParts; partIndex++) {
|
for (int partIndex = 0; partIndex < numParts; partIndex++) {
|
||||||
if (!fbxGeometry.meshes[i].blendshapes.empty() && _blendedVertexBuffers.find(i) == _blendedVertexBuffers.end()) {
|
if (_blendshapeBuffers.find(i) == _blendshapeBuffers.end()) {
|
||||||
initializeBlendshapes(fbxGeometry.meshes[i], i);
|
initializeBlendshapes(fbxGeometry.meshes[i], i);
|
||||||
}
|
}
|
||||||
auto ptr = std::make_shared<CauterizedMeshPartPayload>(shared_from_this(), i, partIndex, shapeID, transform, offset);
|
auto ptr = std::make_shared<CauterizedMeshPartPayload>(shared_from_this(), i, partIndex, shapeID, transform, offset);
|
||||||
|
@ -97,7 +97,7 @@ void CauterizedModel::createRenderItemSet() {
|
||||||
shapeID++;
|
shapeID++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_blendedVertexBuffersInitialized = true;
|
_blendshapeBuffersInitialized = true;
|
||||||
} else {
|
} else {
|
||||||
Model::createRenderItemSet();
|
Model::createRenderItemSet();
|
||||||
}
|
}
|
||||||
|
@ -176,7 +176,7 @@ void CauterizedModel::updateClusterMatrices() {
|
||||||
|
|
||||||
// post the blender if we're not currently waiting for one to finish
|
// post the blender if we're not currently waiting for one to finish
|
||||||
auto modelBlender = DependencyManager::get<ModelBlender>();
|
auto modelBlender = DependencyManager::get<ModelBlender>();
|
||||||
if (_blendedVertexBuffersInitialized && modelBlender->shouldComputeBlendshapes() && geometry.hasBlendedMeshes() && _blendshapeCoefficients != _blendedBlendshapeCoefficients) {
|
if (_blendshapeBuffersInitialized && modelBlender->shouldComputeBlendshapes() && geometry.hasBlendedMeshes() && _blendshapeCoefficients != _blendedBlendshapeCoefficients) {
|
||||||
_blendedBlendshapeCoefficients = _blendshapeCoefficients;
|
_blendedBlendshapeCoefficients = _blendshapeCoefficients;
|
||||||
modelBlender->noteRequiresBlend(getThisPointer());
|
modelBlender->noteRequiresBlend(getThisPointer());
|
||||||
}
|
}
|
||||||
|
|
|
@ -208,9 +208,11 @@ ModelMeshPartPayload::ModelMeshPartPayload(ModelPointer model, int meshIndex, in
|
||||||
|
|
||||||
bool useDualQuaternionSkinning = model->getUseDualQuaternionSkinning();
|
bool useDualQuaternionSkinning = model->getUseDualQuaternionSkinning();
|
||||||
|
|
||||||
if (!model->getFBXGeometry().meshes[meshIndex].blendshapes.isEmpty()) {
|
auto buffer = model->_blendshapeBuffers.find(meshIndex);
|
||||||
_blendedVertexBuffer = model->_blendedVertexBuffers[meshIndex];
|
if (buffer != model->_blendshapeBuffers.end()) {
|
||||||
|
_blendshapeBuffer = buffer->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto& modelMesh = model->getGeometry()->getMeshes().at(_meshIndex);
|
auto& modelMesh = model->getGeometry()->getMeshes().at(_meshIndex);
|
||||||
const Model::MeshState& state = model->getMeshState(_meshIndex);
|
const Model::MeshState& state = model->getMeshState(_meshIndex);
|
||||||
|
|
||||||
|
@ -389,14 +391,10 @@ ShapeKey ModelMeshPartPayload::getShapeKey() const {
|
||||||
void ModelMeshPartPayload::bindMesh(gpu::Batch& batch) {
|
void ModelMeshPartPayload::bindMesh(gpu::Batch& batch) {
|
||||||
batch.setIndexBuffer(gpu::UINT32, (_drawMesh->getIndexBuffer()._buffer), 0);
|
batch.setIndexBuffer(gpu::UINT32, (_drawMesh->getIndexBuffer()._buffer), 0);
|
||||||
batch.setInputFormat((_drawMesh->getVertexFormat()));
|
batch.setInputFormat((_drawMesh->getVertexFormat()));
|
||||||
if (_isBlendShaped && _blendedVertexBuffer) {
|
if (_blendshapeBuffer) {
|
||||||
batch.setInputBuffer(0, _blendedVertexBuffer, 0, sizeof(glm::vec3));
|
batch.setResourceBuffer(0, _blendshapeBuffer);
|
||||||
// Stride is 2*sizeof(glm::vec3) because normal and tangents are interleaved
|
|
||||||
batch.setInputBuffer(1, _blendedVertexBuffer, _drawMesh->getNumVertices() * sizeof(glm::vec3), 2 * sizeof(NormalType));
|
|
||||||
batch.setInputStream(2, _drawMesh->getVertexStream().makeRangedStream(2));
|
|
||||||
} else {
|
|
||||||
batch.setInputStream(0, _drawMesh->getVertexStream());
|
|
||||||
}
|
}
|
||||||
|
batch.setInputStream(0, _drawMesh->getVertexStream());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelMeshPartPayload::bindTransform(gpu::Batch& batch, RenderArgs::RenderMode renderMode) const {
|
void ModelMeshPartPayload::bindTransform(gpu::Batch& batch, RenderArgs::RenderMode renderMode) const {
|
||||||
|
|
|
@ -135,7 +135,7 @@ public:
|
||||||
private:
|
private:
|
||||||
void initCache(const ModelPointer& model);
|
void initCache(const ModelPointer& model);
|
||||||
|
|
||||||
gpu::BufferPointer _blendedVertexBuffer;
|
gpu::BufferPointer _blendshapeBuffer;
|
||||||
render::ShapeKey _shapeKey { render::ShapeKey::Builder::invalid() };
|
render::ShapeKey _shapeKey { render::ShapeKey::Builder::invalid() };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -308,12 +308,12 @@ bool Model::updateGeometry() {
|
||||||
state.clusterDualQuaternions.resize(mesh.clusters.size());
|
state.clusterDualQuaternions.resize(mesh.clusters.size());
|
||||||
state.clusterMatrices.resize(mesh.clusters.size());
|
state.clusterMatrices.resize(mesh.clusters.size());
|
||||||
_meshStates.push_back(state);
|
_meshStates.push_back(state);
|
||||||
if (!mesh.blendshapes.empty() && _blendedVertexBuffers.find(i) == _blendedVertexBuffers.end()) {
|
if (_blendshapeBuffers.find(i) == _blendshapeBuffers.end()) {
|
||||||
initializeBlendshapes(mesh, i);
|
initializeBlendshapes(mesh, i);
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
_blendedVertexBuffersInitialized = true;
|
_blendshapeBuffersInitialized = true;
|
||||||
needFullUpdate = true;
|
needFullUpdate = true;
|
||||||
emit rigReady();
|
emit rigReady();
|
||||||
}
|
}
|
||||||
|
@ -1034,9 +1034,9 @@ void Model::removeFromScene(const render::ScenePointer& scene, render::Transacti
|
||||||
_modelMeshMaterialNames.clear();
|
_modelMeshMaterialNames.clear();
|
||||||
_modelMeshRenderItemShapes.clear();
|
_modelMeshRenderItemShapes.clear();
|
||||||
|
|
||||||
_blendedVertexBuffers.clear();
|
_blendshapeBuffers.clear();
|
||||||
_normalsAndTangents.clear();
|
_blendshapeOffsets.clear();
|
||||||
_blendedVertexBuffersInitialized = false;
|
_blendshapeBuffersInitialized = false;
|
||||||
|
|
||||||
_addedToScene = false;
|
_addedToScene = false;
|
||||||
|
|
||||||
|
@ -1304,26 +1304,21 @@ Blender::Blender(ModelPointer model, int blendNumber, const Geometry::WeakPointe
|
||||||
}
|
}
|
||||||
|
|
||||||
void Blender::run() {
|
void Blender::run() {
|
||||||
QVector<glm::vec3> vertices;
|
QVector<BlendshapeOffset> blendshapeOffsets;
|
||||||
QVector<NormalType> normalsAndTangents;
|
|
||||||
if (_model && _model->isLoaded()) {
|
if (_model && _model->isLoaded()) {
|
||||||
DETAILED_PROFILE_RANGE_EX(simulation_animation, __FUNCTION__, 0xFFFF0000, 0, { { "url", _model->getURL().toString() } });
|
DETAILED_PROFILE_RANGE_EX(simulation_animation, __FUNCTION__, 0xFFFF0000, 0, { { "url", _model->getURL().toString() } });
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
int normalsAndTangentsOffset = 0;
|
|
||||||
auto meshes = _model->getFBXGeometry().meshes;
|
auto meshes = _model->getFBXGeometry().meshes;
|
||||||
int meshIndex = 0;
|
int meshIndex = 0;
|
||||||
foreach (const FBXMesh& mesh, meshes) {
|
foreach (const FBXMesh& mesh, meshes) {
|
||||||
auto modelMeshNormalsAndTangents = _model->_normalsAndTangents.find(meshIndex++);
|
auto modelMeshBlendshapeOffsets = _model->_blendshapeOffsets.find(meshIndex++);
|
||||||
if (mesh.blendshapes.isEmpty() || modelMeshNormalsAndTangents == _model->_normalsAndTangents.end()) {
|
if (mesh.blendshapes.isEmpty() || modelMeshBlendshapeOffsets == _model->_blendshapeOffsets.end()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
vertices += mesh.vertices;
|
blendshapeOffsets += modelMeshBlendshapeOffsets->second;
|
||||||
normalsAndTangents += modelMeshNormalsAndTangents->second;
|
BlendshapeOffset* meshBlendshapeOffsets = blendshapeOffsets.data() + offset;
|
||||||
glm::vec3* meshVertices = vertices.data() + offset;
|
offset += modelMeshBlendshapeOffsets->second.size();
|
||||||
NormalType* meshNormalsAndTangents = normalsAndTangents.data() + normalsAndTangentsOffset;
|
|
||||||
offset += mesh.vertices.size();
|
|
||||||
normalsAndTangentsOffset += modelMeshNormalsAndTangents->second.size();
|
|
||||||
const float NORMAL_COEFFICIENT_SCALE = 0.01f;
|
const float NORMAL_COEFFICIENT_SCALE = 0.01f;
|
||||||
for (int i = 0, n = qMin(_blendshapeCoefficients.size(), mesh.blendshapes.size()); i < n; i++) {
|
for (int i = 0, n = qMin(_blendshapeCoefficients.size(), mesh.blendshapes.size()); i < n; i++) {
|
||||||
float vertexCoefficient = _blendshapeCoefficients.at(i);
|
float vertexCoefficient = _blendshapeCoefficients.at(i);
|
||||||
|
@ -1336,26 +1331,15 @@ void Blender::run() {
|
||||||
tbb::parallel_for(tbb::blocked_range<int>(0, blendshape.indices.size()), [&](const tbb::blocked_range<int>& range) {
|
tbb::parallel_for(tbb::blocked_range<int>(0, blendshape.indices.size()), [&](const tbb::blocked_range<int>& range) {
|
||||||
for (auto j = range.begin(); j < range.end(); j++) {
|
for (auto j = range.begin(); j < range.end(); j++) {
|
||||||
int index = blendshape.indices.at(j);
|
int index = blendshape.indices.at(j);
|
||||||
meshVertices[index] += blendshape.vertices.at(j) * vertexCoefficient;
|
auto& currentBlendshapeOffset = meshBlendshapeOffsets[index];
|
||||||
|
currentBlendshapeOffset.positionOffsetAndSpare += glm::vec4(blendshape.vertices.at(j) * vertexCoefficient, 0.0f);
|
||||||
|
|
||||||
glm::vec3 normal = mesh.normals.at(index) + blendshape.normals.at(j) * normalCoefficient;
|
currentBlendshapeOffset.normalOffsetAndSpare += glm::vec4(blendshape.normals.at(j) * normalCoefficient, 0.0f);
|
||||||
glm::vec3 tangent;
|
|
||||||
if (index < mesh.tangents.size()) {
|
if (index < mesh.tangents.size()) {
|
||||||
tangent = mesh.tangents.at(index);
|
|
||||||
if ((int)j < blendshape.tangents.size()) {
|
if ((int)j < blendshape.tangents.size()) {
|
||||||
tangent += blendshape.tangents.at(j) * normalCoefficient;
|
currentBlendshapeOffset.tangentOffsetAndSpare += glm::vec4(blendshape.tangents.at(j) * normalCoefficient, 0.0f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if FBX_PACK_NORMALS
|
|
||||||
glm::uint32 finalNormal;
|
|
||||||
glm::uint32 finalTangent;
|
|
||||||
buffer_helpers::packNormalAndTangent(normal, tangent, finalNormal, finalTangent);
|
|
||||||
#else
|
|
||||||
const auto& finalNormal = normal;
|
|
||||||
const auto& finalTangent = tangent;
|
|
||||||
#endif
|
|
||||||
meshNormalsAndTangents[2 * index] = finalNormal;
|
|
||||||
meshNormalsAndTangents[2 * index + 1] = finalTangent;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1363,8 +1347,7 @@ void Blender::run() {
|
||||||
}
|
}
|
||||||
// post the result to the ModelBlender, which will dispatch to the model if still alive
|
// post the result to the ModelBlender, which will dispatch to the model if still alive
|
||||||
QMetaObject::invokeMethod(DependencyManager::get<ModelBlender>().data(), "setBlendedVertices",
|
QMetaObject::invokeMethod(DependencyManager::get<ModelBlender>().data(), "setBlendedVertices",
|
||||||
Q_ARG(ModelPointer, _model), Q_ARG(int, _blendNumber), Q_ARG(QVector<glm::vec3>, vertices),
|
Q_ARG(ModelPointer, _model), Q_ARG(int, _blendNumber), Q_ARG(QVector<BlendshapeOffset>, blendshapeOffsets));
|
||||||
Q_ARG(QVector<NormalType>, normalsAndTangents));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Model::setScaleToFit(bool scaleToFit, const glm::vec3& dimensions, bool forceRescale) {
|
void Model::setScaleToFit(bool scaleToFit, const glm::vec3& dimensions, bool forceRescale) {
|
||||||
|
@ -1525,7 +1508,7 @@ void Model::updateClusterMatrices() {
|
||||||
|
|
||||||
// post the blender if we're not currently waiting for one to finish
|
// post the blender if we're not currently waiting for one to finish
|
||||||
auto modelBlender = DependencyManager::get<ModelBlender>();
|
auto modelBlender = DependencyManager::get<ModelBlender>();
|
||||||
if (_blendedVertexBuffersInitialized && modelBlender->shouldComputeBlendshapes() && geometry.hasBlendedMeshes() && _blendshapeCoefficients != _blendedBlendshapeCoefficients) {
|
if (_blendshapeBuffersInitialized && modelBlender->shouldComputeBlendshapes() && geometry.hasBlendedMeshes() && _blendshapeCoefficients != _blendedBlendshapeCoefficients) {
|
||||||
_blendedBlendshapeCoefficients = _blendshapeCoefficients;
|
_blendedBlendshapeCoefficients = _blendshapeCoefficients;
|
||||||
modelBlender->noteRequiresBlend(getThisPointer());
|
modelBlender->noteRequiresBlend(getThisPointer());
|
||||||
}
|
}
|
||||||
|
@ -1542,39 +1525,34 @@ bool Model::maybeStartBlender() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Model::setBlendedVertices(int blendNumber, const QVector<glm::vec3>& vertices, const QVector<NormalType>& normalsAndTangents) {
|
void Model::setBlendedVertices(int blendNumber, const QVector<BlendshapeOffset>& blendshapeOffsets) {
|
||||||
if (!isLoaded() || blendNumber < _appliedBlendNumber || !_blendedVertexBuffersInitialized) {
|
if (!isLoaded() || blendNumber < _appliedBlendNumber || !_blendshapeBuffersInitialized) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_appliedBlendNumber = blendNumber;
|
_appliedBlendNumber = blendNumber;
|
||||||
const FBXGeometry& fbxGeometry = getFBXGeometry();
|
const FBXGeometry& fbxGeometry = getFBXGeometry();
|
||||||
int index = 0;
|
int index = 0;
|
||||||
int normalAndTangentIndex = 0;
|
|
||||||
for (int i = 0; i < fbxGeometry.meshes.size(); i++) {
|
for (int i = 0; i < fbxGeometry.meshes.size(); i++) {
|
||||||
const FBXMesh& mesh = fbxGeometry.meshes.at(i);
|
const FBXMesh& mesh = fbxGeometry.meshes.at(i);
|
||||||
auto meshNormalsAndTangents = _normalsAndTangents.find(i);
|
auto meshBlendshapeOffsets = _blendshapeOffsets.find(i);
|
||||||
if (mesh.blendshapes.isEmpty() || meshNormalsAndTangents == _normalsAndTangents.end()) {
|
if (mesh.blendshapes.isEmpty() || meshBlendshapeOffsets == _blendshapeOffsets.end()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto vertexCount = mesh.vertices.size();
|
const auto& buffer = _blendshapeBuffers.find(i);
|
||||||
const auto verticesSize = vertexCount * sizeof(glm::vec3);
|
assert(buffer != _blendshapeBuffers.end());
|
||||||
const auto& buffer = _blendedVertexBuffers.find(i);
|
const auto blendshapeOffsetSize = meshBlendshapeOffsets->second.size() * sizeof(BlendshapeOffset);
|
||||||
assert(buffer != _blendedVertexBuffers.end());
|
buffer->second->setData(blendshapeOffsetSize, (gpu::Byte*) blendshapeOffsets.constData() + index * sizeof(BlendshapeOffset));
|
||||||
buffer->second->resize(mesh.vertices.size() * sizeof(glm::vec3) + meshNormalsAndTangents->second.size() * sizeof(NormalType));
|
|
||||||
buffer->second->setSubData(0, verticesSize, (gpu::Byte*) vertices.constData() + index * sizeof(glm::vec3));
|
|
||||||
buffer->second->setSubData(verticesSize, meshNormalsAndTangents->second.size() * sizeof(NormalType), (const gpu::Byte*) normalsAndTangents.data() + normalAndTangentIndex * sizeof(NormalType));
|
|
||||||
|
|
||||||
index += vertexCount;
|
index += meshBlendshapeOffsets->second.size();
|
||||||
normalAndTangentIndex += meshNormalsAndTangents->second.size();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Model::deleteGeometry() {
|
void Model::deleteGeometry() {
|
||||||
_deleteGeometryCounter++;
|
_deleteGeometryCounter++;
|
||||||
_blendedVertexBuffers.clear();
|
_blendshapeBuffers.clear();
|
||||||
_normalsAndTangents.clear();
|
_blendshapeOffsets.clear();
|
||||||
_blendedVertexBuffersInitialized = false;
|
_blendshapeBuffersInitialized = false;
|
||||||
_meshStates.clear();
|
_meshStates.clear();
|
||||||
_rig.destroyAnimGraph();
|
_rig.destroyAnimGraph();
|
||||||
_blendedBlendshapeCoefficients.clear();
|
_blendedBlendshapeCoefficients.clear();
|
||||||
|
@ -1607,39 +1585,12 @@ const render::ItemIDs& Model::fetchRenderItemIDs() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Model::initializeBlendshapes(const FBXMesh& mesh, int index) {
|
void Model::initializeBlendshapes(const FBXMesh& mesh, int index) {
|
||||||
_blendedVertexBuffers[index] = std::make_shared<gpu::Buffer>();
|
_blendshapeBuffers[index] = std::make_shared<gpu::Buffer>();
|
||||||
QVector<NormalType> normalsAndTangents;
|
QVector<BlendshapeOffset> blendshapeOffset;
|
||||||
normalsAndTangents.resize(2 * mesh.normals.size());
|
blendshapeOffset.fill(BlendshapeOffset(), 3 * mesh.vertices.size());
|
||||||
|
const auto blendshapeOffsetsSize = blendshapeOffset.size() * sizeof(BlendshapeOffset);
|
||||||
// Interleave normals and tangents
|
_blendshapeBuffers[index]->setData(blendshapeOffsetsSize, (const gpu::Byte*) blendshapeOffset.constData());
|
||||||
// Parallel version for performance
|
_blendshapeOffsets[index] = blendshapeOffset;
|
||||||
tbb::parallel_for(tbb::blocked_range<int>(0, mesh.normals.size()), [&](const tbb::blocked_range<int>& range) {
|
|
||||||
auto normalsRange = std::make_pair(mesh.normals.begin() + range.begin(), mesh.normals.begin() + range.end());
|
|
||||||
auto tangentsRange = std::make_pair(mesh.tangents.begin() + range.begin(), mesh.tangents.begin() + range.end());
|
|
||||||
auto normalsAndTangentsIt = normalsAndTangents.begin() + 2 * range.begin();
|
|
||||||
|
|
||||||
for (auto normalIt = normalsRange.first, tangentIt = tangentsRange.first;
|
|
||||||
normalIt != normalsRange.second;
|
|
||||||
++normalIt, ++tangentIt) {
|
|
||||||
#if FBX_PACK_NORMALS
|
|
||||||
glm::uint32 finalNormal;
|
|
||||||
glm::uint32 finalTangent;
|
|
||||||
buffer_helpers::packNormalAndTangent(*normalIt, *tangentIt, finalNormal, finalTangent);
|
|
||||||
#else
|
|
||||||
const auto& finalNormal = *normalIt;
|
|
||||||
const auto& finalTangent = *tangentIt;
|
|
||||||
#endif
|
|
||||||
*normalsAndTangentsIt = finalNormal;
|
|
||||||
++normalsAndTangentsIt;
|
|
||||||
*normalsAndTangentsIt = finalTangent;
|
|
||||||
++normalsAndTangentsIt;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
const auto verticesSize = mesh.vertices.size() * sizeof(glm::vec3);
|
|
||||||
_blendedVertexBuffers[index]->resize(mesh.vertices.size() * sizeof(glm::vec3) + normalsAndTangents.size() * sizeof(NormalType));
|
|
||||||
_blendedVertexBuffers[index]->setSubData(0, verticesSize, (const gpu::Byte*) mesh.vertices.constData());
|
|
||||||
_blendedVertexBuffers[index]->setSubData(verticesSize, normalsAndTangents.size() * sizeof(NormalType), (const gpu::Byte*) normalsAndTangents.data());
|
|
||||||
_normalsAndTangents[index] = normalsAndTangents;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Model::createRenderItemSet() {
|
void Model::createRenderItemSet() {
|
||||||
|
@ -1680,7 +1631,7 @@ void Model::createRenderItemSet() {
|
||||||
// Create the render payloads
|
// Create the render payloads
|
||||||
int numParts = (int)mesh->getNumParts();
|
int numParts = (int)mesh->getNumParts();
|
||||||
for (int partIndex = 0; partIndex < numParts; partIndex++) {
|
for (int partIndex = 0; partIndex < numParts; partIndex++) {
|
||||||
if (!fbxGeometry.meshes[i].blendshapes.empty() && _blendedVertexBuffers.find(i) == _blendedVertexBuffers.end()) {
|
if (_blendshapeBuffers.find(i) == _blendshapeBuffers.end()) {
|
||||||
initializeBlendshapes(fbxGeometry.meshes[i], i);
|
initializeBlendshapes(fbxGeometry.meshes[i], i);
|
||||||
}
|
}
|
||||||
_modelMeshRenderItems << std::make_shared<ModelMeshPartPayload>(shared_from_this(), i, partIndex, shapeID, transform, offset);
|
_modelMeshRenderItems << std::make_shared<ModelMeshPartPayload>(shared_from_this(), i, partIndex, shapeID, transform, offset);
|
||||||
|
@ -1794,9 +1745,9 @@ void ModelBlender::noteRequiresBlend(ModelPointer model) {
|
||||||
_modelsRequiringBlends.insert(model);
|
_modelsRequiringBlends.insert(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelBlender::setBlendedVertices(ModelPointer model, int blendNumber, QVector<glm::vec3> vertices, QVector<NormalType> normalsAndTangents) {
|
void ModelBlender::setBlendedVertices(ModelPointer model, int blendNumber, QVector<BlendshapeOffset> blendshapeOffsets) {
|
||||||
if (model) {
|
if (model) {
|
||||||
model->setBlendedVertices(blendNumber, vertices, normalsAndTangents);
|
model->setBlendedVertices(blendNumber, blendshapeOffsets);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
Lock lock(_mutex);
|
Lock lock(_mutex);
|
||||||
|
|
|
@ -75,6 +75,12 @@ struct SortedTriangleSet {
|
||||||
int subMeshIndex;
|
int subMeshIndex;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct BlendshapeOffset {
|
||||||
|
glm::vec4 positionOffsetAndSpare;
|
||||||
|
glm::vec4 normalOffsetAndSpare;
|
||||||
|
glm::vec4 tangentOffsetAndSpare;
|
||||||
|
};
|
||||||
|
|
||||||
/// A generic 3D model displaying geometry loaded from a URL.
|
/// A generic 3D model displaying geometry loaded from a URL.
|
||||||
class Model : public QObject, public std::enable_shared_from_this<Model>, public scriptable::ModelProvider {
|
class Model : public QObject, public std::enable_shared_from_this<Model>, public scriptable::ModelProvider {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
@ -144,7 +150,7 @@ public:
|
||||||
bool maybeStartBlender();
|
bool maybeStartBlender();
|
||||||
|
|
||||||
/// Sets blended vertices computed in a separate thread.
|
/// Sets blended vertices computed in a separate thread.
|
||||||
void setBlendedVertices(int blendNumber, const QVector<glm::vec3>& vertices, const QVector<NormalType>& normalsAndTangents);
|
void setBlendedVertices(int blendNumber, const QVector<BlendshapeOffset>& blendshapeOffsets);
|
||||||
|
|
||||||
bool isLoaded() const { return (bool)_renderGeometry && _renderGeometry->isGeometryLoaded(); }
|
bool isLoaded() const { return (bool)_renderGeometry && _renderGeometry->isGeometryLoaded(); }
|
||||||
bool isAddedToScene() const { return _addedToScene; }
|
bool isAddedToScene() const { return _addedToScene; }
|
||||||
|
@ -344,7 +350,7 @@ public:
|
||||||
void addMaterial(graphics::MaterialLayer material, const std::string& parentMaterialName);
|
void addMaterial(graphics::MaterialLayer material, const std::string& parentMaterialName);
|
||||||
void removeMaterial(graphics::MaterialPointer material, const std::string& parentMaterialName);
|
void removeMaterial(graphics::MaterialPointer material, const std::string& parentMaterialName);
|
||||||
|
|
||||||
std::unordered_map<int, QVector<NormalType>> _normalsAndTangents;
|
std::unordered_map<int, QVector<BlendshapeOffset>> _blendshapeOffsets;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void loadURLFinished(bool success);
|
void loadURLFinished(bool success);
|
||||||
|
@ -424,8 +430,8 @@ protected:
|
||||||
|
|
||||||
QUrl _url;
|
QUrl _url;
|
||||||
|
|
||||||
std::unordered_map<int, gpu::BufferPointer> _blendedVertexBuffers;
|
std::unordered_map<int, gpu::BufferPointer> _blendshapeBuffers;
|
||||||
bool _blendedVertexBuffersInitialized { false };
|
bool _blendshapeBuffersInitialized{ false };
|
||||||
|
|
||||||
QVector<QVector<QSharedPointer<Texture>>> _dilatedTextures;
|
QVector<QVector<QSharedPointer<Texture>>> _dilatedTextures;
|
||||||
|
|
||||||
|
@ -506,6 +512,7 @@ private:
|
||||||
|
|
||||||
Q_DECLARE_METATYPE(ModelPointer)
|
Q_DECLARE_METATYPE(ModelPointer)
|
||||||
Q_DECLARE_METATYPE(Geometry::WeakPointer)
|
Q_DECLARE_METATYPE(Geometry::WeakPointer)
|
||||||
|
Q_DECLARE_METATYPE(BlendshapeOffset)
|
||||||
|
|
||||||
/// Handle management of pending models that need blending
|
/// Handle management of pending models that need blending
|
||||||
class ModelBlender : public QObject, public Dependency {
|
class ModelBlender : public QObject, public Dependency {
|
||||||
|
@ -520,7 +527,7 @@ public:
|
||||||
bool shouldComputeBlendshapes() { return _computeBlendshapes; }
|
bool shouldComputeBlendshapes() { return _computeBlendshapes; }
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void setBlendedVertices(ModelPointer model, int blendNumber, QVector<glm::vec3> vertices, QVector<NormalType> normalsAndTangents);
|
void setBlendedVertices(ModelPointer model, int blendNumber, QVector<BlendshapeOffset> blendshapeOffsets);
|
||||||
void setComputeBlendshapes(bool computeBlendshapes) { _computeBlendshapes = computeBlendshapes; }
|
void setComputeBlendshapes(bool computeBlendshapes) { _computeBlendshapes = computeBlendshapes; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -78,7 +78,7 @@ void SoftAttachmentModel::updateClusterMatrices() {
|
||||||
|
|
||||||
// post the blender if we're not currently waiting for one to finish
|
// post the blender if we're not currently waiting for one to finish
|
||||||
auto modelBlender = DependencyManager::get<ModelBlender>();
|
auto modelBlender = DependencyManager::get<ModelBlender>();
|
||||||
if (_blendedVertexBuffersInitialized && modelBlender->shouldComputeBlendshapes() && geometry.hasBlendedMeshes() && _blendshapeCoefficients != _blendedBlendshapeCoefficients) {
|
if (_blendshapeBuffersInitialized && modelBlender->shouldComputeBlendshapes() && geometry.hasBlendedMeshes() && _blendshapeCoefficients != _blendedBlendshapeCoefficients) {
|
||||||
_blendedBlendshapeCoefficients = _blendshapeCoefficients;
|
_blendedBlendshapeCoefficients = _blendshapeCoefficients;
|
||||||
modelBlender->noteRequiresBlend(getThisPointer());
|
modelBlender->noteRequiresBlend(getThisPointer());
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
<@include gpu/Config.slh@>
|
<@include gpu/Config.slh@>
|
||||||
<$VERSION_HEADER$>
|
<$VERSION_HEADER$>
|
||||||
// Generated on <$_SCRIBE_DATE$>
|
// <$_SCRIBE_FILENAME$>
|
||||||
// model.vert
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
// vertex shader
|
|
||||||
//
|
//
|
||||||
// Created by Andrzej Kapolka on 10/14/13.
|
// Created by Hifi Engine Team.
|
||||||
// Copyright 2013 High Fidelity, Inc.
|
// Copyright 2013 High Fidelity, Inc.
|
||||||
//
|
//
|
||||||
// Distributed under the Apache License, Version 2.0.
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
@ -21,6 +20,7 @@
|
||||||
|
|
||||||
<$declareMaterialTexMapArrayBuffer()$>
|
<$declareMaterialTexMapArrayBuffer()$>
|
||||||
|
|
||||||
|
layout(location=RENDER_UTILS_ATTR_POSITION_WS) out vec4 _positionWS;
|
||||||
layout(location=RENDER_UTILS_ATTR_POSITION_ES) out vec4 _positionES;
|
layout(location=RENDER_UTILS_ATTR_POSITION_ES) out vec4 _positionES;
|
||||||
layout(location=RENDER_UTILS_ATTR_TEXCOORD01) out vec4 _texCoord01;
|
layout(location=RENDER_UTILS_ATTR_TEXCOORD01) out vec4 _texCoord01;
|
||||||
layout(location=RENDER_UTILS_ATTR_NORMAL_WS) out vec3 _normalWS;
|
layout(location=RENDER_UTILS_ATTR_NORMAL_WS) out vec3 _normalWS;
|
||||||
|
@ -32,11 +32,11 @@ void main(void) {
|
||||||
|
|
||||||
TexMapArray texMapArray = getTexMapArray();
|
TexMapArray texMapArray = getTexMapArray();
|
||||||
<$evalTexMapArrayTexcoord0(texMapArray, inTexCoord0, _texCoord01.xy)$>
|
<$evalTexMapArrayTexcoord0(texMapArray, inTexCoord0, _texCoord01.xy)$>
|
||||||
<$evalTexMapArrayTexcoord1(texMapArray, inTexCoord0, _texCoord01.zw)$>
|
<$evalTexMapArrayTexcoord1(texMapArray, inTexCoord1, _texCoord01.zw)$>
|
||||||
|
|
||||||
// standard transform
|
// standard transform
|
||||||
TransformCamera cam = getTransformCamera();
|
TransformCamera cam = getTransformCamera();
|
||||||
TransformObject obj = getTransformObject();
|
TransformObject obj = getTransformObject();
|
||||||
<$transformModelToEyeAndClipPos(cam, obj, inPosition, _positionES, gl_Position)$>
|
<$transformModelToWorldAndEyeAndClipPos(cam, obj, inPosition, _positionWS, _positionES, gl_Position)$>
|
||||||
<$transformModelToWorldDir(cam, obj, inNormal.xyz, _normalWS)$>
|
<$transformModelToWorldDir(cam, obj, inNormal.xyz, _normalWS)$>
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
<@include gpu/Config.slh@>
|
<@include gpu/Config.slh@>
|
||||||
<$VERSION_HEADER$>
|
<$VERSION_HEADER$>
|
||||||
// Generated on <$_SCRIBE_DATE$>
|
// <$_SCRIBE_FILENAME$>
|
||||||
// model_fade.vert
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
// vertex shader
|
|
||||||
//
|
//
|
||||||
// Created by Olivier Prat on 04/24/17.
|
// Created by Olivier Prat on 04/24/17.
|
||||||
// Copyright 2017 High Fidelity, Inc.
|
// Copyright 2017 High Fidelity, Inc.
|
||||||
|
@ -33,7 +32,7 @@ void main(void) {
|
||||||
|
|
||||||
TexMapArray texMapArray = getTexMapArray();
|
TexMapArray texMapArray = getTexMapArray();
|
||||||
<$evalTexMapArrayTexcoord0(texMapArray, inTexCoord0, _texCoord01.xy)$>
|
<$evalTexMapArrayTexcoord0(texMapArray, inTexCoord0, _texCoord01.xy)$>
|
||||||
<$evalTexMapArrayTexcoord1(texMapArray, inTexCoord0, _texCoord01.zw)$>
|
<$evalTexMapArrayTexcoord1(texMapArray, inTexCoord1, _texCoord01.zw)$>
|
||||||
|
|
||||||
// standard transform
|
// standard transform
|
||||||
TransformCamera cam = getTransformCamera();
|
TransformCamera cam = getTransformCamera();
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
<@include gpu/Config.slh@>
|
<@include gpu/Config.slh@>
|
||||||
<$VERSION_HEADER$>
|
<$VERSION_HEADER$>
|
||||||
// Generated on <$_SCRIBE_DATE$>
|
// <$_SCRIBE_FILENAME$>
|
||||||
//
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
// model_lightmap.vert
|
|
||||||
// vertex shader
|
|
||||||
//
|
//
|
||||||
// Created by Sam Gateau on 11/21/14.
|
// Created by Sam Gateau on 11/21/14.
|
||||||
// Copyright 2013 High Fidelity, Inc.
|
// Copyright 2013 High Fidelity, Inc.
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
<@include gpu/Config.slh@>
|
<@include gpu/Config.slh@>
|
||||||
<$VERSION_HEADER$>
|
<$VERSION_HEADER$>
|
||||||
// Generated on <$_SCRIBE_DATE$>
|
// <$_SCRIBE_FILENAME$>
|
||||||
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
//
|
//
|
||||||
// model_normal_map.vert
|
// Created by Hifi Engine Team.
|
||||||
// vertex shader
|
|
||||||
//
|
|
||||||
// Created by Andrzej Kapolka on 10/14/13.
|
|
||||||
// Copyright 2013 High Fidelity, Inc.
|
// Copyright 2013 High Fidelity, Inc.
|
||||||
//
|
//
|
||||||
// Distributed under the Apache License, Version 2.0.
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
@ -36,7 +34,7 @@ void main(void) {
|
||||||
|
|
||||||
TexMapArray texMapArray = getTexMapArray();
|
TexMapArray texMapArray = getTexMapArray();
|
||||||
<$evalTexMapArrayTexcoord0(texMapArray, inTexCoord0, _texCoord01.xy)$>
|
<$evalTexMapArrayTexcoord0(texMapArray, inTexCoord0, _texCoord01.xy)$>
|
||||||
<$evalTexMapArrayTexcoord1(texMapArray, inTexCoord0, _texCoord01.zw)$>
|
<$evalTexMapArrayTexcoord1(texMapArray, inTexCoord1, _texCoord01.zw)$>
|
||||||
|
|
||||||
// standard transform
|
// standard transform
|
||||||
TransformCamera cam = getTransformCamera();
|
TransformCamera cam = getTransformCamera();
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
<@include gpu/Config.slh@>
|
<@include gpu/Config.slh@>
|
||||||
<$VERSION_HEADER$>
|
<$VERSION_HEADER$>
|
||||||
// Generated on <$_SCRIBE_DATE$>
|
// <$_SCRIBE_FILENAME$>
|
||||||
//
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
// model_normal_map_fade.vert
|
|
||||||
// vertex shader
|
|
||||||
//
|
//
|
||||||
// Created by Olivier Prat on 04/24/17.
|
// Created by Olivier Prat on 04/24/17.
|
||||||
// Copyright 2017 High Fidelity, Inc.
|
// Copyright 2017 High Fidelity, Inc.
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
<@include gpu/Config.slh@>
|
<@include gpu/Config.slh@>
|
||||||
<$VERSION_HEADER$>
|
<$VERSION_HEADER$>
|
||||||
// Generated on <$_SCRIBE_DATE$>
|
// <$_SCRIBE_FILENAME$>
|
||||||
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
//
|
//
|
||||||
// model_shadow.vert
|
// Created by Hifi Engine Team.
|
||||||
// vertex shader
|
|
||||||
//
|
|
||||||
// Created by Andrzej Kapolka on 3/24/14.
|
|
||||||
// Copyright 2014 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
//
|
//
|
||||||
// Distributed under the Apache License, Version 2.0.
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
<@include gpu/Config.slh@>
|
<@include gpu/Config.slh@>
|
||||||
<$VERSION_HEADER$>
|
<$VERSION_HEADER$>
|
||||||
// Generated on <$_SCRIBE_DATE$>
|
// <$_SCRIBE_FILENAME$>
|
||||||
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
//
|
//
|
||||||
// model_shadow_fade.vert
|
// Created by Olivier Prat on 06/05/17.
|
||||||
// vertex shader
|
|
||||||
//
|
|
||||||
// Created by Olivier Prat on 06/045/17.
|
|
||||||
// Copyright 2017 High Fidelity, Inc.
|
// Copyright 2017 High Fidelity, Inc.
|
||||||
//
|
//
|
||||||
// Distributed under the Apache License, Version 2.0.
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
VERTEX model
|
|
@ -0,0 +1 @@
|
||||||
|
VERTEX model_fade
|
|
@ -0,0 +1 @@
|
||||||
|
VERTEX model_normal_map
|
|
@ -0,0 +1 @@
|
||||||
|
VERTEX model_normal_map_fade
|
|
@ -0,0 +1 @@
|
||||||
|
VERTEX model
|
|
@ -0,0 +1 @@
|
||||||
|
VERTEX model_normal_map
|
|
@ -1 +1 @@
|
||||||
VERTEX model_translucent_normal_map
|
VERTEX model_normal_map_fade
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
<@include gpu/Config.slh@>
|
<@include gpu/Config.slh@>
|
||||||
<$VERSION_HEADER$>
|
<$VERSION_HEADER$>
|
||||||
// Generated on <$_SCRIBE_DATE$>
|
// <$_SCRIBE_FILENAME$>
|
||||||
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
//
|
//
|
||||||
// skin_model.vert
|
// Created by Hifi Engine Team.
|
||||||
// vertex shader
|
|
||||||
//
|
|
||||||
// Created by Andrzej Kapolka on 10/14/13.
|
|
||||||
// Copyright 2013 High Fidelity, Inc.
|
// Copyright 2013 High Fidelity, Inc.
|
||||||
//
|
//
|
||||||
// Distributed under the Apache License, Version 2.0.
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
<@include gpu/Config.slh@>
|
<@include gpu/Config.slh@>
|
||||||
<$VERSION_HEADER$>
|
<$VERSION_HEADER$>
|
||||||
// Generated on <$_SCRIBE_DATE$>
|
// <$_SCRIBE_FILENAME$>
|
||||||
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
//
|
//
|
||||||
// skin_model_dq.vert
|
// Created by Hifi Engine Team.
|
||||||
// vertex shader
|
|
||||||
//
|
|
||||||
// Created by Andrzej Kapolka on 10/14/13.
|
|
||||||
// Copyright 2013 High Fidelity, Inc.
|
// Copyright 2013 High Fidelity, Inc.
|
||||||
//
|
//
|
||||||
// Distributed under the Apache License, Version 2.0.
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
<@include gpu/Config.slh@>
|
<@include gpu/Config.slh@>
|
||||||
<$VERSION_HEADER$>
|
<$VERSION_HEADER$>
|
||||||
// Generated on <$_SCRIBE_DATE$>
|
// <$_SCRIBE_FILENAME$>
|
||||||
//
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
// skin_model_fade.vert
|
|
||||||
// vertex shader
|
|
||||||
//
|
//
|
||||||
|
// Created by Hifi Engine Team.
|
||||||
// Created by Olivier Prat on 06/045/17.
|
// Created by Olivier Prat on 06/045/17.
|
||||||
// Copyright 2017 High Fidelity, Inc.
|
// Copyright 2017 High Fidelity, Inc.
|
||||||
//
|
//
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
<@include gpu/Config.slh@>
|
<@include gpu/Config.slh@>
|
||||||
<$VERSION_HEADER$>
|
<$VERSION_HEADER$>
|
||||||
// Generated on <$_SCRIBE_DATE$>
|
// <$_SCRIBE_FILENAME$>
|
||||||
//
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
// skin_model_fade_dq.vert
|
|
||||||
// vertex shader
|
|
||||||
//
|
//
|
||||||
// Created by Olivier Prat on 06/045/17.
|
// Created by Olivier Prat on 06/045/17.
|
||||||
// Copyright 2017 High Fidelity, Inc.
|
// Copyright 2017 High Fidelity, Inc.
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
<@include gpu/Config.slh@>
|
<@include gpu/Config.slh@>
|
||||||
<$VERSION_HEADER$>
|
<$VERSION_HEADER$>
|
||||||
// Generated on <$_SCRIBE_DATE$>
|
// <$_SCRIBE_FILENAME$>
|
||||||
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
//
|
//
|
||||||
// skin_model_normal_map.vert
|
// Created by Hifi Engine Team.
|
||||||
// vertex shader
|
|
||||||
//
|
|
||||||
// Created by Andrzej Kapolka on 10/29/13.
|
|
||||||
// Copyright 2013 High Fidelity, Inc.
|
// Copyright 2013 High Fidelity, Inc.
|
||||||
//
|
//
|
||||||
// Distributed under the Apache License, Version 2.0.
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
<@include gpu/Config.slh@>
|
<@include gpu/Config.slh@>
|
||||||
<$VERSION_HEADER$>
|
<$VERSION_HEADER$>
|
||||||
// Generated on <$_SCRIBE_DATE$>
|
// <$_SCRIBE_FILENAME$>
|
||||||
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
//
|
//
|
||||||
// skin_model_normal_map_dq.vert
|
// Created by Hifi Engine Team.
|
||||||
// vertex shader
|
|
||||||
//
|
|
||||||
// Created by Andrzej Kapolka on 10/29/13.
|
|
||||||
// Copyright 2013 High Fidelity, Inc.
|
// Copyright 2013 High Fidelity, Inc.
|
||||||
//
|
//
|
||||||
// Distributed under the Apache License, Version 2.0.
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
<@include gpu/Config.slh@>
|
<@include gpu/Config.slh@>
|
||||||
<$VERSION_HEADER$>
|
<$VERSION_HEADER$>
|
||||||
// Generated on <$_SCRIBE_DATE$>
|
// <$_SCRIBE_FILENAME$>
|
||||||
//
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
// skin_model_normal_map_fade.vert
|
|
||||||
// vertex shader
|
|
||||||
//
|
//
|
||||||
|
// Created by Hifi Engine Team.
|
||||||
// Created by Olivier Prat on 06/045/17.
|
// Created by Olivier Prat on 06/045/17.
|
||||||
// Copyright 2017 High Fidelity, Inc.
|
// Copyright 2017 High Fidelity, Inc.
|
||||||
//
|
//
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
<@include gpu/Config.slh@>
|
<@include gpu/Config.slh@>
|
||||||
<$VERSION_HEADER$>
|
<$VERSION_HEADER$>
|
||||||
// Generated on <$_SCRIBE_DATE$>
|
// <$_SCRIBE_FILENAME$>
|
||||||
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
//
|
//
|
||||||
// skin_model_normal_map_fade_dq.vert
|
// Created by Hifi Engine Team.
|
||||||
// vertex shader
|
|
||||||
//
|
|
||||||
// Created by Andrzej Kapolka on 10/29/13.
|
|
||||||
// Copyright 2013 High Fidelity, Inc.
|
// Copyright 2013 High Fidelity, Inc.
|
||||||
//
|
//
|
||||||
// Distributed under the Apache License, Version 2.0.
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
<@include gpu/Config.slh@>
|
<@include gpu/Config.slh@>
|
||||||
<$VERSION_HEADER$>
|
<$VERSION_HEADER$>
|
||||||
// Generated on <$_SCRIBE_DATE$>
|
// <$_SCRIBE_FILENAME$>
|
||||||
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
//
|
//
|
||||||
// skin_model_shadow.vert
|
// Created by Hifi Engine Team.
|
||||||
// vertex shader
|
|
||||||
//
|
|
||||||
// Created by Andrzej Kapolka on 3/24/14.
|
|
||||||
// Copyright 2014 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
//
|
//
|
||||||
// Distributed under the Apache License, Version 2.0.
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
<@include gpu/Config.slh@>
|
<@include gpu/Config.slh@>
|
||||||
<$VERSION_HEADER$>
|
<$VERSION_HEADER$>
|
||||||
// Generated on <$_SCRIBE_DATE$>
|
// <$_SCRIBE_FILENAME$>
|
||||||
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
//
|
//
|
||||||
// skin_model_shadow_dq.vert
|
// Created by Hifi Engine Team.
|
||||||
// vertex shader
|
|
||||||
//
|
|
||||||
// Created by Andrzej Kapolka on 3/24/14.
|
|
||||||
// Copyright 2014 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
//
|
//
|
||||||
// Distributed under the Apache License, Version 2.0.
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
<@include gpu/Config.slh@>
|
<@include gpu/Config.slh@>
|
||||||
<$VERSION_HEADER$>
|
<$VERSION_HEADER$>
|
||||||
// Generated on <$_SCRIBE_DATE$>
|
// <$_SCRIBE_FILENAME$>
|
||||||
//
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
// skin_model_shadow_fade.vert
|
|
||||||
// vertex shader
|
|
||||||
//
|
//
|
||||||
|
// Created by Hifi Engine Team.
|
||||||
// Created by Olivier Prat on 06/045/17.
|
// Created by Olivier Prat on 06/045/17.
|
||||||
// Copyright 2017 High Fidelity, Inc.
|
// Copyright 2017 High Fidelity, Inc.
|
||||||
//
|
//
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
<@include gpu/Config.slh@>
|
<@include gpu/Config.slh@>
|
||||||
<$VERSION_HEADER$>
|
<$VERSION_HEADER$>
|
||||||
// Generated on <$_SCRIBE_DATE$>
|
// <$_SCRIBE_FILENAME$>
|
||||||
//
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
// skin_model_shadow_fade_dq.vert
|
|
||||||
// vertex shader
|
|
||||||
//
|
//
|
||||||
|
// Created by Hifi Engine Team.
|
||||||
// Created by Olivier Prat on 06/045/17.
|
// Created by Olivier Prat on 06/045/17.
|
||||||
// Copyright 2017 High Fidelity, Inc.
|
// Copyright 2017 High Fidelity, Inc.
|
||||||
//
|
//
|
||||||
|
|
Loading…
Reference in a new issue