Skip to content

Commit dccc9cf

Browse files
committed
temp
1 parent 90f8165 commit dccc9cf

File tree

10 files changed

+108
-92
lines changed

10 files changed

+108
-92
lines changed

source/gameengine/Converter/BL_BlenderDataConversion.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -515,10 +515,8 @@ KX_Mesh *BL_ConvertMesh(Mesh *me, Object *blenderobj, KX_Scene *scene, BL_SceneC
515515
RAS_MaterialBucket *bucket = BL_ConvertMaterial(ma, scene, converter);
516516
RAS_MeshMaterial *meshmat = meshobj->AddMaterial(bucket, i, vertformat);
517517
RAS_IMaterial *mat = meshmat->GetBucket()->GetMaterial();
518-
RAS_IVertexFactory *factory = RAS_IVertexFactory::Construct(vertformat);
519518

520-
mats[i] = BL_MeshMaterial(meshmat->GetDisplayArray(), factory, bucket,
521-
mat->IsVisible(), mat->IsTwoSided(), mat->IsCollider(), mat->IsWire());
519+
mats[i] = {meshmat->GetDisplayArray(), bucket, mat->IsVisible(), mat->IsTwoSided(), mat->IsCollider(), mat->IsWire()};
522520
}
523521

524522
BL_ConvertDerivedMeshToArray(dm, me, mats, layersInfo);
@@ -582,7 +580,6 @@ void BL_ConvertDerivedMeshToArray(DerivedMesh *dm, Mesh *me, const std::vector<B
582580

583581
const BL_MeshMaterial& mat = mats[mpoly.mat_nr];
584582
RAS_DisplayArray *array = mat.array;
585-
RAS_IVertexFactory *factory = mat.vertexFactory.get();
586583

587584
// Mark face as flat, so vertices are split.
588585
const bool flat = (mpoly.flag & ME_SMOOTH) == 0;

source/gameengine/Converter/BL_BlenderDataConversion.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838

3939
class RAS_Rasterizer;
4040
class RAS_ICanvas;
41-
class RAS_IVertexFactory;
4241
class KX_KetsjiEngine;
4342
class KX_Scene;
4443
class BL_SceneConverter;

source/gameengine/Converter/BL_ModifierDeformer.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
#include "RAS_Mesh.h"
4343
#include "RAS_MeshUser.h"
4444
#include "RAS_BoundingBox.h"
45-
#include "RAS_VertexFactory.h"
4645

4746
#include "DNA_armature_types.h"
4847
#include "DNA_action_types.h"
@@ -178,10 +177,7 @@ void BL_ModifierDeformer::UpdateTransverts()
178177
array->Clear();
179178

180179
RAS_IMaterial *mat = meshmat->GetBucket()->GetMaterial();
181-
RAS_IVertexFactory *factory = RAS_IVertexFactory::Construct(array->GetFormat());
182-
183-
mats[i] = BL_MeshMaterial(array, factory, meshmat->GetBucket(),
184-
mat->IsVisible(), mat->IsTwoSided(), mat->IsCollider(), mat->IsWire());
180+
mats[i] = {array, meshmat->GetBucket(), mat->IsVisible(), mat->IsTwoSided(), mat->IsCollider(), mat->IsWire()};
185181
}
186182

187183
BL_ConvertDerivedMeshToArray(m_dm, m_bmesh, mats, m_mesh->GetLayersInfo());

source/gameengine/Ketsji/KX_MeshBuilder.cpp

