// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "dna/BaseImpl.h" #include "dna/TypeDefs.h" #include "dna/Writer.h" #include "dna/utils/Extd.h" #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4365 4987) #endif #include #include #include #include #include #include #ifdef _MSC_VER #pragma warning(pop) #endif namespace dna { template typename std::enable_if::value>::type ensureHasSize(TContainer& target, std::size_t size) { target.reserve(size); while (target.size() < size) { target.push_back(typename TContainer::value_type(target.get_allocator().getMemoryResource())); } } template typename std::enable_if::value>::type ensureHasSize(TContainer& target, std::size_t size) { if (target.size() < size) { target.resize(size); } } template typename std::enable_if::value, typename TContainer::value_type&>::type getAt(TContainer& target, U index) { ensureHasSize(target, index + 1ul); return target[index]; } template typename std::enable_if::value>::type setAt(TContainer& target, TSize index, const TValue& value) { getAt(target, index) = value; } template class WriterImpl : public TWriterBase, public virtual BaseImpl { public: explicit WriterImpl(MemoryResource* memRes_); // HeaderWriter methods void setFileFormatGeneration(std::uint16_t generation) override; void setFileFormatVersion(std::uint16_t version) override; // DescriptorWriter methods void setName(const char* name) override; void setArchetype(Archetype archetype) override; void setGender(Gender gender) override; void setAge(std::uint16_t age) override; void clearMetaData() override; void setMetaData(const char* key, const char* value) override; void setTranslationUnit(TranslationUnit unit) override; void setRotationUnit(RotationUnit unit) override; void setCoordinateSystem(CoordinateSystem system) override; void setLODCount(std::uint16_t lodCount) override; void setDBMaxLOD(std::uint16_t lod) override; void setDBComplexity(const char* name) override; void setDBName(const char* name) override; // DefinitionWriter methods void clearGUIControlNames() override; void setGUIControlName(std::uint16_t index, const char* name) override; void clearRawControlNames() override; void setRawControlName(std::uint16_t index, const char* name) override; void clearJointNames() override; void setJointName(std::uint16_t index, const char* name) override; void clearJointIndices() override; void setJointIndices(std::uint16_t index, const std::uint16_t* jointIndices, std::uint16_t count) override; void clearLODJointMappings() override; void setLODJointMapping(std::uint16_t lod, std::uint16_t index) override; void clearBlendShapeChannelNames() override; void setJointHierarchy(const std::uint16_t* jointIndices, std::uint16_t count) override; void setBlendShapeChannelName(std::uint16_t index, const char* name) override; void clearBlendShapeChannelIndices() override; void setBlendShapeChannelIndices(std::uint16_t index, const std::uint16_t* blendShapeChannelIndices, std::uint16_t count) override; void clearLODBlendShapeChannelMappings() override; void setLODBlendShapeChannelMapping(std::uint16_t lod, std::uint16_t index) override; void clearAnimatedMapNames() override; void setAnimatedMapName(std::uint16_t index, const char* name) override; void clearAnimatedMapIndices() override; void setAnimatedMapIndices(std::uint16_t index, const std::uint16_t* animatedMapIndices, std::uint16_t count) override; void clearLODAnimatedMapMappings() override; void setLODAnimatedMapMapping(std::uint16_t lod, std::uint16_t index) override; void clearMeshNames() override; void setMeshName(std::uint16_t index, const char* name) override; void clearMeshIndices() override; void setMeshIndices(std::uint16_t index, const std::uint16_t* meshIndices, std::uint16_t count) override; void clearLODMeshMappings() override; void setLODMeshMapping(std::uint16_t lod, std::uint16_t index) override; void clearMeshBlendShapeChannelMappings() override; void setMeshBlendShapeChannelMapping(std::uint32_t index, std::uint16_t meshIndex, std::uint16_t blendShapeChannelIndex) override; void setNeutralJointTranslations(const Vector3* translations, std::uint16_t count) override; void setNeutralJointRotations(const Vector3* rotations, std::uint16_t count) override; // BehaviorWriter methods void setGUIToRawInputIndices(const std::uint16_t* inputIndices, std::uint16_t count) override; void setGUIToRawOutputIndices(const std::uint16_t* outputIndices, std::uint16_t count) override; void setGUIToRawFromValues(const float* fromValues, std::uint16_t count) override; void setGUIToRawToValues(const float* toValues, std::uint16_t count) override; void setGUIToRawSlopeValues(const float* slopeValues, std::uint16_t count) override; void setGUIToRawCutValues(const float* cutValues, std::uint16_t count) override; void setPSDCount(std::uint16_t count) override; void setPSDRowIndices(const std::uint16_t* rowIndices, std::uint16_t count) override; void setPSDColumnIndices(const std::uint16_t* columnIndices, std::uint16_t count) override; void setPSDValues(const float* weights, std::uint16_t count) override; void setJointRowCount(std::uint16_t rowCount) override; void setJointColumnCount(std::uint16_t columnCount) override; void clearJointGroups() override; void deleteJointGroup(std::uint16_t jointGroupIndex) override; void setJointGroupLODs(std::uint16_t jointGroupIndex, const std::uint16_t* lods, std::uint16_t count) override; void setJointGroupInputIndices(std::uint16_t jointGroupIndex, const std::uint16_t* inputIndices, std::uint16_t count) override; void setJointGroupOutputIndices(std::uint16_t jointGroupIndex, const std::uint16_t* outputIndices, std::uint16_t count) override; void setJointGroupValues(std::uint16_t jointGroupIndex, const float* values, std::uint32_t count) override; void setJointGroupJointIndices(std::uint16_t jointGroupIndex, const std::uint16_t* jointIndices, std::uint16_t count) override; void setBlendShapeChannelLODs(const std::uint16_t* lods, std::uint16_t count) override; void setBlendShapeChannelInputIndices(const std::uint16_t* inputIndices, std::uint16_t count) override; void setBlendShapeChannelOutputIndices(const std::uint16_t* outputIndices, std::uint16_t count) override; void setAnimatedMapLODs(const std::uint16_t* lods, std::uint16_t count) override; void setAnimatedMapInputIndices(const std::uint16_t* inputIndices, std::uint16_t count) override; void setAnimatedMapOutputIndices(const std::uint16_t* outputIndices, std::uint16_t count) override; void setAnimatedMapFromValues(const float* fromValues, std::uint16_t count) override; void setAnimatedMapToValues(const float* toValues, std::uint16_t count) override; void setAnimatedMapSlopeValues(const float* slopeValues, std::uint16_t count) override; void setAnimatedMapCutValues(const float* cutValues, std::uint16_t count) override; // GeometryWriter methods void clearMeshes() override; void deleteMesh(std::uint16_t meshIndex) override; void setVertexPositions(std::uint16_t meshIndex, const Position* positions, std::uint32_t count) override; void setVertexTextureCoordinates(std::uint16_t meshIndex, const TextureCoordinate* textureCoordinates, std::uint32_t count) override; void setVertexNormals(std::uint16_t meshIndex, const Normal* normals, std::uint32_t count) override; void setVertexLayouts(std::uint16_t meshIndex, const VertexLayout* layouts, std::uint32_t count) override; void clearFaceVertexLayoutIndices(std::uint16_t meshIndex) override; void setFaceVertexLayoutIndices(std::uint16_t meshIndex, std::uint32_t faceIndex, const std::uint32_t* layoutIndices, std::uint32_t count) override; void setMaximumInfluencePerVertex(std::uint16_t meshIndex, std::uint16_t maxInfluenceCount) override; void clearSkinWeights(std::uint16_t meshIndex) override; void setSkinWeightsValues(std::uint16_t meshIndex, std::uint32_t vertexIndex, const float* weights, std::uint16_t count) override; void setSkinWeightsJointIndices(std::uint16_t meshIndex, std::uint32_t vertexIndex, const std::uint16_t* jointIndices, std::uint16_t count) override; void clearBlendShapeTargets(std::uint16_t meshIndex) override; void setBlendShapeChannelIndex(std::uint16_t meshIndex, std::uint16_t blendShapeTargetIndex, std::uint16_t blendShapeChannelIndex) override; void setBlendShapeTargetDeltas(std::uint16_t meshIndex, std::uint16_t blendShapeTargetIndex, const Delta* deltas, std::uint32_t count) override; void setBlendShapeTargetVertexIndices(std::uint16_t meshIndex, std::uint16_t blendShapeTargetIndex, const std::uint32_t* vertexIndices, std::uint32_t count) override; // MachineLearnedBehaviorWriter methods void clearMLControlNames() override; void setMLControlName(std::uint16_t index, const char* name) override; void clearNeuralNetworks() override; void clearNeuralNetworkIndices() override; void setNeuralNetworkIndices(std::uint16_t index, const std::uint16_t* netIndices, std::uint16_t count) override; void clearMeshRegionNames() override; void clearMeshRegionNames(std::uint16_t meshIndex) override; void setMeshRegionName(std::uint16_t meshIndex, std::uint16_t regionIndex, const char* name) override; void clearLODNeuralNetworkMappings() override; void setLODNeuralNetworkMapping(std::uint16_t lod, std::uint16_t index) override; void clearNeuralNetworkIndicesPerMeshRegion() override; void setNeuralNetworkIndicesForMeshRegion(std::uint16_t meshIndex, std::uint16_t regionIndex, const std::uint16_t* netIndices, std::uint16_t count) override; void deleteNeuralNetwork(std::uint16_t netIndex) override; void setNeuralNetworkInputIndices(std::uint16_t netIndex, const std::uint16_t* inputIndices, std::uint16_t count) override; void setNeuralNetworkOutputIndices(std::uint16_t netIndex, const std::uint16_t* outputIndices, std::uint16_t count) override; void clearNeuralNetworkLayers(std::uint16_t netIndex) override; void setNeuralNetworkLayerActivationFunction(std::uint16_t netIndex, std::uint16_t layerIndex, ActivationFunction function) override; void setNeuralNetworkLayerActivationFunctionParameters(std::uint16_t netIndex, std::uint16_t layerIndex, const float* activationFunctionParameters, std::uint16_t count) override; void setNeuralNetworkLayerBiases(std::uint16_t netIndex, std::uint16_t layerIndex, const float* biases, std::uint32_t count) override; void setNeuralNetworkLayerWeights(std::uint16_t netIndex, std::uint16_t layerIndex, const float* weights, std::uint32_t count) override; // RBFBehaviorWriter methods void clearRBFPoses() override; void setRBFPoseName(std::uint16_t poseIndex, const char* name) override; void setRBFPoseScale(std::uint16_t poseIndex, float scale) override; void clearRBFPoseControlNames() override; void setRBFPoseControlName(std::uint16_t poseControlIndex, const char* name) override; void setRBFPoseInputControlIndices(std::uint16_t poseIndex, const std::uint16_t* controlIndices, std::uint16_t controlIndexCount) override; void setRBFPoseOutputControlIndices(std::uint16_t poseIndex, const std::uint16_t* controlIndices, std::uint16_t controlIndexCount) override; void setRBFPoseOutputControlWeights(std::uint16_t poseIndex, const float* controlWeights, std::uint16_t controlWeightCount) override; void clearRBFSolvers() override; void clearRBFSolverIndices() override; void setRBFSolverIndices(std::uint16_t index, const std::uint16_t* solverIndices, std::uint16_t count) override; void clearLODRBFSolverMappings() override; void setLODRBFSolverMapping(std::uint16_t lod, std::uint16_t index) override; void setRBFSolverName(std::uint16_t solverIndex, const char* name) override; void setRBFSolverRawControlIndices(std::uint16_t solverIndex, const std::uint16_t* inputIndices, std::uint16_t count) override; void setRBFSolverPoseIndices(std::uint16_t solverIndex, const std::uint16_t* poseIndices, std::uint16_t count) override; void setRBFSolverRawControlValues(std::uint16_t solverIndex, const float* values, std::uint16_t count) override; void setRBFSolverType(std::uint16_t solverIndex, RBFSolverType type) override; void setRBFSolverRadius(std::uint16_t solverIndex, float radius) override; void setRBFSolverAutomaticRadius(std::uint16_t solverIndex, AutomaticRadius automaticRadius) override; void setRBFSolverWeightThreshold(std::uint16_t solverIndex, float weightThreshold) override; void setRBFSolverDistanceMethod(std::uint16_t solverIndex, RBFDistanceMethod distanceMethod) override; void setRBFSolverNormalizeMethod(std::uint16_t solverIndex, RBFNormalizeMethod normalizeMethod) override; void setRBFSolverFunctionType(std::uint16_t solverIndex, RBFFunctionType functionType) override; void setRBFSolverTwistAxis(std::uint16_t solverIndex, TwistAxis twistAxis) override; // JointBehaviorMetadataWriter void clearJointRepresentations() override; void setJointTranslationRepresentation(std::uint16_t jointIndex, TranslationRepresentation representation) override; void setJointRotationRepresentation(std::uint16_t jointIndex, RotationRepresentation representation) override; void setJointScaleRepresentation(std::uint16_t jointIndex, ScaleRepresentation representation) override; // TwistSwingBehaviorWriter void clearTwists() override; void deleteTwist(std::uint16_t twistIndex) override; void setTwistSetupTwistAxis(std::uint16_t twistIndex, TwistAxis twistAxis) override; void setTwistInputControlIndices(std::uint16_t twistIndex, const std::uint16_t* controlIndices, std::uint16_t controlIndexCount) override; void setTwistOutputJointIndices(std::uint16_t twistIndex, const std::uint16_t* jointIndices, std::uint16_t jointIndexCount) override; void setTwistBlendWeights(std::uint16_t twistIndex, const float* blendWeights, std::uint16_t blendWeightCount) override; void clearSwings() override; void deleteSwing(std::uint16_t swingIndex) override; void setSwingSetupTwistAxis(std::uint16_t swingIndex, TwistAxis twistAxis) override; void setSwingInputControlIndices(std::uint16_t swingIndex, const std::uint16_t* controlIndices, std::uint16_t controlIndexCount) override; void setSwingOutputJointIndices(std::uint16_t swingIndex, const std::uint16_t* jointIndices, std::uint16_t jointIndexCount) override; void setSwingBlendWeights(std::uint16_t swingIndex, const float* blendWeights, std::uint16_t blendWeightCount) override; }; #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4589) #endif template WriterImpl::WriterImpl(MemoryResource* memRes_) : BaseImpl{memRes_} { } #ifdef _MSC_VER #pragma warning(pop) #endif #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4505) #endif template inline void WriterImpl::setFileFormatGeneration(std::uint16_t generation) { dna.version.generation = generation; } template inline void WriterImpl::setFileFormatVersion(std::uint16_t version) { dna.version.version = version; } template inline void WriterImpl::setName(const char* name) { dna.descriptor.name = name; } template inline void WriterImpl::setArchetype(Archetype archetype) { dna.descriptor.archetype = static_cast(archetype); } template inline void WriterImpl::setGender(Gender gender) { dna.descriptor.gender = static_cast(gender); } template inline void WriterImpl::setAge(std::uint16_t age) { dna.descriptor.age = age; } template inline void WriterImpl::clearMetaData() { dna.descriptor.metadata.clear(); } template inline void WriterImpl::setMetaData(const char* key, const char* value) { using CharStringPair = std::tuple, String >; auto it = std::find_if(dna.descriptor.metadata.begin(), dna.descriptor.metadata.end(), [&key](const CharStringPair& kv) { auto& k = std::get<0>(kv); return (std::strlen(key) == k.size() && std::strncmp(k.data(), key, k.size()) == 0); }); if (it == dna.descriptor.metadata.end()) { if (value != nullptr) { dna.descriptor.metadata.emplace_back(String{key, memRes}, String{value, memRes}); } } else { if (value == nullptr) { dna.descriptor.metadata.erase(it); } else { std::get<1>(*it) = value; } } } template inline void WriterImpl::setTranslationUnit(TranslationUnit unit) { dna.descriptor.translationUnit = static_cast(unit); } template inline void WriterImpl::setRotationUnit(RotationUnit unit) { dna.descriptor.rotationUnit = static_cast(unit); } template inline void WriterImpl::setCoordinateSystem(CoordinateSystem system) { dna.descriptor.coordinateSystem.xAxis = static_cast(system.xAxis); dna.descriptor.coordinateSystem.yAxis = static_cast(system.yAxis); dna.descriptor.coordinateSystem.zAxis = static_cast(system.zAxis); } template inline void WriterImpl::setLODCount(std::uint16_t lodCount) { dna.descriptor.lodCount = lodCount; } template inline void WriterImpl::setDBMaxLOD(std::uint16_t lod) { dna.descriptor.maxLOD = lod; } template inline void WriterImpl::setDBComplexity(const char* name) { dna.descriptor.complexity = name; } template inline void WriterImpl::setDBName(const char* name) { dna.descriptor.dbName = name; } template inline void WriterImpl::clearGUIControlNames() { dna.definition.guiControlNames.clear(); } template inline void WriterImpl::setGUIControlName(std::uint16_t index, const char* name) { setAt(dna.definition.guiControlNames, index, name); } template inline void WriterImpl::clearRawControlNames() { dna.definition.rawControlNames.clear(); } template inline void WriterImpl::setRawControlName(std::uint16_t index, const char* name) { setAt(dna.definition.rawControlNames, index, name); } template inline void WriterImpl::clearJointNames() { dna.definition.jointNames.clear(); } template inline void WriterImpl::setJointName(std::uint16_t index, const char* name) { setAt(dna.definition.jointNames, index, name); } template inline void WriterImpl::clearJointIndices() { dna.definition.lodJointMapping.resetIndices(); } template inline void WriterImpl::setJointIndices(std::uint16_t index, const std::uint16_t* jointIndices, std::uint16_t count) { dna.definition.lodJointMapping.clearIndices(index); dna.definition.lodJointMapping.addIndices(index, jointIndices, count); } template inline void WriterImpl::clearLODJointMappings() { dna.definition.lodJointMapping.resetLODs(); } template inline void WriterImpl::setLODJointMapping(std::uint16_t lod, std::uint16_t index) { dna.definition.lodJointMapping.associateLODWithIndices(lod, index); } template inline void WriterImpl::setJointHierarchy(const std::uint16_t* jointIndices, std::uint16_t count) { dna.definition.jointHierarchy.assign(jointIndices, jointIndices + count); } template inline void WriterImpl::clearBlendShapeChannelNames() { dna.definition.blendShapeChannelNames.clear(); } template inline void WriterImpl::setBlendShapeChannelName(std::uint16_t index, const char* name) { setAt(dna.definition.blendShapeChannelNames, index, name); } template inline void WriterImpl::clearBlendShapeChannelIndices() { dna.definition.lodBlendShapeMapping.resetIndices(); } template inline void WriterImpl::setBlendShapeChannelIndices(std::uint16_t index, const std::uint16_t* blendShapeChannelIndices, std::uint16_t count) { dna.definition.lodBlendShapeMapping.clearIndices(index); dna.definition.lodBlendShapeMapping.addIndices(index, blendShapeChannelIndices, count); } template inline void WriterImpl::clearLODBlendShapeChannelMappings() { dna.definition.lodBlendShapeMapping.resetLODs(); } template inline void WriterImpl::setLODBlendShapeChannelMapping(std::uint16_t lod, std::uint16_t index) { dna.definition.lodBlendShapeMapping.associateLODWithIndices(lod, index); } template inline void WriterImpl::clearAnimatedMapNames() { dna.definition.animatedMapNames.clear(); } template inline void WriterImpl::setAnimatedMapName(std::uint16_t index, const char* name) { setAt(dna.definition.animatedMapNames, index, name); } template inline void WriterImpl::clearAnimatedMapIndices() { dna.definition.lodAnimatedMapMapping.resetIndices(); } template inline void WriterImpl::setAnimatedMapIndices(std::uint16_t index, const std::uint16_t* animatedMapIndices, std::uint16_t count) { dna.definition.lodAnimatedMapMapping.clearIndices(index); dna.definition.lodAnimatedMapMapping.addIndices(index, animatedMapIndices, count); } template inline void WriterImpl::clearLODAnimatedMapMappings() { dna.definition.lodAnimatedMapMapping.resetLODs(); } template inline void WriterImpl::setLODAnimatedMapMapping(std::uint16_t lod, std::uint16_t index) { dna.definition.lodAnimatedMapMapping.associateLODWithIndices(lod, index); } template inline void WriterImpl::clearMeshNames() { dna.definition.meshNames.clear(); } template inline void WriterImpl::setMeshName(std::uint16_t index, const char* name) { setAt(dna.definition.meshNames, index, name); } template inline void WriterImpl::clearMeshIndices() { dna.definition.lodMeshMapping.resetIndices(); } template inline void WriterImpl::setMeshIndices(std::uint16_t index, const std::uint16_t* meshIndices, std::uint16_t count) { dna.definition.lodMeshMapping.clearIndices(index); dna.definition.lodMeshMapping.addIndices(index, meshIndices, count); } template inline void WriterImpl::clearLODMeshMappings() { dna.definition.lodMeshMapping.resetLODs(); } template inline void WriterImpl::setLODMeshMapping(std::uint16_t lod, std::uint16_t index) { dna.definition.lodMeshMapping.associateLODWithIndices(lod, index); } template inline void WriterImpl::clearMeshBlendShapeChannelMappings() { dna.definition.meshBlendShapeChannelMapping.clear(); } template inline void WriterImpl::setMeshBlendShapeChannelMapping(std::uint32_t index, std::uint16_t meshIndex, std::uint16_t blendShapeChannelIndex) { dna.definition.meshBlendShapeChannelMapping.set(index, meshIndex, blendShapeChannelIndex); } template inline void WriterImpl::setNeutralJointTranslations(const Vector3* translations, std::uint16_t count) { dna.definition.neutralJointTranslations.assign(translations, translations + count); } template inline void WriterImpl::setNeutralJointRotations(const Vector3* rotations, std::uint16_t count) { dna.definition.neutralJointRotations.assign(rotations, rotations + count); } template inline void WriterImpl::setGUIToRawInputIndices(const std::uint16_t* inputIndices, std::uint16_t count) { dna.behavior.controls.conditionals.inputIndices.assign(inputIndices, inputIndices + count); } template inline void WriterImpl::setGUIToRawOutputIndices(const std::uint16_t* outputIndices, std::uint16_t count) { dna.behavior.controls.conditionals.outputIndices.assign(outputIndices, outputIndices + count); } template inline void WriterImpl::setGUIToRawFromValues(const float* fromValues, std::uint16_t count) { dna.behavior.controls.conditionals.fromValues.assign(fromValues, fromValues + count); } template inline void WriterImpl::setGUIToRawToValues(const float* toValues, std::uint16_t count) { dna.behavior.controls.conditionals.toValues.assign(toValues, toValues + count); } template inline void WriterImpl::setGUIToRawSlopeValues(const float* slopeValues, std::uint16_t count) { dna.behavior.controls.conditionals.slopeValues.assign(slopeValues, slopeValues + count); } template inline void WriterImpl::setGUIToRawCutValues(const float* cutValues, std::uint16_t count) { dna.behavior.controls.conditionals.cutValues.assign(cutValues, cutValues + count); } template inline void WriterImpl::setPSDCount(std::uint16_t count) { dna.behavior.controls.psdCount = count; } template inline void WriterImpl::setPSDRowIndices(const std::uint16_t* rowIndices, std::uint16_t count) { dna.behavior.controls.psds.rows.assign(rowIndices, rowIndices + count); } template inline void WriterImpl::setPSDColumnIndices(const std::uint16_t* columnIndices, std::uint16_t count) { dna.behavior.controls.psds.columns.assign(columnIndices, columnIndices + count); } template inline void WriterImpl::setPSDValues(const float* weights, std::uint16_t count) { dna.behavior.controls.psds.values.assign(weights, weights + count); } template inline void WriterImpl::setJointRowCount(std::uint16_t rowCount) { dna.behavior.joints.rowCount = rowCount; } template inline void WriterImpl::setJointColumnCount(std::uint16_t columnCount) { dna.behavior.joints.colCount = columnCount; } template inline void WriterImpl::clearJointGroups() { dna.behavior.joints.jointGroups.clear(); } template inline void WriterImpl::deleteJointGroup(std::uint16_t jointGroupIndex) { if (jointGroupIndex < dna.behavior.joints.jointGroups.size()) { auto it = extd::advanced(dna.behavior.joints.jointGroups.begin(), jointGroupIndex); dna.behavior.joints.jointGroups.erase(it); } } template inline void WriterImpl::setJointGroupLODs(std::uint16_t jointGroupIndex, const std::uint16_t* lods, std::uint16_t count) { auto& jointGroup = getAt(dna.behavior.joints.jointGroups, jointGroupIndex); jointGroup.lods.assign(lods, lods + count); } template inline void WriterImpl::setJointGroupInputIndices(std::uint16_t jointGroupIndex, const std::uint16_t* inputIndices, std::uint16_t count) { auto& jointGroup = getAt(dna.behavior.joints.jointGroups, jointGroupIndex); jointGroup.inputIndices.assign(inputIndices, inputIndices + count); } template inline void WriterImpl::setJointGroupOutputIndices(std::uint16_t jointGroupIndex, const std::uint16_t* outputIndices, std::uint16_t count) { auto& jointGroup = getAt(dna.behavior.joints.jointGroups, jointGroupIndex); jointGroup.outputIndices.assign(outputIndices, outputIndices + count); } template inline void WriterImpl::setJointGroupValues(std::uint16_t jointGroupIndex, const float* values, std::uint32_t count) { auto& jointGroup = getAt(dna.behavior.joints.jointGroups, jointGroupIndex); jointGroup.values.assign(values, values + count); } template inline void WriterImpl::setJointGroupJointIndices(std::uint16_t jointGroupIndex, const std::uint16_t* jointIndices, std::uint16_t count) { auto& jointGroup = getAt(dna.behavior.joints.jointGroups, jointGroupIndex); jointGroup.jointIndices.assign(jointIndices, jointIndices + count); } template inline void WriterImpl::setBlendShapeChannelLODs(const std::uint16_t* lods, std::uint16_t count) { dna.behavior.blendShapeChannels.lods.assign(lods, lods + count); } template inline void WriterImpl::setBlendShapeChannelInputIndices(const std::uint16_t* inputIndices, std::uint16_t count) { dna.behavior.blendShapeChannels.inputIndices.assign(inputIndices, inputIndices + count); } template inline void WriterImpl::setBlendShapeChannelOutputIndices(const std::uint16_t* outputIndices, std::uint16_t count) { dna.behavior.blendShapeChannels.outputIndices.assign(outputIndices, outputIndices + count); } template inline void WriterImpl::setAnimatedMapLODs(const std::uint16_t* lods, std::uint16_t count) { dna.behavior.animatedMaps.lods.assign(lods, lods + count); } template inline void WriterImpl::setAnimatedMapInputIndices(const std::uint16_t* inputIndices, std::uint16_t count) { dna.behavior.animatedMaps.conditionals.inputIndices.assign(inputIndices, inputIndices + count); } template inline void WriterImpl::setAnimatedMapOutputIndices(const std::uint16_t* outputIndices, std::uint16_t count) { dna.behavior.animatedMaps.conditionals.outputIndices.assign(outputIndices, outputIndices + count); } template inline void WriterImpl::setAnimatedMapFromValues(const float* fromValues, std::uint16_t count) { dna.behavior.animatedMaps.conditionals.fromValues.assign(fromValues, fromValues + count); } template inline void WriterImpl::setAnimatedMapToValues(const float* toValues, std::uint16_t count) { dna.behavior.animatedMaps.conditionals.toValues.assign(toValues, toValues + count); } template inline void WriterImpl::setAnimatedMapSlopeValues(const float* slopeValues, std::uint16_t count) { dna.behavior.animatedMaps.conditionals.slopeValues.assign(slopeValues, slopeValues + count); } template inline void WriterImpl::setAnimatedMapCutValues(const float* cutValues, std::uint16_t count) { dna.behavior.animatedMaps.conditionals.cutValues.assign(cutValues, cutValues + count); } template inline void WriterImpl::clearMeshes() { dna.geometry.meshes.clear(); } template inline void WriterImpl::deleteMesh(std::uint16_t meshIndex) { if (meshIndex < dna.geometry.meshes.size()) { auto it = extd::advanced(dna.geometry.meshes.begin(), meshIndex); dna.geometry.meshes.erase(it); } } template inline void WriterImpl::setVertexPositions(std::uint16_t meshIndex, const Position* positions, std::uint32_t count) { auto& mesh = getAt(dna.geometry.meshes, meshIndex); mesh.positions.assign(positions, positions + count); } template inline void WriterImpl::setVertexTextureCoordinates(std::uint16_t meshIndex, const TextureCoordinate* textureCoordinates, std::uint32_t count) { auto& mesh = getAt(dna.geometry.meshes, meshIndex); auto& destination = mesh.textureCoordinates; destination.clear(); destination.us.resize_uninitialized(count); destination.vs.resize_uninitialized(count); for (std::size_t i = 0ul; i < count; ++i) { destination.us[i] = textureCoordinates[i].u; destination.vs[i] = textureCoordinates[i].v; } } template inline void WriterImpl::setVertexNormals(std::uint16_t meshIndex, const Normal* normals, std::uint32_t count) { auto& mesh = getAt(dna.geometry.meshes, meshIndex); mesh.normals.assign(normals, normals + count); } template inline void WriterImpl::setVertexLayouts(std::uint16_t meshIndex, const VertexLayout* layouts, std::uint32_t count) { auto& mesh = getAt(dna.geometry.meshes, meshIndex); auto& destination = mesh.layouts; destination.clear(); destination.positions.resize_uninitialized(count); destination.textureCoordinates.resize_uninitialized(count); destination.normals.resize_uninitialized(count); for (std::size_t i = 0ul; i < count; ++i) { destination.positions[i] = layouts[i].position; destination.textureCoordinates[i] = layouts[i].textureCoordinate; destination.normals[i] = layouts[i].normal; } } template inline void WriterImpl::clearFaceVertexLayoutIndices(std::uint16_t meshIndex) { if (meshIndex < dna.geometry.meshes.size()) { dna.geometry.meshes[meshIndex].faces.clear(); } } template inline void WriterImpl::setFaceVertexLayoutIndices(std::uint16_t meshIndex, std::uint32_t faceIndex, const std::uint32_t* layoutIndices, std::uint32_t count) { auto& mesh = getAt(dna.geometry.meshes, meshIndex); auto& face = getAt(mesh.faces, faceIndex); face.layoutIndices.assign(layoutIndices, layoutIndices + count); } template inline void WriterImpl::setMaximumInfluencePerVertex(std::uint16_t meshIndex, std::uint16_t maxInfluenceCount) { auto& mesh = getAt(dna.geometry.meshes, meshIndex); mesh.maximumInfluencePerVertex = maxInfluenceCount; } template inline void WriterImpl::clearSkinWeights(std::uint16_t meshIndex) { if (meshIndex < dna.geometry.meshes.size()) { dna.geometry.meshes[meshIndex].skinWeights.clear(); } } template inline void WriterImpl::setSkinWeightsValues(std::uint16_t meshIndex, std::uint32_t vertexIndex, const float* weights, std::uint16_t count) { auto& mesh = getAt(dna.geometry.meshes, meshIndex); auto& vertexSkinWeights = getAt(mesh.skinWeights, vertexIndex); vertexSkinWeights.weights.assign(weights, weights + count); } template inline void WriterImpl::setSkinWeightsJointIndices(std::uint16_t meshIndex, std::uint32_t vertexIndex, const std::uint16_t* jointIndices, std::uint16_t count) { auto& mesh = getAt(dna.geometry.meshes, meshIndex); auto& vertexSkinWeights = getAt(mesh.skinWeights, vertexIndex); vertexSkinWeights.jointIndices.assign(jointIndices, jointIndices + count); } template inline void WriterImpl::clearBlendShapeTargets(std::uint16_t meshIndex) { if (meshIndex < dna.geometry.meshes.size()) { dna.geometry.meshes[meshIndex].blendShapeTargets.clear(); } } template inline void WriterImpl::setBlendShapeChannelIndex(std::uint16_t meshIndex, std::uint16_t blendShapeTargetIndex, std::uint16_t blendShapeChannelIndex) { auto& mesh = getAt(dna.geometry.meshes, meshIndex); auto& blendShapeTarget = getAt(mesh.blendShapeTargets, blendShapeTargetIndex); blendShapeTarget.blendShapeChannelIndex = blendShapeChannelIndex; } template inline void WriterImpl::setBlendShapeTargetDeltas(std::uint16_t meshIndex, std::uint16_t blendShapeTargetIndex, const Delta* deltas, std::uint32_t count) { auto& mesh = getAt(dna.geometry.meshes, meshIndex); auto& blendShapeTarget = getAt(mesh.blendShapeTargets, blendShapeTargetIndex); blendShapeTarget.deltas.assign(deltas, deltas + count); } template inline void WriterImpl::setBlendShapeTargetVertexIndices(std::uint16_t meshIndex, std::uint16_t blendShapeTargetIndex, const std::uint32_t* vertexIndices, std::uint32_t count) { auto& mesh = getAt(dna.geometry.meshes, meshIndex); auto& blendShapeTarget = getAt(mesh.blendShapeTargets, blendShapeTargetIndex); blendShapeTarget.vertexIndices.assign(vertexIndices, vertexIndices + count); } template inline void WriterImpl::clearMLControlNames() { dna.machineLearnedBehavior.mlControlNames.clear(); } template inline void WriterImpl::setMLControlName(std::uint16_t index, const char* name) { setAt(dna.machineLearnedBehavior.mlControlNames, index, name); } template inline void WriterImpl::clearNeuralNetworks() { dna.machineLearnedBehavior.neuralNetworks.clear(); } template inline void WriterImpl::clearNeuralNetworkIndices() { dna.machineLearnedBehavior.lodNeuralNetworkMapping.resetIndices(); } template inline void WriterImpl::setNeuralNetworkIndices(std::uint16_t index, const std::uint16_t* netIndices, std::uint16_t count) { dna.machineLearnedBehavior.lodNeuralNetworkMapping.clearIndices(index); dna.machineLearnedBehavior.lodNeuralNetworkMapping.addIndices(index, netIndices, count); } template inline void WriterImpl::clearLODNeuralNetworkMappings() { dna.machineLearnedBehavior.lodNeuralNetworkMapping.resetLODs(); } template inline void WriterImpl::setLODNeuralNetworkMapping(std::uint16_t lod, std::uint16_t index) { dna.machineLearnedBehavior.lodNeuralNetworkMapping.associateLODWithIndices(lod, index); } template inline void WriterImpl::clearMeshRegionNames() { dna.machineLearnedBehavior.neuralNetworkToMeshRegion.regionNames.clear(); } template inline void WriterImpl::clearMeshRegionNames(std::uint16_t meshIndex) { if (meshIndex < dna.machineLearnedBehavior.neuralNetworkToMeshRegion.regionNames.size()) { dna.machineLearnedBehavior.neuralNetworkToMeshRegion.regionNames[meshIndex].clear(); } } template inline void WriterImpl::setMeshRegionName(std::uint16_t meshIndex, std::uint16_t regionIndex, const char* name) { auto& meshRegionNames = getAt(dna.machineLearnedBehavior.neuralNetworkToMeshRegion.regionNames, meshIndex); setAt(meshRegionNames, regionIndex, name); } template inline void WriterImpl::clearNeuralNetworkIndicesPerMeshRegion() { dna.machineLearnedBehavior.neuralNetworkToMeshRegion.indices.clear(); } template inline void WriterImpl::setNeuralNetworkIndicesForMeshRegion(std::uint16_t meshIndex, std::uint16_t regionIndex, const std::uint16_t* netIndices, std::uint16_t count) { auto& neuralNetworkToMeshRegionIndices = getAt(dna.machineLearnedBehavior.neuralNetworkToMeshRegion.indices, meshIndex); auto& region = getAt(neuralNetworkToMeshRegionIndices, regionIndex); region.assign(netIndices, netIndices + count); } template inline void WriterImpl::deleteNeuralNetwork(std::uint16_t netIndex) { if (netIndex < dna.machineLearnedBehavior.neuralNetworks.size()) { auto it = extd::advanced(dna.machineLearnedBehavior.neuralNetworks.begin(), netIndex); dna.machineLearnedBehavior.neuralNetworks.erase(it); } } template inline void WriterImpl::setNeuralNetworkInputIndices(std::uint16_t netIndex, const std::uint16_t* inputIndices, std::uint16_t count) { auto& neuralNet = getAt(dna.machineLearnedBehavior.neuralNetworks, netIndex); neuralNet.inputIndices.assign(inputIndices, inputIndices + count); } template inline void WriterImpl::setNeuralNetworkOutputIndices(std::uint16_t netIndex, const std::uint16_t* outputIndices, std::uint16_t count) { auto& neuralNet = getAt(dna.machineLearnedBehavior.neuralNetworks, netIndex); neuralNet.outputIndices.assign(outputIndices, outputIndices + count); } template inline void WriterImpl::clearNeuralNetworkLayers(std::uint16_t netIndex) { auto& neuralNet = getAt(dna.machineLearnedBehavior.neuralNetworks, netIndex); neuralNet.layers.clear(); } template inline void WriterImpl::setNeuralNetworkLayerActivationFunction(std::uint16_t netIndex, std::uint16_t layerIndex, ActivationFunction function) { auto& neuralNet = getAt(dna.machineLearnedBehavior.neuralNetworks, netIndex); auto& layer = getAt(neuralNet.layers, layerIndex); layer.activationFunction.functionId = static_cast(function); } template inline void WriterImpl::setNeuralNetworkLayerActivationFunctionParameters(std::uint16_t netIndex, std::uint16_t layerIndex, const float* activationFunctionParameters, std::uint16_t count) { auto& neuralNet = getAt(dna.machineLearnedBehavior.neuralNetworks, netIndex); auto& layer = getAt(neuralNet.layers, layerIndex); layer.activationFunction.parameters.assign(activationFunctionParameters, activationFunctionParameters + count); } template inline void WriterImpl::setNeuralNetworkLayerBiases(std::uint16_t netIndex, std::uint16_t layerIndex, const float* biases, std::uint32_t count) { auto& neuralNet = getAt(dna.machineLearnedBehavior.neuralNetworks, netIndex); auto& layer = getAt(neuralNet.layers, layerIndex); layer.biases.assign(biases, biases + count); } template inline void WriterImpl::setNeuralNetworkLayerWeights(std::uint16_t netIndex, std::uint16_t layerIndex, const float* weights, std::uint32_t count) { auto& neuralNet = getAt(dna.machineLearnedBehavior.neuralNetworks, netIndex); auto& layer = getAt(neuralNet.layers, layerIndex); layer.weights.assign(weights, weights + count); } template inline void WriterImpl::clearRBFPoses() { dna.rbfBehavior.poses.clear(); dna.rbfBehaviorExt.poses.clear(); } template inline void WriterImpl::setRBFPoseName(std::uint16_t poseIndex, const char* name) { auto& pose = getAt(dna.rbfBehavior.poses, poseIndex); pose.name = name; } template inline void WriterImpl::setRBFPoseScale(std::uint16_t poseIndex, float scale) { auto& pose = getAt(dna.rbfBehavior.poses, poseIndex); pose.scale = scale; } template inline void WriterImpl::clearRBFPoseControlNames() { dna.rbfBehaviorExt.poseControlNames.clear(); } template inline void WriterImpl::setRBFPoseControlName(std::uint16_t poseControlIndex, const char* name) { setAt(dna.rbfBehaviorExt.poseControlNames, poseControlIndex, name); } template inline void WriterImpl::setRBFPoseInputControlIndices(std::uint16_t poseIndex, const std::uint16_t* controlIndices, std::uint16_t controlIndexCount) { auto& pose = getAt(dna.rbfBehaviorExt.poses, poseIndex); pose.inputControlIndices.assign(controlIndices, controlIndices + controlIndexCount); } template inline void WriterImpl::setRBFPoseOutputControlIndices(std::uint16_t poseIndex, const std::uint16_t* controlIndices, std::uint16_t controlIndexCount) { auto& pose = getAt(dna.rbfBehaviorExt.poses, poseIndex); pose.outputControlIndices.assign(controlIndices, controlIndices + controlIndexCount); } template inline void WriterImpl::setRBFPoseOutputControlWeights(std::uint16_t poseIndex, const float* controlWeights, std::uint16_t controlWeightCount) { auto& pose = getAt(dna.rbfBehaviorExt.poses, poseIndex); pose.outputControlWeights.assign(controlWeights, controlWeights + controlWeightCount); } template inline void WriterImpl::clearRBFSolvers() { dna.rbfBehavior.solvers.clear(); } template inline void WriterImpl::clearRBFSolverIndices() { dna.rbfBehavior.lodSolverMapping.resetIndices(); } template inline void WriterImpl::setRBFSolverIndices(std::uint16_t index, const std::uint16_t* solverIndices, std::uint16_t count) { dna.rbfBehavior.lodSolverMapping.clearIndices(index); dna.rbfBehavior.lodSolverMapping.addIndices(index, solverIndices, count); } template inline void WriterImpl::clearLODRBFSolverMappings() { dna.rbfBehavior.lodSolverMapping.resetLODs(); } template inline void WriterImpl::setLODRBFSolverMapping(std::uint16_t lod, std::uint16_t index) { dna.rbfBehavior.lodSolverMapping.associateLODWithIndices(lod, index); } template inline void WriterImpl::setRBFSolverName(std::uint16_t solverIndex, const char* name) { auto& solver = getAt(dna.rbfBehavior.solvers, solverIndex); solver.name = name; } template inline void WriterImpl::setRBFSolverRawControlIndices(std::uint16_t solverIndex, const std::uint16_t* rawControlIndices, std::uint16_t count) { auto& solver = getAt(dna.rbfBehavior.solvers, solverIndex); solver.rawControlIndices.assign(rawControlIndices, rawControlIndices + count); } template inline void WriterImpl::setRBFSolverPoseIndices(std::uint16_t solverIndex, const std::uint16_t* poseIndices, std::uint16_t count) { auto& solver = getAt(dna.rbfBehavior.solvers, solverIndex); solver.poseIndices.assign(poseIndices, poseIndices + count); } template inline void WriterImpl::setRBFSolverRawControlValues(std::uint16_t solverIndex, const float* values, std::uint16_t count) { auto& solver = getAt(dna.rbfBehavior.solvers, solverIndex); solver.rawControlValues.assign(values, values + count); } template inline void WriterImpl::setRBFSolverType(std::uint16_t solverIndex, RBFSolverType type) { auto& solver = getAt(dna.rbfBehavior.solvers, solverIndex); solver.solverType = static_cast(type); } template inline void WriterImpl::setRBFSolverRadius(std::uint16_t solverIndex, float radius) { auto& solver = getAt(dna.rbfBehavior.solvers, solverIndex); solver.radius = radius; } template inline void WriterImpl::setRBFSolverAutomaticRadius(std::uint16_t solverIndex, AutomaticRadius automaticRadius) { auto& solver = getAt(dna.rbfBehavior.solvers, solverIndex); solver.automaticRadius = static_cast(automaticRadius); } template inline void WriterImpl::setRBFSolverWeightThreshold(std::uint16_t solverIndex, float weightThreshold) { auto& solver = getAt(dna.rbfBehavior.solvers, solverIndex); solver.weightThreshold = weightThreshold; } template inline void WriterImpl::setRBFSolverDistanceMethod(std::uint16_t solverIndex, RBFDistanceMethod distanceMethod) { auto& solver = getAt(dna.rbfBehavior.solvers, solverIndex); solver.distanceMethod = static_cast(distanceMethod); } template inline void WriterImpl::setRBFSolverNormalizeMethod(std::uint16_t solverIndex, RBFNormalizeMethod normalizeMethod) { auto& solver = getAt(dna.rbfBehavior.solvers, solverIndex); solver.normalizeMethod = static_cast(normalizeMethod); } template inline void WriterImpl::setRBFSolverFunctionType(std::uint16_t solverIndex, RBFFunctionType functionType) { auto& solver = getAt(dna.rbfBehavior.solvers, solverIndex); solver.functionType = static_cast(functionType); } template inline void WriterImpl::setRBFSolverTwistAxis(std::uint16_t solverIndex, TwistAxis twistAxis) { auto& solver = getAt(dna.rbfBehavior.solvers, solverIndex); solver.twistAxis = static_cast(twistAxis); } template inline void WriterImpl::clearJointRepresentations() { dna.jointBehaviorMetadata.jointRepresentations.clear(); } template inline void WriterImpl::setJointTranslationRepresentation(std::uint16_t jointIndex, TranslationRepresentation representation) { auto& jointRepresentation = getAt(dna.jointBehaviorMetadata.jointRepresentations, jointIndex); jointRepresentation.translation = static_cast(representation); } template inline void WriterImpl::setJointRotationRepresentation(std::uint16_t jointIndex, RotationRepresentation representation) { auto& jointRepresentation = getAt(dna.jointBehaviorMetadata.jointRepresentations, jointIndex); jointRepresentation.rotation = static_cast(representation); } template inline void WriterImpl::setJointScaleRepresentation(std::uint16_t jointIndex, ScaleRepresentation representation) { auto& jointRepresentation = getAt(dna.jointBehaviorMetadata.jointRepresentations, jointIndex); jointRepresentation.scale = static_cast(representation); } template inline void WriterImpl::clearTwists() { dna.twistSwingBehavior.twists.clear(); } template inline void WriterImpl::deleteTwist(std::uint16_t twistIndex) { if (twistIndex < dna.twistSwingBehavior.twists.size()) { auto it = extd::advanced(dna.twistSwingBehavior.twists.begin(), twistIndex); dna.twistSwingBehavior.twists.erase(it); } } template inline void WriterImpl::setTwistSetupTwistAxis(std::uint16_t twistIndex, TwistAxis twistAxis) { auto& twist = getAt(dna.twistSwingBehavior.twists, twistIndex); twist.twistAxis = static_cast(twistAxis); } template inline void WriterImpl::setTwistInputControlIndices(std::uint16_t twistIndex, const std::uint16_t* controlIndices, std::uint16_t controlIndexCount) { auto& twist = getAt(dna.twistSwingBehavior.twists, twistIndex); twist.twistInputControlIndices.assign(controlIndices, controlIndices + controlIndexCount); } template inline void WriterImpl::setTwistOutputJointIndices(std::uint16_t twistIndex, const std::uint16_t* jointIndices, std::uint16_t jointIndexCount) { auto& twist = getAt(dna.twistSwingBehavior.twists, twistIndex); twist.twistOutputJointIndices.assign(jointIndices, jointIndices + jointIndexCount); } template inline void WriterImpl::setTwistBlendWeights(std::uint16_t twistIndex, const float* blendWeights, std::uint16_t blendWeightCount) { auto& twist = getAt(dna.twistSwingBehavior.twists, twistIndex); twist.twistBlendWeights.assign(blendWeights, blendWeights + blendWeightCount); } template inline void WriterImpl::clearSwings() { dna.twistSwingBehavior.swings.clear(); } template inline void WriterImpl::deleteSwing(std::uint16_t swingIndex) { if (swingIndex < dna.twistSwingBehavior.swings.size()) { auto it = extd::advanced(dna.twistSwingBehavior.swings.begin(), swingIndex); dna.twistSwingBehavior.swings.erase(it); } } template inline void WriterImpl::setSwingSetupTwistAxis(std::uint16_t swingIndex, TwistAxis twistAxis) { auto& swing = getAt(dna.twistSwingBehavior.swings, swingIndex); swing.twistAxis = static_cast(twistAxis); } template inline void WriterImpl::setSwingInputControlIndices(std::uint16_t swingIndex, const std::uint16_t* controlIndices, std::uint16_t controlIndexCount) { auto& swing = getAt(dna.twistSwingBehavior.swings, swingIndex); swing.swingInputControlIndices.assign(controlIndices, controlIndices + controlIndexCount); } template inline void WriterImpl::setSwingOutputJointIndices(std::uint16_t swingIndex, const std::uint16_t* jointIndices, std::uint16_t jointIndexCount) { auto& swing = getAt(dna.twistSwingBehavior.swings, swingIndex); swing.swingOutputJointIndices.assign(jointIndices, jointIndices + jointIndexCount); } template inline void WriterImpl::setSwingBlendWeights(std::uint16_t swingIndex, const float* blendWeights, std::uint16_t blendWeightCount) { auto& swing = getAt(dna.twistSwingBehavior.swings, swingIndex); swing.swingBlendWeights.assign(blendWeights, blendWeights + blendWeightCount); } #ifdef _MSC_VER #pragma warning(pop) #endif } // namespace dna