dna/WriterImpl.h dna/BaseImpl.h dna/TypeDefs.h dna/utils/Extd.h cassert cstddef cstring tuple utility dna::WriterImpl dna //CopyrightEpicGames,Inc.AllRightsReserved. #pragmaonce #include"dna/BaseImpl.h" #include"dna/TypeDefs.h" #include"dna/utils/Extd.h" #ifdef_MSC_VER #pragmawarning(push) #pragmawarning(disable:43654987) #endif #include<cassert> #include<cstddef> #include<cstring> #include<tuple> #include<utility> #ifdef_MSC_VER #pragmawarning(pop) #endif namespacedna{ template<classTContainer,typename...Args> voidensureHasSize(TContainer&target, std::size_tsize, Args&&...args){ target.reserve(size); while(target.size()<size){ target.push_back(typenameTContainer::value_type(std::forward<Args>(args)...)); } } template<classTWriterBase> classWriterImpl:publicTWriterBase,publicvirtualBaseImpl{ public: explicitWriterImpl(MemoryResource*memRes_); //DescriptorWritermethods voidsetName(constchar*name)override; voidsetArchetype(Archetypearchetype)override; voidsetGender(Gendergender)override; voidsetAge(std::uint16_tage)override; voidclearMetaData()override; voidsetMetaData(constchar*key,constchar*value)override; voidsetTranslationUnit(TranslationUnitunit)override; voidsetRotationUnit(RotationUnitunit)override; voidsetCoordinateSystem(CoordinateSystemsystem)override; voidsetLODCount(std::uint16_tlodCount)override; voidsetDBMaxLOD(std::uint16_tlod)override; voidsetDBComplexity(constchar*name)override; voidsetDBName(constchar*name)override; //DefinitionWritermethods voidclearGUIControlNames()override; voidsetGUIControlName(std::uint16_tindex,constchar*name)override; voidclearRawControlNames()override; voidsetRawControlName(std::uint16_tindex,constchar*name)override; voidclearJointNames()override; voidsetJointName(std::uint16_tindex,constchar*name)override; voidclearJointIndices()override; voidsetJointIndices(std::uint16_tindex,conststd::uint16_t*jointIndices,std::uint16_tcount)override; voidclearLODJointMappings()override; voidsetLODJointMapping(std::uint16_tlod,std::uint16_tindex)override; voidclearBlendShapeChannelNames()override; voidsetJointHierarchy(conststd::uint16_t*jointIndices,std::uint16_tcount)override; voidsetBlendShapeChannelName(std::uint16_tindex,constchar*name)override; voidclearBlendShapeChannelIndices()override; voidsetBlendShapeChannelIndices(std::uint16_tindex,conststd::uint16_t*blendShapeChannelIndices, std::uint16_tcount)override; voidclearLODBlendShapeChannelMappings()override; voidsetLODBlendShapeChannelMapping(std::uint16_tlod,std::uint16_tindex)override; voidclearAnimatedMapNames()override; voidsetAnimatedMapName(std::uint16_tindex,constchar*name)override; voidclearAnimatedMapIndices()override; voidsetAnimatedMapIndices(std::uint16_tindex,conststd::uint16_t*animatedMapIndices,std::uint16_tcount)override; voidclearLODAnimatedMapMappings()override; voidsetLODAnimatedMapMapping(std::uint16_tlod,std::uint16_tindex)override; voidclearMeshNames()override; voidsetMeshName(std::uint16_tindex,constchar*name)override; voidclearMeshIndices()override; voidsetMeshIndices(std::uint16_tindex,conststd::uint16_t*meshIndices,std::uint16_tcount)override; voidclearLODMeshMappings()override; voidsetLODMeshMapping(std::uint16_tlod,std::uint16_tindex)override; voidclearMeshBlendShapeChannelMappings()override; voidsetMeshBlendShapeChannelMapping(std::uint32_tindex,std::uint16_tmeshIndex, std::uint16_tblendShapeChannelIndex)override; voidsetNeutralJointTranslations(constVector3*translations,std::uint16_tcount)override; voidsetNeutralJointRotations(constVector3*rotations,std::uint16_tcount)override; //BehaviorWritermethods voidsetGUIToRawInputIndices(conststd::uint16_t*inputIndices,std::uint16_tcount)override; voidsetGUIToRawOutputIndices(conststd::uint16_t*outputIndices,std::uint16_tcount)override; voidsetGUIToRawFromValues(constfloat*fromValues,std::uint16_tcount)override; voidsetGUIToRawToValues(constfloat*toValues,std::uint16_tcount)override; voidsetGUIToRawSlopeValues(constfloat*slopeValues,std::uint16_tcount)override; voidsetGUIToRawCutValues(constfloat*cutValues,std::uint16_tcount)override; voidsetPSDCount(std::uint16_tcount)override; voidsetPSDRowIndices(conststd::uint16_t*rowIndices,std::uint16_tcount)override; voidsetPSDColumnIndices(conststd::uint16_t*columnIndices,std::uint16_tcount)override; voidsetPSDValues(constfloat*weights,std::uint16_tcount)override; voidsetJointRowCount(std::uint16_trowCount)override; voidsetJointColumnCount(std::uint16_tcolumnCount)override; voidclearJointGroups()override; voiddeleteJointGroup(std::uint16_tjointGroupIndex)override; voidsetJointGroupLODs(std::uint16_tjointGroupIndex,conststd::uint16_t*lods,std::uint16_tcount)override; voidsetJointGroupInputIndices(std::uint16_tjointGroupIndex,conststd::uint16_t*inputIndices, std::uint16_tcount)override; voidsetJointGroupOutputIndices(std::uint16_tjointGroupIndex,conststd::uint16_t*outputIndices, std::uint16_tcount)override; voidsetJointGroupValues(std::uint16_tjointGroupIndex,constfloat*values,std::uint32_tcount)override; voidsetJointGroupJointIndices(std::uint16_tjointGroupIndex,conststd::uint16_t*jointIndices, std::uint16_tcount)override; voidsetBlendShapeChannelLODs(conststd::uint16_t*lods,std::uint16_tcount)override; voidsetBlendShapeChannelInputIndices(conststd::uint16_t*inputIndices,std::uint16_tcount)override; voidsetBlendShapeChannelOutputIndices(conststd::uint16_t*outputIndices,std::uint16_tcount)override; voidsetAnimatedMapLODs(conststd::uint16_t*lods,std::uint16_tcount)override; voidsetAnimatedMapInputIndices(conststd::uint16_t*inputIndices,std::uint16_tcount)override; voidsetAnimatedMapOutputIndices(conststd::uint16_t*outputIndices,std::uint16_tcount)override; voidsetAnimatedMapFromValues(constfloat*fromValues,std::uint16_tcount)override; voidsetAnimatedMapToValues(constfloat*toValues,std::uint16_tcount)override; voidsetAnimatedMapSlopeValues(constfloat*slopeValues,std::uint16_tcount)override; voidsetAnimatedMapCutValues(constfloat*cutValues,std::uint16_tcount)override; //GeometryWritermethods voidclearMeshes()override; voiddeleteMesh(std::uint16_tmeshIndex)override; voidsetVertexPositions(std::uint16_tmeshIndex,constPosition*positions,std::uint32_tcount)override; voidsetVertexTextureCoordinates(std::uint16_tmeshIndex,constTextureCoordinate*textureCoordinates, std::uint32_tcount)override; voidsetVertexNormals(std::uint16_tmeshIndex,constNormal*normals,std::uint32_tcount)override; voidsetVertexLayouts(std::uint16_tmeshIndex,constVertexLayout*layouts,std::uint32_tcount)override; voidclearFaceVertexLayoutIndices(std::uint16_tmeshIndex)override; voidsetFaceVertexLayoutIndices(std::uint16_tmeshIndex, std::uint32_tfaceIndex, conststd::uint32_t*layoutIndices, std::uint32_tcount)override; voidsetMaximumInfluencePerVertex(std::uint16_tmeshIndex,std::uint16_tmaxInfluenceCount)override; voidclearSkinWeights(std::uint16_tmeshIndex)override; voidsetSkinWeightsValues(std::uint16_tmeshIndex,std::uint32_tvertexIndex,constfloat*weights, std::uint16_tcount)override; voidsetSkinWeightsJointIndices(std::uint16_tmeshIndex, std::uint32_tvertexIndex, conststd::uint16_t*jointIndices, std::uint16_tcount)override; voidclearBlendShapeTargets(std::uint16_tmeshIndex)override; voidsetBlendShapeChannelIndex(std::uint16_tmeshIndex, std::uint16_tblendShapeTargetIndex, std::uint16_tblendShapeChannelIndex)override; voidsetBlendShapeTargetDeltas(std::uint16_tmeshIndex, std::uint16_tblendShapeTargetIndex, constDelta*deltas, std::uint32_tcount)override; voidsetBlendShapeTargetVertexIndices(std::uint16_tmeshIndex, std::uint16_tblendShapeTargetIndex, conststd::uint32_t*vertexIndices, std::uint32_tcount)override; }; #ifdef_MSC_VER #pragmawarning(push) #pragmawarning(disable:4589) #endif template<classTWriterBase> WriterImpl<TWriterBase>::WriterImpl(MemoryResource*memRes_):BaseImpl{memRes_}{ } #ifdef_MSC_VER #pragmawarning(pop) #endif #ifdef_MSC_VER #pragmawarning(push) #pragmawarning(disable:4505) #endif template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setName(constchar*name){ dna.descriptor.name=name; } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setArchetype(Archetypearchetype){ dna.descriptor.archetype=static_cast<std::uint16_t>(archetype); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setGender(Gendergender){ dna.descriptor.gender=static_cast<std::uint16_t>(gender); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setAge(std::uint16_tage){ dna.descriptor.age=age; } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::clearMetaData(){ dna.descriptor.metadata.clear(); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setMetaData(constchar*key,constchar*value){ usingCharStringPair=std::tuple<String<char>,String<char>>; autoit=std::find_if(dna.descriptor.metadata.begin(),dna.descriptor.metadata.end(),[&key](constCharStringPair&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<char>{key,memRes},String<char>{value,memRes}); } }else{ if(value==nullptr){ dna.descriptor.metadata.erase(it); }else{ std::get<1>(*it)=value; } } } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setTranslationUnit(TranslationUnitunit){ dna.descriptor.translationUnit=static_cast<std::uint16_t>(unit); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setRotationUnit(RotationUnitunit){ dna.descriptor.rotationUnit=static_cast<std::uint16_t>(unit); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setCoordinateSystem(CoordinateSystemsystem){ dna.descriptor.coordinateSystem.xAxis=static_cast<std::uint16_t>(system.xAxis); dna.descriptor.coordinateSystem.yAxis=static_cast<std::uint16_t>(system.yAxis); dna.descriptor.coordinateSystem.zAxis=static_cast<std::uint16_t>(system.zAxis); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setLODCount(std::uint16_tlodCount){ dna.descriptor.lodCount=lodCount; } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setDBMaxLOD(std::uint16_tlod){ dna.descriptor.maxLOD=lod; } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setDBComplexity(constchar*name){ dna.descriptor.complexity=name; } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setDBName(constchar*name){ dna.descriptor.dbName=name; } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::clearGUIControlNames(){ dna.definition.guiControlNames.clear(); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setGUIControlName(std::uint16_tindex,constchar*name){ ensureHasSize(dna.definition.guiControlNames,index+1ul,memRes); dna.definition.guiControlNames[index]=name; } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::clearRawControlNames(){ dna.definition.rawControlNames.clear(); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setRawControlName(std::uint16_tindex,constchar*name){ ensureHasSize(dna.definition.rawControlNames,index+1ul,memRes); dna.definition.rawControlNames[index]=name; } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::clearJointNames(){ dna.definition.jointNames.clear(); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setJointName(std::uint16_tindex,constchar*name){ ensureHasSize(dna.definition.jointNames,index+1ul,memRes); dna.definition.jointNames[index]=name; } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::clearJointIndices(){ dna.definition.lodJointMapping.resetIndices(); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setJointIndices(std::uint16_tindex,conststd::uint16_t*jointIndices, std::uint16_tcount){ dna.definition.lodJointMapping.clearIndices(index); dna.definition.lodJointMapping.addIndices(index,jointIndices,count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::clearLODJointMappings(){ dna.definition.lodJointMapping.resetLODs(); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setLODJointMapping(std::uint16_tlod,std::uint16_tindex){ dna.definition.lodJointMapping.associateLODWithIndices(lod,index); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setJointHierarchy(conststd::uint16_t*jointIndices,std::uint16_tcount){ dna.definition.jointHierarchy.assign(jointIndices,jointIndices+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::clearBlendShapeChannelNames(){ dna.definition.blendShapeChannelNames.clear(); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setBlendShapeChannelName(std::uint16_tindex,constchar*name){ ensureHasSize(dna.definition.blendShapeChannelNames,index+1ul,memRes); dna.definition.blendShapeChannelNames[index]=name; } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::clearBlendShapeChannelIndices(){ dna.definition.lodBlendShapeMapping.resetIndices(); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setBlendShapeChannelIndices(std::uint16_tindex, conststd::uint16_t*blendShapeChannelIndices, std::uint16_tcount){ dna.definition.lodBlendShapeMapping.clearIndices(index); dna.definition.lodBlendShapeMapping.addIndices(index,blendShapeChannelIndices,count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::clearLODBlendShapeChannelMappings(){ dna.definition.lodBlendShapeMapping.resetLODs(); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setLODBlendShapeChannelMapping(std::uint16_tlod,std::uint16_tindex){ dna.definition.lodBlendShapeMapping.associateLODWithIndices(lod,index); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::clearAnimatedMapNames(){ dna.definition.animatedMapNames.clear(); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setAnimatedMapName(std::uint16_tindex,constchar*name){ ensureHasSize(dna.definition.animatedMapNames,index+1ul,memRes); dna.definition.animatedMapNames[index]=name; } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::clearAnimatedMapIndices(){ dna.definition.lodAnimatedMapMapping.resetIndices(); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setAnimatedMapIndices(std::uint16_tindex, conststd::uint16_t*animatedMapIndices, std::uint16_tcount){ dna.definition.lodAnimatedMapMapping.clearIndices(index); dna.definition.lodAnimatedMapMapping.addIndices(index,animatedMapIndices,count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::clearLODAnimatedMapMappings(){ dna.definition.lodAnimatedMapMapping.resetLODs(); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setLODAnimatedMapMapping(std::uint16_tlod,std::uint16_tindex){ dna.definition.lodAnimatedMapMapping.associateLODWithIndices(lod,index); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::clearMeshNames(){ dna.definition.meshNames.clear(); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setMeshName(std::uint16_tindex,constchar*name){ ensureHasSize(dna.definition.meshNames,index+1ul,memRes); dna.definition.meshNames[index]=name; } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::clearMeshIndices(){ dna.definition.lodMeshMapping.resetIndices(); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setMeshIndices(std::uint16_tindex,conststd::uint16_t*meshIndices,std::uint16_tcount){ dna.definition.lodMeshMapping.clearIndices(index); dna.definition.lodMeshMapping.addIndices(index,meshIndices,count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::clearLODMeshMappings(){ dna.definition.lodMeshMapping.resetLODs(); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setLODMeshMapping(std::uint16_tlod,std::uint16_tindex){ dna.definition.lodMeshMapping.associateLODWithIndices(lod,index); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::clearMeshBlendShapeChannelMappings(){ dna.definition.meshBlendShapeChannelMapping.clear(); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setMeshBlendShapeChannelMapping(std::uint32_tindex, std::uint16_tmeshIndex, std::uint16_tblendShapeChannelIndex){ dna.definition.meshBlendShapeChannelMapping.set(index,meshIndex,blendShapeChannelIndex); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setNeutralJointTranslations(constVector3*translations,std::uint16_tcount){ dna.definition.neutralJointTranslations.assign(translations,translations+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setNeutralJointRotations(constVector3*rotations,std::uint16_tcount){ dna.definition.neutralJointRotations.assign(rotations,rotations+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setGUIToRawInputIndices(conststd::uint16_t*inputIndices,std::uint16_tcount){ dna.behavior.controls.conditionals.inputIndices.assign(inputIndices,inputIndices+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setGUIToRawOutputIndices(conststd::uint16_t*outputIndices,std::uint16_tcount){ dna.behavior.controls.conditionals.outputIndices.assign(outputIndices,outputIndices+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setGUIToRawFromValues(constfloat*fromValues,std::uint16_tcount){ dna.behavior.controls.conditionals.fromValues.assign(fromValues,fromValues+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setGUIToRawToValues(constfloat*toValues,std::uint16_tcount){ dna.behavior.controls.conditionals.toValues.assign(toValues,toValues+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setGUIToRawSlopeValues(constfloat*slopeValues,std::uint16_tcount){ dna.behavior.controls.conditionals.slopeValues.assign(slopeValues,slopeValues+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setGUIToRawCutValues(constfloat*cutValues,std::uint16_tcount){ dna.behavior.controls.conditionals.cutValues.assign(cutValues,cutValues+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setPSDCount(std::uint16_tcount){ dna.behavior.controls.psdCount=count; } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setPSDRowIndices(conststd::uint16_t*rowIndices,std::uint16_tcount){ dna.behavior.controls.psds.rows.assign(rowIndices,rowIndices+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setPSDColumnIndices(conststd::uint16_t*columnIndices,std::uint16_tcount){ dna.behavior.controls.psds.columns.assign(columnIndices,columnIndices+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setPSDValues(constfloat*weights,std::uint16_tcount){ dna.behavior.controls.psds.values.assign(weights,weights+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setJointRowCount(std::uint16_trowCount){ dna.behavior.joints.rowCount=rowCount; } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setJointColumnCount(std::uint16_tcolumnCount){ dna.behavior.joints.colCount=columnCount; } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::clearJointGroups(){ dna.behavior.joints.jointGroups.clear(); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::deleteJointGroup(std::uint16_tjointGroupIndex){ if(jointGroupIndex<dna.behavior.joints.jointGroups.size()){ autoit=extd::advanced(dna.behavior.joints.jointGroups.begin(),jointGroupIndex); dna.behavior.joints.jointGroups.erase(it); } } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setJointGroupLODs(std::uint16_tjointGroupIndex, conststd::uint16_t*lods, std::uint16_tcount){ auto&jointGroups=dna.behavior.joints.jointGroups; ensureHasSize(jointGroups,jointGroupIndex+1ul,memRes); jointGroups[jointGroupIndex].lods.assign(lods,lods+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setJointGroupInputIndices(std::uint16_tjointGroupIndex, conststd::uint16_t*inputIndices, std::uint16_tcount){ auto&jointGroups=dna.behavior.joints.jointGroups; ensureHasSize(jointGroups,jointGroupIndex+1ul,memRes); jointGroups[jointGroupIndex].inputIndices.assign(inputIndices,inputIndices+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setJointGroupOutputIndices(std::uint16_tjointGroupIndex, conststd::uint16_t*outputIndices, std::uint16_tcount){ auto&jointGroups=dna.behavior.joints.jointGroups; ensureHasSize(jointGroups,jointGroupIndex+1ul,memRes); jointGroups[jointGroupIndex].outputIndices.assign(outputIndices,outputIndices+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setJointGroupValues(std::uint16_tjointGroupIndex,constfloat*values, std::uint32_tcount){ auto&jointGroups=dna.behavior.joints.jointGroups; ensureHasSize(jointGroups,jointGroupIndex+1ul,memRes); jointGroups[jointGroupIndex].values.assign(values,values+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setJointGroupJointIndices(std::uint16_tjointGroupIndex, conststd::uint16_t*jointIndices, std::uint16_tcount){ auto&jointGroups=dna.behavior.joints.jointGroups; ensureHasSize(jointGroups,jointGroupIndex+1ul,memRes); jointGroups[jointGroupIndex].jointIndices.assign(jointIndices,jointIndices+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setBlendShapeChannelLODs(conststd::uint16_t*lods,std::uint16_tcount){ dna.behavior.blendShapeChannels.lods.assign(lods,lods+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setBlendShapeChannelInputIndices(conststd::uint16_t*inputIndices,std::uint16_tcount){ dna.behavior.blendShapeChannels.inputIndices.assign(inputIndices,inputIndices+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setBlendShapeChannelOutputIndices(conststd::uint16_t*outputIndices,std::uint16_tcount){ dna.behavior.blendShapeChannels.outputIndices.assign(outputIndices,outputIndices+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setAnimatedMapLODs(conststd::uint16_t*lods,std::uint16_tcount){ dna.behavior.animatedMaps.lods.assign(lods,lods+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setAnimatedMapInputIndices(conststd::uint16_t*inputIndices,std::uint16_tcount){ dna.behavior.animatedMaps.conditionals.inputIndices.assign(inputIndices,inputIndices+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setAnimatedMapOutputIndices(conststd::uint16_t*outputIndices,std::uint16_tcount){ dna.behavior.animatedMaps.conditionals.outputIndices.assign(outputIndices,outputIndices+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setAnimatedMapFromValues(constfloat*fromValues,std::uint16_tcount){ dna.behavior.animatedMaps.conditionals.fromValues.assign(fromValues,fromValues+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setAnimatedMapToValues(constfloat*toValues,std::uint16_tcount){ dna.behavior.animatedMaps.conditionals.toValues.assign(toValues,toValues+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setAnimatedMapSlopeValues(constfloat*slopeValues,std::uint16_tcount){ dna.behavior.animatedMaps.conditionals.slopeValues.assign(slopeValues,slopeValues+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setAnimatedMapCutValues(constfloat*cutValues,std::uint16_tcount){ dna.behavior.animatedMaps.conditionals.cutValues.assign(cutValues,cutValues+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::clearMeshes(){ dna.geometry.meshes.clear(); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::deleteMesh(std::uint16_tmeshIndex){ if(meshIndex<dna.geometry.meshes.size()){ autoit=extd::advanced(dna.geometry.meshes.begin(),meshIndex); dna.geometry.meshes.erase(it); } } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setVertexPositions(std::uint16_tmeshIndex,constPosition*positions,std::uint32_tcount){ ensureHasSize(dna.geometry.meshes,meshIndex+1ul,memRes); dna.geometry.meshes[meshIndex].positions.assign(positions,positions+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setVertexTextureCoordinates(std::uint16_tmeshIndex, constTextureCoordinate*textureCoordinates, std::uint32_tcount){ ensureHasSize(dna.geometry.meshes,meshIndex+1ul,memRes); auto&destination=dna.geometry.meshes[meshIndex].textureCoordinates; destination.clear(); destination.us.resize_uninitialized(count); destination.vs.resize_uninitialized(count); for(std::size_ti=0ul;i<count;++i){ destination.us[i]=textureCoordinates[i].u; destination.vs[i]=textureCoordinates[i].v; } } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setVertexNormals(std::uint16_tmeshIndex,constNormal*normals,std::uint32_tcount){ ensureHasSize(dna.geometry.meshes,meshIndex+1ul,memRes); dna.geometry.meshes[meshIndex].normals.assign(normals,normals+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setVertexLayouts(std::uint16_tmeshIndex,constVertexLayout*layouts,std::uint32_tcount){ ensureHasSize(dna.geometry.meshes,meshIndex+1ul,memRes); auto&destination=dna.geometry.meshes[meshIndex].layouts; destination.clear(); destination.positions.resize_uninitialized(count); destination.textureCoordinates.resize_uninitialized(count); destination.normals.resize_uninitialized(count); for(std::size_ti=0ul;i<count;++i){ destination.positions[i]=layouts[i].position; destination.textureCoordinates[i]=layouts[i].textureCoordinate; destination.normals[i]=layouts[i].normal; } } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::clearFaceVertexLayoutIndices(std::uint16_tmeshIndex){ if(meshIndex<dna.geometry.meshes.size()){ dna.geometry.meshes[meshIndex].faces.clear(); } } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setFaceVertexLayoutIndices(std::uint16_tmeshIndex, std::uint32_tfaceIndex, conststd::uint32_t*layoutIndices, std::uint32_tcount){ ensureHasSize(dna.geometry.meshes,meshIndex+1ul,memRes); auto&faces=dna.geometry.meshes[meshIndex].faces; ensureHasSize(faces,faceIndex+1ul,memRes); faces[faceIndex].layoutIndices.assign(layoutIndices,layoutIndices+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setMaximumInfluencePerVertex(std::uint16_tmeshIndex,std::uint16_tmaxInfluenceCount){ ensureHasSize(dna.geometry.meshes,meshIndex+1ul,memRes); dna.geometry.meshes[meshIndex].maximumInfluencePerVertex=maxInfluenceCount; } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::clearSkinWeights(std::uint16_tmeshIndex){ if(meshIndex<dna.geometry.meshes.size()){ dna.geometry.meshes[meshIndex].skinWeights.clear(); } } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setSkinWeightsValues(std::uint16_tmeshIndex, std::uint32_tvertexIndex, constfloat*weights, std::uint16_tcount){ ensureHasSize(dna.geometry.meshes,meshIndex+1ul,memRes); auto&skinWeights=dna.geometry.meshes[meshIndex].skinWeights; ensureHasSize(skinWeights,vertexIndex+1ul,memRes); skinWeights[vertexIndex].weights.assign(weights,weights+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setSkinWeightsJointIndices(std::uint16_tmeshIndex, std::uint32_tvertexIndex, conststd::uint16_t*jointIndices, std::uint16_tcount){ ensureHasSize(dna.geometry.meshes,meshIndex+1ul,memRes); auto&skinWeights=dna.geometry.meshes[meshIndex].skinWeights; ensureHasSize(skinWeights,vertexIndex+1ul,memRes); skinWeights[vertexIndex].jointIndices.assign(jointIndices,jointIndices+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::clearBlendShapeTargets(std::uint16_tmeshIndex){ if(meshIndex<dna.geometry.meshes.size()){ dna.geometry.meshes[meshIndex].blendShapeTargets.clear(); } } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setBlendShapeChannelIndex(std::uint16_tmeshIndex, std::uint16_tblendShapeTargetIndex, std::uint16_tblendShapeChannelIndex){ ensureHasSize(dna.geometry.meshes,meshIndex+1ul,memRes); ensureHasSize(dna.geometry.meshes[meshIndex].blendShapeTargets,blendShapeTargetIndex+1ul,memRes); dna.geometry.meshes[meshIndex].blendShapeTargets[blendShapeTargetIndex].blendShapeChannelIndex=blendShapeChannelIndex; } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setBlendShapeTargetDeltas(std::uint16_tmeshIndex, std::uint16_tblendShapeTargetIndex, constDelta*deltas, std::uint32_tcount){ ensureHasSize(dna.geometry.meshes,meshIndex+1ul,memRes); ensureHasSize(dna.geometry.meshes[meshIndex].blendShapeTargets,blendShapeTargetIndex+1ul,memRes); dna.geometry.meshes[meshIndex].blendShapeTargets[blendShapeTargetIndex].deltas.assign(deltas,deltas+count); } template<classTWriterBase> inlinevoidWriterImpl<TWriterBase>::setBlendShapeTargetVertexIndices(std::uint16_tmeshIndex, std::uint16_tblendShapeTargetIndex, conststd::uint32_t*vertexIndices, std::uint32_tcount){ ensureHasSize(dna.geometry.meshes,meshIndex+1ul,memRes); auto&blendShapeTargets=dna.geometry.meshes[meshIndex].blendShapeTargets; ensureHasSize(blendShapeTargets,blendShapeTargetIndex+1ul,memRes); blendShapeTargets[blendShapeTargetIndex].vertexIndices.assign(vertexIndices,vertexIndices+count); } #ifdef_MSC_VER #pragmawarning(pop) #endif }//namespacedna