Lines changed: 54 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -23,27 +23,19 @@ KX_MeshBuilderSlot::KX_MeshBuilderSlot(KX_BlenderMaterial *material, RAS_Display
2323
{
2424
}
2525

26-
KX_MeshBuilderSlot::KX_MeshBuilderSlot(RAS_MeshMaterial *meshmat, const RAS_VertexFormat& format, unsigned int& origIndexCounter)
27-
:m_format(format),
28-
m_factory(RAS_IVertexFactory::Construct(m_format)),
29-
m_origIndexCounter(origIndexCounter)
26+
KX_MeshBuilderSlot::KX_MeshBuilderSlot(RAS_MeshMaterial *meshmat, const RAS_DisplayArray::Format& format,
27+
unsigned int& origIndexCounter)
28+
:m_origIndexCounter(origIndexCounter)
3029
{
3130
RAS_MaterialBucket *bucket = meshmat->GetBucket();
32-
m_material = static_cast<KX_BlenderMaterial *>(bucket->GetPolyMaterial());
33-
34-
RAS_IDisplayArray *array = meshmat->GetDisplayArray();
35-
m_primitive = array->GetPrimitiveType();
31+
m_material = static_cast<KX_BlenderMaterial *>(bucket->GetMaterial());
3632

37-
m_vertexInfos = array->GetVertexInfoList();
38-
m_primitiveIndices = array->GetPrimitiveIndexList();
39-
m_triangleIndices = array->GetTriangleIndexList();
40-
41-
for (unsigned int i = 0, size = array->GetVertexCount(); i < size; ++i) {
42-
m_vertices.push_back(m_factory->CopyVertex(array->GetVertexData(i)));
43-
}
33+
RAS_DisplayArray *array = meshmat->GetDisplayArray();
34+
BLI_assert(array->GetType() == RAS_DisplayArray::NORMAL);
35+
m_array = new RAS_DisplayArray(*array);
4436

4537
// Compute the maximum original index from the arrays.
46-
m_origIndexCounter = std::max(m_origIndexCounter, array->GetMaxOrigIndex());
38+
m_origIndexCounter = std::max(m_origIndexCounter, m_array->GetMaxOrigIndex());
4739
}
4840

4941
KX_MeshBuilderSlot::~KX_MeshBuilderSlot()
@@ -226,19 +218,19 @@ PyObject *KX_MeshBuilderSlot::PyAddVertex(PyObject *args, PyObject *kwds)
226218
return nullptr;
227219
}
228220

229-
mt::vec3_packed normal = mt::axisZ3;
221+
mt::vec3_packed normal = mt::vec3_packed(mt::axisZ3);
230222
if (pynormal && !PyVecTo(pynormal, normal)) {
231223
return nullptr;
232224
}
233225

234-
mt::vec4_packed tangent = mt::one4;
226+
mt::vec4_packed tangent = mt::vec4_packed(mt::one4);
235227
if (pytangent && !PyVecTo(pytangent, tangent)) {
236228
return nullptr;
237229
}
238230

239231
const RAS_DisplayArray::Format& format = m_array->GetFormat();
240232

241-
mt::vec2_packed uvs[RAS_Texture::MaxUnits] = {mt::zero2};
233+
mt::vec2_packed uvs[RAS_Texture::MaxUnits] = {mt::vec2_packed(mt::zero2)};
242234
if (pyuvs) {
243235
if (!PySequence_Check(pyuvs)) {
244236
return nullptr;
@@ -268,8 +260,7 @@ PyObject *KX_MeshBuilderSlot::PyAddVertex(PyObject *args, PyObject *kwds)
268260
}
269261
}
270262

271-
const unsigned index = m_array->AddVertex(pos, normal, tangent, uvs, colors);
272-
m_vertexInfos.emplace_back(m_origIndexCounter++, false);
263+
const unsigned index = m_array->AddVertex(pos, normal, tangent, uvs, colors, m_origIndexCounter++, 0);
273264

274265
return PyLong_FromLong(index);
275266
}
@@ -281,7 +272,7 @@ PyObject *KX_MeshBuilderSlot::PyAddIndex(PyObject *value)
281272
return nullptr;
282273
}
283274

284-
const bool isTriangle = (m_primitive == RAS_DisplayArray::TRIANGLES);
275+
const bool isTriangle = (m_array->GetPrimitiveType() == RAS_DisplayArray::TRIANGLES);
285276

286277
for (unsigned int i = 0, size = PySequence_Size(value); i < size; ++i) {
287278
const int val = PyLong_AsLong(PySequence_GetItem(value, i));
@@ -291,9 +282,9 @@ PyObject *KX_MeshBuilderSlot::PyAddIndex(PyObject *value)
291282
return nullptr;
292283
}
293284

294-
m_primitiveIndices.push_back(val);
285+
m_array->AddPrimitiveIndex(val);
295286
if (isTriangle) {
296-
m_triangleIndices.push_back(val);
287+
m_array->AddTriangleIndex(val);
297288
}
298289
}
299290

@@ -315,7 +306,7 @@ PyObject *KX_MeshBuilderSlot::PyAddPrimitiveIndex(PyObject *value)
315306
return nullptr;
316307
}
317308

