58 lines · 2.2 KB · C++
RawDownload
////  MetaModelPayload.cpp////  Created by Sam Gondelman on 10/9/18.//  Copyright 2018 High Fidelity, Inc.////  Distributed under the Apache License, Version 2.0.//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html//#include "MetaModelPayload.h" #include "AbstractViewStateInterface.h"#include "MeshPartPayload.h" void MetaModelPayload::setBlendedVertices(int blendNumber, const QVector<BlendshapeOffset>& blendshapeOffsets, const QVector<int>& blendedMeshSizes, const render::ItemIDs& subRenderItems) {    PROFILE_RANGE(render, __FUNCTION__);    if (blendNumber < _appliedBlendNumber) {        return;    }    _appliedBlendNumber = blendNumber;     // We have fewer meshes than before.  Invalidate everything    if (blendedMeshSizes.length() < (int)_blendshapeBuffers.size()) {        _blendshapeBuffers.clear();    }     int index = 0;    for (int i = 0; i < blendedMeshSizes.size(); i++) {        int numVertices = blendedMeshSizes.at(i);         // This mesh isn't blendshaped        if (numVertices == 0) {            _blendshapeBuffers.erase(i);            continue;        }         const auto& buffer = _blendshapeBuffers.find(i);        const auto blendShapeBufferSize = numVertices * sizeof(BlendshapeOffset);        if (buffer == _blendshapeBuffers.end()) {            auto usage = gpu::Buffer::ResourceBuffer;            auto data = (gpu::Byte*) blendshapeOffsets.constData() + index * sizeof(BlendshapeOffset);            auto size = blendShapeBufferSize;            _blendshapeBuffers[i] = std::make_shared<gpu::Buffer>(usage, size, data);        } else {            buffer->second->setData(blendShapeBufferSize, (gpu::Byte*) blendshapeOffsets.constData() + index * sizeof(BlendshapeOffset));        }         index += numVertices;    }     render::Transaction transaction;    for (auto& id : subRenderItems) {        transaction.updateItem<ModelMeshPartPayload>(id, [this, blendedMeshSizes](ModelMeshPartPayload& data) {            data.setBlendshapeBuffer(_blendshapeBuffers, blendedMeshSizes);        });    }    AbstractViewStateInterface::instance()->getMain3DScene()->enqueueTransaction(transaction);}