// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "dna/BaseImpl.h" #include "dna/DenormalizedData.h" #include "dna/Reader.h" #include "dna/TypeDefs.h" #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4365 4987) #endif #include #include #include #ifdef _MSC_VER #pragma warning(pop) #endif namespace dna { template class ReaderImpl : public TReaderBase, public virtual BaseImpl { public: explicit ReaderImpl(MemoryResource* memRes_); // HeaderReader methods std::uint16_t getFileFormatGeneration() const override; std::uint16_t getFileFormatVersion() const override; // DescriptorReader methods StringView getName() const override; Archetype getArchetype() const override; Gender getGender() const override; std::uint16_t getAge() const override; std::uint32_t getMetaDataCount() const override; StringView getMetaDataKey(std::uint32_t index) const override; StringView getMetaDataValue(const char* key) const override; TranslationUnit getTranslationUnit() const override; RotationUnit getRotationUnit() const override; CoordinateSystem getCoordinateSystem() const override; std::uint16_t getLODCount() const override; std::uint16_t getDBMaxLOD() const override; StringView getDBComplexity() const override; StringView getDBName() const override; // DefinitionReader methods std::uint16_t getGUIControlCount() const override; StringView getGUIControlName(std::uint16_t index) const override; std::uint16_t getRawControlCount() const override; StringView getRawControlName(std::uint16_t index) const override; std::uint16_t getJointCount() const override; StringView getJointName(std::uint16_t index) const override; std::uint16_t getJointIndexListCount() const override; ConstArrayView getJointIndicesForLOD(std::uint16_t lod) const override; std::uint16_t getJointParentIndex(std::uint16_t index) const override; std::uint16_t getBlendShapeChannelCount() const override; StringView getBlendShapeChannelName(std::uint16_t index) const override; std::uint16_t getBlendShapeChannelIndexListCount() const override; ConstArrayView getBlendShapeChannelIndicesForLOD(std::uint16_t lod) const override; std::uint16_t getAnimatedMapCount() const override; StringView getAnimatedMapName(std::uint16_t index) const override; std::uint16_t getAnimatedMapIndexListCount() const override; ConstArrayView getAnimatedMapIndicesForLOD(std::uint16_t lod) const override; std::uint16_t getMeshCount() const override; StringView getMeshName(std::uint16_t index) const override; std::uint16_t getMeshIndexListCount() const override; ConstArrayView getMeshIndicesForLOD(std::uint16_t lod) const override; std::uint16_t getMeshBlendShapeChannelMappingCount() const override; MeshBlendShapeChannelMapping getMeshBlendShapeChannelMapping(std::uint16_t index) const override; ConstArrayView getMeshBlendShapeChannelMappingIndicesForLOD(std::uint16_t lod) const override; Vector3 getNeutralJointTranslation(std::uint16_t index) const override; ConstArrayView getNeutralJointTranslationXs() const override; ConstArrayView getNeutralJointTranslationYs() const override; ConstArrayView getNeutralJointTranslationZs() const override; Vector3 getNeutralJointRotation(std::uint16_t index) const override; ConstArrayView getNeutralJointRotationXs() const override; ConstArrayView getNeutralJointRotationYs() const override; ConstArrayView getNeutralJointRotationZs() const override; // BehaviorReader methods ConstArrayView getGUIToRawInputIndices() const override; ConstArrayView getGUIToRawOutputIndices() const override; ConstArrayView getGUIToRawFromValues() const override; ConstArrayView getGUIToRawToValues() const override; ConstArrayView getGUIToRawSlopeValues() const override; ConstArrayView getGUIToRawCutValues() const override; std::uint16_t getPSDCount() const override; ConstArrayView getPSDRowIndices() const override; ConstArrayView getPSDColumnIndices() const override; ConstArrayView getPSDValues() const override; std::uint16_t getJointRowCount() const override; std::uint16_t getJointColumnCount() const override; ConstArrayView getJointVariableAttributeIndices(std::uint16_t lod) const override; std::uint16_t getJointGroupCount() const override; ConstArrayView getJointGroupLODs(std::uint16_t jointGroupIndex) const override; ConstArrayView getJointGroupInputIndices(std::uint16_t jointGroupIndex) const override; ConstArrayView getJointGroupOutputIndices(std::uint16_t jointGroupIndex) const override; ConstArrayView getJointGroupValues(std::uint16_t jointGroupIndex) const override; ConstArrayView getJointGroupJointIndices(std::uint16_t jointGroupIndex) const override; ConstArrayView getBlendShapeChannelLODs() const override; ConstArrayView getBlendShapeChannelOutputIndices() const override; ConstArrayView getBlendShapeChannelInputIndices() const override; ConstArrayView getAnimatedMapLODs() const override; ConstArrayView getAnimatedMapInputIndices() const override; ConstArrayView getAnimatedMapOutputIndices() const override; ConstArrayView getAnimatedMapFromValues() const override; ConstArrayView getAnimatedMapToValues() const override; ConstArrayView getAnimatedMapSlopeValues() const override; ConstArrayView getAnimatedMapCutValues() const override; // GeometryReader methods std::uint32_t getVertexPositionCount(std::uint16_t meshIndex) const override; Position getVertexPosition(std::uint16_t meshIndex, std::uint32_t vertexIndex) const override; ConstArrayView getVertexPositionXs(std::uint16_t meshIndex) const override; ConstArrayView getVertexPositionYs(std::uint16_t meshIndex) const override; ConstArrayView getVertexPositionZs(std::uint16_t meshIndex) const override; std::uint32_t getVertexTextureCoordinateCount(std::uint16_t meshIndex) const override; TextureCoordinate getVertexTextureCoordinate(std::uint16_t meshIndex, std::uint32_t textureCoordinateIndex) const override; ConstArrayView getVertexTextureCoordinateUs(std::uint16_t meshIndex) const override; ConstArrayView getVertexTextureCoordinateVs(std::uint16_t meshIndex) const override; std::uint32_t getVertexNormalCount(std::uint16_t meshIndex) const override; Normal getVertexNormal(std::uint16_t meshIndex, std::uint32_t normalIndex) const override; ConstArrayView getVertexNormalXs(std::uint16_t meshIndex) const override; ConstArrayView getVertexNormalYs(std::uint16_t meshIndex) const override; ConstArrayView getVertexNormalZs(std::uint16_t meshIndex) const override; std::uint32_t getFaceCount(std::uint16_t meshIndex) const override; ConstArrayView getFaceVertexLayoutIndices(std::uint16_t meshIndex, std::uint32_t faceIndex) const override; std::uint32_t getVertexLayoutCount(std::uint16_t meshIndex) const override; VertexLayout getVertexLayout(std::uint16_t meshIndex, std::uint32_t layoutIndex) const override; ConstArrayView getVertexLayoutPositionIndices(std::uint16_t meshIndex) const override; ConstArrayView getVertexLayoutTextureCoordinateIndices(std::uint16_t meshIndex) const override; ConstArrayView getVertexLayoutNormalIndices(std::uint16_t meshIndex) const override; std::uint16_t getMaximumInfluencePerVertex(std::uint16_t meshIndex) const override; std::uint32_t getSkinWeightsCount(std::uint16_t meshIndex) const override; ConstArrayView getSkinWeightsValues(std::uint16_t meshIndex, std::uint32_t vertexIndex) const override; ConstArrayView getSkinWeightsJointIndices(std::uint16_t meshIndex, std::uint32_t vertexIndex) const override; std::uint16_t getBlendShapeTargetCount(std::uint16_t meshIndex) const override; std::uint16_t getBlendShapeChannelIndex(std::uint16_t meshIndex, std::uint16_t blendShapeTargetIndex) const override; std::uint32_t getBlendShapeTargetDeltaCount(std::uint16_t meshIndex, std::uint16_t blendShapeTargetIndex) const override; Delta getBlendShapeTargetDelta(std::uint16_t meshIndex, std::uint16_t blendShapeTargetIndex, std::uint32_t deltaIndex) const override; ConstArrayView getBlendShapeTargetDeltaXs(std::uint16_t meshIndex, std::uint16_t blendShapeTargetIndex) const override; ConstArrayView getBlendShapeTargetDeltaYs(std::uint16_t meshIndex, std::uint16_t blendShapeTargetIndex) const override; ConstArrayView getBlendShapeTargetDeltaZs(std::uint16_t meshIndex, std::uint16_t blendShapeTargetIndex) const override; ConstArrayView getBlendShapeTargetVertexIndices(std::uint16_t meshIndex, std::uint16_t blendShapeTargetIndex) const override; // MachineLearnedBehaviorReader methods std::uint16_t getMLControlCount() const override; StringView getMLControlName(std::uint16_t index) const override; std::uint16_t getNeuralNetworkCount() const override; std::uint16_t getNeuralNetworkIndexListCount() const override; ConstArrayView getNeuralNetworkIndicesForLOD(std::uint16_t lod) const override; std::uint16_t getMeshRegionCount(std::uint16_t meshIndex) const override; StringView getMeshRegionName(std::uint16_t meshIndex, std::uint16_t regionIndex) const override; ConstArrayView getNeuralNetworkIndicesForMeshRegion(std::uint16_t meshIndex, std::uint16_t regionIndex) const override; ConstArrayView getNeuralNetworkInputIndices(std::uint16_t netIndex) const override; ConstArrayView getNeuralNetworkOutputIndices(std::uint16_t netIndex) const override; std::uint16_t getNeuralNetworkLayerCount(std::uint16_t netIndex) const override; ActivationFunction getNeuralNetworkLayerActivationFunction(std::uint16_t netIndex, std::uint16_t layerIndex) const override; ConstArrayView getNeuralNetworkLayerActivationFunctionParameters(std::uint16_t netIndex, std::uint16_t layerIndex) const override; ConstArrayView getNeuralNetworkLayerBiases(std::uint16_t netIndex, std::uint16_t layerIndex) const override; ConstArrayView getNeuralNetworkLayerWeights(std::uint16_t netIndex, std::uint16_t layerIndex) const override; // RBFBehaviorReader methods std::uint16_t getRBFPoseCount() const override; StringView getRBFPoseName(std::uint16_t index) const override; ConstArrayView getRBFPoseJointOutputIndices(std::uint16_t poseIndex) const override; ConstArrayView getRBFPoseBlendShapeChannelOutputIndices(std::uint16_t poseIndex) const override; ConstArrayView getRBFPoseAnimatedMapOutputIndices(std::uint16_t poseIndex) const override; ConstArrayView getRBFPoseJointOutputValues(std::uint16_t poseIndex) const override; float getRBFPoseScale(std::uint16_t poseIndex) const override; std::uint16_t getRBFPoseControlCount() const override; StringView getRBFPoseControlName(std::uint16_t poseControlIndex) const override; ConstArrayView getRBFPoseInputControlIndices(std::uint16_t poseIndex) const override; ConstArrayView getRBFPoseOutputControlIndices(std::uint16_t poseIndex) const override; ConstArrayView getRBFPoseOutputControlWeights(std::uint16_t poseIndex) const override; std::uint16_t getRBFSolverCount() const override; std::uint16_t getRBFSolverIndexListCount() const override; ConstArrayView getRBFSolverIndicesForLOD(std::uint16_t lod) const override; StringView getRBFSolverName(std::uint16_t index) const override; ConstArrayView getRBFSolverRawControlIndices(std::uint16_t solverIndex) const override; ConstArrayView getRBFSolverPoseIndices(std::uint16_t solverIndex) const override; ConstArrayView getRBFSolverRawControlValues(std::uint16_t solverIndex) const override; RBFSolverType getRBFSolverType(std::uint16_t solverIndex) const override; float getRBFSolverRadius(std::uint16_t solverIndex) const override; AutomaticRadius getRBFSolverAutomaticRadius(std::uint16_t solverIndex) const override; float getRBFSolverWeightThreshold(std::uint16_t solverIndex) const override; RBFDistanceMethod getRBFSolverDistanceMethod(std::uint16_t solverIndex) const override; RBFNormalizeMethod getRBFSolverNormalizeMethod(std::uint16_t solverIndex) const override; RBFFunctionType getRBFSolverFunctionType(std::uint16_t solverIndex) const override; TwistAxis getRBFSolverTwistAxis(std::uint16_t solverIndex) const override; // JointBehaviorMetadataReader methods TranslationRepresentation getJointTranslationRepresentation(std::uint16_t jointIndex) const override; RotationRepresentation getJointRotationRepresentation(std::uint16_t jointIndex) const override; ScaleRepresentation getJointScaleRepresentation(std::uint16_t jointIndex) const override; // TwistSwingBehaviorReader methods std::uint16_t getTwistCount() const override; TwistAxis getTwistSetupTwistAxis(std::uint16_t twistIndex) const override; ConstArrayView getTwistInputControlIndices(std::uint16_t twistIndex) const override; ConstArrayView getTwistOutputJointIndices(std::uint16_t twistIndex) const override; ConstArrayView getTwistBlendWeights(std::uint16_t twistIndex) const override; std::uint16_t getSwingCount() const override; TwistAxis getSwingSetupTwistAxis(std::uint16_t swingIndex) const override; ConstArrayView getSwingInputControlIndices(std::uint16_t swingIndex) const override; ConstArrayView getSwingOutputJointIndices(std::uint16_t swingIndex) const override; ConstArrayView getSwingBlendWeights(std::uint16_t swingIndex) const override; protected: mutable DenormalizedData cache; }; #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4589) #endif template inline ReaderImpl::ReaderImpl(MemoryResource* memRes_) : BaseImpl{memRes_}, cache{memRes_} { } #ifdef _MSC_VER #pragma warning(pop) #endif #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4505) #endif template inline std::uint16_t ReaderImpl::getFileFormatGeneration() const { return dna.version.generation; } template inline std::uint16_t ReaderImpl::getFileFormatVersion() const { return dna.version.version; } template inline StringView ReaderImpl::getName() const { return {dna.descriptor.name.data(), dna.descriptor.name.size()}; } template inline Archetype ReaderImpl::getArchetype() const { return static_cast(dna.descriptor.archetype); } template inline Gender ReaderImpl::getGender() const { return static_cast(dna.descriptor.gender); } template inline std::uint16_t ReaderImpl::getAge() const { return dna.descriptor.age; } template inline std::uint32_t ReaderImpl::getMetaDataCount() const { return static_cast(dna.descriptor.metadata.size()); } template inline StringView ReaderImpl::getMetaDataKey(std::uint32_t index) const { if (index < dna.descriptor.metadata.size()) { const auto& key = std::get<0>(dna.descriptor.metadata[index]); return {key.data(), key.size()}; } return {}; } template inline StringView ReaderImpl::getMetaDataValue(const char* key) const { for (const auto& data: dna.descriptor.metadata) { if (std::get<0>(data) == key) { const auto& value = std::get<1>(data); return {value.data(), value.size()}; } } return {}; } template inline TranslationUnit ReaderImpl::getTranslationUnit() const { return static_cast(dna.descriptor.translationUnit); } template inline RotationUnit ReaderImpl::getRotationUnit() const { return static_cast(dna.descriptor.rotationUnit); } template inline CoordinateSystem ReaderImpl::getCoordinateSystem() const { return { static_cast(dna.descriptor.coordinateSystem.xAxis), static_cast(dna.descriptor.coordinateSystem.yAxis), static_cast(dna.descriptor.coordinateSystem.zAxis) }; } template inline std::uint16_t ReaderImpl::getLODCount() const { return dna.descriptor.lodCount; } template inline std::uint16_t ReaderImpl::getDBMaxLOD() const { return dna.descriptor.maxLOD; } template inline StringView ReaderImpl::getDBComplexity() const { return {dna.descriptor.complexity.data(), dna.descriptor.complexity.size()}; } template inline StringView ReaderImpl::getDBName() const { return {dna.descriptor.dbName.data(), dna.descriptor.dbName.size()}; } template inline std::uint16_t ReaderImpl::getGUIControlCount() const { return static_cast(dna.definition.guiControlNames.size()); } template inline StringView ReaderImpl::getGUIControlName(std::uint16_t index) const { if (index < dna.definition.guiControlNames.size()) { const auto& guiControlName = dna.definition.guiControlNames[index]; return {guiControlName.data(), guiControlName.size()}; } return {}; } template inline std::uint16_t ReaderImpl::getRawControlCount() const { return static_cast(dna.definition.rawControlNames.size()); } template inline StringView ReaderImpl::getRawControlName(std::uint16_t index) const { if (index < dna.definition.rawControlNames.size()) { const auto& rawControlName = dna.definition.rawControlNames[index]; return {rawControlName.data(), rawControlName.size()}; } return {}; } template inline std::uint16_t ReaderImpl::getJointCount() const { return static_cast(dna.definition.jointNames.size()); } template inline StringView ReaderImpl::getJointName(std::uint16_t index) const { if (index < dna.definition.jointNames.size()) { const auto& jointName = dna.definition.jointNames[index]; return {jointName.data(), jointName.size()}; } return {}; } template inline std::uint16_t ReaderImpl::getJointIndexListCount() const { return dna.definition.lodJointMapping.getIndexListCount(); } template inline ConstArrayView ReaderImpl::getJointIndicesForLOD(std::uint16_t lod) const { return dna.definition.lodJointMapping.getIndices(lod); } template inline std::uint16_t ReaderImpl::getJointParentIndex(std::uint16_t index) const { if (index < dna.definition.jointHierarchy.size()) { return dna.definition.jointHierarchy[index]; } return std::numeric_limits::max(); } template inline std::uint16_t ReaderImpl::getBlendShapeChannelCount() const { return static_cast(dna.definition.blendShapeChannelNames.size()); } template inline StringView ReaderImpl::getBlendShapeChannelName(std::uint16_t index) const { if (index < dna.definition.blendShapeChannelNames.size()) { const auto& blendShapeName = dna.definition.blendShapeChannelNames[index]; return {blendShapeName.data(), blendShapeName.size()}; } return {}; } template inline std::uint16_t ReaderImpl::getBlendShapeChannelIndexListCount() const { return dna.definition.lodBlendShapeMapping.getIndexListCount(); } template inline ConstArrayView ReaderImpl::getBlendShapeChannelIndicesForLOD(std::uint16_t lod) const { return dna.definition.lodBlendShapeMapping.getIndices(lod); } template inline std::uint16_t ReaderImpl::getAnimatedMapCount() const { return static_cast(dna.definition.animatedMapNames.size()); } template inline StringView ReaderImpl::getAnimatedMapName(std::uint16_t index) const { if (index < dna.definition.animatedMapNames.size()) { const auto& animatedMapName = dna.definition.animatedMapNames[index]; return {animatedMapName.data(), animatedMapName.size()}; } return {}; } template inline std::uint16_t ReaderImpl::getAnimatedMapIndexListCount() const { return dna.definition.lodAnimatedMapMapping.getIndexListCount(); } template inline ConstArrayView ReaderImpl::getAnimatedMapIndicesForLOD(std::uint16_t lod) const { return dna.definition.lodAnimatedMapMapping.getIndices(lod); } template inline std::uint16_t ReaderImpl::getMeshCount() const { return static_cast(dna.definition.meshNames.size()); } template inline StringView ReaderImpl::getMeshName(std::uint16_t index) const { if (index < dna.definition.meshNames.size()) { const auto& meshName = dna.definition.meshNames[index]; return {meshName.data(), meshName.size()}; } return {}; } template inline std::uint16_t ReaderImpl::getMeshIndexListCount() const { return dna.definition.lodMeshMapping.getIndexListCount(); } template inline ConstArrayView ReaderImpl::getMeshIndicesForLOD(std::uint16_t lod) const { return dna.definition.lodMeshMapping.getIndices(lod); } template inline std::uint16_t ReaderImpl::getMeshBlendShapeChannelMappingCount() const { return static_cast(dna.definition.meshBlendShapeChannelMapping.size()); } template inline MeshBlendShapeChannelMapping ReaderImpl::getMeshBlendShapeChannelMapping(std::uint16_t index) const { const auto mapping = dna.definition.meshBlendShapeChannelMapping.get(index); return {mapping.from, mapping.to}; } template inline ConstArrayView ReaderImpl::getMeshBlendShapeChannelMappingIndicesForLOD(std::uint16_t lod) const { if (cache.meshBlendShapeMappingIndices.getLODCount() == static_cast(0)) { cache.populateMeshBlendShapeMappingIndices(this); } return cache.meshBlendShapeMappingIndices.getIndices(lod); } template inline Vector3 ReaderImpl::getNeutralJointTranslation(std::uint16_t index) const { const auto& translations = dna.definition.neutralJointTranslations; if (index < translations.xs.size()) { return {translations.xs[index], translations.ys[index], translations.zs[index]}; } return {}; } template inline ConstArrayView ReaderImpl::getNeutralJointTranslationXs() const { const auto& xs = dna.definition.neutralJointTranslations.xs; return {xs.data(), xs.size()}; } template inline ConstArrayView ReaderImpl::getNeutralJointTranslationYs() const { const auto& ys = dna.definition.neutralJointTranslations.ys; return {ys.data(), ys.size()}; } template inline ConstArrayView ReaderImpl::getNeutralJointTranslationZs() const { const auto& zs = dna.definition.neutralJointTranslations.zs; return {zs.data(), zs.size()}; } template inline Vector3 ReaderImpl::getNeutralJointRotation(std::uint16_t index) const { const auto& rotations = dna.definition.neutralJointRotations; if (index < rotations.size()) { return {rotations.xs[index], rotations.ys[index], rotations.zs[index]}; } return {}; } template inline ConstArrayView ReaderImpl::getNeutralJointRotationXs() const { const auto& xs = dna.definition.neutralJointRotations.xs; return {xs.data(), xs.size()}; } template inline ConstArrayView ReaderImpl::getNeutralJointRotationYs() const { const auto& ys = dna.definition.neutralJointRotations.ys; return {ys.data(), ys.size()}; } template inline ConstArrayView ReaderImpl::getNeutralJointRotationZs() const { const auto& zs = dna.definition.neutralJointRotations.zs; return {zs.data(), zs.size()}; } template inline ConstArrayView ReaderImpl::getGUIToRawInputIndices() const { const auto& inputIndices = dna.behavior.controls.conditionals.inputIndices; return {inputIndices.data(), inputIndices.size()}; } template inline ConstArrayView ReaderImpl::getGUIToRawOutputIndices() const { const auto& outputIndices = dna.behavior.controls.conditionals.outputIndices; return {outputIndices.data(), outputIndices.size()}; } template inline ConstArrayView ReaderImpl::getGUIToRawFromValues() const { const auto& fromValues = dna.behavior.controls.conditionals.fromValues; return {fromValues.data(), fromValues.size()}; } template inline ConstArrayView ReaderImpl::getGUIToRawToValues() const { const auto& toValues = dna.behavior.controls.conditionals.toValues; return {toValues.data(), toValues.size()}; } template inline ConstArrayView ReaderImpl::getGUIToRawSlopeValues() const { const auto& slopeValues = dna.behavior.controls.conditionals.slopeValues; return {slopeValues.data(), slopeValues.size()}; } template inline ConstArrayView ReaderImpl::getGUIToRawCutValues() const { const auto& cutValues = dna.behavior.controls.conditionals.cutValues; return {cutValues.data(), cutValues.size()}; } template inline std::uint16_t ReaderImpl::getPSDCount() const { return dna.behavior.controls.psdCount; } template inline ConstArrayView ReaderImpl::getPSDRowIndices() const { const auto& rows = dna.behavior.controls.psds.rows; return {rows.data(), rows.size()}; } template inline ConstArrayView ReaderImpl::getPSDColumnIndices() const { const auto& columns = dna.behavior.controls.psds.columns; return {columns.data(), columns.size()}; } template inline ConstArrayView ReaderImpl::getPSDValues() const { const auto& values = dna.behavior.controls.psds.values; return {values.data(), values.size()}; } template inline std::uint16_t ReaderImpl::getJointRowCount() const { return dna.behavior.joints.rowCount; } template inline std::uint16_t ReaderImpl::getJointColumnCount() const { return dna.behavior.joints.colCount; } template inline ConstArrayView ReaderImpl::getJointVariableAttributeIndices(std::uint16_t lod) const { if (cache.jointVariableAttributeIndices.getLODCount() == static_cast(0)) { cache.populateJointVariableAttributeIndices(this); } return cache.jointVariableAttributeIndices.getIndices(lod); } template inline std::uint16_t ReaderImpl::getJointGroupCount() const { return static_cast(dna.behavior.joints.jointGroups.size()); } template inline ConstArrayView ReaderImpl::getJointGroupLODs(std::uint16_t jointGroupIndex) const { if (jointGroupIndex < dna.behavior.joints.jointGroups.size()) { const auto& lods = dna.behavior.joints.jointGroups[jointGroupIndex].lods; return {lods.data(), lods.size()}; } return {}; } template inline ConstArrayView ReaderImpl::getJointGroupInputIndices(std::uint16_t jointGroupIndex) const { if (jointGroupIndex < dna.behavior.joints.jointGroups.size()) { const auto& inputIndices = dna.behavior.joints.jointGroups[jointGroupIndex].inputIndices; return {inputIndices.data(), inputIndices.size()}; } return {}; } template inline ConstArrayView ReaderImpl::getJointGroupOutputIndices(std::uint16_t jointGroupIndex) const { if (jointGroupIndex < dna.behavior.joints.jointGroups.size()) { const auto& outputIndices = dna.behavior.joints.jointGroups[jointGroupIndex].outputIndices; return {outputIndices.data(), outputIndices.size()}; } return {}; } template inline ConstArrayView ReaderImpl::getJointGroupValues(std::uint16_t jointGroupIndex) const { if (jointGroupIndex < dna.behavior.joints.jointGroups.size()) { const auto& values = dna.behavior.joints.jointGroups[jointGroupIndex].values; return {values.data(), values.size()}; } return {}; } template inline ConstArrayView ReaderImpl::getJointGroupJointIndices(std::uint16_t jointGroupIndex) const { if (jointGroupIndex < dna.behavior.joints.jointGroups.size()) { const auto& jointIndices = dna.behavior.joints.jointGroups[jointGroupIndex].jointIndices; return {jointIndices.data(), jointIndices.size()}; } return {}; } template inline ConstArrayView ReaderImpl::getBlendShapeChannelLODs() const { const auto& lods = dna.behavior.blendShapeChannels.lods; return {lods.data(), lods.size()}; } template inline ConstArrayView ReaderImpl::getBlendShapeChannelInputIndices() const { const auto& inputIndices = dna.behavior.blendShapeChannels.inputIndices; return {inputIndices.data(), inputIndices.size()}; } template inline ConstArrayView ReaderImpl::getBlendShapeChannelOutputIndices() const { const auto& outputIndices = dna.behavior.blendShapeChannels.outputIndices; return {outputIndices.data(), outputIndices.size()}; } template inline ConstArrayView ReaderImpl::getAnimatedMapLODs() const { const auto& lods = dna.behavior.animatedMaps.lods; return {lods.data(), lods.size()}; } template inline ConstArrayView ReaderImpl::getAnimatedMapInputIndices() const { const auto& inputIndices = dna.behavior.animatedMaps.conditionals.inputIndices; return {inputIndices.data(), inputIndices.size()}; } template inline ConstArrayView ReaderImpl::getAnimatedMapOutputIndices() const { const auto& outputIndices = dna.behavior.animatedMaps.conditionals.outputIndices; return {outputIndices.data(), outputIndices.size()}; } template inline ConstArrayView ReaderImpl::getAnimatedMapFromValues() const { const auto& fromValues = dna.behavior.animatedMaps.conditionals.fromValues; return {fromValues.data(), fromValues.size()}; } template inline ConstArrayView ReaderImpl::getAnimatedMapToValues() const { const auto& toValues = dna.behavior.animatedMaps.conditionals.toValues; return {toValues.data(), toValues.size()}; } template inline ConstArrayView ReaderImpl::getAnimatedMapSlopeValues() const { const auto& slopeValues = dna.behavior.animatedMaps.conditionals.slopeValues; return {slopeValues.data(), slopeValues.size()}; } template inline ConstArrayView ReaderImpl::getAnimatedMapCutValues() const { const auto& cutValues = dna.behavior.animatedMaps.conditionals.cutValues; return {cutValues.data(), cutValues.size()}; } template inline std::uint32_t ReaderImpl::getVertexPositionCount(std::uint16_t meshIndex) const { if (meshIndex < dna.geometry.meshes.size()) { return static_cast(dna.geometry.meshes[meshIndex].positions.xs.size()); } return 0u; } template inline Position ReaderImpl::getVertexPosition(std::uint16_t meshIndex, std::uint32_t vertexIndex) const { if (meshIndex < dna.geometry.meshes.size()) { const auto& positions = dna.geometry.meshes[meshIndex].positions; if (vertexIndex < positions.size()) { return {positions.xs[vertexIndex], positions.ys[vertexIndex], positions.zs[vertexIndex]}; } } return {}; } template inline ConstArrayView ReaderImpl::getVertexPositionXs(std::uint16_t meshIndex) const { if (meshIndex < dna.geometry.meshes.size()) { const auto& xPositions = dna.geometry.meshes[meshIndex].positions.xs; return {xPositions.data(), xPositions.size()}; } return {}; } template inline ConstArrayView ReaderImpl::getVertexPositionYs(std::uint16_t meshIndex) const { if (meshIndex < dna.geometry.meshes.size()) { const auto& yPositions = dna.geometry.meshes[meshIndex].positions.ys; return {yPositions.data(), yPositions.size()}; } return {}; } template inline ConstArrayView ReaderImpl::getVertexPositionZs(std::uint16_t meshIndex) const { if (meshIndex < dna.geometry.meshes.size()) { const auto& zPositions = dna.geometry.meshes[meshIndex].positions.zs; return {zPositions.data(), zPositions.size()}; } return {}; } template inline std::uint32_t ReaderImpl::getVertexTextureCoordinateCount(std::uint16_t meshIndex) const { if (meshIndex < dna.geometry.meshes.size()) { return static_cast(dna.geometry.meshes[meshIndex].textureCoordinates.us.size()); } return 0u; } template inline TextureCoordinate ReaderImpl::getVertexTextureCoordinate(std::uint16_t meshIndex, std::uint32_t textureCoordinateIndex) const { if (meshIndex < dna.geometry.meshes.size()) { const auto& textureCoordinates = dna.geometry.meshes[meshIndex].textureCoordinates; if (textureCoordinateIndex < textureCoordinates.size()) { return {textureCoordinates.us[textureCoordinateIndex], textureCoordinates.vs[textureCoordinateIndex]}; } } return {}; } template inline ConstArrayView ReaderImpl::getVertexTextureCoordinateUs(std::uint16_t meshIndex) const { const auto& uTextureCoordinates = dna.geometry.meshes[meshIndex].textureCoordinates.us; return {uTextureCoordinates.data(), uTextureCoordinates.size()}; } template inline ConstArrayView ReaderImpl::getVertexTextureCoordinateVs(std::uint16_t meshIndex) const { const auto& vTextureCoordinates = dna.geometry.meshes[meshIndex].textureCoordinates.vs; return {vTextureCoordinates.data(), vTextureCoordinates.size()}; } template inline std::uint32_t ReaderImpl::getVertexNormalCount(std::uint16_t meshIndex) const { if (meshIndex < dna.geometry.meshes.size()) { return static_cast(dna.geometry.meshes[meshIndex].normals.xs.size()); } return 0u; } template inline Normal ReaderImpl::getVertexNormal(std::uint16_t meshIndex, std::uint32_t normalIndex) const { if (meshIndex < dna.geometry.meshes.size()) { const auto& normals = dna.geometry.meshes[meshIndex].normals; if (normalIndex < normals.size()) { return {normals.xs[normalIndex], normals.ys[normalIndex], normals.zs[normalIndex]}; } } return {}; } template inline ConstArrayView ReaderImpl::getVertexNormalXs(std::uint16_t meshIndex) const { if (meshIndex < dna.geometry.meshes.size()) { const auto& xNormals = dna.geometry.meshes[meshIndex].normals.xs; return {xNormals.data(), xNormals.size()}; } return {}; } template inline ConstArrayView ReaderImpl::getVertexNormalYs(std::uint16_t meshIndex) const { if (meshIndex < dna.geometry.meshes.size()) { const auto& yNormals = dna.geometry.meshes[meshIndex].normals.ys; return {yNormals.data(), yNormals.size()}; } return {}; } template inline ConstArrayView ReaderImpl::getVertexNormalZs(std::uint16_t meshIndex) const { if (meshIndex < dna.geometry.meshes.size()) { const auto& zNormals = dna.geometry.meshes[meshIndex].normals.zs; return {zNormals.data(), zNormals.size()}; } return {}; } template inline std::uint32_t ReaderImpl::getFaceCount(std::uint16_t meshIndex) const { if (meshIndex < dna.geometry.meshes.size()) { return static_cast(dna.geometry.meshes[meshIndex].faces.size()); } return 0u; } template inline ConstArrayView ReaderImpl::getFaceVertexLayoutIndices(std::uint16_t meshIndex, std::uint32_t faceIndex) const { const auto& meshes = dna.geometry.meshes; if ((meshIndex < meshes.size()) && (faceIndex < meshes[meshIndex].faces.size())) { const auto& layoutIndices = meshes[meshIndex].faces[faceIndex].layoutIndices; return {layoutIndices.data(), layoutIndices.size()}; } return {}; } template inline std::uint32_t ReaderImpl::getVertexLayoutCount(std::uint16_t meshIndex) const { if (meshIndex < dna.geometry.meshes.size()) { return static_cast(dna.geometry.meshes[meshIndex].layouts.positions.size()); } return 0u; } template inline VertexLayout ReaderImpl::getVertexLayout(std::uint16_t meshIndex, std::uint32_t layoutIndex) const { if (meshIndex < dna.geometry.meshes.size()) { const auto& layouts = dna.geometry.meshes[meshIndex].layouts; if (layoutIndex < layouts.size()) { return {layouts.positions[layoutIndex], layouts.textureCoordinates[layoutIndex], layouts.normals[layoutIndex]}; } } return {}; } template inline ConstArrayView ReaderImpl::getVertexLayoutPositionIndices(std::uint16_t meshIndex) const { if (meshIndex < dna.geometry.meshes.size()) { const auto& positions = dna.geometry.meshes[meshIndex].layouts.positions; return {positions.data(), positions.size()}; } return {}; } template inline ConstArrayView ReaderImpl::getVertexLayoutTextureCoordinateIndices(std::uint16_t meshIndex) const { if (meshIndex < dna.geometry.meshes.size()) { const auto& textureCoordinated = dna.geometry.meshes[meshIndex].layouts.textureCoordinates; return {textureCoordinated.data(), textureCoordinated.size()}; } return {}; } template inline ConstArrayView ReaderImpl::getVertexLayoutNormalIndices(std::uint16_t meshIndex) const { if (meshIndex < dna.geometry.meshes.size()) { const auto& normals = dna.geometry.meshes[meshIndex].layouts.normals; return {normals.data(), normals.size()}; } return {}; } template inline std::uint16_t ReaderImpl::getMaximumInfluencePerVertex(std::uint16_t meshIndex) const { if (meshIndex < dna.geometry.meshes.size()) { return dna.geometry.meshes[meshIndex].maximumInfluencePerVertex; } return {}; } template inline std::uint32_t ReaderImpl::getSkinWeightsCount(std::uint16_t meshIndex) const { const auto& meshes = dna.geometry.meshes; if (meshIndex < meshes.size()) { return static_cast(meshes[meshIndex].skinWeights.size()); } return {}; } template inline ConstArrayView ReaderImpl::getSkinWeightsValues(std::uint16_t meshIndex, std::uint32_t vertexIndex) const { const auto& meshes = dna.geometry.meshes; if ((meshIndex < meshes.size()) && (vertexIndex < meshes[meshIndex].skinWeights.size())) { const auto& weights = meshes[meshIndex].skinWeights[vertexIndex].weights; return {weights.data(), weights.size()}; } return {}; } template inline ConstArrayView ReaderImpl::getSkinWeightsJointIndices(std::uint16_t meshIndex, std::uint32_t vertexIndex) const { const auto& meshes = dna.geometry.meshes; if ((meshIndex < meshes.size()) && (vertexIndex < meshes[meshIndex].skinWeights.size())) { const auto& jointIndices = meshes[meshIndex].skinWeights[vertexIndex].jointIndices; return {jointIndices.data(), jointIndices.size()}; } return {}; } template inline std::uint16_t ReaderImpl::getBlendShapeTargetCount(std::uint16_t meshIndex) const { if (meshIndex < dna.geometry.meshes.size()) { return static_cast(dna.geometry.meshes[meshIndex].blendShapeTargets.size()); } return {}; } template inline std::uint16_t ReaderImpl::getBlendShapeChannelIndex(std::uint16_t meshIndex, std::uint16_t blendShapeTargetIndex) const { const auto& meshes = dna.geometry.meshes; if ((meshIndex < meshes.size()) && (blendShapeTargetIndex < meshes[meshIndex].blendShapeTargets.size())) { return meshes[meshIndex].blendShapeTargets[blendShapeTargetIndex].blendShapeChannelIndex; } return {}; } template inline std::uint32_t ReaderImpl::getBlendShapeTargetDeltaCount(std::uint16_t meshIndex, std::uint16_t blendShapeTargetIndex) const { const auto& meshes = dna.geometry.meshes; if ((meshIndex < meshes.size()) && (blendShapeTargetIndex < meshes[meshIndex].blendShapeTargets.size())) { return static_cast(meshes[meshIndex].blendShapeTargets[blendShapeTargetIndex].deltas.xs.size()); } return {}; } template inline Delta ReaderImpl::getBlendShapeTargetDelta(std::uint16_t meshIndex, std::uint16_t blendShapeTargetIndex, std::uint32_t deltaIndex) const { const auto& meshes = dna.geometry.meshes; if ((meshIndex < meshes.size()) && (blendShapeTargetIndex < meshes[meshIndex].blendShapeTargets.size()) && (deltaIndex < meshes[meshIndex].blendShapeTargets[blendShapeTargetIndex].deltas.size())) { const auto& deltas = meshes[meshIndex].blendShapeTargets[blendShapeTargetIndex].deltas; return {deltas.xs[deltaIndex], deltas.ys[deltaIndex], deltas.zs[deltaIndex]}; } return {}; } template inline ConstArrayView ReaderImpl::getBlendShapeTargetDeltaXs(std::uint16_t meshIndex, std::uint16_t blendShapeTargetIndex) const { const auto& meshes = dna.geometry.meshes; if ((meshIndex < meshes.size()) && (blendShapeTargetIndex < meshes[meshIndex].blendShapeTargets.size())) { const auto& xDeltas = meshes[meshIndex].blendShapeTargets[blendShapeTargetIndex].deltas.xs; return {xDeltas.data(), xDeltas.size()}; } return {}; } template inline ConstArrayView ReaderImpl::getBlendShapeTargetDeltaYs(std::uint16_t meshIndex, std::uint16_t blendShapeTargetIndex) const { const auto& meshes = dna.geometry.meshes; if ((meshIndex < meshes.size()) && (blendShapeTargetIndex < meshes[meshIndex].blendShapeTargets.size())) { const auto& yDeltas = meshes[meshIndex].blendShapeTargets[blendShapeTargetIndex].deltas.ys; return {yDeltas.data(), yDeltas.size()}; } return {}; } template inline ConstArrayView ReaderImpl::getBlendShapeTargetDeltaZs(std::uint16_t meshIndex, std::uint16_t blendShapeTargetIndex) const { const auto& meshes = dna.geometry.meshes; if ((meshIndex < meshes.size()) && (blendShapeTargetIndex < meshes[meshIndex].blendShapeTargets.size())) { const auto& zDeltas = meshes[meshIndex].blendShapeTargets[blendShapeTargetIndex].deltas.zs; return {zDeltas.data(), zDeltas.size()}; } return {}; } template inline ConstArrayView ReaderImpl::getBlendShapeTargetVertexIndices(std::uint16_t meshIndex, std::uint16_t blendShapeTargetIndex) const { const auto& meshes = dna.geometry.meshes; if ((meshIndex < meshes.size()) && (blendShapeTargetIndex < meshes[meshIndex].blendShapeTargets.size())) { const auto& vertexIndices = meshes[meshIndex].blendShapeTargets[blendShapeTargetIndex].vertexIndices; return {vertexIndices.data(), vertexIndices.size()}; } return {}; } template inline std::uint16_t ReaderImpl::getMLControlCount() const { return static_cast(dna.machineLearnedBehavior.mlControlNames.size()); } template inline StringView ReaderImpl::getMLControlName(std::uint16_t index) const { if (index < dna.machineLearnedBehavior.mlControlNames.size()) { const auto& mlControlName = dna.machineLearnedBehavior.mlControlNames[index]; return {mlControlName.data(), mlControlName.size()}; } return {}; } template inline std::uint16_t ReaderImpl::getNeuralNetworkCount() const { return static_cast(dna.machineLearnedBehavior.neuralNetworks.size()); } template inline std::uint16_t ReaderImpl::getNeuralNetworkIndexListCount() const { return dna.machineLearnedBehavior.lodNeuralNetworkMapping.getIndexListCount(); } template inline ConstArrayView ReaderImpl::getNeuralNetworkIndicesForLOD(std::uint16_t lod) const { return dna.machineLearnedBehavior.lodNeuralNetworkMapping.getIndices(lod); } template inline std::uint16_t ReaderImpl::getMeshRegionCount(std::uint16_t meshIndex) const { if (meshIndex < dna.machineLearnedBehavior.neuralNetworkToMeshRegion.regionNames.size()) { return static_cast(dna.machineLearnedBehavior.neuralNetworkToMeshRegion.regionNames[meshIndex].size()); } return {}; } template inline StringView ReaderImpl::getMeshRegionName(std::uint16_t meshIndex, std::uint16_t regionIndex) const { if ((meshIndex < dna.machineLearnedBehavior.neuralNetworkToMeshRegion.regionNames.size()) && (regionIndex < dna.machineLearnedBehavior.neuralNetworkToMeshRegion.regionNames[meshIndex].size())) { return StringView{dna.machineLearnedBehavior.neuralNetworkToMeshRegion.regionNames[meshIndex][regionIndex]}; } return {}; } template inline ConstArrayView ReaderImpl::getNeuralNetworkIndicesForMeshRegion(std::uint16_t meshIndex, std::uint16_t regionIndex) const { if (meshIndex < dna.machineLearnedBehavior.neuralNetworkToMeshRegion.indices.size()) { const auto& mesh = dna.machineLearnedBehavior.neuralNetworkToMeshRegion.indices[meshIndex]; if (regionIndex < mesh.size()) { const auto& region = mesh[regionIndex]; return {region.data(), region.size()}; } } return {}; } template inline ConstArrayView ReaderImpl::getNeuralNetworkInputIndices(std::uint16_t netIndex) const { const auto& neuralNets = dna.machineLearnedBehavior.neuralNetworks; if (netIndex < neuralNets.size()) { return ConstArrayView{neuralNets[netIndex].inputIndices}; } return {}; } template inline ConstArrayView ReaderImpl::getNeuralNetworkOutputIndices(std::uint16_t netIndex) const { const auto& neuralNets = dna.machineLearnedBehavior.neuralNetworks; if (netIndex < neuralNets.size()) { return ConstArrayView{neuralNets[netIndex].outputIndices}; } return {}; } template inline std::uint16_t ReaderImpl::getNeuralNetworkLayerCount(std::uint16_t netIndex) const { const auto& neuralNets = dna.machineLearnedBehavior.neuralNetworks; if (netIndex < neuralNets.size()) { return static_cast(neuralNets[netIndex].layers.size()); } return {}; } template inline ActivationFunction ReaderImpl::getNeuralNetworkLayerActivationFunction(std::uint16_t netIndex, std::uint16_t layerIndex) const { const auto& neuralNets = dna.machineLearnedBehavior.neuralNetworks; if ((netIndex < neuralNets.size()) && (layerIndex < neuralNets[netIndex].layers.size())) { return static_cast(neuralNets[netIndex].layers[layerIndex].activationFunction.functionId); } return {}; } template inline ConstArrayView ReaderImpl::getNeuralNetworkLayerActivationFunctionParameters(std::uint16_t netIndex, std::uint16_t layerIndex) const { const auto& neuralNets = dna.machineLearnedBehavior.neuralNetworks; if ((netIndex < neuralNets.size()) && (layerIndex < neuralNets[netIndex].layers.size())) { return ConstArrayView{neuralNets[netIndex].layers[layerIndex].activationFunction.parameters}; } return {}; } template inline ConstArrayView ReaderImpl::getNeuralNetworkLayerBiases(std::uint16_t netIndex, std::uint16_t layerIndex) const { const auto& neuralNets = dna.machineLearnedBehavior.neuralNetworks; if ((netIndex < neuralNets.size()) && (layerIndex < neuralNets[netIndex].layers.size())) { return ConstArrayView{neuralNets[netIndex].layers[layerIndex].biases}; } return {}; } template inline ConstArrayView ReaderImpl::getNeuralNetworkLayerWeights(std::uint16_t netIndex, std::uint16_t layerIndex) const { const auto& neuralNets = dna.machineLearnedBehavior.neuralNetworks; if ((netIndex < neuralNets.size()) && (layerIndex < neuralNets[netIndex].layers.size())) { return ConstArrayView{neuralNets[netIndex].layers[layerIndex].weights}; } return {}; } template inline std::uint16_t ReaderImpl::getRBFPoseCount() const { return static_cast(dna.rbfBehavior.poses.size()); } template inline StringView ReaderImpl::getRBFPoseName(std::uint16_t poseIndex) const { const auto& poses = dna.rbfBehavior.poses; if (poseIndex < poses.size()) { return poses[poseIndex].name; } return {}; } template inline ConstArrayView ReaderImpl::getRBFPoseJointOutputIndices(std::uint16_t poseIndex) const { const auto& poses = dna.rbfBehavior.poses; if (poseIndex < poses.size()) { if (cache.rbfPoseJointOutputIndices.size() == 0) { cache.populateRBFPoseJointOutputIndices(this); } return cache.rbfPoseJointOutputIndices[poseIndex]; } return {}; } template inline ConstArrayView ReaderImpl::getRBFPoseBlendShapeChannelOutputIndices(std::uint16_t poseIndex) const { const auto& poses = dna.rbfBehavior.poses; if (poseIndex < poses.size()) { if (cache.rbfBlendShapeChannelOutputIndices.size() == 0) { cache.populateRBFBlendShapeOutputIndices(this); } return cache.rbfBlendShapeChannelOutputIndices[poseIndex]; } return {}; } template inline ConstArrayView ReaderImpl::getRBFPoseAnimatedMapOutputIndices(std::uint16_t poseIndex) const { const auto& poses = dna.rbfBehavior.poses; if (poseIndex < poses.size()) { if (cache.rbfAnimatedMapOutputIndices.size() == 0) { cache.populateRBFAnimatedMapOutputIndices(this); } return cache.rbfAnimatedMapOutputIndices[poseIndex]; } return {}; } template inline ConstArrayView ReaderImpl::getRBFPoseJointOutputValues(std::uint16_t poseIndex) const { const auto& poses = dna.rbfBehavior.poses; if (poseIndex < poses.size()) { if (cache.rbfPoseJointOutputValues.size() == 0) { cache.populateRBFPoseJointOutputValues(this); } return cache.rbfPoseJointOutputValues[poseIndex]; } return {}; } template inline float ReaderImpl::getRBFPoseScale(std::uint16_t poseIndex) const { const auto& poses = dna.rbfBehavior.poses; if (poseIndex < poses.size()) { return poses[poseIndex].scale; } return 0.0f; } template inline std::uint16_t ReaderImpl::getRBFPoseControlCount() const { return static_cast(dna.rbfBehaviorExt.poseControlNames.size()); } template StringView ReaderImpl::getRBFPoseControlName(std::uint16_t poseControlIndex) const { if (poseControlIndex < dna.rbfBehaviorExt.poseControlNames.size()) { const auto& poseControlName = dna.rbfBehaviorExt.poseControlNames[poseControlIndex]; return {poseControlName.data(), poseControlName.size()}; } return {}; } template inline ConstArrayView ReaderImpl::getRBFPoseInputControlIndices(std::uint16_t poseIndex) const { const auto& poses = dna.rbfBehaviorExt.poses; if (poseIndex < poses.size()) { return poses[poseIndex].inputControlIndices; } return {}; } template inline ConstArrayView ReaderImpl::getRBFPoseOutputControlIndices(std::uint16_t poseIndex) const { const auto& poses = dna.rbfBehaviorExt.poses; if (poseIndex < poses.size()) { return poses[poseIndex].outputControlIndices; } return {}; } template inline ConstArrayView ReaderImpl::getRBFPoseOutputControlWeights(std::uint16_t poseIndex) const { const auto& poses = dna.rbfBehaviorExt.poses; if (poseIndex < poses.size()) { return poses[poseIndex].outputControlWeights; } return {}; } template inline std::uint16_t ReaderImpl::getRBFSolverCount() const { return static_cast(dna.rbfBehavior.solvers.size()); } template inline std::uint16_t ReaderImpl::getRBFSolverIndexListCount() const { return dna.rbfBehavior.lodSolverMapping.getIndexListCount(); } template inline ConstArrayView ReaderImpl::getRBFSolverIndicesForLOD(std::uint16_t lod) const { return dna.rbfBehavior.lodSolverMapping.getIndices(lod); } template inline StringView ReaderImpl::getRBFSolverName(std::uint16_t solverIndex) const { if (dna.rbfBehavior.solvers.size() > solverIndex) { return dna.rbfBehavior.solvers[solverIndex].name; } return {}; } template inline ConstArrayView ReaderImpl::getRBFSolverRawControlIndices(std::uint16_t solverIndex) const { if (dna.rbfBehavior.solvers.size() > solverIndex) { return dna.rbfBehavior.solvers[solverIndex].rawControlIndices; } return {}; } template inline ConstArrayView ReaderImpl::getRBFSolverPoseIndices(std::uint16_t solverIndex) const { if (dna.rbfBehavior.solvers.size() > solverIndex) { return dna.rbfBehavior.solvers[solverIndex].poseIndices; } return {}; } template inline ConstArrayView ReaderImpl::getRBFSolverRawControlValues(std::uint16_t solverIndex) const { if (dna.rbfBehavior.solvers.size() > solverIndex) { return dna.rbfBehavior.solvers[solverIndex].rawControlValues; } return {}; } template inline RBFSolverType ReaderImpl::getRBFSolverType(std::uint16_t solverIndex) const { if (dna.rbfBehavior.solvers.size() > solverIndex) { return static_cast(dna.rbfBehavior.solvers[solverIndex].solverType); } return {}; } template inline float ReaderImpl::getRBFSolverRadius(std::uint16_t solverIndex) const { if (dna.rbfBehavior.solvers.size() > solverIndex) { return dna.rbfBehavior.solvers[solverIndex].radius; } return 0.0f; } template inline AutomaticRadius ReaderImpl::getRBFSolverAutomaticRadius(std::uint16_t solverIndex) const { if (dna.rbfBehavior.solvers.size() > solverIndex) { return static_cast(dna.rbfBehavior.solvers[solverIndex].automaticRadius); } return {}; } template inline float ReaderImpl::getRBFSolverWeightThreshold(std::uint16_t solverIndex) const { if (dna.rbfBehavior.solvers.size() > solverIndex) { return dna.rbfBehavior.solvers[solverIndex].weightThreshold; } return 0.0f; } template inline RBFDistanceMethod ReaderImpl::getRBFSolverDistanceMethod(std::uint16_t solverIndex) const { if (dna.rbfBehavior.solvers.size() > solverIndex) { return static_cast(dna.rbfBehavior.solvers[solverIndex].distanceMethod); } return {}; } template inline RBFNormalizeMethod ReaderImpl::getRBFSolverNormalizeMethod(std::uint16_t solverIndex) const { if (dna.rbfBehavior.solvers.size() > solverIndex) { return static_cast(dna.rbfBehavior.solvers[solverIndex].normalizeMethod); } return {}; } template inline RBFFunctionType ReaderImpl::getRBFSolverFunctionType(std::uint16_t solverIndex) const { if (dna.rbfBehavior.solvers.size() > solverIndex) { return static_cast(dna.rbfBehavior.solvers[solverIndex].functionType); } return {}; } template inline TwistAxis ReaderImpl::getRBFSolverTwistAxis(std::uint16_t solverIndex) const { if (dna.rbfBehavior.solvers.size() > solverIndex) { return static_cast(dna.rbfBehavior.solvers[solverIndex].twistAxis); } return {}; } template inline TranslationRepresentation ReaderImpl::getJointTranslationRepresentation(std::uint16_t jointIndex) const { if (dna.jointBehaviorMetadata.jointRepresentations.size() > jointIndex) { return static_cast(dna.jointBehaviorMetadata.jointRepresentations[jointIndex].translation); } return {}; } template inline RotationRepresentation ReaderImpl::getJointRotationRepresentation(std::uint16_t jointIndex) const { if (dna.jointBehaviorMetadata.jointRepresentations.size() > jointIndex) { return static_cast(dna.jointBehaviorMetadata.jointRepresentations[jointIndex].rotation); } return {}; } template inline ScaleRepresentation ReaderImpl::getJointScaleRepresentation(std::uint16_t jointIndex) const { if (dna.jointBehaviorMetadata.jointRepresentations.size() > jointIndex) { return static_cast(dna.jointBehaviorMetadata.jointRepresentations[jointIndex].scale); } return {}; } template inline std::uint16_t ReaderImpl::getTwistCount() const { return static_cast(dna.twistSwingBehavior.twists.size()); } template inline TwistAxis ReaderImpl::getTwistSetupTwistAxis(std::uint16_t twistIndex) const { if (dna.twistSwingBehavior.twists.size() > twistIndex) { return static_cast(dna.twistSwingBehavior.twists[twistIndex].twistAxis); } return {}; } template inline ConstArrayView ReaderImpl::getTwistInputControlIndices(std::uint16_t twistIndex) const { if (dna.twistSwingBehavior.twists.size() > twistIndex) { return dna.twistSwingBehavior.twists[twistIndex].twistInputControlIndices; } return {}; } template inline ConstArrayView ReaderImpl::getTwistOutputJointIndices(std::uint16_t twistIndex) const { if (dna.twistSwingBehavior.twists.size() > twistIndex) { return dna.twistSwingBehavior.twists[twistIndex].twistOutputJointIndices; } return {}; } template inline ConstArrayView ReaderImpl::getTwistBlendWeights(std::uint16_t twistIndex) const { if (dna.twistSwingBehavior.twists.size() > twistIndex) { return dna.twistSwingBehavior.twists[twistIndex].twistBlendWeights; } return {}; } template inline std::uint16_t ReaderImpl::getSwingCount() const { return static_cast(dna.twistSwingBehavior.swings.size()); } template inline TwistAxis ReaderImpl::getSwingSetupTwistAxis(std::uint16_t swingIndex) const { if (dna.twistSwingBehavior.swings.size() > swingIndex) { return static_cast(dna.twistSwingBehavior.swings[swingIndex].twistAxis); } return {}; } template inline ConstArrayView ReaderImpl::getSwingInputControlIndices(std::uint16_t swingIndex) const { if (dna.twistSwingBehavior.swings.size() > swingIndex) { return dna.twistSwingBehavior.swings[swingIndex].swingInputControlIndices; } return {}; } template inline ConstArrayView ReaderImpl::getSwingOutputJointIndices(std::uint16_t swingIndex) const { if (dna.twistSwingBehavior.swings.size() > swingIndex) { return dna.twistSwingBehavior.swings[swingIndex].swingOutputJointIndices; } return {}; } template inline ConstArrayView ReaderImpl::getSwingBlendWeights(std::uint16_t swingIndex) const { if (dna.twistSwingBehavior.swings.size() > swingIndex) { return dna.twistSwingBehavior.swings[swingIndex].swingBlendWeights; } return {}; } #ifdef _MSC_VER #pragma warning(pop) #endif } // namespace dna