318-
m_primitiveIndices.push_back(val);
309+
m_array->AddPrimitiveIndex(val);
319310
}
320311

321312
Py_RETURN_NONE;
@@ -336,29 +327,20 @@ PyObject *KX_MeshBuilderSlot::PyAddTriangleIndex(PyObject *value)
336327
return nullptr;
337328
}
338329

339-
m_triangleIndices.push_back(val);
330+
m_array->AddTriangleIndex(val);
340331
}
341332

342333
Py_RETURN_NONE;
343334
}
344335

345-
template <class ListType>
346-
static PyObject *removeDataCheck(ListType& list, int start, int end, const std::string& errmsg)
336+
static bool removeDataCheck(int start, int end, unsigned int size, const std::string& errmsg)
347337
{
348-
const int size = list.size();
349-
if (start >= size || (end != -1 && (end > size || end < start))) {
350-
PyErr_Format(PyExc_TypeError, "%s: range invalid, must be included in [0, %i[", errmsg.c_str(), size);
351-
return nullptr;
352-
}
353-
354-
if (end == -1) {
355-
list.erase(list.begin() + start);
356-
}
357-
else {
358-
list.erase(list.begin() + start, list.begin() + end);
338+
if (start < 0 || start >= size || (end != -1 && (end > size || end <= start))) {
339+
PyErr_Format(PyExc_TypeError, "%s: range invalid or empty, must be included in [0, %i[", errmsg.c_str(), size);
340+
return false;
359341
}
360342

361-
Py_RETURN_NONE;
343+
return true;
362344
}
363345

364346
PyObject *KX_MeshBuilderSlot::PyRemoveVertex(PyObject *args)
@@ -370,7 +352,13 @@ PyObject *KX_MeshBuilderSlot::PyRemoveVertex(PyObject *args)
370352
return nullptr;
371353
}
372354

373-
return removeDataCheck(m_vertices, start, end, "slot.removeVertex(start, end)");
355+
if (!removeDataCheck(start, end, m_array->GetVertexCount(), "slot.removeVertex(start, end)")) {
356+
return nullptr;
357+
}
358+
359+
m_array->RemoveVertex(start, end);
360+
361+
Py_RETURN_NONE;
374362
}
375363

376364
PyObject *KX_MeshBuilderSlot::PyRemovePrimitiveIndex(PyObject *args)
@@ -382,7 +370,13 @@ PyObject *KX_MeshBuilderSlot::PyRemovePrimitiveIndex(PyObject *args)
382370
return nullptr;
383371
}
384372

385-
return removeDataCheck(m_vertices, start, end, "slot.removePrimitiveIndex(start, end)");
373+
if (!removeDataCheck(start, end, m_array->GetPrimitiveIndexCount(), "slot.removePrimitiveIndex(start, end)")) {
374+
return nullptr;
375+
}
376+
377+
m_array->RemovePrimitiveIndex(start, end);
378+
379+
Py_RETURN_NONE;
386380
}
387381

388382
PyObject *KX_MeshBuilderSlot::PyRemoveTriangleIndex(PyObject *args)
@@ -394,7 +388,13 @@ PyObject *KX_MeshBuilderSlot::PyRemoveTriangleIndex(PyObject *args)
394388
return nullptr;
395389
}
396390

397-
return removeDataCheck(m_vertices, start, end, "slot.removeTriangleIndex(start, end)");
391+
if (!removeDataCheck(start, end, m_array->GetTriangleIndexCount(), "slot.removeTriangleIndex(start, end)")) {
392+
return nullptr;
393+
}
394+
395+
m_array->RemoveTriangleIndex(start, end);
396+
397+
Py_RETURN_NONE;
398398
}
399399

400400
PyObject *KX_MeshBuilderSlot::PyRecalculateNormals()
@@ -404,31 +404,30 @@ PyObject *KX_MeshBuilderSlot::PyRecalculateNormals()
404404
return nullptr;
405405
}
406406

407-
for (RAS_IVertexData *data : m_vertices) {
408-
zero_v3(data->normal);
409-
}
407+
std::vector<mt::vec3, mt::simd_allocator<mt::vec3> > normals(m_array->GetVertexCount(), mt::zero3);
410408

