|
|
@@ -86,8 +86,6 @@ bool Model::Load(Deserializer& source)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- bool headless = GetSubsystem<Graphics>() == 0;
|
|
|
-
|
|
|
geometries_.Clear();
|
|
|
geometryBoneMappings_.Clear();
|
|
|
morphs_.Clear();
|
|
|
@@ -113,43 +111,19 @@ bool Model::Load(Deserializer& source)
|
|
|
buffer->SetMorphRange(morphStart, morphCount);
|
|
|
|
|
|
unsigned vertexSize = buffer->GetVertexSize();
|
|
|
- if (!headless)
|
|
|
+ unsigned char* data = (unsigned char*)buffer->Lock(0, vertexCount, LOCK_NORMAL);
|
|
|
+ if (data)
|
|
|
{
|
|
|
- unsigned char* data = (unsigned char*)buffer->Lock(0, vertexCount, LOCK_NORMAL);
|
|
|
- if (data)
|
|
|
+ source.Read(data, vertexCount * vertexSize);
|
|
|
+ // If there is a morph range, make a copy of the data so that the morph range can be reset
|
|
|
+ if (morphCount)
|
|
|
{
|
|
|
- source.Read(data, vertexCount * vertexSize);
|
|
|
- // If there is a morph range, make a copy of the data so that the morph range can be reset
|
|
|
- if (morphCount)
|
|
|
- {
|
|
|
- SharedArrayPtr<unsigned char> morphResetData(new unsigned char[morphCount * vertexSize]);
|
|
|
- memcpy(morphResetData.Get(), &data[morphStart * vertexSize], morphCount * vertexSize);
|
|
|
- buffer->SetMorphRangeResetData(morphResetData);
|
|
|
- }
|
|
|
-
|
|
|
- // Copy the raw position data for CPU-side operations
|
|
|
- SharedArrayPtr<unsigned char> rawVertexData(new unsigned char[3 * sizeof(float) * vertexCount]);
|
|
|
- float* rawDest = (float*)rawVertexData.Get();
|
|
|
- for (unsigned i = 0; i < vertexCount; ++i)
|
|
|
- {
|
|
|
- float* rawSrc = (float*)&data[i * vertexSize];
|
|
|
- *rawDest++ = *rawSrc++;
|
|
|
- *rawDest++ = *rawSrc++;
|
|
|
- *rawDest++ = *rawSrc++;
|
|
|
- }
|
|
|
- rawVertexDatas.Push(rawVertexData);
|
|
|
-
|
|
|
- buffer->Unlock();
|
|
|
+ SharedArrayPtr<unsigned char> morphResetData(new unsigned char[morphCount * vertexSize]);
|
|
|
+ memcpy(morphResetData.Get(), &data[morphStart * vertexSize], morphCount * vertexSize);
|
|
|
+ buffer->SetMorphRangeResetData(morphResetData);
|
|
|
}
|
|
|
- else
|
|
|
- return false;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- // In headless mode only store the raw position data for CPU operations
|
|
|
- SharedArrayPtr<unsigned char> data(new unsigned char[vertexCount * vertexSize]);
|
|
|
- source.Read(data.Get(), vertexCount * vertexSize);
|
|
|
|
|
|
+ // Copy the raw position data for CPU-side operations
|
|
|
SharedArrayPtr<unsigned char> rawVertexData(new unsigned char[3 * sizeof(float) * vertexCount]);
|
|
|
float* rawDest = (float*)rawVertexData.Get();
|
|
|
for (unsigned i = 0; i < vertexCount; ++i)
|
|
|
@@ -160,7 +134,11 @@ bool Model::Load(Deserializer& source)
|
|
|
*rawDest++ = *rawSrc++;
|
|
|
}
|
|
|
rawVertexDatas.Push(rawVertexData);
|
|
|
+
|
|
|
+ buffer->Unlock();
|
|
|
}
|
|
|
+ else
|
|
|
+ return false;
|
|
|
|
|
|
vertexBuffers_.Push(buffer);
|
|
|
}
|
|
|
@@ -175,30 +153,20 @@ bool Model::Load(Deserializer& source)
|
|
|
SharedPtr<IndexBuffer> buffer(new IndexBuffer(context_));
|
|
|
buffer->SetSize(indexCount, indexSize > sizeof(unsigned short));
|
|
|
|
|
|
- if (!headless)
|
|
|
+ unsigned char* data = (unsigned char*)buffer->Lock(0, indexCount, LOCK_NORMAL);
|
|
|
+ if (data)
|
|
|
{
|
|
|
- unsigned char* data = (unsigned char*)buffer->Lock(0, indexCount, LOCK_NORMAL);
|
|
|
- if (data)
|
|
|
- {
|
|
|
- source.Read(data, indexCount * indexSize);
|
|
|
+ source.Read(data, indexCount * indexSize);
|
|
|
|
|
|
- // Copy the raw index data for CPU-side operations
|
|
|
- SharedArrayPtr<unsigned char> rawIndexData(new unsigned char[indexSize * indexCount]);
|
|
|
- memcpy(rawIndexData.Get(), data, indexSize * indexCount);
|
|
|
- rawIndexDatas.Push(rawIndexData);
|
|
|
-
|
|
|
- buffer->Unlock();
|
|
|
- }
|
|
|
- else
|
|
|
- return false;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- // In headless mode only store the raw index data for CPU operations
|
|
|
+ // Copy the raw index data for CPU-side operations
|
|
|
SharedArrayPtr<unsigned char> rawIndexData(new unsigned char[indexSize * indexCount]);
|
|
|
- source.Read(rawIndexData.Get(), indexSize * indexCount);
|
|
|
+ memcpy(rawIndexData.Get(), data, indexSize * indexCount);
|
|
|
rawIndexDatas.Push(rawIndexData);
|
|
|
+
|
|
|
+ buffer->Unlock();
|
|
|
}
|
|
|
+ else
|
|
|
+ return false;
|
|
|
|
|
|
indexBuffers_.Push(buffer);
|
|
|
}
|