86QSSGRenderMotionVectorMap::MotionResultData QSSGRenderMotionVectorMap::trackMotionData(
88 const QMatrix4x4 ¤tModelViewProjection,
89 const QMatrix4x4 ¤tInstanceLocal,
90 const QMatrix4x4 ¤tInstanceGlobal,
91 QSSGRenderTextureData *currentBoneTextureData,
92 QSSGRenderInstanceTable *currentInstanceTable,
93 const QVector<
float> ¤tMorphWeights)
95 auto lastFrameDataIterator = m_cache.find(modelKey);
97 if (lastFrameDataIterator == m_cache.end()) {
98 MotionStoreData dataToStore;
99 dataToStore.prevModelViewProjection = currentModelViewProjection;
100 dataToStore.prevInstanceLocal = currentInstanceLocal;
101 dataToStore.prevInstanceGlobal = currentInstanceGlobal;
103 dataToStore.frameAge = 0;
105 if (currentBoneTextureData) {
106 dataToStore.prevBoneTextureData = std::make_shared<QSSGRenderTextureData>();
107 copyToTextureData(dataToStore.prevBoneTextureData.get(), currentBoneTextureData);
108 dataToStore.lastPrevBoneTextureDataSize = dataToStore.prevBoneTextureData->size();
111 if (currentInstanceTable) {
112 dataToStore.prevInstanceTextureData = std::make_shared<QSSGRenderTextureData>();
113 copyToTextureData(dataToStore.prevInstanceTextureData.get(), currentInstanceTable);
114 dataToStore.lastPrevInstanceTextureDataSize = dataToStore.prevInstanceTextureData->size();
117 if (currentMorphWeights.size()) {
118 dataToStore.currentMorphWeightTextureData = std::make_shared<QSSGRenderTextureData>();
119 copyToTextureData(dataToStore.currentMorphWeightTextureData.get(), currentMorphWeights);
120 dataToStore.lastCurrentMorphWeightTextureDataSize = dataToStore.currentMorphWeightTextureData->size();
122 dataToStore.prevMorphWeightTextureData = std::make_shared<QSSGRenderTextureData>();
123 copyToTextureData(dataToStore.prevMorphWeightTextureData.get(), currentMorphWeights);
124 dataToStore.lastPrevMorphWeightTextureDataSize = dataToStore.prevMorphWeightTextureData->size();
127 m_cache[modelKey] = dataToStore;
128 return { currentModelViewProjection, currentInstanceLocal, currentInstanceGlobal, QSSGRenderImageTexture(), QSSGRenderImageTexture(), QSSGRenderImageTexture(), QSSGRenderImageTexture() };
131 MotionResultData motionResult;
133 motionResult.prevModelViewProjection = lastFrameDataIterator->prevModelViewProjection;
134 lastFrameDataIterator->prevModelViewProjection = currentModelViewProjection;
136 motionResult.prevInstanceLocal = lastFrameDataIterator->prevInstanceLocal;
137 lastFrameDataIterator->prevInstanceLocal = currentInstanceLocal;
139 motionResult.prevInstanceGlobal = lastFrameDataIterator->prevInstanceGlobal;
140 lastFrameDataIterator->prevInstanceGlobal = currentInstanceGlobal;
142 motionResult.prevBoneTexture = loadAndReleaseIfNeeded(
143 lastFrameDataIterator->prevBoneTextureData,
144 lastFrameDataIterator->lastPrevBoneTextureDataSize);
146 motionResult.prevInstanceTexture = loadAndReleaseIfNeeded(
147 lastFrameDataIterator->prevInstanceTextureData,
148 lastFrameDataIterator->lastPrevInstanceTextureDataSize);
150 motionResult.prevMorphWeightTexture = loadAndReleaseIfNeeded(
151 lastFrameDataIterator->prevMorphWeightTextureData,
152 lastFrameDataIterator->lastPrevMorphWeightTextureDataSize);
154 motionResult.currentMorphWeightTexture = loadAndReleaseIfNeeded(
155 lastFrameDataIterator->currentMorphWeightTextureData,
156 lastFrameDataIterator->lastCurrentMorphWeightTextureDataSize);
158 if (currentBoneTextureData) {
159 if (!lastFrameDataIterator->prevBoneTextureData)
160 lastFrameDataIterator->prevBoneTextureData = std::make_shared<QSSGRenderTextureData>();
162 lastFrameDataIterator->lastPrevBoneTextureDataSize = lastFrameDataIterator->prevBoneTextureData->size();
163 copyToTextureData(lastFrameDataIterator->prevBoneTextureData.get(), currentBoneTextureData);
165 if (currentInstanceTable) {
166 if (!lastFrameDataIterator->prevInstanceTextureData)
167 lastFrameDataIterator->prevInstanceTextureData = std::make_shared<QSSGRenderTextureData>();
169 lastFrameDataIterator->lastPrevInstanceTextureDataSize = lastFrameDataIterator->prevInstanceTextureData->size();
170 copyToTextureData(lastFrameDataIterator->prevInstanceTextureData.get(), currentInstanceTable);
173 if (currentMorphWeights.size()) {
174 if (!lastFrameDataIterator->prevMorphWeightTextureData)
175 lastFrameDataIterator->prevMorphWeightTextureData = std::make_shared<QSSGRenderTextureData>();
177 lastFrameDataIterator->lastPrevMorphWeightTextureDataSize = lastFrameDataIterator->prevMorphWeightTextureData->size();
178 copyToTextureData(lastFrameDataIterator->prevMorphWeightTextureData.get(), lastFrameDataIterator->currentMorphWeightTextureData.get());
180 if (!lastFrameDataIterator->currentMorphWeightTextureData)
181 lastFrameDataIterator->currentMorphWeightTextureData = std::make_shared<QSSGRenderTextureData>();
183 lastFrameDataIterator->lastCurrentMorphWeightTextureDataSize = lastFrameDataIterator->currentMorphWeightTextureData->size();
184 copyToTextureData(lastFrameDataIterator->currentMorphWeightTextureData.get(), currentMorphWeights);
186 lastFrameDataIterator->frameAge = 0;