411-
for (unsigned int i = 0, size = m_primitiveIndices.size(); i < size; i += 3) {
409+
for (unsigned int i = 0, size = m_array->GetPrimitiveIndexCount(); i < size; i += 3) {
412410
float normal[3];
413411
normal_tri_v3(normal,
414-
m_vertices[m_primitiveIndices[i]]->position,
415-
m_vertices[m_primitiveIndices[i + 1]]->position,
416-
m_vertices[m_primitiveIndices[i + 2]]->position);
412+
m_array->GetPosition(m_array->GetPrimitiveIndex(i)).data,
413+
m_array->GetPosition(m_array->GetPrimitiveIndex(i + 1)).data,
414+
m_array->GetPosition(m_array->GetPrimitiveIndex(i + 2)).data);
417415

416+
const mt::vec3 vnormal(normal);
418417
for (unsigned short j = 0; j < 3; ++j) {
419-
add_v3_v3(m_vertices[m_primitiveIndices[i + j]]->normal, normal);
418+
normals[m_array->GetPrimitiveIndex(i + j)] += vnormal;
420419
}
421420
}
422421

423-
for (RAS_IVertexData *data : m_vertices) {
424-
normalize_v3(data->normal);
422+
for (unsigned int i = 0, size = normals.size(); i < size; ++i) {
423+
m_array->SetNormal(i, normals[i].SafeNormalized(mt::zero3));
425424
}
426425

427426
Py_RETURN_NONE;
428427
}
429428

430429
KX_MeshBuilder::KX_MeshBuilder(const std::string& name, KX_Scene *scene, const RAS_Mesh::LayersInfo& layersInfo,
431-
const RAS_VertexFormat& format)
430+
const RAS_DisplayArray::Format& format)
432431
:m_name(name),
433432
m_layersInfo(layersInfo),
434433
m_format(format),
@@ -520,7 +519,7 @@ static PyObject *py_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
520519
return nullptr;
521520
}
522521

523-
RAS_VertexFormat format{(uint8_t)max_ii(layersInfo.uvLayers.size(), 1), (uint8_t)max_ii(layersInfo.colorLayers.size(), 1)};
522+
RAS_DisplayArray::Format format{(uint8_t)max_ii(layersInfo.uvLayers.size(), 1), (uint8_t)max_ii(layersInfo.colorLayers.size(), 1)};
524523

525524
KX_MeshBuilder *builder = new KX_MeshBuilder(name, scene, layersInfo, format);
526525

source/gameengine/Ketsji/KX_MeshBuilder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class KX_MeshBuilderSlot : public EXP_Value
2626
public:
2727
KX_MeshBuilderSlot(KX_BlenderMaterial *material, RAS_DisplayArray::PrimitiveType primitiveType,
2828
const RAS_DisplayArray::Format& format, unsigned int& origIndexCounter);
29-
KX_MeshBuilderSlot(RAS_MeshMaterial *meshmat, const RAS_VertexFormat& format, unsigned int& origIndexCounter);
29+
KX_MeshBuilderSlot(RAS_MeshMaterial *meshmat, const RAS_DisplayArray::Format& format, unsigned int& origIndexCounter);
3030
~KX_MeshBuilderSlot();
3131

3232
virtual std::string GetName();

source/gameengine/Rasterizer/RAS_DisplayArray.cpp

Lines changed: 38 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -77,22 +77,6 @@ RAS_DisplayArray::~RAS_DisplayArray()
7777
{
7878
}
7979

