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 QSSGRenderImageTexture(), QSSGRenderImageTexture(),
129 QSSGRenderImageTexture(), QSSGRenderImageTexture() };
130 dataToStore.cachedResult = firstFrameResult;
131 m_cache[modelKey] = dataToStore;
132 return firstFrameResult;
135 if (lastFrameDataIterator->visitedThisFrame)
136 return lastFrameDataIterator->cachedResult;
138 MotionResultData motionResult;
140 motionResult.prevModelViewProjection = lastFrameDataIterator->prevModelViewProjection;
141 lastFrameDataIterator->prevModelViewProjection = currentModelViewProjection;
143 motionResult.prevInstanceLocal = lastFrameDataIterator->prevInstanceLocal;
144 lastFrameDataIterator->prevInstanceLocal = currentInstanceLocal;
146 motionResult.prevInstanceGlobal = lastFrameDataIterator->prevInstanceGlobal;
147 lastFrameDataIterator->prevInstanceGlobal = currentInstanceGlobal;
149 motionResult.prevBoneTexture = loadAndReleaseIfNeeded(
150 lastFrameDataIterator->prevBoneTextureData,
151 lastFrameDataIterator->lastPrevBoneTextureDataSize);
153 motionResult.prevInstanceTexture = loadAndReleaseIfNeeded(
154 lastFrameDataIterator->prevInstanceTextureData,
155 lastFrameDataIterator->lastPrevInstanceTextureDataSize);
157 motionResult.prevMorphWeightTexture = loadAndReleaseIfNeeded(
158 lastFrameDataIterator->prevMorphWeightTextureData,
159 lastFrameDataIterator->lastPrevMorphWeightTextureDataSize);
161 motionResult.currentMorphWeightTexture = loadAndReleaseIfNeeded(
162 lastFrameDataIterator->currentMorphWeightTextureData,
163 lastFrameDataIterator->lastCurrentMorphWeightTextureDataSize);
165 if (currentBoneTextureData) {
166 if (!lastFrameDataIterator->prevBoneTextureData)
167 lastFrameDataIterator->prevBoneTextureData = std::make_shared<QSSGRenderTextureData>();
169 lastFrameDataIterator->lastPrevBoneTextureDataSize = lastFrameDataIterator->prevBoneTextureData->size();
170 copyToTextureData(lastFrameDataIterator->prevBoneTextureData.get(), currentBoneTextureData);
172 if (currentInstanceTable) {
173 if (!lastFrameDataIterator->prevInstanceTextureData)
174 lastFrameDataIterator->prevInstanceTextureData = std::make_shared<QSSGRenderTextureData>();
176 lastFrameDataIterator->lastPrevInstanceTextureDataSize = lastFrameDataIterator->prevInstanceTextureData->size();
177 copyToTextureData(lastFrameDataIterator->prevInstanceTextureData.get(), currentInstanceTable);
180 if (currentMorphWeights.size()) {
181 if (!lastFrameDataIterator->prevMorphWeightTextureData)
182 lastFrameDataIterator->prevMorphWeightTextureData = std::make_shared<QSSGRenderTextureData>();
184 lastFrameDataIterator->lastPrevMorphWeightTextureDataSize = lastFrameDataIterator->prevMorphWeightTextureData->size();
185 copyToTextureData(lastFrameDataIterator->prevMorphWeightTextureData.get(), lastFrameDataIterator->currentMorphWeightTextureData.get());
187 if (!lastFrameDataIterator->currentMorphWeightTextureData)
188 lastFrameDataIterator->currentMorphWeightTextureData = std::make_shared<QSSGRenderTextureData>();
190 lastFrameDataIterator->lastCurrentMorphWeightTextureDataSize = lastFrameDataIterator->currentMorphWeightTextureData->size();
191 copyToTextureData(lastFrameDataIterator->currentMorphWeightTextureData.get(), currentMorphWeights);
194 lastFrameDataIterator->frameAge = 0;
195 lastFrameDataIterator->visitedThisFrame =
true;
196 lastFrameDataIterator->cachedResult = motionResult;