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;
102 dataToStore.frameAge = 0;
103 dataToStore.visitedThisFrame =
true;
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 MotionResultData firstFrameResult = { currentModelViewProjection, currentInstanceLocal, currentInstanceGlobal,
128 loadAndReleaseIfNeeded(dataToStore.prevBoneTextureData, dataToStore.lastPrevBoneTextureDataSize),
129 loadAndReleaseIfNeeded(dataToStore.prevInstanceTextureData, dataToStore.lastPrevInstanceTextureDataSize),
130 loadAndReleaseIfNeeded(dataToStore.currentMorphWeightTextureData, dataToStore.lastCurrentMorphWeightTextureDataSize),
131 loadAndReleaseIfNeeded(dataToStore.prevMorphWeightTextureData, dataToStore.lastPrevMorphWeightTextureDataSize) };
132 dataToStore.cachedResult = firstFrameResult;
133 m_cache[modelKey] = dataToStore;
134 return firstFrameResult;
137 if (lastFrameDataIterator->visitedThisFrame)
138 return lastFrameDataIterator->cachedResult;
140 MotionResultData motionResult;
142 motionResult.prevModelViewProjection = lastFrameDataIterator->prevModelViewProjection;
143 lastFrameDataIterator->prevModelViewProjection = currentModelViewProjection;
145 motionResult.prevInstanceLocal = lastFrameDataIterator->prevInstanceLocal;
146 lastFrameDataIterator->prevInstanceLocal = currentInstanceLocal;
148 motionResult.prevInstanceGlobal = lastFrameDataIterator->prevInstanceGlobal;
149 lastFrameDataIterator->prevInstanceGlobal = currentInstanceGlobal;
151 motionResult.prevBoneTexture = loadAndReleaseIfNeeded(
152 lastFrameDataIterator->prevBoneTextureData,
153 lastFrameDataIterator->lastPrevBoneTextureDataSize);
155 motionResult.prevInstanceTexture = loadAndReleaseIfNeeded(
156 lastFrameDataIterator->prevInstanceTextureData,
157 lastFrameDataIterator->lastPrevInstanceTextureDataSize);
159 motionResult.prevMorphWeightTexture = loadAndReleaseIfNeeded(
160 lastFrameDataIterator->prevMorphWeightTextureData,
161 lastFrameDataIterator->lastPrevMorphWeightTextureDataSize);
163 motionResult.currentMorphWeightTexture = loadAndReleaseIfNeeded(
164 lastFrameDataIterator->currentMorphWeightTextureData,
165 lastFrameDataIterator->lastCurrentMorphWeightTextureDataSize);
167 if (currentBoneTextureData) {
168 if (!lastFrameDataIterator->prevBoneTextureData)
169 lastFrameDataIterator->prevBoneTextureData = std::make_shared<QSSGRenderTextureData>();
171 lastFrameDataIterator->lastPrevBoneTextureDataSize = lastFrameDataIterator->prevBoneTextureData->size();
172 copyToTextureData(lastFrameDataIterator->prevBoneTextureData.get(), currentBoneTextureData);
174 if (currentInstanceTable) {
175 if (!lastFrameDataIterator->prevInstanceTextureData)
176 lastFrameDataIterator->prevInstanceTextureData = std::make_shared<QSSGRenderTextureData>();
178 lastFrameDataIterator->lastPrevInstanceTextureDataSize = lastFrameDataIterator->prevInstanceTextureData->size();
179 copyToTextureData(lastFrameDataIterator->prevInstanceTextureData.get(), currentInstanceTable);
182 if (currentMorphWeights.size()) {
183 if (!lastFrameDataIterator->prevMorphWeightTextureData)
184 lastFrameDataIterator->prevMorphWeightTextureData = std::make_shared<QSSGRenderTextureData>();
186 lastFrameDataIterator->lastPrevMorphWeightTextureDataSize = lastFrameDataIterator->prevMorphWeightTextureData->size();
187 if (lastFrameDataIterator->currentMorphWeightTextureData)
188 copyToTextureData(lastFrameDataIterator->prevMorphWeightTextureData.get(), lastFrameDataIterator->currentMorphWeightTextureData.get());
190 copyToTextureData(lastFrameDataIterator->prevMorphWeightTextureData.get(), currentMorphWeights);
192 if (!lastFrameDataIterator->currentMorphWeightTextureData)
193 lastFrameDataIterator->currentMorphWeightTextureData = std::make_shared<QSSGRenderTextureData>();
195 lastFrameDataIterator->lastCurrentMorphWeightTextureDataSize = lastFrameDataIterator->currentMorphWeightTextureData->size();
196 copyToTextureData(lastFrameDataIterator->currentMorphWeightTextureData.get(), currentMorphWeights);
199 lastFrameDataIterator->frameAge = 0;
200 lastFrameDataIterator->visitedThisFrame =
true;
201 lastFrameDataIterator->cachedResult = motionResult;