80-
RAS_IDisplayArray::RAS_IDisplayArray(PrimitiveType type, const RAS_VertexFormat& format,
81-
const RAS_VertexDataMemoryFormat& memoryFormat, const VertexInfoList& vertexInfos,
82-
const IndexList& primitiveIndices, const IndexList& triangleIndices)
83-
:m_type(type),
84-
m_format(format),
85-
m_memoryFormat(memoryFormat),
86-
m_vertexInfos(vertexInfos),
87-
m_primitiveIndices(primitiveIndices),
88-
m_triangleIndices(triangleIndices),
89-
m_maxOrigIndex(0)
90-
{
91-
for (const RAS_VertexInfo& info : m_vertexInfos) {
92-
m_maxOrigIndex = std::max(m_maxOrigIndex, info.GetOrigIndex());
93-
}
94-
}
95-
9680
unsigned int RAS_DisplayArray::AddVertex(const mt::vec3_packed& pos, const mt::vec3_packed& nor, const mt::vec4_packed& tan,
9781
mt::vec2_packed uvs[RAS_Texture::MaxUnits], unsigned int colors[RAS_Texture::MaxUnits], unsigned int origIndex, uint8_t flag)
9882
{
@@ -114,6 +98,44 @@ unsigned int RAS_DisplayArray::AddVertex(const mt::vec3_packed& pos, const mt::v
11498
return m_vertexInfos.size() - 1;
11599
}
116100

101+
template <class List>
102+
void removeRange(List& list, unsigned int start, unsigned int end)
103+
{
104+
if (end == -1) {
105+
list.erase(list.begin() + start);
106+
}
107+
else {
108+
list.erase(list.begin() + start, list.begin() + end);
109+
}
110+
}
111+
112+
void RAS_DisplayArray::RemoveVertex(unsigned int start, unsigned int end)
113+
{
114+
removeRange(m_vertexData.positions, start, end);
115+
removeRange(m_vertexData.normals, start, end);
116+
removeRange(m_vertexData.tangents, start, end);
117+
118+
for (unsigned short i = 0; i < m_format.uvSize; ++i) {
119+
removeRange(m_vertexData.uvs[i], start, end);
120+
}
121+
122+
for (unsigned short i = 0; i < m_format.colorSize; ++i) {
123+
removeRange(m_vertexData.colors[i], start, end);
124+
}
125+
126+
removeRange(m_vertexInfos, start, end);
127+
}
128+
129+
void RAS_DisplayArray::RemovePrimitiveIndex(unsigned int start, unsigned int end)
130+
{
131+
removeRange(m_primitiveIndices, start, end);
132+
}
133+
134+
void RAS_DisplayArray::RemoveTriangleIndex(unsigned int start, unsigned int end)
135+
{
136+
removeRange(m_triangleIndices, start, end);
137+
}
138+
117139
void RAS_DisplayArray::Clear()
118140
{
119141
m_vertexData.positions.clear();
@@ -134,14 +156,6 @@ void RAS_DisplayArray::Clear()
134156
m_maxOrigIndex = 0;
135157
}
136158

137-
RAS_IDisplayArray *RAS_IDisplayArray::Construct(RAS_IDisplayArray::PrimitiveType type, const RAS_VertexFormat &format,
138-
const IVertexDataList& vertices, const VertexInfoList& vertexInfos,
139-
const IndexList& primitiveIndices, const IndexList& triangleIndices)
140-
{
141-
return CM_InstantiateTemplateSwitch<RAS_IDisplayArray, RAS_DisplayArray, RAS_VertexFormatTuple>(format,
142-
type, format, vertices, vertexInfos, primitiveIndices, triangleIndices);
143-
}
144-
145159
void RAS_DisplayArray::SortPolygons(const mt::mat3x4& transform, unsigned int *indexmap)
146160
{
147161
const unsigned int totpoly = GetPrimitiveIndexCount() / 3;

source/gameengine/Rasterizer/RAS_DisplayArray.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,10 @@ class RAS_DisplayArray : public CM_UpdateServer<RAS_DisplayArray>
264264
m_triangleIndices.push_back(origIndex);
265265
}
266266

267+
void RemoveVertex(unsigned int start, unsigned int end);
268+
void RemovePrimitiveIndex(unsigned int start, unsigned int end);
269+
void RemoveTriangleIndex(unsigned int start, unsigned int end);
270+
267271
void Clear();
268272

269273
inline unsigned int GetVertexCount() const

source/gameengine/Rasterizer/RAS_Mesh.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ RAS_MeshMaterial *RAS_Mesh::AddMaterial(RAS_MaterialBucket *bucket, unsigned int
195195
return meshmat;
196196
}
197197

198-
RAS_MeshMaterial *RAS_Mesh::AddMaterial(RAS_MaterialBucket *bucket, unsigned int index, RAS_IDisplayArray *array)
198+
RAS_MeshMaterial *RAS_Mesh::AddMaterial(RAS_MaterialBucket *bucket, unsigned int index, RAS_DisplayArray *array)
199199
{
200200
RAS_MeshMaterial *meshmat = GetMeshMaterialBlenderIndex(index);
201201

0 commit comments

Comments
 (0)