From c1bd416a660ce5f9cb5f34635ee452e5d7f361ca Mon Sep 17 00:00:00 2001 From: Martin Ashton Date: Wed, 26 Mar 2025 14:21:25 -0400 Subject: [PATCH 1/7] Implemented Vector3 and Matrix4x4 data column types in the entity tables. --- src/cpp/vim/object-model.h | 317 ++++++++++++++ src/cpp/vim/vim.h | 31 ++ .../ObjectModelCppGenerator.cs | 2 + .../ObjectModelTypeScriptGenerator.cs | 7 +- .../ColumnExtensions.Buffer.cs | 17 + .../vim/Vim.Format.Core/ColumnExtensions.cs | 3 + .../vim/Vim.Format.Core/EntityTableBuilder.cs | 7 + src/cs/vim/Vim.Format.Core/Serializer.cs | 11 + src/cs/vim/Vim.Format.Core/VimConstants.cs | 5 + .../Vim.Format.Tests/GeometricEntitiesTest.cs | 98 +++++ .../vim/Vim.Format/ObjectModel/ObjectModel.cs | 34 +- .../ObjectModel/ObjectModelGenerated.cs | 332 +++++++++++++++ src/ts/package-lock.json | 2 +- src/ts/src/entityTable.ts | 60 +++ src/ts/src/objectModel.ts | 385 ++++++++++++++++++ 15 files changed, 1308 insertions(+), 3 deletions(-) create mode 100644 src/cs/vim/Vim.Format.Tests/GeometricEntitiesTest.cs diff --git a/src/cpp/vim/object-model.h b/src/cpp/vim/object-model.h index 2b2bedeb..c1372b8a 100644 --- a/src/cpp/vim/object-model.h +++ b/src/cpp/vim/object-model.h @@ -120,6 +120,12 @@ namespace Vim class SiteTable; class Building; class BuildingTable; + class FaceSilhouette; + class FaceSilhouetteTable; + class FaceSilhouetteIndexBuffer; + class FaceSilhouetteIndexBufferTable; + class FaceSilhouetteVertexBuffer; + class FaceSilhouetteVertexBufferTable; class DocumentModel { @@ -178,6 +184,9 @@ namespace Vim ViewInViewSheetTable* mViewInViewSheet; SiteTable* mSite; BuildingTable* mBuilding; + FaceSilhouetteTable* mFaceSilhouette; + FaceSilhouetteIndexBufferTable* mFaceSilhouetteIndexBuffer; + FaceSilhouetteVertexBufferTable* mFaceSilhouetteVertexBuffer; DocumentModel(Scene& scene); ~DocumentModel(); @@ -13886,6 +13895,308 @@ namespace Vim return new BuildingTable(scene.mEntityTables["Vim.Building"], scene.mStrings); } + class FaceSilhouette + { + public: + int mIndex; + + int mFaceSilhouetteIndexBufferStartIndex; + FaceSilhouetteIndexBuffer* mFaceSilhouetteIndexBufferStart; + int mFaceSilhouetteIndexBufferEndIndex; + FaceSilhouetteIndexBuffer* mFaceSilhouetteIndexBufferEnd; + int mViewIndex; + View* mView; + int mElementIndex; + Element* mElement; + + FaceSilhouette() {} + }; + + class FaceSilhouetteTable + { + EntityTable& mEntityTable; + std::vector& mStrings; + public: + FaceSilhouetteTable(EntityTable& entityTable, std::vector& strings): + mEntityTable(entityTable), mStrings(strings) {} + + size_t GetCount() + { + return mEntityTable.get_count(); + } + + FaceSilhouette* Get(int faceSilhouetteIndex) + { + FaceSilhouette* faceSilhouette = new FaceSilhouette(); + faceSilhouette->mIndex = faceSilhouetteIndex; + faceSilhouette->mFaceSilhouetteIndexBufferStartIndex = GetFaceSilhouetteIndexBufferStartIndex(faceSilhouetteIndex); + faceSilhouette->mFaceSilhouetteIndexBufferEndIndex = GetFaceSilhouetteIndexBufferEndIndex(faceSilhouetteIndex); + faceSilhouette->mViewIndex = GetViewIndex(faceSilhouetteIndex); + faceSilhouette->mElementIndex = GetElementIndex(faceSilhouetteIndex); + return faceSilhouette; + } + + std::vector* GetAll() + { + bool existsFaceSilhouetteIndexBufferStart = mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart"); + bool existsFaceSilhouetteIndexBufferEnd = mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd"); + bool existsView = mEntityTable.column_exists("index:Vim.View:View"); + bool existsElement = mEntityTable.column_exists("index:Vim.Element:Element"); + + const auto count = GetCount(); + + std::vector* faceSilhouette = new std::vector(); + faceSilhouette->reserve(count); + + const std::vector& faceSilhouetteIndexBufferStartData = mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart") ? mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart"] : std::vector(); + const std::vector& faceSilhouetteIndexBufferEndData = mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd") ? mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd"] : std::vector(); + const std::vector& viewData = mEntityTable.column_exists("index:Vim.View:View") ? mEntityTable.mIndexColumns["index:Vim.View:View"] : std::vector(); + const std::vector& elementData = mEntityTable.column_exists("index:Vim.Element:Element") ? mEntityTable.mIndexColumns["index:Vim.Element:Element"] : std::vector(); + + for (int i = 0; i < count; ++i) + { + FaceSilhouette entity; + entity.mIndex = i; + entity.mFaceSilhouetteIndexBufferStartIndex = existsFaceSilhouetteIndexBufferStart ? faceSilhouetteIndexBufferStartData[i] : -1; + entity.mFaceSilhouetteIndexBufferEndIndex = existsFaceSilhouetteIndexBufferEnd ? faceSilhouetteIndexBufferEndData[i] : -1; + entity.mViewIndex = existsView ? viewData[i] : -1; + entity.mElementIndex = existsElement ? elementData[i] : -1; + faceSilhouette->push_back(entity); + } + + return faceSilhouette; + } + + int GetFaceSilhouetteIndexBufferStartIndex(int faceSilhouetteIndex) + { + if (!mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart")) { + return -1; + } + + if (faceSilhouetteIndex < 0 || faceSilhouetteIndex >= GetCount()) + return -1; + + return mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart"][faceSilhouetteIndex]; + } + + int GetFaceSilhouetteIndexBufferEndIndex(int faceSilhouetteIndex) + { + if (!mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd")) { + return -1; + } + + if (faceSilhouetteIndex < 0 || faceSilhouetteIndex >= GetCount()) + return -1; + + return mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd"][faceSilhouetteIndex]; + } + + int GetViewIndex(int faceSilhouetteIndex) + { + if (!mEntityTable.column_exists("index:Vim.View:View")) { + return -1; + } + + if (faceSilhouetteIndex < 0 || faceSilhouetteIndex >= GetCount()) + return -1; + + return mEntityTable.mIndexColumns["index:Vim.View:View"][faceSilhouetteIndex]; + } + + int GetElementIndex(int faceSilhouetteIndex) + { + if (!mEntityTable.column_exists("index:Vim.Element:Element")) { + return -1; + } + + if (faceSilhouetteIndex < 0 || faceSilhouetteIndex >= GetCount()) + return -1; + + return mEntityTable.mIndexColumns["index:Vim.Element:Element"][faceSilhouetteIndex]; + } + + }; + + static FaceSilhouetteTable* GetFaceSilhouetteTable(Scene& scene) + { + if (scene.mEntityTables.find("Vim.FaceSilhouette") == scene.mEntityTables.end()) + return {}; + + return new FaceSilhouetteTable(scene.mEntityTables["Vim.FaceSilhouette"], scene.mStrings); + } + + class FaceSilhouetteIndexBuffer + { + public: + int mIndex; + + int mVertexIndexIndex; + FaceSilhouetteVertexBuffer* mVertexIndex; + + FaceSilhouetteIndexBuffer() {} + }; + + class FaceSilhouetteIndexBufferTable + { + EntityTable& mEntityTable; + std::vector& mStrings; + public: + FaceSilhouetteIndexBufferTable(EntityTable& entityTable, std::vector& strings): + mEntityTable(entityTable), mStrings(strings) {} + + size_t GetCount() + { + return mEntityTable.get_count(); + } + + FaceSilhouetteIndexBuffer* Get(int faceSilhouetteIndexBufferIndex) + { + FaceSilhouetteIndexBuffer* faceSilhouetteIndexBuffer = new FaceSilhouetteIndexBuffer(); + faceSilhouetteIndexBuffer->mIndex = faceSilhouetteIndexBufferIndex; + faceSilhouetteIndexBuffer->mVertexIndexIndex = GetVertexIndexIndex(faceSilhouetteIndexBufferIndex); + return faceSilhouetteIndexBuffer; + } + + std::vector* GetAll() + { + bool existsVertexIndex = mEntityTable.column_exists("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex"); + + const auto count = GetCount(); + + std::vector* faceSilhouetteIndexBuffer = new std::vector(); + faceSilhouetteIndexBuffer->reserve(count); + + const std::vector& vertexIndexData = mEntityTable.column_exists("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex") ? mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteVertexBuffer:VertexIndex"] : std::vector(); + + for (int i = 0; i < count; ++i) + { + FaceSilhouetteIndexBuffer entity; + entity.mIndex = i; + entity.mVertexIndexIndex = existsVertexIndex ? vertexIndexData[i] : -1; + faceSilhouetteIndexBuffer->push_back(entity); + } + + return faceSilhouetteIndexBuffer; + } + + int GetVertexIndexIndex(int faceSilhouetteIndexBufferIndex) + { + if (!mEntityTable.column_exists("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex")) { + return -1; + } + + if (faceSilhouetteIndexBufferIndex < 0 || faceSilhouetteIndexBufferIndex >= GetCount()) + return -1; + + return mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteVertexBuffer:VertexIndex"][faceSilhouetteIndexBufferIndex]; + } + + }; + + static FaceSilhouetteIndexBufferTable* GetFaceSilhouetteIndexBufferTable(Scene& scene) + { + if (scene.mEntityTables.find("Vim.FaceSilhouetteIndexBuffer") == scene.mEntityTables.end()) + return {}; + + return new FaceSilhouetteIndexBufferTable(scene.mEntityTables["Vim.FaceSilhouetteIndexBuffer"], scene.mStrings); + } + + class FaceSilhouetteVertexBuffer + { + public: + int mIndex; + Vector3 mVertex; + + FaceSilhouetteVertexBuffer() {} + }; + + class FaceSilhouetteVertexBufferTable + { + EntityTable& mEntityTable; + std::vector& mStrings; + public: + FaceSilhouetteVertexBufferTable(EntityTable& entityTable, std::vector& strings): + mEntityTable(entityTable), mStrings(strings) {} + + size_t GetCount() + { + return mEntityTable.get_count(); + } + + FaceSilhouetteVertexBuffer* Get(int faceSilhouetteVertexBufferIndex) + { + FaceSilhouetteVertexBuffer* faceSilhouetteVertexBuffer = new FaceSilhouetteVertexBuffer(); + faceSilhouetteVertexBuffer->mIndex = faceSilhouetteVertexBufferIndex; + faceSilhouetteVertexBuffer->mVertex = GetVertex(faceSilhouetteVertexBufferIndex); + return faceSilhouetteVertexBuffer; + } + + std::vector* GetAll() + { + bool existsVertex = mEntityTable.column_exists("vector3:Vertex"); + + const auto count = GetCount(); + + std::vector* faceSilhouetteVertexBuffer = new std::vector(); + faceSilhouetteVertexBuffer->reserve(count); + + Vector3* vertexData = new Vector3[count]; + if (mEntityTable.column_exists("vector3:Vertex")) { + memcpy(vertexData, mEntityTable.mDataColumns["vector3:Vertex"].begin(), count * sizeof(Vector3)); + } + + for (int i = 0; i < count; ++i) + { + FaceSilhouetteVertexBuffer entity; + entity.mIndex = i; + if (existsVertex) + entity.mVertex = vertexData[i]; + faceSilhouetteVertexBuffer->push_back(entity); + } + + delete[] vertexData; + + return faceSilhouetteVertexBuffer; + } + + Vector3 GetVertex(int faceSilhouetteVertexBufferIndex) + { + if (faceSilhouetteVertexBufferIndex < 0 || faceSilhouetteVertexBufferIndex >= GetCount()) + return {}; + + if (mEntityTable.column_exists("vector3:Vertex")) { + return *reinterpret_cast(const_cast(mEntityTable.mDataColumns["vector3:Vertex"].begin() + faceSilhouetteVertexBufferIndex * sizeof(Vector3))); + } + + return {}; + } + + std::vector* GetAllVertex() + { + const auto count = GetCount(); + + Vector3* vertexData = new Vector3[count]; + if (mEntityTable.column_exists("vector3:Vertex")) { + memcpy(vertexData, mEntityTable.mDataColumns["vector3:Vertex"].begin(), count * sizeof(Vector3)); + } + + std::vector* result = new std::vector(vertexData, vertexData + count); + + delete[] vertexData; + + return result; + } + + }; + + static FaceSilhouetteVertexBufferTable* GetFaceSilhouetteVertexBufferTable(Scene& scene) + { + if (scene.mEntityTables.find("Vim.FaceSilhouetteVertexBuffer") == scene.mEntityTables.end()) + return {}; + + return new FaceSilhouetteVertexBufferTable(scene.mEntityTables["Vim.FaceSilhouetteVertexBuffer"], scene.mStrings); + } + DocumentModel::DocumentModel(Scene& scene) { mAsset = GetAssetTable(scene); @@ -13942,6 +14253,9 @@ namespace Vim mViewInViewSheet = GetViewInViewSheetTable(scene); mSite = GetSiteTable(scene); mBuilding = GetBuildingTable(scene); + mFaceSilhouette = GetFaceSilhouetteTable(scene); + mFaceSilhouetteIndexBuffer = GetFaceSilhouetteIndexBufferTable(scene); + mFaceSilhouetteVertexBuffer = GetFaceSilhouetteVertexBufferTable(scene); } DocumentModel::~DocumentModel() @@ -14000,6 +14314,9 @@ namespace Vim delete mViewInViewSheet; delete mSite; delete mBuilding; + delete mFaceSilhouette; + delete mFaceSilhouetteIndexBuffer; + delete mFaceSilhouetteVertexBuffer; } } diff --git a/src/cpp/vim/vim.h b/src/cpp/vim/vim.h index 01f6ed56..759e6644 100644 --- a/src/cpp/vim/vim.h +++ b/src/cpp/vim/vim.h @@ -42,6 +42,37 @@ namespace Vim static const std::string data_column_ulong_prefix = "ulong:"; static const std::string data_column_float_prefix = "float:"; static const std::string data_column_double_prefix = "double:"; + static const std::string data_column_vector3_prefix = "vector3:"; + static const std::string data_column_matrix4x4_prefix = "matrix4x4:"; + + class Vector3 + { + public: + float X = 0.0f; + float Y = 0.0f; + float Z = 0.0f; + }; + + class Matrix4x4 + { + public: + float M11; // row 1, column 1 + float M12; // row 1, column 2 + float M13; // ... + float M14; + float M21; + float M22; + float M23; + float M24; + float M31; + float M32; + float M33; + float M34; + float M41; + float M42; + float M43; + float M44; + }; class EntityTable { diff --git a/src/cs/vim/Vim.Format.CodeGen/ObjectModelCppGenerator.cs b/src/cs/vim/Vim.Format.CodeGen/ObjectModelCppGenerator.cs index 99de9355..85eb9527 100644 --- a/src/cs/vim/Vim.Format.CodeGen/ObjectModelCppGenerator.cs +++ b/src/cs/vim/Vim.Format.CodeGen/ObjectModelCppGenerator.cs @@ -33,6 +33,8 @@ private static string ToCppType(string type) => "String" or "string" => "std::string", "Int32" or "int" => "int", "Int64" or "Long" or "long" => "long long", + "Vector3" or "vector3" => "Vector3", + "Matrix4x4" or "matrix4x4" => "Matrix4x4", _ => throw new ArgumentOutOfRangeException(nameof(type), type, $"Type {type} not supported") }; diff --git a/src/cs/vim/Vim.Format.CodeGen/ObjectModelTypeScriptGenerator.cs b/src/cs/vim/Vim.Format.CodeGen/ObjectModelTypeScriptGenerator.cs index 70e40bdc..42685f1b 100644 --- a/src/cs/vim/Vim.Format.CodeGen/ObjectModelTypeScriptGenerator.cs +++ b/src/cs/vim/Vim.Format.CodeGen/ObjectModelTypeScriptGenerator.cs @@ -21,7 +21,8 @@ private static string ToTypeScriptType(string type) "Single" or "float" or "Double" or "double" or "Int32" or "int" => "number", "Int64" or "Long" or "long" => "bigint", "String" or "string" => "string", - _ => throw new ArgumentOutOfRangeException(nameof(type), type, $"Type {type} not supported") + "Vector3" => "Vector3", + "Matrix4x4" => "Matrix4x4" }; private static string ToTypeScriptArrayType(string type) @@ -235,6 +236,8 @@ private static string GetFieldGetter(this FieldInfo fieldInfo) "number" => "getNumber", "bigint" => "getBigInt", "string" => "getString", + "Vector3" => "getVector3", + "Matrix4x4" => "getMatrix4x4", _ => throw new ArgumentOutOfRangeException($"There's no getter function for {fieldInfo.FieldType.Name}") }; @@ -245,6 +248,8 @@ private static string GetArrayGetterName(this FieldInfo fieldInfo) => "number" => "getNumberArray", "bigint" => "getBigIntArray", "string" => "getStringArray", + "Vector3" => "getVector3Array", + "Matrix4x4" => "getMatrix4x4Array", _ => throw new ArgumentOutOfRangeException($"There's no getter function for {fieldInfo.FieldType.Name}") }; diff --git a/src/cs/vim/Vim.Format.Core/ColumnExtensions.Buffer.cs b/src/cs/vim/Vim.Format.Core/ColumnExtensions.Buffer.cs index 3cce6b9f..9992244d 100644 --- a/src/cs/vim/Vim.Format.Core/ColumnExtensions.Buffer.cs +++ b/src/cs/vim/Vim.Format.Core/ColumnExtensions.Buffer.cs @@ -4,6 +4,7 @@ using System.Linq; using Vim.BFast; using Vim.LinqArray; +using Vim.Math3d; namespace Vim.Format { @@ -70,6 +71,10 @@ public static object GetDataColumnValue(this IBuffer dataColumn, string typePref return dataColumn.AsArray().ElementAtOrDefault(rowIndex); case VimConstants.DoubleColumnNameTypePrefix: return dataColumn.AsArray().ElementAtOrDefault(rowIndex); + case VimConstants.Vector3ColumnNameTypePrefix: + return dataColumn.AsArray().ElementAtOrDefault(rowIndex); + case VimConstants.Matrix4x4ColumnNameTypePrefix: + return dataColumn.AsArray().ElementAtOrDefault(rowIndex); default: return null; } @@ -92,6 +97,10 @@ public static IBuffer CreateDefaultDataColumnBuffer(int length, string typePrefi return new float[length].ToBuffer(); case (VimConstants.DoubleColumnNameTypePrefix): return new double[length].ToBuffer(); + case (VimConstants.Vector3ColumnNameTypePrefix): + return new Vector3[length].ToBuffer(); + case (VimConstants.Matrix4x4ColumnNameTypePrefix): + return new Matrix4x4[length].ToBuffer(); default: throw new Exception($"{nameof(CreateDefaultDataColumnBuffer)} - {UnknownNamedBufferPrefix}"); } @@ -111,6 +120,10 @@ public static IBuffer CopyDataColumn(this IBuffer dataColumn, string typePrefix, return (dataColumn.Data as float[]).RemapData(remapping).ToBuffer(); case (VimConstants.ByteColumnNameTypePrefix): return (dataColumn.Data as byte[]).RemapData(remapping).ToBuffer(); + case (VimConstants.Vector3ColumnNameTypePrefix): + return (dataColumn.Data as Vector3[]).RemapData(remapping).ToBuffer(); + case (VimConstants.Matrix4x4ColumnNameTypePrefix): + return (dataColumn.Data as Matrix4x4[]).RemapData(remapping).ToBuffer(); default: throw new Exception($"{nameof(CopyDataColumn)} - {UnknownNamedBufferPrefix}"); } @@ -139,6 +152,10 @@ public static IBuffer ConcatDataColumnBuffers(this IBuffer thisBuffer, IBuffer o return thisBuffer.Concat(otherBuffer); case (VimConstants.DoubleColumnNameTypePrefix): return thisBuffer.Concat(otherBuffer); + case (VimConstants.Vector3ColumnNameTypePrefix): + return thisBuffer.Concat(otherBuffer); + case (VimConstants.Matrix4x4ColumnNameTypePrefix): + return thisBuffer.Concat(otherBuffer); default: throw new Exception($"{nameof(ConcatDataColumnBuffers)} - {UnknownNamedBufferPrefix}"); } diff --git a/src/cs/vim/Vim.Format.Core/ColumnExtensions.cs b/src/cs/vim/Vim.Format.Core/ColumnExtensions.cs index 0d826c14..9988d4a5 100644 --- a/src/cs/vim/Vim.Format.Core/ColumnExtensions.cs +++ b/src/cs/vim/Vim.Format.Core/ColumnExtensions.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; +using Vim.Math3d; namespace Vim.Format { @@ -17,6 +18,8 @@ public static readonly IReadOnlyCollection AllColumnInfos new ColumnInfo(ColumnType.DataColumn, VimConstants.ByteColumnNameTypePrefix, typeof(byte), typeof(bool)), new ColumnInfo(ColumnType.DataColumn, VimConstants.DoubleColumnNameTypePrefix, typeof(double)), new ColumnInfo(ColumnType.DataColumn, VimConstants.FloatColumnNameTypePrefix, typeof(float)), + new ColumnInfo(ColumnType.DataColumn, VimConstants.Vector3ColumnNameTypePrefix, typeof(Vector3)), + new ColumnInfo(ColumnType.DataColumn, VimConstants.Matrix4x4ColumnNameTypePrefix, typeof(Matrix4x4)) }; public static readonly IReadOnlyDictionary TypePrefixToColumnTypeMap diff --git a/src/cs/vim/Vim.Format.Core/EntityTableBuilder.cs b/src/cs/vim/Vim.Format.Core/EntityTableBuilder.cs index bd1da0fd..e6305ed1 100644 --- a/src/cs/vim/Vim.Format.Core/EntityTableBuilder.cs +++ b/src/cs/vim/Vim.Format.Core/EntityTableBuilder.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using Vim.BFast; +using Vim.Math3d; namespace Vim.Format { @@ -93,6 +94,12 @@ public EntityTableBuilder AddDataColumn(string columnName, IEnumerable val public EntityTableBuilder AddDataColumn(string columnName, IEnumerable values) => AddDataColumn(columnName, values.Select(x => x ? (byte)1 : (byte)0).ToArray()); + public EntityTableBuilder AddDataColumn(string columnName, IEnumerable values) + => AddDataColumn(columnName, values.ToArray()); + + public EntityTableBuilder AddDataColumn(string columnName, IEnumerable values) + => AddDataColumn(columnName, values.ToArray()); + public IEnumerable GetAllStrings() => StringColumns.Values.SelectMany(sc => sc) .Where(x => x != null); diff --git a/src/cs/vim/Vim.Format.Core/Serializer.cs b/src/cs/vim/Vim.Format.Core/Serializer.cs index 06dce92e..af6d72b6 100644 --- a/src/cs/vim/Vim.Format.Core/Serializer.cs +++ b/src/cs/vim/Vim.Format.Core/Serializer.cs @@ -6,6 +6,7 @@ using System.Text; using System.Text.RegularExpressions; using Vim.G3d; +using Vim.Math3d; using Vim.Util; namespace Vim.Format @@ -108,6 +109,16 @@ public static SerializableEntityTable ReadEntityTable( et.DataColumns.Add(colBr.ReadEntityTableColumn(schemaOnly)); break; } + case VimConstants.Vector3ColumnNameTypePrefix: + { + et.DataColumns.Add(colBr.ReadEntityTableColumn(schemaOnly)); + break; + } + case VimConstants.Matrix4x4ColumnNameTypePrefix: + { + et.DataColumns.Add(colBr.ReadEntityTableColumn(schemaOnly)); + break; + } // For flexibility, we ignore the columns which do not contain a recognized prefix. } } diff --git a/src/cs/vim/Vim.Format.Core/VimConstants.cs b/src/cs/vim/Vim.Format.Core/VimConstants.cs index 72867a68..7e21c7c8 100644 --- a/src/cs/vim/Vim.Format.Core/VimConstants.cs +++ b/src/cs/vim/Vim.Format.Core/VimConstants.cs @@ -68,6 +68,9 @@ public static class TableNames public const string ViewInViewSheet = "Vim.ViewInViewSheet"; public const string Site = "Vim.Site"; public const string Building = "Vim.Building"; + public const string FaceSilhouette = "Vim.FaceSilhouette"; + public const string FaceSilhouetteIndexBuffer = "Vim.FaceSilhouetteIndexBuffer"; + public const string FaceSilhouetteVertexBuffer = "Vim.FaceSilhouetteVertexBuffer"; } public static class VimConstants @@ -85,6 +88,8 @@ public static class VimConstants public const string UbyteColumNameTypePrefix = "ubyte:"; // unused for now public const string FloatColumnNameTypePrefix = "float:"; public const string DoubleColumnNameTypePrefix = "double:"; + public const string Vector3ColumnNameTypePrefix = "vector3:"; + public const string Matrix4x4ColumnNameTypePrefix = "matrix4x4:"; public const int NoEntityRelation = -1; public const long SyntheticElementId = -1; diff --git a/src/cs/vim/Vim.Format.Tests/GeometricEntitiesTest.cs b/src/cs/vim/Vim.Format.Tests/GeometricEntitiesTest.cs new file mode 100644 index 00000000..e852b545 --- /dev/null +++ b/src/cs/vim/Vim.Format.Tests/GeometricEntitiesTest.cs @@ -0,0 +1,98 @@ +using NUnit.Framework; +using System.IO; +using Vim.BFast; +using Vim.Math3d; +using Vim.Util.Tests; + +namespace Vim.Format.Tests; + +[TestFixture] +public static class GeometricEntitiesTest +{ + [Test] + public static void TestRawReadWrite() + { + var ctx = new CallerTestContext(); + var dir = ctx.PrepareDirectory(); + + // Test Vector3 raw read/write + { + var vectorData = new Vector3[20]; + for (var i = 0; i < vectorData.Length; i++) + vectorData[i] = new Vector3(i, i * i, i * i * i); + + var vectorBuffer = vectorData.ToNamedBuffer("vectors"); + + var vectorFile = Path.Combine(dir, "vectors.buf"); + using (var fs = File.Open(vectorFile, FileMode.Create)) + { + vectorBuffer.Write(fs); + } + + using (var fs = File.OpenRead(vectorFile)) + { + var vectorsRead = fs.ReadArray(vectorData.Length); + Assert.Greater(vectorsRead.Length, 0); + + for (var i = 0; i < vectorsRead.Length; i++) + { + var vectorExpected = vectorData[i]; + var vectorActual = vectorsRead[i]; + Assert.IsTrue(vectorExpected.X == vectorActual.X); + Assert.IsTrue(vectorExpected.Y == vectorActual.Y); + Assert.IsTrue(vectorExpected.Z == vectorActual.Z); + } + } + } + + // Test Matrix4x4 raw read/write + { + var matrixData = new Matrix4x4[20]; + for (var i = 0; i < matrixData.Length; i++) + { + matrixData[i] = new Matrix4x4( + i, + i + 1, + i + 2, + i + 3, + i + 4, + i + 5, + i + 6, + i + 7, + i + 8, + i + 9, + i + 10, + i + 11, + i + 12, + i + 13, + i + 14, + i + 15); + } + + var matrixBuffer = matrixData.ToNamedBuffer("matrices"); + + var matrixFile = Path.Combine(dir, "matrices.buf"); + using (var fs = File.Open(matrixFile, FileMode.Create)) + { + matrixBuffer.Write(fs); + } + + using (var fs = File.OpenRead(matrixFile)) + { + var matricesRead = fs.ReadArray(matrixData.Length); + Assert.Greater(matricesRead.Length, 0); + for (var i = 0; i < matricesRead.Length; i++) + { + var matrixExpectedFloats = matrixData[i].ToFloats(); + Assert.Greater(matrixExpectedFloats.Length, 0); + var matrixActualFloats = matricesRead[i].ToFloats(); + + for (var j = 0; j < matrixExpectedFloats.Length; j++) + { + Assert.AreEqual(matrixExpectedFloats[j], matrixActualFloats[j]); + } + } + } + } + } +} diff --git a/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs b/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs index 9b78cd85..59dc4628 100644 --- a/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs +++ b/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs @@ -14,6 +14,10 @@ public static class SchemaVersion // ReSharper disable MemberHidesStaticFromOuterClass public static class History { + // Schema additions + // TODO + public const string v5_6_0 = "5.6.0"; + // Schema additions // Vim.Level__double:ProjectElevation public const string v5_5_0 = "5.5.0"; @@ -171,7 +175,8 @@ public static class History // ReSharper enable MemberHidesStaticFromOuterClass // [MAINTAIN] Add more object model SerializableVersions below and update the current one. - public static SerializableVersion Current => v5_5_0; + public static SerializableVersion Current => v5_6_0; + public static SerializableVersion v5_6_0 => SerializableVersion.Parse(History.v5_6_0); public static SerializableVersion v5_5_0 => SerializableVersion.Parse(History.v5_5_0); public static SerializableVersion v5_4_0 => SerializableVersion.Parse(History.v5_4_0); public static SerializableVersion v5_3_0 => SerializableVersion.Parse(History.v5_3_0); @@ -1767,6 +1772,33 @@ public partial class Building : EntityWithElement public Relation _Site; } + /// + /// Represents an element face projected in a View + /// + [TableName(TableNames.FaceSilhouette)] + public partial class FaceSilhouette : EntityWithElement + { + public Relation _FaceSilhouetteIndexBufferStart; + public Relation _FaceSilhouetteIndexBufferEnd; + public Relation _View; + //public Relation _Material; // later? + } + + /// + /// Represents a continuous index buffer of triangular faces. + /// + [TableName(TableNames.FaceSilhouetteIndexBuffer)] + public partial class FaceSilhouetteIndexBuffer : Entity + { + public Relation _VertexIndex; + } + + [TableName(TableNames.FaceSilhouetteVertexBuffer)] + public partial class FaceSilhouetteVertexBuffer : Entity + { + public Vector3 Vertex; + } + /// /// Helper functions for performing reflection over the object model /// diff --git a/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs b/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs index c9d04f0c..67216125 100644 --- a/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs +++ b/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs @@ -1887,6 +1887,97 @@ public override bool FieldsAreEqual(object obj) } // end of class + // AUTO-GENERATED + public partial class FaceSilhouette + { + public Vim.Format.ObjectModel.FaceSilhouetteIndexBuffer FaceSilhouetteIndexBufferStart => _FaceSilhouetteIndexBufferStart.Value; + public Vim.Format.ObjectModel.FaceSilhouetteIndexBuffer FaceSilhouetteIndexBufferEnd => _FaceSilhouetteIndexBufferEnd.Value; + public Vim.Format.ObjectModel.View View => _View.Value; + public Vim.Format.ObjectModel.Element Element => _Element.Value; + public FaceSilhouette() + { + _FaceSilhouetteIndexBufferStart = new Relation(); + _FaceSilhouetteIndexBufferEnd = new Relation(); + _View = new Relation(); + _Element = new Relation(); + } + + public override bool FieldsAreEqual(object obj) + { + if ((obj is FaceSilhouette other)) + { + var fieldsAreEqual = + (Index == other.Index) && + (_FaceSilhouetteIndexBufferStart?.Index == other._FaceSilhouetteIndexBufferStart?.Index) && + (_FaceSilhouetteIndexBufferEnd?.Index == other._FaceSilhouetteIndexBufferEnd?.Index) && + (_View?.Index == other._View?.Index) && + (_Element?.Index == other._Element?.Index); + if (!fieldsAreEqual) + { + return false; + } + + return true; + } + return false; + } + + } // end of class + + // AUTO-GENERATED + public partial class FaceSilhouetteIndexBuffer + { + public Vim.Format.ObjectModel.FaceSilhouetteVertexBuffer VertexIndex => _VertexIndex.Value; + public FaceSilhouetteIndexBuffer() + { + _VertexIndex = new Relation(); + } + + public override bool FieldsAreEqual(object obj) + { + if ((obj is FaceSilhouetteIndexBuffer other)) + { + var fieldsAreEqual = + (Index == other.Index) && + (_VertexIndex?.Index == other._VertexIndex?.Index); + if (!fieldsAreEqual) + { + return false; + } + + return true; + } + return false; + } + + } // end of class + + // AUTO-GENERATED + public partial class FaceSilhouetteVertexBuffer + { + public FaceSilhouetteVertexBuffer() + { + } + + public override bool FieldsAreEqual(object obj) + { + if ((obj is FaceSilhouetteVertexBuffer other)) + { + var fieldsAreEqual = + (Index == other.Index) && + (Vertex == other.Vertex); + if (!fieldsAreEqual) + { + return false; + } + + return true; + } + return false; + } + + } // end of class + public partial class DocumentModel { public ElementIndexMaps ElementIndexMaps { get; } @@ -3738,6 +3829,72 @@ public Building GetBuilding(int n) return r; } + + // FaceSilhouette + + public EntityTable FaceSilhouetteEntityTable { get; } + + public IArray FaceSilhouetteFaceSilhouetteIndexBufferStartIndex { get; } + public int GetFaceSilhouetteFaceSilhouetteIndexBufferStartIndex(int index) => FaceSilhouetteFaceSilhouetteIndexBufferStartIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; + public IArray FaceSilhouetteFaceSilhouetteIndexBufferEndIndex { get; } + public int GetFaceSilhouetteFaceSilhouetteIndexBufferEndIndex(int index) => FaceSilhouetteFaceSilhouetteIndexBufferEndIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; + public IArray FaceSilhouetteViewIndex { get; } + public int GetFaceSilhouetteViewIndex(int index) => FaceSilhouetteViewIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; + public IArray FaceSilhouetteElementIndex { get; } + public int GetFaceSilhouetteElementIndex(int index) => FaceSilhouetteElementIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; + public int NumFaceSilhouette => FaceSilhouetteEntityTable?.NumRows ?? 0; + public IArray FaceSilhouetteList { get; } + public FaceSilhouette GetFaceSilhouette(int n) + { + if (n < 0) return null; + var r = new FaceSilhouette(); + r.Document = Document; + r.Index = n; + r._FaceSilhouetteIndexBufferStart = new Relation(GetFaceSilhouetteFaceSilhouetteIndexBufferStartIndex(n), GetFaceSilhouetteIndexBuffer); + r._FaceSilhouetteIndexBufferEnd = new Relation(GetFaceSilhouetteFaceSilhouetteIndexBufferEndIndex(n), GetFaceSilhouetteIndexBuffer); + r._View = new Relation(GetFaceSilhouetteViewIndex(n), GetView); + r._Element = new Relation(GetFaceSilhouetteElementIndex(n), GetElement); + return r; + } + + + // FaceSilhouetteIndexBuffer + + public EntityTable FaceSilhouetteIndexBufferEntityTable { get; } + + public IArray FaceSilhouetteIndexBufferVertexIndexIndex { get; } + public int GetFaceSilhouetteIndexBufferVertexIndexIndex(int index) => FaceSilhouetteIndexBufferVertexIndexIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; + public int NumFaceSilhouetteIndexBuffer => FaceSilhouetteIndexBufferEntityTable?.NumRows ?? 0; + public IArray FaceSilhouetteIndexBufferList { get; } + public FaceSilhouetteIndexBuffer GetFaceSilhouetteIndexBuffer(int n) + { + if (n < 0) return null; + var r = new FaceSilhouetteIndexBuffer(); + r.Document = Document; + r.Index = n; + r._VertexIndex = new Relation(GetFaceSilhouetteIndexBufferVertexIndexIndex(n), GetFaceSilhouetteVertexBuffer); + return r; + } + + + // FaceSilhouetteVertexBuffer + + public EntityTable FaceSilhouetteVertexBufferEntityTable { get; } + + public IArray FaceSilhouetteVertexBufferVertex { get; } + public Vector3 GetFaceSilhouetteVertexBufferVertex(int index, Vector3 defaultValue = default) => FaceSilhouetteVertexBufferVertex?.ElementAtOrDefault(index, defaultValue) ?? defaultValue; + public int NumFaceSilhouetteVertexBuffer => FaceSilhouetteVertexBufferEntityTable?.NumRows ?? 0; + public IArray FaceSilhouetteVertexBufferList { get; } + public FaceSilhouetteVertexBuffer GetFaceSilhouetteVertexBuffer(int n) + { + if (n < 0) return null; + var r = new FaceSilhouetteVertexBuffer(); + r.Document = Document; + r.Index = n; + r.Vertex = FaceSilhouetteVertexBufferVertex.ElementAtOrDefault(n); + return r; + } + // All entity collections public Dictionary> AllEntities => new Dictionary>() { {"Vim.Asset", AssetList.ToEnumerable()}, @@ -3794,6 +3951,9 @@ public Building GetBuilding(int n) {"Vim.ViewInViewSheet", ViewInViewSheetList.ToEnumerable()}, {"Vim.Site", SiteList.ToEnumerable()}, {"Vim.Building", BuildingList.ToEnumerable()}, + {"Vim.FaceSilhouette", FaceSilhouetteList.ToEnumerable()}, + {"Vim.FaceSilhouetteIndexBuffer", FaceSilhouetteIndexBufferList.ToEnumerable()}, + {"Vim.FaceSilhouetteVertexBuffer", FaceSilhouetteVertexBufferList.ToEnumerable()}, }; // Entity types from table names @@ -3852,6 +4012,9 @@ public Building GetBuilding(int n) {"Vim.ViewInViewSheet", typeof(ViewInViewSheet)}, {"Vim.Site", typeof(Site)}, {"Vim.Building", typeof(Building)}, + {"Vim.FaceSilhouette", typeof(FaceSilhouette)}, + {"Vim.FaceSilhouetteIndexBuffer", typeof(FaceSilhouetteIndexBuffer)}, + {"Vim.FaceSilhouetteVertexBuffer", typeof(FaceSilhouetteVertexBuffer)}, }; public DocumentModel(Document d, bool inParallel = true) { @@ -3912,6 +4075,9 @@ public DocumentModel(Document d, bool inParallel = true) ViewInViewSheetEntityTable = Document.GetTable("Vim.ViewInViewSheet"); SiteEntityTable = Document.GetTable("Vim.Site"); BuildingEntityTable = Document.GetTable("Vim.Building"); + FaceSilhouetteEntityTable = Document.GetTable("Vim.FaceSilhouette"); + FaceSilhouetteIndexBufferEntityTable = Document.GetTable("Vim.FaceSilhouetteIndexBuffer"); + FaceSilhouetteVertexBufferEntityTable = Document.GetTable("Vim.FaceSilhouetteVertexBuffer"); // Initialize entity arrays AssetBufferName = AssetEntityTable?.GetStringColumnValues("string:BufferName") ?? Array.Empty().ToIArray(); @@ -4142,6 +4308,7 @@ public DocumentModel(Document d, bool inParallel = true) BuildingElevation = BuildingEntityTable?.GetDataColumnValues("double:Elevation") ?? Array.Empty().ToIArray(); BuildingTerrainElevation = BuildingEntityTable?.GetDataColumnValues("double:TerrainElevation") ?? Array.Empty().ToIArray(); BuildingAddress = BuildingEntityTable?.GetStringColumnValues("string:Address") ?? Array.Empty().ToIArray(); + FaceSilhouetteVertexBufferVertex = FaceSilhouetteVertexBufferEntityTable?.GetDataColumnValues("vector3:Vertex") ?? Array.Empty().ToIArray(); // Initialize entity relational columns ParameterDescriptorDisplayUnitIndex = ParameterDescriptorEntityTable?.GetIndexColumnValues("index:Vim.DisplayUnit:DisplayUnit") ?? Array.Empty().ToIArray(); @@ -4244,6 +4411,11 @@ public DocumentModel(Document d, bool inParallel = true) SiteElementIndex = SiteEntityTable?.GetIndexColumnValues("index:Vim.Element:Element") ?? Array.Empty().ToIArray(); BuildingSiteIndex = BuildingEntityTable?.GetIndexColumnValues("index:Vim.Site:Site") ?? Array.Empty().ToIArray(); BuildingElementIndex = BuildingEntityTable?.GetIndexColumnValues("index:Vim.Element:Element") ?? Array.Empty().ToIArray(); + FaceSilhouetteFaceSilhouetteIndexBufferStartIndex = FaceSilhouetteEntityTable?.GetIndexColumnValues("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart") ?? Array.Empty().ToIArray(); + FaceSilhouetteFaceSilhouetteIndexBufferEndIndex = FaceSilhouetteEntityTable?.GetIndexColumnValues("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd") ?? Array.Empty().ToIArray(); + FaceSilhouetteViewIndex = FaceSilhouetteEntityTable?.GetIndexColumnValues("index:Vim.View:View") ?? Array.Empty().ToIArray(); + FaceSilhouetteElementIndex = FaceSilhouetteEntityTable?.GetIndexColumnValues("index:Vim.Element:Element") ?? Array.Empty().ToIArray(); + FaceSilhouetteIndexBufferVertexIndexIndex = FaceSilhouetteIndexBufferEntityTable?.GetIndexColumnValues("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex") ?? Array.Empty().ToIArray(); // Initialize entity collections AssetList = NumAsset.Select(i => GetAsset(i)); @@ -4300,6 +4472,9 @@ public DocumentModel(Document d, bool inParallel = true) ViewInViewSheetList = NumViewInViewSheet.Select(i => GetViewInViewSheet(i)); SiteList = NumSite.Select(i => GetSite(i)); BuildingList = NumBuilding.Select(i => GetBuilding(i)); + FaceSilhouetteList = NumFaceSilhouette.Select(i => GetFaceSilhouette(i)); + FaceSilhouetteIndexBufferList = NumFaceSilhouetteIndexBuffer.Select(i => GetFaceSilhouetteIndexBuffer(i)); + FaceSilhouetteVertexBufferList = NumFaceSilhouetteVertexBuffer.Select(i => GetFaceSilhouetteVertexBuffer(i)); // Initialize element index maps ElementIndexMaps = new ElementIndexMaps(this, inParallel); @@ -4483,6 +4658,15 @@ public EntityTableSet(SerializableEntityTable[] rawTables, string[] stringBuffer if (GetRawTableOrDefault("Vim.Building") is SerializableEntityTable buildingTable) BuildingTable = new BuildingTable(buildingTable, stringBuffer); + if (GetRawTableOrDefault("Vim.FaceSilhouette") is SerializableEntityTable facesilhouetteTable) + FaceSilhouetteTable = new FaceSilhouetteTable(facesilhouetteTable, stringBuffer); + + if (GetRawTableOrDefault("Vim.FaceSilhouetteIndexBuffer") is SerializableEntityTable facesilhouetteindexbufferTable) + FaceSilhouetteIndexBufferTable = new FaceSilhouetteIndexBufferTable(facesilhouetteindexbufferTable, stringBuffer); + + if (GetRawTableOrDefault("Vim.FaceSilhouetteVertexBuffer") is SerializableEntityTable facesilhouettevertexbufferTable) + FaceSilhouetteVertexBufferTable = new FaceSilhouetteVertexBufferTable(facesilhouettevertexbufferTable, stringBuffer); + // Initialize element index maps ElementIndexMaps = new ElementIndexMaps(this, inParallel); @@ -4596,6 +4780,12 @@ public EntityTableSet(SerializableEntityTable[] rawTables, string[] stringBuffer public Site GetSite(int index) => SiteTable?.Get(index); public BuildingTable BuildingTable { get; } // can be null public Building GetBuilding(int index) => BuildingTable?.Get(index); + public FaceSilhouetteTable FaceSilhouetteTable { get; } // can be null + public FaceSilhouette GetFaceSilhouette(int index) => FaceSilhouetteTable?.Get(index); + public FaceSilhouetteIndexBufferTable FaceSilhouetteIndexBufferTable { get; } // can be null + public FaceSilhouetteIndexBuffer GetFaceSilhouetteIndexBuffer(int index) => FaceSilhouetteIndexBufferTable?.Get(index); + public FaceSilhouetteVertexBufferTable FaceSilhouetteVertexBufferTable { get; } // can be null + public FaceSilhouetteVertexBuffer GetFaceSilhouetteVertexBuffer(int index) => FaceSilhouetteVertexBufferTable?.Get(index); } // class EntityTableSet public partial class AssetTable : EntityTable_v2, IEnumerable @@ -7514,6 +7704,118 @@ public IEnumerator GetEnumerator() } } // class BuildingTable + public partial class FaceSilhouetteTable : EntityTable_v2, IEnumerable + { + private readonly EntityTableSet _parentTableSet; // can be null + + public FaceSilhouetteTable(SerializableEntityTable rawTable, string[] stringBuffer, EntityTableSet parentTableSet = null) : base(rawTable, stringBuffer) + { + _parentTableSet = parentTableSet; + Column_FaceSilhouetteIndexBufferStartIndex = GetIndexColumnValues("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart") ?? Array.Empty(); + Column_FaceSilhouetteIndexBufferEndIndex = GetIndexColumnValues("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd") ?? Array.Empty(); + Column_ViewIndex = GetIndexColumnValues("index:Vim.View:View") ?? Array.Empty(); + Column_ElementIndex = GetIndexColumnValues("index:Vim.Element:Element") ?? Array.Empty(); + } + + public int[] Column_FaceSilhouetteIndexBufferStartIndex { get; } + public int GetFaceSilhouetteIndexBufferStartIndex(int index) => Column_FaceSilhouetteIndexBufferStartIndex.ElementAtOrDefault(index, EntityRelation.None); + public FaceSilhouetteIndexBuffer GetFaceSilhouetteIndexBufferStart(int index) => _GetReferencedFaceSilhouetteIndexBufferStart(GetFaceSilhouetteIndexBufferStartIndex(index)); + private FaceSilhouetteIndexBuffer _GetReferencedFaceSilhouetteIndexBufferStart(int referencedIndex) => _parentTableSet.GetFaceSilhouetteIndexBuffer(referencedIndex); + public int[] Column_FaceSilhouetteIndexBufferEndIndex { get; } + public int GetFaceSilhouetteIndexBufferEndIndex(int index) => Column_FaceSilhouetteIndexBufferEndIndex.ElementAtOrDefault(index, EntityRelation.None); + public FaceSilhouetteIndexBuffer GetFaceSilhouetteIndexBufferEnd(int index) => _GetReferencedFaceSilhouetteIndexBufferEnd(GetFaceSilhouetteIndexBufferEndIndex(index)); + private FaceSilhouetteIndexBuffer _GetReferencedFaceSilhouetteIndexBufferEnd(int referencedIndex) => _parentTableSet.GetFaceSilhouetteIndexBuffer(referencedIndex); + public int[] Column_ViewIndex { get; } + public int GetViewIndex(int index) => Column_ViewIndex.ElementAtOrDefault(index, EntityRelation.None); + public View GetView(int index) => _GetReferencedView(GetViewIndex(index)); + private View _GetReferencedView(int referencedIndex) => _parentTableSet.GetView(referencedIndex); + public int[] Column_ElementIndex { get; } + public int GetElementIndex(int index) => Column_ElementIndex.ElementAtOrDefault(index, EntityRelation.None); + public Element GetElement(int index) => _GetReferencedElement(GetElementIndex(index)); + private Element _GetReferencedElement(int referencedIndex) => _parentTableSet.GetElement(referencedIndex); + // Object Getter + public FaceSilhouette Get(int index) + { + if (index < 0) return null; + var r = new FaceSilhouette(); + r.Index = index; + r._FaceSilhouetteIndexBufferStart = new Relation(GetFaceSilhouetteIndexBufferStartIndex(index), _GetReferencedFaceSilhouetteIndexBufferStart); + r._FaceSilhouetteIndexBufferEnd = new Relation(GetFaceSilhouetteIndexBufferEndIndex(index), _GetReferencedFaceSilhouetteIndexBufferEnd); + r._View = new Relation(GetViewIndex(index), _GetReferencedView); + r._Element = new Relation(GetElementIndex(index), _GetReferencedElement); + return r; + } + // Enumerator + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + public IEnumerator GetEnumerator() + { + for (var i = 0; i < RowCount; ++i) + yield return Get(i); + } + } // class FaceSilhouetteTable + + public partial class FaceSilhouetteIndexBufferTable : EntityTable_v2, IEnumerable + { + private readonly EntityTableSet _parentTableSet; // can be null + + public FaceSilhouetteIndexBufferTable(SerializableEntityTable rawTable, string[] stringBuffer, EntityTableSet parentTableSet = null) : base(rawTable, stringBuffer) + { + _parentTableSet = parentTableSet; + Column_VertexIndexIndex = GetIndexColumnValues("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex") ?? Array.Empty(); + } + + public int[] Column_VertexIndexIndex { get; } + public int GetVertexIndexIndex(int index) => Column_VertexIndexIndex.ElementAtOrDefault(index, EntityRelation.None); + public FaceSilhouetteVertexBuffer GetVertexIndex(int index) => _GetReferencedVertexIndex(GetVertexIndexIndex(index)); + private FaceSilhouetteVertexBuffer _GetReferencedVertexIndex(int referencedIndex) => _parentTableSet.GetFaceSilhouetteVertexBuffer(referencedIndex); + // Object Getter + public FaceSilhouetteIndexBuffer Get(int index) + { + if (index < 0) return null; + var r = new FaceSilhouetteIndexBuffer(); + r.Index = index; + r._VertexIndex = new Relation(GetVertexIndexIndex(index), _GetReferencedVertexIndex); + return r; + } + // Enumerator + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + public IEnumerator GetEnumerator() + { + for (var i = 0; i < RowCount; ++i) + yield return Get(i); + } + } // class FaceSilhouetteIndexBufferTable + + public partial class FaceSilhouetteVertexBufferTable : EntityTable_v2, IEnumerable + { + private readonly EntityTableSet _parentTableSet; // can be null + + public FaceSilhouetteVertexBufferTable(SerializableEntityTable rawTable, string[] stringBuffer, EntityTableSet parentTableSet = null) : base(rawTable, stringBuffer) + { + _parentTableSet = parentTableSet; + Column_Vertex = GetDataColumnValues("vector3:Vertex") ?? Array.Empty(); + } + + public Vector3[] Column_Vertex { get; } + public Vector3 GetVertex(int index, Vector3 @default = default) => Column_Vertex.ElementAtOrDefault(index, @default); + // Object Getter + public FaceSilhouetteVertexBuffer Get(int index) + { + if (index < 0) return null; + var r = new FaceSilhouetteVertexBuffer(); + r.Index = index; + r.Vertex = GetVertex(index); + return r; + } + // Enumerator + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + public IEnumerator GetEnumerator() + { + for (var i = 0; i < RowCount; ++i) + yield return Get(i); + } + } // class FaceSilhouetteVertexBufferTable + public static class DocumentBuilderExtensions { public static Func, EntityTableBuilder> GetTableBuilderFunc(this Type type) @@ -7572,6 +7874,9 @@ public static Func, EntityTableBuilder> GetTableBuilderFunc( if (type == typeof(ViewInViewSheet)) return ToViewInViewSheetTableBuilder; if (type == typeof(Site)) return ToSiteTableBuilder; if (type == typeof(Building)) return ToBuildingTableBuilder; + if (type == typeof(FaceSilhouette)) return ToFaceSilhouetteTableBuilder; + if (type == typeof(FaceSilhouetteIndexBuffer)) return ToFaceSilhouetteIndexBufferTableBuilder; + if (type == typeof(FaceSilhouetteVertexBuffer)) return ToFaceSilhouetteVertexBufferTableBuilder; throw new ArgumentException(nameof(type)); } public static EntityTableBuilder ToAssetTableBuilder(this IEnumerable entities) @@ -8226,6 +8531,30 @@ public static EntityTableBuilder ToBuildingTableBuilder(this IEnumerable tb.AddIndexColumn("index:Vim.Element:Element", typedEntities.Select(x => x._Element?.Index ?? EntityRelation.None)); return tb; } + public static EntityTableBuilder ToFaceSilhouetteTableBuilder(this IEnumerable entities) + { + var typedEntities = entities?.Cast() ?? Enumerable.Empty(); + var tb = new EntityTableBuilder("Vim.FaceSilhouette"); + tb.AddIndexColumn("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart", typedEntities.Select(x => x._FaceSilhouetteIndexBufferStart?.Index ?? EntityRelation.None)); + tb.AddIndexColumn("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd", typedEntities.Select(x => x._FaceSilhouetteIndexBufferEnd?.Index ?? EntityRelation.None)); + tb.AddIndexColumn("index:Vim.View:View", typedEntities.Select(x => x._View?.Index ?? EntityRelation.None)); + tb.AddIndexColumn("index:Vim.Element:Element", typedEntities.Select(x => x._Element?.Index ?? EntityRelation.None)); + return tb; + } + public static EntityTableBuilder ToFaceSilhouetteIndexBufferTableBuilder(this IEnumerable entities) + { + var typedEntities = entities?.Cast() ?? Enumerable.Empty(); + var tb = new EntityTableBuilder("Vim.FaceSilhouetteIndexBuffer"); + tb.AddIndexColumn("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex", typedEntities.Select(x => x._VertexIndex?.Index ?? EntityRelation.None)); + return tb; + } + public static EntityTableBuilder ToFaceSilhouetteVertexBufferTableBuilder(this IEnumerable entities) + { + var typedEntities = entities?.Cast() ?? Enumerable.Empty(); + var tb = new EntityTableBuilder("Vim.FaceSilhouetteVertexBuffer"); + tb.AddDataColumn("vector3:Vertex", typedEntities.Select(x => x.Vertex)); + return tb; + } } // DocumentBuilderExtensions public partial class ObjectModelBuilder @@ -8286,6 +8615,9 @@ public partial class ObjectModelBuilder {typeof(ViewInViewSheet), new EntityTableBuilder()}, {typeof(Site), new EntityTableBuilder()}, {typeof(Building), new EntityTableBuilder()}, + {typeof(FaceSilhouette), new EntityTableBuilder()}, + {typeof(FaceSilhouetteIndexBuffer), new EntityTableBuilder()}, + {typeof(FaceSilhouetteVertexBuffer), new EntityTableBuilder()}, }; } // ObjectModelBuilder } // namespace diff --git a/src/ts/package-lock.json b/src/ts/package-lock.json index 79d6454f..88a69a8f 100644 --- a/src/ts/package-lock.json +++ b/src/ts/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "vim-format", - "version": "1.0.15-dev.2", + "version": "1.0.16-dev.2", "license": "MIT", "dependencies": { "pako": "^2.1.0" diff --git a/src/ts/src/entityTable.ts b/src/ts/src/entityTable.ts index b77f6674..52647e37 100644 --- a/src/ts/src/entityTable.ts +++ b/src/ts/src/entityTable.ts @@ -3,6 +3,7 @@ */ import { BFast, NumericArray, Range } from './bfast' +import { Vector3, Matrix4x4 } from './structures' export class EntityTable { private readonly bfast: BFast @@ -42,6 +43,16 @@ export class EntityTable { return 2 // 2 bytes } + if (colName.startsWith('vector3:')) + { + return 4 * 3 // 4 bytes (float) times 3 (x,y,z) + } + + if (colName.startsWith('matrix4x4:')) + { + return 4 * 16 // 4 bytes (float) times 16 (4x4 matrix) + } + return 1 // default to 1 byte } @@ -170,4 +181,53 @@ export class EntityTable { } return result } + + async getVector3(elementIndex: number, columnName: string): Promise + { + const arrayBuffer = await this.bfast.getBuffer(columnName) + const floatView = new Float32Array(arrayBuffer) + + const startIndex = elementIndex * 3; // (x,y,z) => 3 + return { + x: floatView[startIndex], + y: floatView[startIndex + 1], + z: floatView[startIndex + 2] + } + } + + // TODO: Promise is a shortcut... should actually be Promise + async getVector3Array(columnName: string): Promise { + return await this.bfast.getBuffer(columnName) + } + + async getMatrix4x4(elementIndex: number, columnName: string): Promise + { + const arrayBuffer = await this.bfast.getBuffer(columnName) + const floatView = new Float32Array(arrayBuffer) + + const startIndex = elementIndex * 16; // (4x4) => 16 + return { + m11: floatView[startIndex], + m12: floatView[startIndex + 1], + m13: floatView[startIndex + 2], + m14: floatView[startIndex + 3], + m21: floatView[startIndex + 4], + m22: floatView[startIndex + 5], + m23: floatView[startIndex + 6], + m24: floatView[startIndex + 7], + m31: floatView[startIndex + 8], + m32: floatView[startIndex + 9], + m33: floatView[startIndex + 10], + m34: floatView[startIndex + 11], + m41: floatView[startIndex + 12], + m42: floatView[startIndex + 13], + m43: floatView[startIndex + 14], + m44: floatView[startIndex + 15], + } + } + + // TODO: Promise is a shortcut... should actually be Promise + async getMatrix4x4Array(columnName: string): Promise { + return await this.bfast.getBuffer(columnName) + } } diff --git a/src/ts/src/objectModel.ts b/src/ts/src/objectModel.ts index 3d543168..f3772bbc 100644 --- a/src/ts/src/objectModel.ts +++ b/src/ts/src/objectModel.ts @@ -10569,6 +10569,385 @@ export class BuildingTable implements IBuildingTable { } +export interface IFaceSilhouette { + index: number + + faceSilhouetteIndexBufferStartIndex?: number + faceSilhouetteIndexBufferStart?: IFaceSilhouetteIndexBuffer + faceSilhouetteIndexBufferEndIndex?: number + faceSilhouetteIndexBufferEnd?: IFaceSilhouetteIndexBuffer + viewIndex?: number + view?: IView + elementIndex?: number + element?: IElement +} + +export interface IFaceSilhouetteTable { + getCount(): Promise + get(faceSilhouetteIndex: number): Promise + getAll(): Promise + + getFaceSilhouetteIndexBufferStartIndex(faceSilhouetteIndex: number): Promise + getAllFaceSilhouetteIndexBufferStartIndex(): Promise + getFaceSilhouetteIndexBufferStart(faceSilhouetteIndex: number): Promise + getFaceSilhouetteIndexBufferEndIndex(faceSilhouetteIndex: number): Promise + getAllFaceSilhouetteIndexBufferEndIndex(): Promise + getFaceSilhouetteIndexBufferEnd(faceSilhouetteIndex: number): Promise + getViewIndex(faceSilhouetteIndex: number): Promise + getAllViewIndex(): Promise + getView(faceSilhouetteIndex: number): Promise + getElementIndex(faceSilhouetteIndex: number): Promise + getAllElementIndex(): Promise + getElement(faceSilhouetteIndex: number): Promise +} + +export class FaceSilhouette implements IFaceSilhouette { + index: number + + faceSilhouetteIndexBufferStartIndex?: number + faceSilhouetteIndexBufferStart?: IFaceSilhouetteIndexBuffer + faceSilhouetteIndexBufferEndIndex?: number + faceSilhouetteIndexBufferEnd?: IFaceSilhouetteIndexBuffer + viewIndex?: number + view?: IView + elementIndex?: number + element?: IElement + + static async createFromTable(table: IFaceSilhouetteTable, index: number): Promise { + let result = new FaceSilhouette() + result.index = index + + await Promise.all([ + table.getFaceSilhouetteIndexBufferStartIndex(index).then(v => result.faceSilhouetteIndexBufferStartIndex = v), + table.getFaceSilhouetteIndexBufferEndIndex(index).then(v => result.faceSilhouetteIndexBufferEndIndex = v), + table.getViewIndex(index).then(v => result.viewIndex = v), + table.getElementIndex(index).then(v => result.elementIndex = v), + ]) + + return result + } +} + +export class FaceSilhouetteTable implements IFaceSilhouetteTable { + private document: VimDocument + private entityTable: EntityTable + + static async createFromDocument(document: VimDocument): Promise { + const entity = await document.entities.getBfast("Vim.FaceSilhouette") + + if (!entity) { + return undefined + } + + let table = new FaceSilhouetteTable() + table.document = document + table.entityTable = new EntityTable(entity, document.strings) + + return table + } + + getCount(): Promise { + return this.entityTable.getCount() + } + + async get(faceSilhouetteIndex: number): Promise { + return await FaceSilhouette.createFromTable(this, faceSilhouetteIndex) + } + + async getAll(): Promise { + const localTable = await this.entityTable.getLocal() + + let faceSilhouetteIndexBufferStartIndex: number[] | undefined + let faceSilhouetteIndexBufferEndIndex: number[] | undefined + let viewIndex: number[] | undefined + let elementIndex: number[] | undefined + + await Promise.all([ + (async () => { faceSilhouetteIndexBufferStartIndex = (await localTable.getNumberArray("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart")) })(), + (async () => { faceSilhouetteIndexBufferEndIndex = (await localTable.getNumberArray("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd")) })(), + (async () => { viewIndex = (await localTable.getNumberArray("index:Vim.View:View")) })(), + (async () => { elementIndex = (await localTable.getNumberArray("index:Vim.Element:Element")) })(), + ]) + + let faceSilhouette: IFaceSilhouette[] = [] + + const rowCount = await this.getCount() + for (let i = 0; i < rowCount; i++) { + faceSilhouette.push({ + index: i, + faceSilhouetteIndexBufferStartIndex: faceSilhouetteIndexBufferStartIndex ? faceSilhouetteIndexBufferStartIndex[i] : undefined, + faceSilhouetteIndexBufferEndIndex: faceSilhouetteIndexBufferEndIndex ? faceSilhouetteIndexBufferEndIndex[i] : undefined, + viewIndex: viewIndex ? viewIndex[i] : undefined, + elementIndex: elementIndex ? elementIndex[i] : undefined + }) + } + + return faceSilhouette + } + + async getFaceSilhouetteIndexBufferStartIndex(faceSilhouetteIndex: number): Promise { + return await this.entityTable.getNumber(faceSilhouetteIndex, "index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart") + } + + async getAllFaceSilhouetteIndexBufferStartIndex(): Promise { + return await this.entityTable.getNumberArray("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart") + } + + async getFaceSilhouetteIndexBufferStart(faceSilhouetteIndex: number): Promise { + const index = await this.getFaceSilhouetteIndexBufferStartIndex(faceSilhouetteIndex) + + if (index === undefined) { + return undefined + } + + return await this.document.faceSilhouetteIndexBuffer?.get(index) + } + + async getFaceSilhouetteIndexBufferEndIndex(faceSilhouetteIndex: number): Promise { + return await this.entityTable.getNumber(faceSilhouetteIndex, "index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd") + } + + async getAllFaceSilhouetteIndexBufferEndIndex(): Promise { + return await this.entityTable.getNumberArray("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd") + } + + async getFaceSilhouetteIndexBufferEnd(faceSilhouetteIndex: number): Promise { + const index = await this.getFaceSilhouetteIndexBufferEndIndex(faceSilhouetteIndex) + + if (index === undefined) { + return undefined + } + + return await this.document.faceSilhouetteIndexBuffer?.get(index) + } + + async getViewIndex(faceSilhouetteIndex: number): Promise { + return await this.entityTable.getNumber(faceSilhouetteIndex, "index:Vim.View:View") + } + + async getAllViewIndex(): Promise { + return await this.entityTable.getNumberArray("index:Vim.View:View") + } + + async getView(faceSilhouetteIndex: number): Promise { + const index = await this.getViewIndex(faceSilhouetteIndex) + + if (index === undefined) { + return undefined + } + + return await this.document.view?.get(index) + } + + async getElementIndex(faceSilhouetteIndex: number): Promise { + return await this.entityTable.getNumber(faceSilhouetteIndex, "index:Vim.Element:Element") + } + + async getAllElementIndex(): Promise { + return await this.entityTable.getNumberArray("index:Vim.Element:Element") + } + + async getElement(faceSilhouetteIndex: number): Promise { + const index = await this.getElementIndex(faceSilhouetteIndex) + + if (index === undefined) { + return undefined + } + + return await this.document.element?.get(index) + } + +} + +export interface IFaceSilhouetteIndexBuffer { + index: number + + vertexIndexIndex?: number + vertexIndex?: IFaceSilhouetteVertexBuffer +} + +export interface IFaceSilhouetteIndexBufferTable { + getCount(): Promise + get(faceSilhouetteIndexBufferIndex: number): Promise + getAll(): Promise + + getVertexIndexIndex(faceSilhouetteIndexBufferIndex: number): Promise + getAllVertexIndexIndex(): Promise + getVertexIndex(faceSilhouetteIndexBufferIndex: number): Promise +} + +export class FaceSilhouetteIndexBuffer implements IFaceSilhouetteIndexBuffer { + index: number + + vertexIndexIndex?: number + vertexIndex?: IFaceSilhouetteVertexBuffer + + static async createFromTable(table: IFaceSilhouetteIndexBufferTable, index: number): Promise { + let result = new FaceSilhouetteIndexBuffer() + result.index = index + + await Promise.all([ + table.getVertexIndexIndex(index).then(v => result.vertexIndexIndex = v), + ]) + + return result + } +} + +export class FaceSilhouetteIndexBufferTable implements IFaceSilhouetteIndexBufferTable { + private document: VimDocument + private entityTable: EntityTable + + static async createFromDocument(document: VimDocument): Promise { + const entity = await document.entities.getBfast("Vim.FaceSilhouetteIndexBuffer") + + if (!entity) { + return undefined + } + + let table = new FaceSilhouetteIndexBufferTable() + table.document = document + table.entityTable = new EntityTable(entity, document.strings) + + return table + } + + getCount(): Promise { + return this.entityTable.getCount() + } + + async get(faceSilhouetteIndexBufferIndex: number): Promise { + return await FaceSilhouetteIndexBuffer.createFromTable(this, faceSilhouetteIndexBufferIndex) + } + + async getAll(): Promise { + const localTable = await this.entityTable.getLocal() + + let vertexIndexIndex: number[] | undefined + + await Promise.all([ + (async () => { vertexIndexIndex = (await localTable.getNumberArray("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex")) })(), + ]) + + let faceSilhouetteIndexBuffer: IFaceSilhouetteIndexBuffer[] = [] + + const rowCount = await this.getCount() + for (let i = 0; i < rowCount; i++) { + faceSilhouetteIndexBuffer.push({ + index: i, + vertexIndexIndex: vertexIndexIndex ? vertexIndexIndex[i] : undefined + }) + } + + return faceSilhouetteIndexBuffer + } + + async getVertexIndexIndex(faceSilhouetteIndexBufferIndex: number): Promise { + return await this.entityTable.getNumber(faceSilhouetteIndexBufferIndex, "index:Vim.FaceSilhouetteVertexBuffer:VertexIndex") + } + + async getAllVertexIndexIndex(): Promise { + return await this.entityTable.getNumberArray("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex") + } + + async getVertexIndex(faceSilhouetteIndexBufferIndex: number): Promise { + const index = await this.getVertexIndexIndex(faceSilhouetteIndexBufferIndex) + + if (index === undefined) { + return undefined + } + + return await this.document.faceSilhouetteVertexBuffer?.get(index) + } + +} + +export interface IFaceSilhouetteVertexBuffer { + index: number + vertex?: Vector3 +} + +export interface IFaceSilhouetteVertexBufferTable { + getCount(): Promise + get(faceSilhouetteVertexBufferIndex: number): Promise + getAll(): Promise + + getVertex(faceSilhouetteVertexBufferIndex: number): Promise + getAllVertex(): Promise +} + +export class FaceSilhouetteVertexBuffer implements IFaceSilhouetteVertexBuffer { + index: number + vertex?: Vector3 + + static async createFromTable(table: IFaceSilhouetteVertexBufferTable, index: number): Promise { + let result = new FaceSilhouetteVertexBuffer() + result.index = index + + await Promise.all([ + table.getVertex(index).then(v => result.vertex = v), + ]) + + return result + } +} + +export class FaceSilhouetteVertexBufferTable implements IFaceSilhouetteVertexBufferTable { + private entityTable: EntityTable + + static async createFromDocument(document: VimDocument): Promise { + const entity = await document.entities.getBfast("Vim.FaceSilhouetteVertexBuffer") + + if (!entity) { + return undefined + } + + let table = new FaceSilhouetteVertexBufferTable() + table.entityTable = new EntityTable(entity, document.strings) + + return table + } + + getCount(): Promise { + return this.entityTable.getCount() + } + + async get(faceSilhouetteVertexBufferIndex: number): Promise { + return await FaceSilhouetteVertexBuffer.createFromTable(this, faceSilhouetteVertexBufferIndex) + } + + async getAll(): Promise { + const localTable = await this.entityTable.getLocal() + + let vertex: Vector3[] | undefined + + await Promise.all([ + (async () => { vertex = (await localTable.getVector3Array("vector3:Vertex")) })(), + ]) + + let faceSilhouetteVertexBuffer: IFaceSilhouetteVertexBuffer[] = [] + + const rowCount = await this.getCount() + for (let i = 0; i < rowCount; i++) { + faceSilhouetteVertexBuffer.push({ + index: i, + vertex: vertex ? vertex[i] : undefined + }) + } + + return faceSilhouetteVertexBuffer + } + + async getVertex(faceSilhouetteVertexBufferIndex: number): Promise { + return (await this.entityTable.getVector3(faceSilhouetteVertexBufferIndex, "vector3:Vertex")) + } + + async getAllVertex(): Promise { + return (await this.entityTable.getVector3Array("vector3:Vertex")) + } + +} + export class VimDocument { asset: IAssetTable | undefined displayUnit: IDisplayUnitTable | undefined @@ -10624,6 +11003,9 @@ export class VimDocument { viewInViewSheet: IViewInViewSheetTable | undefined site: ISiteTable | undefined building: IBuildingTable | undefined + faceSilhouette: IFaceSilhouetteTable | undefined + faceSilhouetteIndexBuffer: IFaceSilhouetteIndexBufferTable | undefined + faceSilhouetteVertexBuffer: IFaceSilhouetteVertexBufferTable | undefined entities: BFast strings: string[] | undefined @@ -10695,6 +11077,9 @@ export class VimDocument { doc.viewInViewSheet = await ViewInViewSheetTable.createFromDocument(doc) doc.site = await SiteTable.createFromDocument(doc) doc.building = await BuildingTable.createFromDocument(doc) + doc.faceSilhouette = await FaceSilhouetteTable.createFromDocument(doc) + doc.faceSilhouetteIndexBuffer = await FaceSilhouetteIndexBufferTable.createFromDocument(doc) + doc.faceSilhouetteVertexBuffer = await FaceSilhouetteVertexBufferTable.createFromDocument(doc) return doc } From af3dbf5df44c2ee8783f342812939823288f1177 Mon Sep 17 00:00:00 2001 From: Martin Ashton Date: Wed, 26 Mar 2025 16:33:01 -0400 Subject: [PATCH 2/7] Added EntityBufferAttribute and implemented face silhouette index buffer and vertex buffer serialization into the document builder. --- src/cpp/vim/object-model.h | 18 +++ .../ObjectModelGenerator.cs | 8 +- .../ColumnExtensions.Reflection.cs | 3 + .../Vim.Format.Core/EntityBufferAttribute.cs | 8 ++ .../vim/Vim.Format/ObjectModel/ObjectModel.cs | 4 +- .../ObjectModel/ObjectModelGenerated.cs | 134 ++---------------- .../ObjectModel/ObjectModelStore.cs | 31 +++- src/ts/src/objectModel.ts | 29 ++++ 8 files changed, 111 insertions(+), 124 deletions(-) create mode 100644 src/cs/vim/Vim.Format.Core/EntityBufferAttribute.cs diff --git a/src/cpp/vim/object-model.h b/src/cpp/vim/object-model.h index c1372b8a..9478469b 100644 --- a/src/cpp/vim/object-model.h +++ b/src/cpp/vim/object-model.h @@ -13906,6 +13906,8 @@ namespace Vim FaceSilhouetteIndexBuffer* mFaceSilhouetteIndexBufferEnd; int mViewIndex; View* mView; + int mMaterialIndex; + Material* mMaterial; int mElementIndex; Element* mElement; @@ -13932,6 +13934,7 @@ namespace Vim faceSilhouette->mFaceSilhouetteIndexBufferStartIndex = GetFaceSilhouetteIndexBufferStartIndex(faceSilhouetteIndex); faceSilhouette->mFaceSilhouetteIndexBufferEndIndex = GetFaceSilhouetteIndexBufferEndIndex(faceSilhouetteIndex); faceSilhouette->mViewIndex = GetViewIndex(faceSilhouetteIndex); + faceSilhouette->mMaterialIndex = GetMaterialIndex(faceSilhouetteIndex); faceSilhouette->mElementIndex = GetElementIndex(faceSilhouetteIndex); return faceSilhouette; } @@ -13941,6 +13944,7 @@ namespace Vim bool existsFaceSilhouetteIndexBufferStart = mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart"); bool existsFaceSilhouetteIndexBufferEnd = mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd"); bool existsView = mEntityTable.column_exists("index:Vim.View:View"); + bool existsMaterial = mEntityTable.column_exists("index:Vim.Material:Material"); bool existsElement = mEntityTable.column_exists("index:Vim.Element:Element"); const auto count = GetCount(); @@ -13951,6 +13955,7 @@ namespace Vim const std::vector& faceSilhouetteIndexBufferStartData = mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart") ? mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart"] : std::vector(); const std::vector& faceSilhouetteIndexBufferEndData = mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd") ? mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd"] : std::vector(); const std::vector& viewData = mEntityTable.column_exists("index:Vim.View:View") ? mEntityTable.mIndexColumns["index:Vim.View:View"] : std::vector(); + const std::vector& materialData = mEntityTable.column_exists("index:Vim.Material:Material") ? mEntityTable.mIndexColumns["index:Vim.Material:Material"] : std::vector(); const std::vector& elementData = mEntityTable.column_exists("index:Vim.Element:Element") ? mEntityTable.mIndexColumns["index:Vim.Element:Element"] : std::vector(); for (int i = 0; i < count; ++i) @@ -13960,6 +13965,7 @@ namespace Vim entity.mFaceSilhouetteIndexBufferStartIndex = existsFaceSilhouetteIndexBufferStart ? faceSilhouetteIndexBufferStartData[i] : -1; entity.mFaceSilhouetteIndexBufferEndIndex = existsFaceSilhouetteIndexBufferEnd ? faceSilhouetteIndexBufferEndData[i] : -1; entity.mViewIndex = existsView ? viewData[i] : -1; + entity.mMaterialIndex = existsMaterial ? materialData[i] : -1; entity.mElementIndex = existsElement ? elementData[i] : -1; faceSilhouette->push_back(entity); } @@ -14003,6 +14009,18 @@ namespace Vim return mEntityTable.mIndexColumns["index:Vim.View:View"][faceSilhouetteIndex]; } + int GetMaterialIndex(int faceSilhouetteIndex) + { + if (!mEntityTable.column_exists("index:Vim.Material:Material")) { + return -1; + } + + if (faceSilhouetteIndex < 0 || faceSilhouetteIndex >= GetCount()) + return -1; + + return mEntityTable.mIndexColumns["index:Vim.Material:Material"][faceSilhouetteIndex]; + } + int GetElementIndex(int faceSilhouetteIndex) { if (!mEntityTable.column_exists("index:Vim.Element:Element")) { diff --git a/src/cs/vim/Vim.Format.CodeGen/ObjectModelGenerator.cs b/src/cs/vim/Vim.Format.CodeGen/ObjectModelGenerator.cs index c176413c..eeb5f877 100644 --- a/src/cs/vim/Vim.Format.CodeGen/ObjectModelGenerator.cs +++ b/src/cs/vim/Vim.Format.CodeGen/ObjectModelGenerator.cs @@ -224,7 +224,9 @@ IEnumerable GetEquatableFields(FieldInfo[] fis) private static CodeBuilder WriteDocument(CodeBuilder cb) { - var entityTypes = ObjectModelReflection.GetEntityTypes().ToArray(); + var entityTypes = ObjectModelReflection.GetEntityTypes() + .Where(t => !t.IsEntityTableBuffer()) + .ToArray(); foreach (var et in entityTypes) WriteEntityClass(et, cb); @@ -433,7 +435,9 @@ private static void WriteEntityTable(CodeBuilder cb, Type t) private static void WriteDocumentBuilder(CodeBuilder cb) { - var entityTypes = ObjectModelReflection.GetEntityTypes().ToArray(); + var entityTypes = ObjectModelReflection.GetEntityTypes() + .Where(t => !t.IsEntityTableBuffer()) + .ToArray(); cb.AppendLine("public static class DocumentBuilderExtensions"); cb.AppendLine("{"); diff --git a/src/cs/vim/Vim.Format.Core/ColumnExtensions.Reflection.cs b/src/cs/vim/Vim.Format.Core/ColumnExtensions.Reflection.cs index d7cedece..805b9ffa 100644 --- a/src/cs/vim/Vim.Format.Core/ColumnExtensions.Reflection.cs +++ b/src/cs/vim/Vim.Format.Core/ColumnExtensions.Reflection.cs @@ -75,6 +75,9 @@ public static IEnumerable GetRelationFields(this Type t) public static string GetEntityTableName(this Type t) => (t.GetCustomAttribute(typeof(TableNameAttribute)) as TableNameAttribute)?.Name; + public static bool IsEntityTableBuffer(this Type t) + => (t.GetCustomAttribute(typeof(EntityBufferAttribute)) as EntityBufferAttribute) != null; + public static (string IndexColumnName, string LocalFieldName) GetIndexColumnInfo(this FieldInfo fieldInfo) { if (!fieldInfo.Name.StartsWith("_")) diff --git a/src/cs/vim/Vim.Format.Core/EntityBufferAttribute.cs b/src/cs/vim/Vim.Format.Core/EntityBufferAttribute.cs new file mode 100644 index 00000000..1555e74f --- /dev/null +++ b/src/cs/vim/Vim.Format.Core/EntityBufferAttribute.cs @@ -0,0 +1,8 @@ +using System; + +namespace Vim.Format +{ + public class EntityBufferAttribute : Attribute + { + } +} diff --git a/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs b/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs index 59dc4628..baa5b92f 100644 --- a/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs +++ b/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs @@ -1781,19 +1781,21 @@ public partial class FaceSilhouette : EntityWithElement public Relation _FaceSilhouetteIndexBufferStart; public Relation _FaceSilhouetteIndexBufferEnd; public Relation _View; - //public Relation _Material; // later? + public Relation _Material; } /// /// Represents a continuous index buffer of triangular faces. /// [TableName(TableNames.FaceSilhouetteIndexBuffer)] + [EntityBuffer] public partial class FaceSilhouetteIndexBuffer : Entity { public Relation _VertexIndex; } [TableName(TableNames.FaceSilhouetteVertexBuffer)] + [EntityBuffer] public partial class FaceSilhouetteVertexBuffer : Entity { public Vector3 Vertex; diff --git a/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs b/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs index 67216125..9b06f88b 100644 --- a/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs +++ b/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs @@ -1893,12 +1893,14 @@ public partial class FaceSilhouette public Vim.Format.ObjectModel.FaceSilhouetteIndexBuffer FaceSilhouetteIndexBufferStart => _FaceSilhouetteIndexBufferStart.Value; public Vim.Format.ObjectModel.FaceSilhouetteIndexBuffer FaceSilhouetteIndexBufferEnd => _FaceSilhouetteIndexBufferEnd.Value; public Vim.Format.ObjectModel.View View => _View.Value; + public Vim.Format.ObjectModel.Material Material => _Material.Value; public Vim.Format.ObjectModel.Element Element => _Element.Value; public FaceSilhouette() { _FaceSilhouetteIndexBufferStart = new Relation(); _FaceSilhouetteIndexBufferEnd = new Relation(); _View = new Relation(); + _Material = new Relation(); _Element = new Relation(); } @@ -1911,6 +1913,7 @@ public override bool FieldsAreEqual(object obj) (_FaceSilhouetteIndexBufferStart?.Index == other._FaceSilhouetteIndexBufferStart?.Index) && (_FaceSilhouetteIndexBufferEnd?.Index == other._FaceSilhouetteIndexBufferEnd?.Index) && (_View?.Index == other._View?.Index) && + (_Material?.Index == other._Material?.Index) && (_Element?.Index == other._Element?.Index); if (!fieldsAreEqual) { @@ -1924,60 +1927,6 @@ public override bool FieldsAreEqual(object obj) } // end of class - // AUTO-GENERATED - public partial class FaceSilhouetteIndexBuffer - { - public Vim.Format.ObjectModel.FaceSilhouetteVertexBuffer VertexIndex => _VertexIndex.Value; - public FaceSilhouetteIndexBuffer() - { - _VertexIndex = new Relation(); - } - - public override bool FieldsAreEqual(object obj) - { - if ((obj is FaceSilhouetteIndexBuffer other)) - { - var fieldsAreEqual = - (Index == other.Index) && - (_VertexIndex?.Index == other._VertexIndex?.Index); - if (!fieldsAreEqual) - { - return false; - } - - return true; - } - return false; - } - - } // end of class - - // AUTO-GENERATED - public partial class FaceSilhouetteVertexBuffer - { - public FaceSilhouetteVertexBuffer() - { - } - - public override bool FieldsAreEqual(object obj) - { - if ((obj is FaceSilhouetteVertexBuffer other)) - { - var fieldsAreEqual = - (Index == other.Index) && - (Vertex == other.Vertex); - if (!fieldsAreEqual) - { - return false; - } - - return true; - } - return false; - } - - } // end of class - public partial class DocumentModel { public ElementIndexMaps ElementIndexMaps { get; } @@ -3840,6 +3789,8 @@ public Building GetBuilding(int n) public int GetFaceSilhouetteFaceSilhouetteIndexBufferEndIndex(int index) => FaceSilhouetteFaceSilhouetteIndexBufferEndIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; public IArray FaceSilhouetteViewIndex { get; } public int GetFaceSilhouetteViewIndex(int index) => FaceSilhouetteViewIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; + public IArray FaceSilhouetteMaterialIndex { get; } + public int GetFaceSilhouetteMaterialIndex(int index) => FaceSilhouetteMaterialIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; public IArray FaceSilhouetteElementIndex { get; } public int GetFaceSilhouetteElementIndex(int index) => FaceSilhouetteElementIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; public int NumFaceSilhouette => FaceSilhouetteEntityTable?.NumRows ?? 0; @@ -3853,48 +3804,11 @@ public FaceSilhouette GetFaceSilhouette(int n) r._FaceSilhouetteIndexBufferStart = new Relation(GetFaceSilhouetteFaceSilhouetteIndexBufferStartIndex(n), GetFaceSilhouetteIndexBuffer); r._FaceSilhouetteIndexBufferEnd = new Relation(GetFaceSilhouetteFaceSilhouetteIndexBufferEndIndex(n), GetFaceSilhouetteIndexBuffer); r._View = new Relation(GetFaceSilhouetteViewIndex(n), GetView); + r._Material = new Relation(GetFaceSilhouetteMaterialIndex(n), GetMaterial); r._Element = new Relation(GetFaceSilhouetteElementIndex(n), GetElement); return r; } - - // FaceSilhouetteIndexBuffer - - public EntityTable FaceSilhouetteIndexBufferEntityTable { get; } - - public IArray FaceSilhouetteIndexBufferVertexIndexIndex { get; } - public int GetFaceSilhouetteIndexBufferVertexIndexIndex(int index) => FaceSilhouetteIndexBufferVertexIndexIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; - public int NumFaceSilhouetteIndexBuffer => FaceSilhouetteIndexBufferEntityTable?.NumRows ?? 0; - public IArray FaceSilhouetteIndexBufferList { get; } - public FaceSilhouetteIndexBuffer GetFaceSilhouetteIndexBuffer(int n) - { - if (n < 0) return null; - var r = new FaceSilhouetteIndexBuffer(); - r.Document = Document; - r.Index = n; - r._VertexIndex = new Relation(GetFaceSilhouetteIndexBufferVertexIndexIndex(n), GetFaceSilhouetteVertexBuffer); - return r; - } - - - // FaceSilhouetteVertexBuffer - - public EntityTable FaceSilhouetteVertexBufferEntityTable { get; } - - public IArray FaceSilhouetteVertexBufferVertex { get; } - public Vector3 GetFaceSilhouetteVertexBufferVertex(int index, Vector3 defaultValue = default) => FaceSilhouetteVertexBufferVertex?.ElementAtOrDefault(index, defaultValue) ?? defaultValue; - public int NumFaceSilhouetteVertexBuffer => FaceSilhouetteVertexBufferEntityTable?.NumRows ?? 0; - public IArray FaceSilhouetteVertexBufferList { get; } - public FaceSilhouetteVertexBuffer GetFaceSilhouetteVertexBuffer(int n) - { - if (n < 0) return null; - var r = new FaceSilhouetteVertexBuffer(); - r.Document = Document; - r.Index = n; - r.Vertex = FaceSilhouetteVertexBufferVertex.ElementAtOrDefault(n); - return r; - } - // All entity collections public Dictionary> AllEntities => new Dictionary>() { {"Vim.Asset", AssetList.ToEnumerable()}, @@ -3952,8 +3866,6 @@ public FaceSilhouetteVertexBuffer GetFaceSilhouetteVertexBuffer(int n) {"Vim.Site", SiteList.ToEnumerable()}, {"Vim.Building", BuildingList.ToEnumerable()}, {"Vim.FaceSilhouette", FaceSilhouetteList.ToEnumerable()}, - {"Vim.FaceSilhouetteIndexBuffer", FaceSilhouetteIndexBufferList.ToEnumerable()}, - {"Vim.FaceSilhouetteVertexBuffer", FaceSilhouetteVertexBufferList.ToEnumerable()}, }; // Entity types from table names @@ -4013,8 +3925,6 @@ public FaceSilhouetteVertexBuffer GetFaceSilhouetteVertexBuffer(int n) {"Vim.Site", typeof(Site)}, {"Vim.Building", typeof(Building)}, {"Vim.FaceSilhouette", typeof(FaceSilhouette)}, - {"Vim.FaceSilhouetteIndexBuffer", typeof(FaceSilhouetteIndexBuffer)}, - {"Vim.FaceSilhouetteVertexBuffer", typeof(FaceSilhouetteVertexBuffer)}, }; public DocumentModel(Document d, bool inParallel = true) { @@ -4076,8 +3986,6 @@ public DocumentModel(Document d, bool inParallel = true) SiteEntityTable = Document.GetTable("Vim.Site"); BuildingEntityTable = Document.GetTable("Vim.Building"); FaceSilhouetteEntityTable = Document.GetTable("Vim.FaceSilhouette"); - FaceSilhouetteIndexBufferEntityTable = Document.GetTable("Vim.FaceSilhouetteIndexBuffer"); - FaceSilhouetteVertexBufferEntityTable = Document.GetTable("Vim.FaceSilhouetteVertexBuffer"); // Initialize entity arrays AssetBufferName = AssetEntityTable?.GetStringColumnValues("string:BufferName") ?? Array.Empty().ToIArray(); @@ -4308,7 +4216,6 @@ public DocumentModel(Document d, bool inParallel = true) BuildingElevation = BuildingEntityTable?.GetDataColumnValues("double:Elevation") ?? Array.Empty().ToIArray(); BuildingTerrainElevation = BuildingEntityTable?.GetDataColumnValues("double:TerrainElevation") ?? Array.Empty().ToIArray(); BuildingAddress = BuildingEntityTable?.GetStringColumnValues("string:Address") ?? Array.Empty().ToIArray(); - FaceSilhouetteVertexBufferVertex = FaceSilhouetteVertexBufferEntityTable?.GetDataColumnValues("vector3:Vertex") ?? Array.Empty().ToIArray(); // Initialize entity relational columns ParameterDescriptorDisplayUnitIndex = ParameterDescriptorEntityTable?.GetIndexColumnValues("index:Vim.DisplayUnit:DisplayUnit") ?? Array.Empty().ToIArray(); @@ -4414,8 +4321,8 @@ public DocumentModel(Document d, bool inParallel = true) FaceSilhouetteFaceSilhouetteIndexBufferStartIndex = FaceSilhouetteEntityTable?.GetIndexColumnValues("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart") ?? Array.Empty().ToIArray(); FaceSilhouetteFaceSilhouetteIndexBufferEndIndex = FaceSilhouetteEntityTable?.GetIndexColumnValues("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd") ?? Array.Empty().ToIArray(); FaceSilhouetteViewIndex = FaceSilhouetteEntityTable?.GetIndexColumnValues("index:Vim.View:View") ?? Array.Empty().ToIArray(); + FaceSilhouetteMaterialIndex = FaceSilhouetteEntityTable?.GetIndexColumnValues("index:Vim.Material:Material") ?? Array.Empty().ToIArray(); FaceSilhouetteElementIndex = FaceSilhouetteEntityTable?.GetIndexColumnValues("index:Vim.Element:Element") ?? Array.Empty().ToIArray(); - FaceSilhouetteIndexBufferVertexIndexIndex = FaceSilhouetteIndexBufferEntityTable?.GetIndexColumnValues("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex") ?? Array.Empty().ToIArray(); // Initialize entity collections AssetList = NumAsset.Select(i => GetAsset(i)); @@ -4473,8 +4380,6 @@ public DocumentModel(Document d, bool inParallel = true) SiteList = NumSite.Select(i => GetSite(i)); BuildingList = NumBuilding.Select(i => GetBuilding(i)); FaceSilhouetteList = NumFaceSilhouette.Select(i => GetFaceSilhouette(i)); - FaceSilhouetteIndexBufferList = NumFaceSilhouetteIndexBuffer.Select(i => GetFaceSilhouetteIndexBuffer(i)); - FaceSilhouetteVertexBufferList = NumFaceSilhouetteVertexBuffer.Select(i => GetFaceSilhouetteVertexBuffer(i)); // Initialize element index maps ElementIndexMaps = new ElementIndexMaps(this, inParallel); @@ -7714,6 +7619,7 @@ public FaceSilhouetteTable(SerializableEntityTable rawTable, string[] stringBuff Column_FaceSilhouetteIndexBufferStartIndex = GetIndexColumnValues("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart") ?? Array.Empty(); Column_FaceSilhouetteIndexBufferEndIndex = GetIndexColumnValues("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd") ?? Array.Empty(); Column_ViewIndex = GetIndexColumnValues("index:Vim.View:View") ?? Array.Empty(); + Column_MaterialIndex = GetIndexColumnValues("index:Vim.Material:Material") ?? Array.Empty(); Column_ElementIndex = GetIndexColumnValues("index:Vim.Element:Element") ?? Array.Empty(); } @@ -7729,6 +7635,10 @@ public FaceSilhouetteTable(SerializableEntityTable rawTable, string[] stringBuff public int GetViewIndex(int index) => Column_ViewIndex.ElementAtOrDefault(index, EntityRelation.None); public View GetView(int index) => _GetReferencedView(GetViewIndex(index)); private View _GetReferencedView(int referencedIndex) => _parentTableSet.GetView(referencedIndex); + public int[] Column_MaterialIndex { get; } + public int GetMaterialIndex(int index) => Column_MaterialIndex.ElementAtOrDefault(index, EntityRelation.None); + public Material GetMaterial(int index) => _GetReferencedMaterial(GetMaterialIndex(index)); + private Material _GetReferencedMaterial(int referencedIndex) => _parentTableSet.GetMaterial(referencedIndex); public int[] Column_ElementIndex { get; } public int GetElementIndex(int index) => Column_ElementIndex.ElementAtOrDefault(index, EntityRelation.None); public Element GetElement(int index) => _GetReferencedElement(GetElementIndex(index)); @@ -7742,6 +7652,7 @@ public FaceSilhouette Get(int index) r._FaceSilhouetteIndexBufferStart = new Relation(GetFaceSilhouetteIndexBufferStartIndex(index), _GetReferencedFaceSilhouetteIndexBufferStart); r._FaceSilhouetteIndexBufferEnd = new Relation(GetFaceSilhouetteIndexBufferEndIndex(index), _GetReferencedFaceSilhouetteIndexBufferEnd); r._View = new Relation(GetViewIndex(index), _GetReferencedView); + r._Material = new Relation(GetMaterialIndex(index), _GetReferencedMaterial); r._Element = new Relation(GetElementIndex(index), _GetReferencedElement); return r; } @@ -7875,8 +7786,6 @@ public static Func, EntityTableBuilder> GetTableBuilderFunc( if (type == typeof(Site)) return ToSiteTableBuilder; if (type == typeof(Building)) return ToBuildingTableBuilder; if (type == typeof(FaceSilhouette)) return ToFaceSilhouetteTableBuilder; - if (type == typeof(FaceSilhouetteIndexBuffer)) return ToFaceSilhouetteIndexBufferTableBuilder; - if (type == typeof(FaceSilhouetteVertexBuffer)) return ToFaceSilhouetteVertexBufferTableBuilder; throw new ArgumentException(nameof(type)); } public static EntityTableBuilder ToAssetTableBuilder(this IEnumerable entities) @@ -8538,23 +8447,10 @@ public static EntityTableBuilder ToFaceSilhouetteTableBuilder(this IEnumerable x._FaceSilhouetteIndexBufferStart?.Index ?? EntityRelation.None)); tb.AddIndexColumn("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd", typedEntities.Select(x => x._FaceSilhouetteIndexBufferEnd?.Index ?? EntityRelation.None)); tb.AddIndexColumn("index:Vim.View:View", typedEntities.Select(x => x._View?.Index ?? EntityRelation.None)); + tb.AddIndexColumn("index:Vim.Material:Material", typedEntities.Select(x => x._Material?.Index ?? EntityRelation.None)); tb.AddIndexColumn("index:Vim.Element:Element", typedEntities.Select(x => x._Element?.Index ?? EntityRelation.None)); return tb; } - public static EntityTableBuilder ToFaceSilhouetteIndexBufferTableBuilder(this IEnumerable entities) - { - var typedEntities = entities?.Cast() ?? Enumerable.Empty(); - var tb = new EntityTableBuilder("Vim.FaceSilhouetteIndexBuffer"); - tb.AddIndexColumn("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex", typedEntities.Select(x => x._VertexIndex?.Index ?? EntityRelation.None)); - return tb; - } - public static EntityTableBuilder ToFaceSilhouetteVertexBufferTableBuilder(this IEnumerable entities) - { - var typedEntities = entities?.Cast() ?? Enumerable.Empty(); - var tb = new EntityTableBuilder("Vim.FaceSilhouetteVertexBuffer"); - tb.AddDataColumn("vector3:Vertex", typedEntities.Select(x => x.Vertex)); - return tb; - } } // DocumentBuilderExtensions public partial class ObjectModelBuilder @@ -8616,8 +8512,6 @@ public partial class ObjectModelBuilder {typeof(Site), new EntityTableBuilder()}, {typeof(Building), new EntityTableBuilder()}, {typeof(FaceSilhouette), new EntityTableBuilder()}, - {typeof(FaceSilhouetteIndexBuffer), new EntityTableBuilder()}, - {typeof(FaceSilhouetteVertexBuffer), new EntityTableBuilder()}, }; } // ObjectModelBuilder } // namespace diff --git a/src/cs/vim/Vim.Format/ObjectModel/ObjectModelStore.cs b/src/cs/vim/Vim.Format/ObjectModel/ObjectModelStore.cs index fd3c04c9..1be33bb5 100644 --- a/src/cs/vim/Vim.Format/ObjectModel/ObjectModelStore.cs +++ b/src/cs/vim/Vim.Format/ObjectModel/ObjectModelStore.cs @@ -21,13 +21,42 @@ public class ObjectModelStore public DocumentBuilder ToDocumentBuilder(string generator, string versionString) { - return ObjectModelBuilder.ToDocumentBuilder(generator, versionString) + var db = ObjectModelBuilder.ToDocumentBuilder(generator, versionString); + AddFaceSilhouetteBuffers(db); + + return db .AddMeshes(Meshes.Select(g => g.Subdivide())) .AddInstances(Instances) .AddShapes(Shapes) .AddMaterials(CreateMaterialBuilders()); } + public List FaceSilhouetteIndexBuffer { get; } = new List(); + public List FaceSilhouetteVertexBuffer { get; } = new List(); + + private void AddFaceSilhouetteBuffers(DocumentBuilder documentBuilder) + { +#if DEBUG + // Validate the index buffer and the vertex buffer + foreach (var index in FaceSilhouetteIndexBuffer) + Debug.Assert(index >= 0 && index < FaceSilhouetteVertexBuffer.Count); +#endif + + // Add the face silhouette index buffer. + { + var tb = new EntityTableBuilder(TableNames.FaceSilhouetteIndexBuffer); + tb.AddDataColumn("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex", FaceSilhouetteIndexBuffer); + documentBuilder.Tables.Add(TableNames.FaceSilhouetteIndexBuffer, tb); + } + + // Add the face silhouette vertex buffer. + { + var tb = new EntityTableBuilder(TableNames.FaceSilhouetteVertexBuffer); + tb.AddDataColumn("vector3:Vertex", FaceSilhouetteVertexBuffer); + documentBuilder.Tables.Add(TableNames.FaceSilhouetteVertexBuffer, tb); + } + } + private IEnumerable CreateMaterialBuilders() => ObjectModelBuilder.GetEntities().Select(ConvertMaterialEntityToRenderableMaterial); diff --git a/src/ts/src/objectModel.ts b/src/ts/src/objectModel.ts index f3772bbc..39b8f3c1 100644 --- a/src/ts/src/objectModel.ts +++ b/src/ts/src/objectModel.ts @@ -10578,6 +10578,8 @@ export interface IFaceSilhouette { faceSilhouetteIndexBufferEnd?: IFaceSilhouetteIndexBuffer viewIndex?: number view?: IView + materialIndex?: number + material?: IMaterial elementIndex?: number element?: IElement } @@ -10596,6 +10598,9 @@ export interface IFaceSilhouetteTable { getViewIndex(faceSilhouetteIndex: number): Promise getAllViewIndex(): Promise getView(faceSilhouetteIndex: number): Promise + getMaterialIndex(faceSilhouetteIndex: number): Promise + getAllMaterialIndex(): Promise + getMaterial(faceSilhouetteIndex: number): Promise getElementIndex(faceSilhouetteIndex: number): Promise getAllElementIndex(): Promise getElement(faceSilhouetteIndex: number): Promise @@ -10610,6 +10615,8 @@ export class FaceSilhouette implements IFaceSilhouette { faceSilhouetteIndexBufferEnd?: IFaceSilhouetteIndexBuffer viewIndex?: number view?: IView + materialIndex?: number + material?: IMaterial elementIndex?: number element?: IElement @@ -10621,6 +10628,7 @@ export class FaceSilhouette implements IFaceSilhouette { table.getFaceSilhouetteIndexBufferStartIndex(index).then(v => result.faceSilhouetteIndexBufferStartIndex = v), table.getFaceSilhouetteIndexBufferEndIndex(index).then(v => result.faceSilhouetteIndexBufferEndIndex = v), table.getViewIndex(index).then(v => result.viewIndex = v), + table.getMaterialIndex(index).then(v => result.materialIndex = v), table.getElementIndex(index).then(v => result.elementIndex = v), ]) @@ -10660,12 +10668,14 @@ export class FaceSilhouetteTable implements IFaceSilhouetteTable { let faceSilhouetteIndexBufferStartIndex: number[] | undefined let faceSilhouetteIndexBufferEndIndex: number[] | undefined let viewIndex: number[] | undefined + let materialIndex: number[] | undefined let elementIndex: number[] | undefined await Promise.all([ (async () => { faceSilhouetteIndexBufferStartIndex = (await localTable.getNumberArray("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart")) })(), (async () => { faceSilhouetteIndexBufferEndIndex = (await localTable.getNumberArray("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd")) })(), (async () => { viewIndex = (await localTable.getNumberArray("index:Vim.View:View")) })(), + (async () => { materialIndex = (await localTable.getNumberArray("index:Vim.Material:Material")) })(), (async () => { elementIndex = (await localTable.getNumberArray("index:Vim.Element:Element")) })(), ]) @@ -10678,6 +10688,7 @@ export class FaceSilhouetteTable implements IFaceSilhouetteTable { faceSilhouetteIndexBufferStartIndex: faceSilhouetteIndexBufferStartIndex ? faceSilhouetteIndexBufferStartIndex[i] : undefined, faceSilhouetteIndexBufferEndIndex: faceSilhouetteIndexBufferEndIndex ? faceSilhouetteIndexBufferEndIndex[i] : undefined, viewIndex: viewIndex ? viewIndex[i] : undefined, + materialIndex: materialIndex ? materialIndex[i] : undefined, elementIndex: elementIndex ? elementIndex[i] : undefined }) } @@ -10739,6 +10750,24 @@ export class FaceSilhouetteTable implements IFaceSilhouetteTable { return await this.document.view?.get(index) } + async getMaterialIndex(faceSilhouetteIndex: number): Promise { + return await this.entityTable.getNumber(faceSilhouetteIndex, "index:Vim.Material:Material") + } + + async getAllMaterialIndex(): Promise { + return await this.entityTable.getNumberArray("index:Vim.Material:Material") + } + + async getMaterial(faceSilhouetteIndex: number): Promise { + const index = await this.getMaterialIndex(faceSilhouetteIndex) + + if (index === undefined) { + return undefined + } + + return await this.document.material?.get(index) + } + async getElementIndex(faceSilhouetteIndex: number): Promise { return await this.entityTable.getNumber(faceSilhouetteIndex, "index:Vim.Element:Element") } From c1550656eb44959f5caef6bd0ef03084727eb630 Mon Sep 17 00:00:00 2001 From: Martin Ashton Date: Thu, 27 Mar 2025 12:41:09 -0400 Subject: [PATCH 3/7] Refactored to FaceMesh --- src/cpp/vim/object-model.h | 208 ++++++------- .../ObjectModelGenerator.cs | 1 - src/cs/vim/Vim.Format.Core/EntityTable.cs | 11 +- .../Geometry/MeshExtensions.cs | 2 - .../Vim.Format.Core/Geometry/MeshSlicer.cs | 169 +++++++++++ src/cs/vim/Vim.Format.Core/VimConstants.cs | 6 +- .../vim/Vim.Format/ObjectModel/ObjectModel.cs | 25 +- .../ObjectModel/ObjectModelGenerated.cs | 282 ++++++++++++------ .../ObjectModel/ObjectModelStore.cs | 20 +- src/ts/src/objectModel.ts | 242 +++++++-------- 10 files changed, 621 insertions(+), 345 deletions(-) create mode 100644 src/cs/vim/Vim.Format.Core/Geometry/MeshSlicer.cs diff --git a/src/cpp/vim/object-model.h b/src/cpp/vim/object-model.h index 9478469b..5ba9cb24 100644 --- a/src/cpp/vim/object-model.h +++ b/src/cpp/vim/object-model.h @@ -120,12 +120,12 @@ namespace Vim class SiteTable; class Building; class BuildingTable; - class FaceSilhouette; - class FaceSilhouetteTable; - class FaceSilhouetteIndexBuffer; - class FaceSilhouetteIndexBufferTable; - class FaceSilhouetteVertexBuffer; - class FaceSilhouetteVertexBufferTable; + class FaceMesh; + class FaceMeshTable; + class FaceMeshIndexBuffer; + class FaceMeshIndexBufferTable; + class FaceMeshVertexBuffer; + class FaceMeshVertexBufferTable; class DocumentModel { @@ -184,9 +184,9 @@ namespace Vim ViewInViewSheetTable* mViewInViewSheet; SiteTable* mSite; BuildingTable* mBuilding; - FaceSilhouetteTable* mFaceSilhouette; - FaceSilhouetteIndexBufferTable* mFaceSilhouetteIndexBuffer; - FaceSilhouetteVertexBufferTable* mFaceSilhouetteVertexBuffer; + FaceMeshTable* mFaceMesh; + FaceMeshIndexBufferTable* mFaceMeshIndexBuffer; + FaceMeshVertexBufferTable* mFaceMeshVertexBuffer; DocumentModel(Scene& scene); ~DocumentModel(); @@ -13895,15 +13895,15 @@ namespace Vim return new BuildingTable(scene.mEntityTables["Vim.Building"], scene.mStrings); } - class FaceSilhouette + class FaceMesh { public: int mIndex; - int mFaceSilhouetteIndexBufferStartIndex; - FaceSilhouetteIndexBuffer* mFaceSilhouetteIndexBufferStart; - int mFaceSilhouetteIndexBufferEndIndex; - FaceSilhouetteIndexBuffer* mFaceSilhouetteIndexBufferEnd; + int mFaceMeshIndexBufferStartIndex; + FaceMeshIndexBuffer* mFaceMeshIndexBufferStart; + int mFaceMeshIndexBufferEndIndex; + FaceMeshIndexBuffer* mFaceMeshIndexBufferEnd; int mViewIndex; View* mView; int mMaterialIndex; @@ -13911,15 +13911,15 @@ namespace Vim int mElementIndex; Element* mElement; - FaceSilhouette() {} + FaceMesh() {} }; - class FaceSilhouetteTable + class FaceMeshTable { EntityTable& mEntityTable; std::vector& mStrings; public: - FaceSilhouetteTable(EntityTable& entityTable, std::vector& strings): + FaceMeshTable(EntityTable& entityTable, std::vector& strings): mEntityTable(entityTable), mStrings(strings) {} size_t GetCount() @@ -13927,139 +13927,139 @@ namespace Vim return mEntityTable.get_count(); } - FaceSilhouette* Get(int faceSilhouetteIndex) + FaceMesh* Get(int faceMeshIndex) { - FaceSilhouette* faceSilhouette = new FaceSilhouette(); - faceSilhouette->mIndex = faceSilhouetteIndex; - faceSilhouette->mFaceSilhouetteIndexBufferStartIndex = GetFaceSilhouetteIndexBufferStartIndex(faceSilhouetteIndex); - faceSilhouette->mFaceSilhouetteIndexBufferEndIndex = GetFaceSilhouetteIndexBufferEndIndex(faceSilhouetteIndex); - faceSilhouette->mViewIndex = GetViewIndex(faceSilhouetteIndex); - faceSilhouette->mMaterialIndex = GetMaterialIndex(faceSilhouetteIndex); - faceSilhouette->mElementIndex = GetElementIndex(faceSilhouetteIndex); - return faceSilhouette; + FaceMesh* faceMesh = new FaceMesh(); + faceMesh->mIndex = faceMeshIndex; + faceMesh->mFaceMeshIndexBufferStartIndex = GetFaceMeshIndexBufferStartIndex(faceMeshIndex); + faceMesh->mFaceMeshIndexBufferEndIndex = GetFaceMeshIndexBufferEndIndex(faceMeshIndex); + faceMesh->mViewIndex = GetViewIndex(faceMeshIndex); + faceMesh->mMaterialIndex = GetMaterialIndex(faceMeshIndex); + faceMesh->mElementIndex = GetElementIndex(faceMeshIndex); + return faceMesh; } - std::vector* GetAll() + std::vector* GetAll() { - bool existsFaceSilhouetteIndexBufferStart = mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart"); - bool existsFaceSilhouetteIndexBufferEnd = mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd"); + bool existsFaceMeshIndexBufferStart = mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferStart"); + bool existsFaceMeshIndexBufferEnd = mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferEnd"); bool existsView = mEntityTable.column_exists("index:Vim.View:View"); bool existsMaterial = mEntityTable.column_exists("index:Vim.Material:Material"); bool existsElement = mEntityTable.column_exists("index:Vim.Element:Element"); const auto count = GetCount(); - std::vector* faceSilhouette = new std::vector(); - faceSilhouette->reserve(count); + std::vector* faceMesh = new std::vector(); + faceMesh->reserve(count); - const std::vector& faceSilhouetteIndexBufferStartData = mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart") ? mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart"] : std::vector(); - const std::vector& faceSilhouetteIndexBufferEndData = mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd") ? mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd"] : std::vector(); + const std::vector& faceMeshIndexBufferStartData = mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferStart") ? mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferStart"] : std::vector(); + const std::vector& faceMeshIndexBufferEndData = mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferEnd") ? mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferEnd"] : std::vector(); const std::vector& viewData = mEntityTable.column_exists("index:Vim.View:View") ? mEntityTable.mIndexColumns["index:Vim.View:View"] : std::vector(); const std::vector& materialData = mEntityTable.column_exists("index:Vim.Material:Material") ? mEntityTable.mIndexColumns["index:Vim.Material:Material"] : std::vector(); const std::vector& elementData = mEntityTable.column_exists("index:Vim.Element:Element") ? mEntityTable.mIndexColumns["index:Vim.Element:Element"] : std::vector(); for (int i = 0; i < count; ++i) { - FaceSilhouette entity; + FaceMesh entity; entity.mIndex = i; - entity.mFaceSilhouetteIndexBufferStartIndex = existsFaceSilhouetteIndexBufferStart ? faceSilhouetteIndexBufferStartData[i] : -1; - entity.mFaceSilhouetteIndexBufferEndIndex = existsFaceSilhouetteIndexBufferEnd ? faceSilhouetteIndexBufferEndData[i] : -1; + entity.mFaceMeshIndexBufferStartIndex = existsFaceMeshIndexBufferStart ? faceMeshIndexBufferStartData[i] : -1; + entity.mFaceMeshIndexBufferEndIndex = existsFaceMeshIndexBufferEnd ? faceMeshIndexBufferEndData[i] : -1; entity.mViewIndex = existsView ? viewData[i] : -1; entity.mMaterialIndex = existsMaterial ? materialData[i] : -1; entity.mElementIndex = existsElement ? elementData[i] : -1; - faceSilhouette->push_back(entity); + faceMesh->push_back(entity); } - return faceSilhouette; + return faceMesh; } - int GetFaceSilhouetteIndexBufferStartIndex(int faceSilhouetteIndex) + int GetFaceMeshIndexBufferStartIndex(int faceMeshIndex) { - if (!mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart")) { + if (!mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferStart")) { return -1; } - if (faceSilhouetteIndex < 0 || faceSilhouetteIndex >= GetCount()) + if (faceMeshIndex < 0 || faceMeshIndex >= GetCount()) return -1; - return mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart"][faceSilhouetteIndex]; + return mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferStart"][faceMeshIndex]; } - int GetFaceSilhouetteIndexBufferEndIndex(int faceSilhouetteIndex) + int GetFaceMeshIndexBufferEndIndex(int faceMeshIndex) { - if (!mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd")) { + if (!mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferEnd")) { return -1; } - if (faceSilhouetteIndex < 0 || faceSilhouetteIndex >= GetCount()) + if (faceMeshIndex < 0 || faceMeshIndex >= GetCount()) return -1; - return mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd"][faceSilhouetteIndex]; + return mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferEnd"][faceMeshIndex]; } - int GetViewIndex(int faceSilhouetteIndex) + int GetViewIndex(int faceMeshIndex) { if (!mEntityTable.column_exists("index:Vim.View:View")) { return -1; } - if (faceSilhouetteIndex < 0 || faceSilhouetteIndex >= GetCount()) + if (faceMeshIndex < 0 || faceMeshIndex >= GetCount()) return -1; - return mEntityTable.mIndexColumns["index:Vim.View:View"][faceSilhouetteIndex]; + return mEntityTable.mIndexColumns["index:Vim.View:View"][faceMeshIndex]; } - int GetMaterialIndex(int faceSilhouetteIndex) + int GetMaterialIndex(int faceMeshIndex) { if (!mEntityTable.column_exists("index:Vim.Material:Material")) { return -1; } - if (faceSilhouetteIndex < 0 || faceSilhouetteIndex >= GetCount()) + if (faceMeshIndex < 0 || faceMeshIndex >= GetCount()) return -1; - return mEntityTable.mIndexColumns["index:Vim.Material:Material"][faceSilhouetteIndex]; + return mEntityTable.mIndexColumns["index:Vim.Material:Material"][faceMeshIndex]; } - int GetElementIndex(int faceSilhouetteIndex) + int GetElementIndex(int faceMeshIndex) { if (!mEntityTable.column_exists("index:Vim.Element:Element")) { return -1; } - if (faceSilhouetteIndex < 0 || faceSilhouetteIndex >= GetCount()) + if (faceMeshIndex < 0 || faceMeshIndex >= GetCount()) return -1; - return mEntityTable.mIndexColumns["index:Vim.Element:Element"][faceSilhouetteIndex]; + return mEntityTable.mIndexColumns["index:Vim.Element:Element"][faceMeshIndex]; } }; - static FaceSilhouetteTable* GetFaceSilhouetteTable(Scene& scene) + static FaceMeshTable* GetFaceMeshTable(Scene& scene) { if (scene.mEntityTables.find("Vim.FaceSilhouette") == scene.mEntityTables.end()) return {}; - return new FaceSilhouetteTable(scene.mEntityTables["Vim.FaceSilhouette"], scene.mStrings); + return new FaceMeshTable(scene.mEntityTables["Vim.FaceSilhouette"], scene.mStrings); } - class FaceSilhouetteIndexBuffer + class FaceMeshIndexBuffer { public: int mIndex; int mVertexIndexIndex; - FaceSilhouetteVertexBuffer* mVertexIndex; + FaceMeshVertexBuffer* mVertexIndex; - FaceSilhouetteIndexBuffer() {} + FaceMeshIndexBuffer() {} }; - class FaceSilhouetteIndexBufferTable + class FaceMeshIndexBufferTable { EntityTable& mEntityTable; std::vector& mStrings; public: - FaceSilhouetteIndexBufferTable(EntityTable& entityTable, std::vector& strings): + FaceMeshIndexBufferTable(EntityTable& entityTable, std::vector& strings): mEntityTable(entityTable), mStrings(strings) {} size_t GetCount() @@ -14067,73 +14067,73 @@ namespace Vim return mEntityTable.get_count(); } - FaceSilhouetteIndexBuffer* Get(int faceSilhouetteIndexBufferIndex) + FaceMeshIndexBuffer* Get(int faceMeshIndexBufferIndex) { - FaceSilhouetteIndexBuffer* faceSilhouetteIndexBuffer = new FaceSilhouetteIndexBuffer(); - faceSilhouetteIndexBuffer->mIndex = faceSilhouetteIndexBufferIndex; - faceSilhouetteIndexBuffer->mVertexIndexIndex = GetVertexIndexIndex(faceSilhouetteIndexBufferIndex); - return faceSilhouetteIndexBuffer; + FaceMeshIndexBuffer* faceMeshIndexBuffer = new FaceMeshIndexBuffer(); + faceMeshIndexBuffer->mIndex = faceMeshIndexBufferIndex; + faceMeshIndexBuffer->mVertexIndexIndex = GetVertexIndexIndex(faceMeshIndexBufferIndex); + return faceMeshIndexBuffer; } - std::vector* GetAll() + std::vector* GetAll() { bool existsVertexIndex = mEntityTable.column_exists("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex"); const auto count = GetCount(); - std::vector* faceSilhouetteIndexBuffer = new std::vector(); - faceSilhouetteIndexBuffer->reserve(count); + std::vector* faceMeshIndexBuffer = new std::vector(); + faceMeshIndexBuffer->reserve(count); const std::vector& vertexIndexData = mEntityTable.column_exists("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex") ? mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteVertexBuffer:VertexIndex"] : std::vector(); for (int i = 0; i < count; ++i) { - FaceSilhouetteIndexBuffer entity; + FaceMeshIndexBuffer entity; entity.mIndex = i; entity.mVertexIndexIndex = existsVertexIndex ? vertexIndexData[i] : -1; - faceSilhouetteIndexBuffer->push_back(entity); + faceMeshIndexBuffer->push_back(entity); } - return faceSilhouetteIndexBuffer; + return faceMeshIndexBuffer; } - int GetVertexIndexIndex(int faceSilhouetteIndexBufferIndex) + int GetVertexIndexIndex(int faceMeshIndexBufferIndex) { if (!mEntityTable.column_exists("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex")) { return -1; } - if (faceSilhouetteIndexBufferIndex < 0 || faceSilhouetteIndexBufferIndex >= GetCount()) + if (faceMeshIndexBufferIndex < 0 || faceMeshIndexBufferIndex >= GetCount()) return -1; - return mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteVertexBuffer:VertexIndex"][faceSilhouetteIndexBufferIndex]; + return mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteVertexBuffer:VertexIndex"][faceMeshIndexBufferIndex]; } }; - static FaceSilhouetteIndexBufferTable* GetFaceSilhouetteIndexBufferTable(Scene& scene) + static FaceMeshIndexBufferTable* GetFaceMeshIndexBufferTable(Scene& scene) { if (scene.mEntityTables.find("Vim.FaceSilhouetteIndexBuffer") == scene.mEntityTables.end()) return {}; - return new FaceSilhouetteIndexBufferTable(scene.mEntityTables["Vim.FaceSilhouetteIndexBuffer"], scene.mStrings); + return new FaceMeshIndexBufferTable(scene.mEntityTables["Vim.FaceSilhouetteIndexBuffer"], scene.mStrings); } - class FaceSilhouetteVertexBuffer + class FaceMeshVertexBuffer { public: int mIndex; Vector3 mVertex; - FaceSilhouetteVertexBuffer() {} + FaceMeshVertexBuffer() {} }; - class FaceSilhouetteVertexBufferTable + class FaceMeshVertexBufferTable { EntityTable& mEntityTable; std::vector& mStrings; public: - FaceSilhouetteVertexBufferTable(EntityTable& entityTable, std::vector& strings): + FaceMeshVertexBufferTable(EntityTable& entityTable, std::vector& strings): mEntityTable(entityTable), mStrings(strings) {} size_t GetCount() @@ -14141,22 +14141,22 @@ namespace Vim return mEntityTable.get_count(); } - FaceSilhouetteVertexBuffer* Get(int faceSilhouetteVertexBufferIndex) + FaceMeshVertexBuffer* Get(int faceMeshVertexBufferIndex) { - FaceSilhouetteVertexBuffer* faceSilhouetteVertexBuffer = new FaceSilhouetteVertexBuffer(); - faceSilhouetteVertexBuffer->mIndex = faceSilhouetteVertexBufferIndex; - faceSilhouetteVertexBuffer->mVertex = GetVertex(faceSilhouetteVertexBufferIndex); - return faceSilhouetteVertexBuffer; + FaceMeshVertexBuffer* faceMeshVertexBuffer = new FaceMeshVertexBuffer(); + faceMeshVertexBuffer->mIndex = faceMeshVertexBufferIndex; + faceMeshVertexBuffer->mVertex = GetVertex(faceMeshVertexBufferIndex); + return faceMeshVertexBuffer; } - std::vector* GetAll() + std::vector* GetAll() { bool existsVertex = mEntityTable.column_exists("vector3:Vertex"); const auto count = GetCount(); - std::vector* faceSilhouetteVertexBuffer = new std::vector(); - faceSilhouetteVertexBuffer->reserve(count); + std::vector* faceMeshVertexBuffer = new std::vector(); + faceMeshVertexBuffer->reserve(count); Vector3* vertexData = new Vector3[count]; if (mEntityTable.column_exists("vector3:Vertex")) { @@ -14165,25 +14165,25 @@ namespace Vim for (int i = 0; i < count; ++i) { - FaceSilhouetteVertexBuffer entity; + FaceMeshVertexBuffer entity; entity.mIndex = i; if (existsVertex) entity.mVertex = vertexData[i]; - faceSilhouetteVertexBuffer->push_back(entity); + faceMeshVertexBuffer->push_back(entity); } delete[] vertexData; - return faceSilhouetteVertexBuffer; + return faceMeshVertexBuffer; } - Vector3 GetVertex(int faceSilhouetteVertexBufferIndex) + Vector3 GetVertex(int faceMeshVertexBufferIndex) { - if (faceSilhouetteVertexBufferIndex < 0 || faceSilhouetteVertexBufferIndex >= GetCount()) + if (faceMeshVertexBufferIndex < 0 || faceMeshVertexBufferIndex >= GetCount()) return {}; if (mEntityTable.column_exists("vector3:Vertex")) { - return *reinterpret_cast(const_cast(mEntityTable.mDataColumns["vector3:Vertex"].begin() + faceSilhouetteVertexBufferIndex * sizeof(Vector3))); + return *reinterpret_cast(const_cast(mEntityTable.mDataColumns["vector3:Vertex"].begin() + faceMeshVertexBufferIndex * sizeof(Vector3))); } return {}; @@ -14207,12 +14207,12 @@ namespace Vim }; - static FaceSilhouetteVertexBufferTable* GetFaceSilhouetteVertexBufferTable(Scene& scene) + static FaceMeshVertexBufferTable* GetFaceMeshVertexBufferTable(Scene& scene) { if (scene.mEntityTables.find("Vim.FaceSilhouetteVertexBuffer") == scene.mEntityTables.end()) return {}; - return new FaceSilhouetteVertexBufferTable(scene.mEntityTables["Vim.FaceSilhouetteVertexBuffer"], scene.mStrings); + return new FaceMeshVertexBufferTable(scene.mEntityTables["Vim.FaceSilhouetteVertexBuffer"], scene.mStrings); } DocumentModel::DocumentModel(Scene& scene) @@ -14271,9 +14271,9 @@ namespace Vim mViewInViewSheet = GetViewInViewSheetTable(scene); mSite = GetSiteTable(scene); mBuilding = GetBuildingTable(scene); - mFaceSilhouette = GetFaceSilhouetteTable(scene); - mFaceSilhouetteIndexBuffer = GetFaceSilhouetteIndexBufferTable(scene); - mFaceSilhouetteVertexBuffer = GetFaceSilhouetteVertexBufferTable(scene); + mFaceMesh = GetFaceMeshTable(scene); + mFaceMeshIndexBuffer = GetFaceMeshIndexBufferTable(scene); + mFaceMeshVertexBuffer = GetFaceMeshVertexBufferTable(scene); } DocumentModel::~DocumentModel() @@ -14332,9 +14332,9 @@ namespace Vim delete mViewInViewSheet; delete mSite; delete mBuilding; - delete mFaceSilhouette; - delete mFaceSilhouetteIndexBuffer; - delete mFaceSilhouetteVertexBuffer; + delete mFaceMesh; + delete mFaceMeshIndexBuffer; + delete mFaceMeshVertexBuffer; } } diff --git a/src/cs/vim/Vim.Format.CodeGen/ObjectModelGenerator.cs b/src/cs/vim/Vim.Format.CodeGen/ObjectModelGenerator.cs index eeb5f877..a4169938 100644 --- a/src/cs/vim/Vim.Format.CodeGen/ObjectModelGenerator.cs +++ b/src/cs/vim/Vim.Format.CodeGen/ObjectModelGenerator.cs @@ -225,7 +225,6 @@ IEnumerable GetEquatableFields(FieldInfo[] fis) private static CodeBuilder WriteDocument(CodeBuilder cb) { var entityTypes = ObjectModelReflection.GetEntityTypes() - .Where(t => !t.IsEntityTableBuffer()) .ToArray(); foreach (var et in entityTypes) diff --git a/src/cs/vim/Vim.Format.Core/EntityTable.cs b/src/cs/vim/Vim.Format.Core/EntityTable.cs index 44360bf9..bb19a30f 100644 --- a/src/cs/vim/Vim.Format.Core/EntityTable.cs +++ b/src/cs/vim/Vim.Format.Core/EntityTable.cs @@ -39,7 +39,7 @@ public IArray GetStringColumnValues(string columnName) ?.Select(Document.GetString) .ToIArray(); - public IArray GetDataColumnValues(string columnName) where T : unmanaged + public T[] GetDataColumnAsTypedArray(string columnName) where T : unmanaged { var type = typeof(T); @@ -51,12 +51,15 @@ public IArray GetDataColumnValues(string columnName) where T : unmanaged return null; if (type == typeof(short)) - return namedBuffer.GetColumnValues().Select(i => (short)i).ToIArray() as IArray; + return namedBuffer.GetColumnValues().Select(i => (short)i).Cast().ToArray(); if (type == typeof(bool)) - return namedBuffer.GetColumnValues().Select(b => b != 0).ToIArray() as IArray; + return namedBuffer.GetColumnValues().Select(b => b != 0).Cast().ToArray(); - return namedBuffer.GetColumnValues().ToIArray(); + return namedBuffer.GetColumnValues(); } + + public IArray GetDataColumnValues(string columnName) where T : unmanaged + => GetDataColumnAsTypedArray(columnName).ToIArray(); } } diff --git a/src/cs/vim/Vim.Format.Core/Geometry/MeshExtensions.cs b/src/cs/vim/Vim.Format.Core/Geometry/MeshExtensions.cs index 506cb3d3..3acf9f91 100644 --- a/src/cs/vim/Vim.Format.Core/Geometry/MeshExtensions.cs +++ b/src/cs/vim/Vim.Format.Core/Geometry/MeshExtensions.cs @@ -447,7 +447,5 @@ public static IArray CornerDataToVertexData(this IMesh mesh, IArray dat return vertexData.ToIArray(); } #endregion - - } } diff --git a/src/cs/vim/Vim.Format.Core/Geometry/MeshSlicer.cs b/src/cs/vim/Vim.Format.Core/Geometry/MeshSlicer.cs new file mode 100644 index 00000000..95398cae --- /dev/null +++ b/src/cs/vim/Vim.Format.Core/Geometry/MeshSlicer.cs @@ -0,0 +1,169 @@ +using System; +using System.Collections.Generic; +using Vim.Math3d; + +namespace Vim.Format.Geometry +{ + public static class MeshSlicer + { + public delegate bool FilterTrianglesPredicate( + int vertexIndex0, + Vector3 vertex0, + int vertexIndex1, + Vector3 vertex1, + int vertexIndex2, + Vector3 vertex2); + + public static MeshSlicerResult FilterTriangles( + IReadOnlyList vertexBuffer, + IReadOnlyList indexBuffer, + FilterTrianglesPredicate predicate) + { + // BREAKDOWN + // + // vertexBuffer: [ ..., v0, v1, v2, v3, ..., v34, v35, v36, v37, ... ] + // + // indexBuffer: [ 34, 35, 36, 34, 36, 37 ..., 0, 1, 2, 0, 2, 3, ... ] + // + // predicate(indexBuffer): [ 34, 36, 37, 0, 1, 2, 0, 2, 3 ] <-- triangle 34, 35, 36 was rejected + // v v v v v v v v v + // newIndexBuffer: [ 0, 1, 2, 3, 4, 5, 3, 5, 6 ] + // | | | | | | / / / + // | | | | | | / / / + // | | | | | | / / / + // | | | | | |/ / / + // | | | | | /| / / + // | | | | _|__/ | / / + // | | | | / | | / / + // | | | |_/ | |_/ / + // | | | | | | / + // v v v v v v v + // newVertexBuffer: [ v34, v36, v37, v0, v1, v2, v3 ] + + var oldToNewIndexMap = new Dictionary(); + var newVertexBuffer = new List(); + var newIndexBuffer = new List(); + + void KeepVertexIndex(int oldVertexIndex, Vector3 vertex) + { + if (!oldToNewIndexMap.TryGetValue(oldVertexIndex, out var mappedVertexIndex)) + { + mappedVertexIndex = oldToNewIndexMap.Count; // 0, 1, 2, ... + oldToNewIndexMap.Add(oldVertexIndex, mappedVertexIndex); + newVertexBuffer.Add(vertex); + } + + newIndexBuffer.Add(mappedVertexIndex); + } + + // Filter the indices. + for (var i = 0; i < indexBuffer.Count; i += 3) + { + var vertexIndex0 = indexBuffer[i]; + var vertexIndex1 = indexBuffer[i + 1]; + var vertexIndex2 = indexBuffer[i + 2]; + + var v0 = vertexBuffer[vertexIndex0]; + var v1 = vertexBuffer[vertexIndex1]; + var v2 = vertexBuffer[vertexIndex2]; + + if (!predicate(vertexIndex0, v0, vertexIndex1, v1, vertexIndex2, v2)) + continue; + + KeepVertexIndex(vertexIndex0, v0); + KeepVertexIndex(vertexIndex1, v1); + KeepVertexIndex(vertexIndex2, v2); + } + + return new MeshSlicerResult(newVertexBuffer.ToArray(), newIndexBuffer.ToArray()); + } + + public static MeshSlicerResult SliceMesh( + IReadOnlyList vertexBuffer, + IReadOnlyList indexBuffer, + int indexBufferStart, + int indexBufferEnd) + { + // BREAKDOWN: + // + // vertexBuffer: [..., vA, vB, vC, vD, ..., vE, vF, vG, ...] + // (indices): ..., 54, 55, 56, 57, ..., 89, 90, 91, ... + // + // indexBuffer: [..., 89, 90, 91, 54, 55, 56, 54, 56, 57, ...] + // [ ^indexBufferStart indexBufferEnd^ ] + // oldIndexSlice: [ 89, 90, 91, 54, 55, 56, 54, 56, 57 ] + // + // oldToNewIndexMap... + // {oldIndex}: { 89, 90, 91, 54, 55, 56, 57 } + // {newIndex}: { 0, 1, 2, 3, 4, 5, 6 } <-- new indices are based on order of insertion of oldIndex into the map. + // + // newVertexBuffer: [ vE, vF, vG, vA, vB, vC, vD ] <-- vertices are added based on order of insertion of oldIndex into the map. + // + // oldIndexSlice --> [ 89, 90, 91, 54, 55, 56, 54, 56, 57 ] + // v v v v v v v v v <-- mapped using oldToNewIndexMap + // newIndexBuffer: [ 0, 1, 2, 3, 4, 5, 3, 5, 6 ] + + if (indexBufferStart < 0 || indexBufferStart >= indexBuffer.Count) + { + return MeshSlicerResult.Empty; + } + + if (indexBufferEnd < 0 + || indexBufferEnd >= indexBuffer.Count + || indexBufferEnd < indexBufferStart) + { + return MeshSlicerResult.Empty; + } + + // Read the indices. + var oldToNewIndexMap = new Dictionary(); + var newVertexBuffer = new List(); + + // Create a slice of the face silhouette index buffer. + var oldIndexSlice = new int[indexBufferEnd - indexBufferStart + 1]; + for (var i = 0; i < oldIndexSlice.Length; i++) + { + var oldIndex = indexBuffer[indexBufferStart + i]; + oldIndexSlice[i] = oldIndex; + + if (!oldToNewIndexMap.ContainsKey(oldIndex)) + { + var newIndex = oldToNewIndexMap.Count; // 0, 1, 2, ... + oldToNewIndexMap.Add(oldIndex, newIndex); + + var vertex = vertexBuffer[oldIndex]; + newVertexBuffer.Add(vertex); + } + } + + // Create a new index buffer starting at 0. + var newIndexBuffer = new int[oldIndexSlice.Length]; + for (var i = 0; i < newIndexBuffer.Length; ++i) + { + var oldIndex = oldIndexSlice[i]; + var newIndex = oldToNewIndexMap[oldIndex]; + newIndexBuffer[i] = newIndex; + } + + return new MeshSlicerResult(newVertexBuffer.ToArray(), newIndexBuffer); + } + } + + public class MeshSlicerResult + { + public Vector3[] VertexBuffer { get; } + public int[] IndexBuffer { get; } + + public MeshSlicerResult(Vector3[] vertexBuffer, int[] indexBuffer) + { + VertexBuffer = vertexBuffer; + IndexBuffer = indexBuffer; + } + + public static MeshSlicerResult Empty + => new MeshSlicerResult(Array.Empty(), Array.Empty()); + + public bool IsEmpty + => VertexBuffer.Length == 0 || IndexBuffer.Length == 0; + } +} diff --git a/src/cs/vim/Vim.Format.Core/VimConstants.cs b/src/cs/vim/Vim.Format.Core/VimConstants.cs index 7e21c7c8..81182685 100644 --- a/src/cs/vim/Vim.Format.Core/VimConstants.cs +++ b/src/cs/vim/Vim.Format.Core/VimConstants.cs @@ -68,9 +68,9 @@ public static class TableNames public const string ViewInViewSheet = "Vim.ViewInViewSheet"; public const string Site = "Vim.Site"; public const string Building = "Vim.Building"; - public const string FaceSilhouette = "Vim.FaceSilhouette"; - public const string FaceSilhouetteIndexBuffer = "Vim.FaceSilhouetteIndexBuffer"; - public const string FaceSilhouetteVertexBuffer = "Vim.FaceSilhouetteVertexBuffer"; + public const string FaceMesh = "Vim.FaceMesh"; + public const string FaceMeshIndexBuffer = "Vim.FaceMeshIndexBuffer"; + public const string FaceMeshVertexBuffer = "Vim.FaceMeshVertexBuffer"; } public static class VimConstants diff --git a/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs b/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs index baa5b92f..289c249a 100644 --- a/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs +++ b/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs @@ -1285,6 +1285,7 @@ public partial class Shape : EntityWithElement [G3dAttributeReference("g3d:shape:vertexoffset:0:int32:1", G3dAttributeReferenceMultiplicity.OneToMany, true)] [G3dAttributeReference("g3d:shape:color:0:float32:4", G3dAttributeReferenceMultiplicity.OneToMany, true)] [G3dAttributeReference("g3d:shape:width:0:float32:1", G3dAttributeReferenceMultiplicity.OneToMany, true)] + [Obsolete("Replaced with FaceSilhouette")] public partial class ShapeCollection : EntityWithElement { } @@ -1773,13 +1774,14 @@ public partial class Building : EntityWithElement } /// - /// Represents an element face projected in a View + /// Represents an element face in a View /// - [TableName(TableNames.FaceSilhouette)] - public partial class FaceSilhouette : EntityWithElement + [TableName(TableNames.FaceMesh)] + // TODO: VimSqlIgnore + public partial class FaceMesh : EntityWithElement { - public Relation _FaceSilhouetteIndexBufferStart; - public Relation _FaceSilhouetteIndexBufferEnd; + public Relation _FaceMeshIndexBufferStart; + public Relation _FaceMeshIndexBufferEnd; public Relation _View; public Relation _Material; } @@ -1787,16 +1789,19 @@ public partial class FaceSilhouette : EntityWithElement /// /// Represents a continuous index buffer of triangular faces. /// - [TableName(TableNames.FaceSilhouetteIndexBuffer)] + [TableName(TableNames.FaceMeshIndexBuffer)] [EntityBuffer] - public partial class FaceSilhouetteIndexBuffer : Entity + public partial class FaceMeshIndexBuffer : Entity { - public Relation _VertexIndex; + public Relation _VertexIndex; } - [TableName(TableNames.FaceSilhouetteVertexBuffer)] + /// + /// Represents a continuous vertex buffer. + /// + [TableName(TableNames.FaceMeshVertexBuffer)] [EntityBuffer] - public partial class FaceSilhouetteVertexBuffer : Entity + public partial class FaceMeshVertexBuffer : Entity { public Vector3 Vertex; } diff --git a/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs b/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs index 9b06f88b..5c892bce 100644 --- a/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs +++ b/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs @@ -1888,17 +1888,17 @@ public override bool FieldsAreEqual(object obj) } // end of class // AUTO-GENERATED - public partial class FaceSilhouette + public partial class FaceMesh { - public Vim.Format.ObjectModel.FaceSilhouetteIndexBuffer FaceSilhouetteIndexBufferStart => _FaceSilhouetteIndexBufferStart.Value; - public Vim.Format.ObjectModel.FaceSilhouetteIndexBuffer FaceSilhouetteIndexBufferEnd => _FaceSilhouetteIndexBufferEnd.Value; + public Vim.Format.ObjectModel.FaceMeshIndexBuffer FaceMeshIndexBufferStart => _FaceMeshIndexBufferStart.Value; + public Vim.Format.ObjectModel.FaceMeshIndexBuffer FaceMeshIndexBufferEnd => _FaceMeshIndexBufferEnd.Value; public Vim.Format.ObjectModel.View View => _View.Value; public Vim.Format.ObjectModel.Material Material => _Material.Value; public Vim.Format.ObjectModel.Element Element => _Element.Value; - public FaceSilhouette() + public FaceMesh() { - _FaceSilhouetteIndexBufferStart = new Relation(); - _FaceSilhouetteIndexBufferEnd = new Relation(); + _FaceMeshIndexBufferStart = new Relation(); + _FaceMeshIndexBufferEnd = new Relation(); _View = new Relation(); _Material = new Relation(); _Element = new Relation(); @@ -1906,12 +1906,12 @@ public FaceSilhouette() public override bool FieldsAreEqual(object obj) { - if ((obj is FaceSilhouette other)) + if ((obj is FaceMesh other)) { var fieldsAreEqual = (Index == other.Index) && - (_FaceSilhouetteIndexBufferStart?.Index == other._FaceSilhouetteIndexBufferStart?.Index) && - (_FaceSilhouetteIndexBufferEnd?.Index == other._FaceSilhouetteIndexBufferEnd?.Index) && + (_FaceMeshIndexBufferStart?.Index == other._FaceMeshIndexBufferStart?.Index) && + (_FaceMeshIndexBufferEnd?.Index == other._FaceMeshIndexBufferEnd?.Index) && (_View?.Index == other._View?.Index) && (_Material?.Index == other._Material?.Index) && (_Element?.Index == other._Element?.Index); @@ -1927,6 +1927,60 @@ public override bool FieldsAreEqual(object obj) } // end of class + // AUTO-GENERATED + public partial class FaceMeshIndexBuffer + { + public Vim.Format.ObjectModel.FaceMeshVertexBuffer VertexIndex => _VertexIndex.Value; + public FaceMeshIndexBuffer() + { + _VertexIndex = new Relation(); + } + + public override bool FieldsAreEqual(object obj) + { + if ((obj is FaceMeshIndexBuffer other)) + { + var fieldsAreEqual = + (Index == other.Index) && + (_VertexIndex?.Index == other._VertexIndex?.Index); + if (!fieldsAreEqual) + { + return false; + } + + return true; + } + return false; + } + + } // end of class + + // AUTO-GENERATED + public partial class FaceMeshVertexBuffer + { + public FaceMeshVertexBuffer() + { + } + + public override bool FieldsAreEqual(object obj) + { + if ((obj is FaceMeshVertexBuffer other)) + { + var fieldsAreEqual = + (Index == other.Index) && + (Vertex == other.Vertex); + if (!fieldsAreEqual) + { + return false; + } + + return true; + } + return false; + } + + } // end of class + public partial class DocumentModel { public ElementIndexMaps ElementIndexMaps { get; } @@ -3779,33 +3833,71 @@ public Building GetBuilding(int n) } - // FaceSilhouette + // FaceMesh + + public EntityTable FaceMeshEntityTable { get; } + + public IArray FaceMeshFaceMeshIndexBufferStartIndex { get; } + public int GetFaceMeshFaceMeshIndexBufferStartIndex(int index) => FaceMeshFaceMeshIndexBufferStartIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; + public IArray FaceMeshFaceMeshIndexBufferEndIndex { get; } + public int GetFaceMeshFaceMeshIndexBufferEndIndex(int index) => FaceMeshFaceMeshIndexBufferEndIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; + public IArray FaceMeshViewIndex { get; } + public int GetFaceMeshViewIndex(int index) => FaceMeshViewIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; + public IArray FaceMeshMaterialIndex { get; } + public int GetFaceMeshMaterialIndex(int index) => FaceMeshMaterialIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; + public IArray FaceMeshElementIndex { get; } + public int GetFaceMeshElementIndex(int index) => FaceMeshElementIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; + public int NumFaceMesh => FaceMeshEntityTable?.NumRows ?? 0; + public IArray FaceMeshList { get; } + public FaceMesh GetFaceMesh(int n) + { + if (n < 0) return null; + var r = new FaceMesh(); + r.Document = Document; + r.Index = n; + r._FaceMeshIndexBufferStart = new Relation(GetFaceMeshFaceMeshIndexBufferStartIndex(n), GetFaceMeshIndexBuffer); + r._FaceMeshIndexBufferEnd = new Relation(GetFaceMeshFaceMeshIndexBufferEndIndex(n), GetFaceMeshIndexBuffer); + r._View = new Relation(GetFaceMeshViewIndex(n), GetView); + r._Material = new Relation(GetFaceMeshMaterialIndex(n), GetMaterial); + r._Element = new Relation(GetFaceMeshElementIndex(n), GetElement); + return r; + } + + + // FaceMeshIndexBuffer + + public EntityTable FaceMeshIndexBufferEntityTable { get; } + + public IArray FaceMeshIndexBufferVertexIndexIndex { get; } + public int GetFaceMeshIndexBufferVertexIndexIndex(int index) => FaceMeshIndexBufferVertexIndexIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; + public int NumFaceMeshIndexBuffer => FaceMeshIndexBufferEntityTable?.NumRows ?? 0; + public IArray FaceMeshIndexBufferList { get; } + public FaceMeshIndexBuffer GetFaceMeshIndexBuffer(int n) + { + if (n < 0) return null; + var r = new FaceMeshIndexBuffer(); + r.Document = Document; + r.Index = n; + r._VertexIndex = new Relation(GetFaceMeshIndexBufferVertexIndexIndex(n), GetFaceMeshVertexBuffer); + return r; + } + + + // FaceMeshVertexBuffer - public EntityTable FaceSilhouetteEntityTable { get; } + public EntityTable FaceMeshVertexBufferEntityTable { get; } - public IArray FaceSilhouetteFaceSilhouetteIndexBufferStartIndex { get; } - public int GetFaceSilhouetteFaceSilhouetteIndexBufferStartIndex(int index) => FaceSilhouetteFaceSilhouetteIndexBufferStartIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; - public IArray FaceSilhouetteFaceSilhouetteIndexBufferEndIndex { get; } - public int GetFaceSilhouetteFaceSilhouetteIndexBufferEndIndex(int index) => FaceSilhouetteFaceSilhouetteIndexBufferEndIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; - public IArray FaceSilhouetteViewIndex { get; } - public int GetFaceSilhouetteViewIndex(int index) => FaceSilhouetteViewIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; - public IArray FaceSilhouetteMaterialIndex { get; } - public int GetFaceSilhouetteMaterialIndex(int index) => FaceSilhouetteMaterialIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; - public IArray FaceSilhouetteElementIndex { get; } - public int GetFaceSilhouetteElementIndex(int index) => FaceSilhouetteElementIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; - public int NumFaceSilhouette => FaceSilhouetteEntityTable?.NumRows ?? 0; - public IArray FaceSilhouetteList { get; } - public FaceSilhouette GetFaceSilhouette(int n) + public IArray FaceMeshVertexBufferVertex { get; } + public Vector3 GetFaceMeshVertexBufferVertex(int index, Vector3 defaultValue = default) => FaceMeshVertexBufferVertex?.ElementAtOrDefault(index, defaultValue) ?? defaultValue; + public int NumFaceMeshVertexBuffer => FaceMeshVertexBufferEntityTable?.NumRows ?? 0; + public IArray FaceMeshVertexBufferList { get; } + public FaceMeshVertexBuffer GetFaceMeshVertexBuffer(int n) { if (n < 0) return null; - var r = new FaceSilhouette(); + var r = new FaceMeshVertexBuffer(); r.Document = Document; r.Index = n; - r._FaceSilhouetteIndexBufferStart = new Relation(GetFaceSilhouetteFaceSilhouetteIndexBufferStartIndex(n), GetFaceSilhouetteIndexBuffer); - r._FaceSilhouetteIndexBufferEnd = new Relation(GetFaceSilhouetteFaceSilhouetteIndexBufferEndIndex(n), GetFaceSilhouetteIndexBuffer); - r._View = new Relation(GetFaceSilhouetteViewIndex(n), GetView); - r._Material = new Relation(GetFaceSilhouetteMaterialIndex(n), GetMaterial); - r._Element = new Relation(GetFaceSilhouetteElementIndex(n), GetElement); + r.Vertex = FaceMeshVertexBufferVertex.ElementAtOrDefault(n); return r; } @@ -3865,7 +3957,9 @@ public FaceSilhouette GetFaceSilhouette(int n) {"Vim.ViewInViewSheet", ViewInViewSheetList.ToEnumerable()}, {"Vim.Site", SiteList.ToEnumerable()}, {"Vim.Building", BuildingList.ToEnumerable()}, - {"Vim.FaceSilhouette", FaceSilhouetteList.ToEnumerable()}, + {"Vim.FaceSilhouette", FaceMeshList.ToEnumerable()}, + {"Vim.FaceSilhouetteIndexBuffer", FaceMeshIndexBufferList.ToEnumerable()}, + {"Vim.FaceSilhouetteVertexBuffer", FaceMeshVertexBufferList.ToEnumerable()}, }; // Entity types from table names @@ -3924,7 +4018,9 @@ public FaceSilhouette GetFaceSilhouette(int n) {"Vim.ViewInViewSheet", typeof(ViewInViewSheet)}, {"Vim.Site", typeof(Site)}, {"Vim.Building", typeof(Building)}, - {"Vim.FaceSilhouette", typeof(FaceSilhouette)}, + {"Vim.FaceSilhouette", typeof(FaceMesh)}, + {"Vim.FaceSilhouetteIndexBuffer", typeof(FaceMeshIndexBuffer)}, + {"Vim.FaceSilhouetteVertexBuffer", typeof(FaceMeshVertexBuffer)}, }; public DocumentModel(Document d, bool inParallel = true) { @@ -3985,7 +4081,9 @@ public DocumentModel(Document d, bool inParallel = true) ViewInViewSheetEntityTable = Document.GetTable("Vim.ViewInViewSheet"); SiteEntityTable = Document.GetTable("Vim.Site"); BuildingEntityTable = Document.GetTable("Vim.Building"); - FaceSilhouetteEntityTable = Document.GetTable("Vim.FaceSilhouette"); + FaceMeshEntityTable = Document.GetTable("Vim.FaceSilhouette"); + FaceMeshIndexBufferEntityTable = Document.GetTable("Vim.FaceSilhouetteIndexBuffer"); + FaceMeshVertexBufferEntityTable = Document.GetTable("Vim.FaceSilhouetteVertexBuffer"); // Initialize entity arrays AssetBufferName = AssetEntityTable?.GetStringColumnValues("string:BufferName") ?? Array.Empty().ToIArray(); @@ -4216,6 +4314,7 @@ public DocumentModel(Document d, bool inParallel = true) BuildingElevation = BuildingEntityTable?.GetDataColumnValues("double:Elevation") ?? Array.Empty().ToIArray(); BuildingTerrainElevation = BuildingEntityTable?.GetDataColumnValues("double:TerrainElevation") ?? Array.Empty().ToIArray(); BuildingAddress = BuildingEntityTable?.GetStringColumnValues("string:Address") ?? Array.Empty().ToIArray(); + FaceMeshVertexBufferVertex = FaceMeshVertexBufferEntityTable?.GetDataColumnValues("vector3:Vertex") ?? Array.Empty().ToIArray(); // Initialize entity relational columns ParameterDescriptorDisplayUnitIndex = ParameterDescriptorEntityTable?.GetIndexColumnValues("index:Vim.DisplayUnit:DisplayUnit") ?? Array.Empty().ToIArray(); @@ -4318,11 +4417,12 @@ public DocumentModel(Document d, bool inParallel = true) SiteElementIndex = SiteEntityTable?.GetIndexColumnValues("index:Vim.Element:Element") ?? Array.Empty().ToIArray(); BuildingSiteIndex = BuildingEntityTable?.GetIndexColumnValues("index:Vim.Site:Site") ?? Array.Empty().ToIArray(); BuildingElementIndex = BuildingEntityTable?.GetIndexColumnValues("index:Vim.Element:Element") ?? Array.Empty().ToIArray(); - FaceSilhouetteFaceSilhouetteIndexBufferStartIndex = FaceSilhouetteEntityTable?.GetIndexColumnValues("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart") ?? Array.Empty().ToIArray(); - FaceSilhouetteFaceSilhouetteIndexBufferEndIndex = FaceSilhouetteEntityTable?.GetIndexColumnValues("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd") ?? Array.Empty().ToIArray(); - FaceSilhouetteViewIndex = FaceSilhouetteEntityTable?.GetIndexColumnValues("index:Vim.View:View") ?? Array.Empty().ToIArray(); - FaceSilhouetteMaterialIndex = FaceSilhouetteEntityTable?.GetIndexColumnValues("index:Vim.Material:Material") ?? Array.Empty().ToIArray(); - FaceSilhouetteElementIndex = FaceSilhouetteEntityTable?.GetIndexColumnValues("index:Vim.Element:Element") ?? Array.Empty().ToIArray(); + FaceMeshFaceMeshIndexBufferStartIndex = FaceMeshEntityTable?.GetIndexColumnValues("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferStart") ?? Array.Empty().ToIArray(); + FaceMeshFaceMeshIndexBufferEndIndex = FaceMeshEntityTable?.GetIndexColumnValues("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferEnd") ?? Array.Empty().ToIArray(); + FaceMeshViewIndex = FaceMeshEntityTable?.GetIndexColumnValues("index:Vim.View:View") ?? Array.Empty().ToIArray(); + FaceMeshMaterialIndex = FaceMeshEntityTable?.GetIndexColumnValues("index:Vim.Material:Material") ?? Array.Empty().ToIArray(); + FaceMeshElementIndex = FaceMeshEntityTable?.GetIndexColumnValues("index:Vim.Element:Element") ?? Array.Empty().ToIArray(); + FaceMeshIndexBufferVertexIndexIndex = FaceMeshIndexBufferEntityTable?.GetIndexColumnValues("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex") ?? Array.Empty().ToIArray(); // Initialize entity collections AssetList = NumAsset.Select(i => GetAsset(i)); @@ -4379,7 +4479,9 @@ public DocumentModel(Document d, bool inParallel = true) ViewInViewSheetList = NumViewInViewSheet.Select(i => GetViewInViewSheet(i)); SiteList = NumSite.Select(i => GetSite(i)); BuildingList = NumBuilding.Select(i => GetBuilding(i)); - FaceSilhouetteList = NumFaceSilhouette.Select(i => GetFaceSilhouette(i)); + FaceMeshList = NumFaceMesh.Select(i => GetFaceMesh(i)); + FaceMeshIndexBufferList = NumFaceMeshIndexBuffer.Select(i => GetFaceMeshIndexBuffer(i)); + FaceMeshVertexBufferList = NumFaceMeshVertexBuffer.Select(i => GetFaceMeshVertexBuffer(i)); // Initialize element index maps ElementIndexMaps = new ElementIndexMaps(this, inParallel); @@ -4563,14 +4665,14 @@ public EntityTableSet(SerializableEntityTable[] rawTables, string[] stringBuffer if (GetRawTableOrDefault("Vim.Building") is SerializableEntityTable buildingTable) BuildingTable = new BuildingTable(buildingTable, stringBuffer); - if (GetRawTableOrDefault("Vim.FaceSilhouette") is SerializableEntityTable facesilhouetteTable) - FaceSilhouetteTable = new FaceSilhouetteTable(facesilhouetteTable, stringBuffer); + if (GetRawTableOrDefault("Vim.FaceSilhouette") is SerializableEntityTable facemeshTable) + FaceMeshTable = new FaceMeshTable(facemeshTable, stringBuffer); - if (GetRawTableOrDefault("Vim.FaceSilhouetteIndexBuffer") is SerializableEntityTable facesilhouetteindexbufferTable) - FaceSilhouetteIndexBufferTable = new FaceSilhouetteIndexBufferTable(facesilhouetteindexbufferTable, stringBuffer); + if (GetRawTableOrDefault("Vim.FaceSilhouetteIndexBuffer") is SerializableEntityTable facemeshindexbufferTable) + FaceMeshIndexBufferTable = new FaceMeshIndexBufferTable(facemeshindexbufferTable, stringBuffer); - if (GetRawTableOrDefault("Vim.FaceSilhouetteVertexBuffer") is SerializableEntityTable facesilhouettevertexbufferTable) - FaceSilhouetteVertexBufferTable = new FaceSilhouetteVertexBufferTable(facesilhouettevertexbufferTable, stringBuffer); + if (GetRawTableOrDefault("Vim.FaceSilhouetteVertexBuffer") is SerializableEntityTable facemeshvertexbufferTable) + FaceMeshVertexBufferTable = new FaceMeshVertexBufferTable(facemeshvertexbufferTable, stringBuffer); // Initialize element index maps ElementIndexMaps = new ElementIndexMaps(this, inParallel); @@ -4685,12 +4787,12 @@ public EntityTableSet(SerializableEntityTable[] rawTables, string[] stringBuffer public Site GetSite(int index) => SiteTable?.Get(index); public BuildingTable BuildingTable { get; } // can be null public Building GetBuilding(int index) => BuildingTable?.Get(index); - public FaceSilhouetteTable FaceSilhouetteTable { get; } // can be null - public FaceSilhouette GetFaceSilhouette(int index) => FaceSilhouetteTable?.Get(index); - public FaceSilhouetteIndexBufferTable FaceSilhouetteIndexBufferTable { get; } // can be null - public FaceSilhouetteIndexBuffer GetFaceSilhouetteIndexBuffer(int index) => FaceSilhouetteIndexBufferTable?.Get(index); - public FaceSilhouetteVertexBufferTable FaceSilhouetteVertexBufferTable { get; } // can be null - public FaceSilhouetteVertexBuffer GetFaceSilhouetteVertexBuffer(int index) => FaceSilhouetteVertexBufferTable?.Get(index); + public FaceMeshTable FaceMeshTable { get; } // can be null + public FaceMesh GetFaceMesh(int index) => FaceMeshTable?.Get(index); + public FaceMeshIndexBufferTable FaceMeshIndexBufferTable { get; } // can be null + public FaceMeshIndexBuffer GetFaceMeshIndexBuffer(int index) => FaceMeshIndexBufferTable?.Get(index); + public FaceMeshVertexBufferTable FaceMeshVertexBufferTable { get; } // can be null + public FaceMeshVertexBuffer GetFaceMeshVertexBuffer(int index) => FaceMeshVertexBufferTable?.Get(index); } // class EntityTableSet public partial class AssetTable : EntityTable_v2, IEnumerable @@ -7609,28 +7711,28 @@ public IEnumerator GetEnumerator() } } // class BuildingTable - public partial class FaceSilhouetteTable : EntityTable_v2, IEnumerable + public partial class FaceMeshTable : EntityTable_v2, IEnumerable { private readonly EntityTableSet _parentTableSet; // can be null - public FaceSilhouetteTable(SerializableEntityTable rawTable, string[] stringBuffer, EntityTableSet parentTableSet = null) : base(rawTable, stringBuffer) + public FaceMeshTable(SerializableEntityTable rawTable, string[] stringBuffer, EntityTableSet parentTableSet = null) : base(rawTable, stringBuffer) { _parentTableSet = parentTableSet; - Column_FaceSilhouetteIndexBufferStartIndex = GetIndexColumnValues("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart") ?? Array.Empty(); - Column_FaceSilhouetteIndexBufferEndIndex = GetIndexColumnValues("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd") ?? Array.Empty(); + Column_FaceMeshIndexBufferStartIndex = GetIndexColumnValues("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferStart") ?? Array.Empty(); + Column_FaceMeshIndexBufferEndIndex = GetIndexColumnValues("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferEnd") ?? Array.Empty(); Column_ViewIndex = GetIndexColumnValues("index:Vim.View:View") ?? Array.Empty(); Column_MaterialIndex = GetIndexColumnValues("index:Vim.Material:Material") ?? Array.Empty(); Column_ElementIndex = GetIndexColumnValues("index:Vim.Element:Element") ?? Array.Empty(); } - public int[] Column_FaceSilhouetteIndexBufferStartIndex { get; } - public int GetFaceSilhouetteIndexBufferStartIndex(int index) => Column_FaceSilhouetteIndexBufferStartIndex.ElementAtOrDefault(index, EntityRelation.None); - public FaceSilhouetteIndexBuffer GetFaceSilhouetteIndexBufferStart(int index) => _GetReferencedFaceSilhouetteIndexBufferStart(GetFaceSilhouetteIndexBufferStartIndex(index)); - private FaceSilhouetteIndexBuffer _GetReferencedFaceSilhouetteIndexBufferStart(int referencedIndex) => _parentTableSet.GetFaceSilhouetteIndexBuffer(referencedIndex); - public int[] Column_FaceSilhouetteIndexBufferEndIndex { get; } - public int GetFaceSilhouetteIndexBufferEndIndex(int index) => Column_FaceSilhouetteIndexBufferEndIndex.ElementAtOrDefault(index, EntityRelation.None); - public FaceSilhouetteIndexBuffer GetFaceSilhouetteIndexBufferEnd(int index) => _GetReferencedFaceSilhouetteIndexBufferEnd(GetFaceSilhouetteIndexBufferEndIndex(index)); - private FaceSilhouetteIndexBuffer _GetReferencedFaceSilhouetteIndexBufferEnd(int referencedIndex) => _parentTableSet.GetFaceSilhouetteIndexBuffer(referencedIndex); + public int[] Column_FaceMeshIndexBufferStartIndex { get; } + public int GetFaceMeshIndexBufferStartIndex(int index) => Column_FaceMeshIndexBufferStartIndex.ElementAtOrDefault(index, EntityRelation.None); + public FaceMeshIndexBuffer GetFaceMeshIndexBufferStart(int index) => _GetReferencedFaceMeshIndexBufferStart(GetFaceMeshIndexBufferStartIndex(index)); + private FaceMeshIndexBuffer _GetReferencedFaceMeshIndexBufferStart(int referencedIndex) => _parentTableSet.GetFaceMeshIndexBuffer(referencedIndex); + public int[] Column_FaceMeshIndexBufferEndIndex { get; } + public int GetFaceMeshIndexBufferEndIndex(int index) => Column_FaceMeshIndexBufferEndIndex.ElementAtOrDefault(index, EntityRelation.None); + public FaceMeshIndexBuffer GetFaceMeshIndexBufferEnd(int index) => _GetReferencedFaceMeshIndexBufferEnd(GetFaceMeshIndexBufferEndIndex(index)); + private FaceMeshIndexBuffer _GetReferencedFaceMeshIndexBufferEnd(int referencedIndex) => _parentTableSet.GetFaceMeshIndexBuffer(referencedIndex); public int[] Column_ViewIndex { get; } public int GetViewIndex(int index) => Column_ViewIndex.ElementAtOrDefault(index, EntityRelation.None); public View GetView(int index) => _GetReferencedView(GetViewIndex(index)); @@ -7644,13 +7746,13 @@ public FaceSilhouetteTable(SerializableEntityTable rawTable, string[] stringBuff public Element GetElement(int index) => _GetReferencedElement(GetElementIndex(index)); private Element _GetReferencedElement(int referencedIndex) => _parentTableSet.GetElement(referencedIndex); // Object Getter - public FaceSilhouette Get(int index) + public FaceMesh Get(int index) { if (index < 0) return null; - var r = new FaceSilhouette(); + var r = new FaceMesh(); r.Index = index; - r._FaceSilhouetteIndexBufferStart = new Relation(GetFaceSilhouetteIndexBufferStartIndex(index), _GetReferencedFaceSilhouetteIndexBufferStart); - r._FaceSilhouetteIndexBufferEnd = new Relation(GetFaceSilhouetteIndexBufferEndIndex(index), _GetReferencedFaceSilhouetteIndexBufferEnd); + r._FaceMeshIndexBufferStart = new Relation(GetFaceMeshIndexBufferStartIndex(index), _GetReferencedFaceMeshIndexBufferStart); + r._FaceMeshIndexBufferEnd = new Relation(GetFaceMeshIndexBufferEndIndex(index), _GetReferencedFaceMeshIndexBufferEnd); r._View = new Relation(GetViewIndex(index), _GetReferencedView); r._Material = new Relation(GetMaterialIndex(index), _GetReferencedMaterial); r._Element = new Relation(GetElementIndex(index), _GetReferencedElement); @@ -7658,18 +7760,18 @@ public FaceSilhouette Get(int index) } // Enumerator IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); - public IEnumerator GetEnumerator() + public IEnumerator GetEnumerator() { for (var i = 0; i < RowCount; ++i) yield return Get(i); } - } // class FaceSilhouetteTable + } // class FaceMeshTable - public partial class FaceSilhouetteIndexBufferTable : EntityTable_v2, IEnumerable + public partial class FaceMeshIndexBufferTable : EntityTable_v2, IEnumerable { private readonly EntityTableSet _parentTableSet; // can be null - public FaceSilhouetteIndexBufferTable(SerializableEntityTable rawTable, string[] stringBuffer, EntityTableSet parentTableSet = null) : base(rawTable, stringBuffer) + public FaceMeshIndexBufferTable(SerializableEntityTable rawTable, string[] stringBuffer, EntityTableSet parentTableSet = null) : base(rawTable, stringBuffer) { _parentTableSet = parentTableSet; Column_VertexIndexIndex = GetIndexColumnValues("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex") ?? Array.Empty(); @@ -7677,31 +7779,31 @@ public FaceSilhouetteIndexBufferTable(SerializableEntityTable rawTable, string[] public int[] Column_VertexIndexIndex { get; } public int GetVertexIndexIndex(int index) => Column_VertexIndexIndex.ElementAtOrDefault(index, EntityRelation.None); - public FaceSilhouetteVertexBuffer GetVertexIndex(int index) => _GetReferencedVertexIndex(GetVertexIndexIndex(index)); - private FaceSilhouetteVertexBuffer _GetReferencedVertexIndex(int referencedIndex) => _parentTableSet.GetFaceSilhouetteVertexBuffer(referencedIndex); + public FaceMeshVertexBuffer GetVertexIndex(int index) => _GetReferencedVertexIndex(GetVertexIndexIndex(index)); + private FaceMeshVertexBuffer _GetReferencedVertexIndex(int referencedIndex) => _parentTableSet.GetFaceMeshVertexBuffer(referencedIndex); // Object Getter - public FaceSilhouetteIndexBuffer Get(int index) + public FaceMeshIndexBuffer Get(int index) { if (index < 0) return null; - var r = new FaceSilhouetteIndexBuffer(); + var r = new FaceMeshIndexBuffer(); r.Index = index; - r._VertexIndex = new Relation(GetVertexIndexIndex(index), _GetReferencedVertexIndex); + r._VertexIndex = new Relation(GetVertexIndexIndex(index), _GetReferencedVertexIndex); return r; } // Enumerator IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); - public IEnumerator GetEnumerator() + public IEnumerator GetEnumerator() { for (var i = 0; i < RowCount; ++i) yield return Get(i); } - } // class FaceSilhouetteIndexBufferTable + } // class FaceMeshIndexBufferTable - public partial class FaceSilhouetteVertexBufferTable : EntityTable_v2, IEnumerable + public partial class FaceMeshVertexBufferTable : EntityTable_v2, IEnumerable { private readonly EntityTableSet _parentTableSet; // can be null - public FaceSilhouetteVertexBufferTable(SerializableEntityTable rawTable, string[] stringBuffer, EntityTableSet parentTableSet = null) : base(rawTable, stringBuffer) + public FaceMeshVertexBufferTable(SerializableEntityTable rawTable, string[] stringBuffer, EntityTableSet parentTableSet = null) : base(rawTable, stringBuffer) { _parentTableSet = parentTableSet; Column_Vertex = GetDataColumnValues("vector3:Vertex") ?? Array.Empty(); @@ -7710,22 +7812,22 @@ public FaceSilhouetteVertexBufferTable(SerializableEntityTable rawTable, string[ public Vector3[] Column_Vertex { get; } public Vector3 GetVertex(int index, Vector3 @default = default) => Column_Vertex.ElementAtOrDefault(index, @default); // Object Getter - public FaceSilhouetteVertexBuffer Get(int index) + public FaceMeshVertexBuffer Get(int index) { if (index < 0) return null; - var r = new FaceSilhouetteVertexBuffer(); + var r = new FaceMeshVertexBuffer(); r.Index = index; r.Vertex = GetVertex(index); return r; } // Enumerator IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); - public IEnumerator GetEnumerator() + public IEnumerator GetEnumerator() { for (var i = 0; i < RowCount; ++i) yield return Get(i); } - } // class FaceSilhouetteVertexBufferTable + } // class FaceMeshVertexBufferTable public static class DocumentBuilderExtensions { @@ -7785,7 +7887,7 @@ public static Func, EntityTableBuilder> GetTableBuilderFunc( if (type == typeof(ViewInViewSheet)) return ToViewInViewSheetTableBuilder; if (type == typeof(Site)) return ToSiteTableBuilder; if (type == typeof(Building)) return ToBuildingTableBuilder; - if (type == typeof(FaceSilhouette)) return ToFaceSilhouetteTableBuilder; + if (type == typeof(FaceMesh)) return ToFaceMeshTableBuilder; throw new ArgumentException(nameof(type)); } public static EntityTableBuilder ToAssetTableBuilder(this IEnumerable entities) @@ -8440,12 +8542,12 @@ public static EntityTableBuilder ToBuildingTableBuilder(this IEnumerable tb.AddIndexColumn("index:Vim.Element:Element", typedEntities.Select(x => x._Element?.Index ?? EntityRelation.None)); return tb; } - public static EntityTableBuilder ToFaceSilhouetteTableBuilder(this IEnumerable entities) + public static EntityTableBuilder ToFaceMeshTableBuilder(this IEnumerable entities) { - var typedEntities = entities?.Cast() ?? Enumerable.Empty(); + var typedEntities = entities?.Cast() ?? Enumerable.Empty(); var tb = new EntityTableBuilder("Vim.FaceSilhouette"); - tb.AddIndexColumn("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart", typedEntities.Select(x => x._FaceSilhouetteIndexBufferStart?.Index ?? EntityRelation.None)); - tb.AddIndexColumn("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd", typedEntities.Select(x => x._FaceSilhouetteIndexBufferEnd?.Index ?? EntityRelation.None)); + tb.AddIndexColumn("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferStart", typedEntities.Select(x => x._FaceMeshIndexBufferStart?.Index ?? EntityRelation.None)); + tb.AddIndexColumn("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferEnd", typedEntities.Select(x => x._FaceMeshIndexBufferEnd?.Index ?? EntityRelation.None)); tb.AddIndexColumn("index:Vim.View:View", typedEntities.Select(x => x._View?.Index ?? EntityRelation.None)); tb.AddIndexColumn("index:Vim.Material:Material", typedEntities.Select(x => x._Material?.Index ?? EntityRelation.None)); tb.AddIndexColumn("index:Vim.Element:Element", typedEntities.Select(x => x._Element?.Index ?? EntityRelation.None)); @@ -8511,7 +8613,7 @@ public partial class ObjectModelBuilder {typeof(ViewInViewSheet), new EntityTableBuilder()}, {typeof(Site), new EntityTableBuilder()}, {typeof(Building), new EntityTableBuilder()}, - {typeof(FaceSilhouette), new EntityTableBuilder()}, + {typeof(FaceMesh), new EntityTableBuilder()}, }; } // ObjectModelBuilder } // namespace diff --git a/src/cs/vim/Vim.Format/ObjectModel/ObjectModelStore.cs b/src/cs/vim/Vim.Format/ObjectModel/ObjectModelStore.cs index 1be33bb5..3faf35e4 100644 --- a/src/cs/vim/Vim.Format/ObjectModel/ObjectModelStore.cs +++ b/src/cs/vim/Vim.Format/ObjectModel/ObjectModelStore.cs @@ -31,29 +31,29 @@ public DocumentBuilder ToDocumentBuilder(string generator, string versionString) .AddMaterials(CreateMaterialBuilders()); } - public List FaceSilhouetteIndexBuffer { get; } = new List(); - public List FaceSilhouetteVertexBuffer { get; } = new List(); + public List FaceMeshIndexBuffer { get; } = new List(); + public List FaceMeshVertexBuffer { get; } = new List(); private void AddFaceSilhouetteBuffers(DocumentBuilder documentBuilder) { #if DEBUG // Validate the index buffer and the vertex buffer - foreach (var index in FaceSilhouetteIndexBuffer) - Debug.Assert(index >= 0 && index < FaceSilhouetteVertexBuffer.Count); + foreach (var index in FaceMeshIndexBuffer) + Debug.Assert(index >= 0 && index < FaceMeshVertexBuffer.Count); #endif // Add the face silhouette index buffer. { - var tb = new EntityTableBuilder(TableNames.FaceSilhouetteIndexBuffer); - tb.AddDataColumn("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex", FaceSilhouetteIndexBuffer); - documentBuilder.Tables.Add(TableNames.FaceSilhouetteIndexBuffer, tb); + var tb = new EntityTableBuilder(TableNames.FaceMeshIndexBuffer); + tb.AddIndexColumn("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex", FaceMeshIndexBuffer); + documentBuilder.Tables.Add(TableNames.FaceMeshIndexBuffer, tb); } // Add the face silhouette vertex buffer. { - var tb = new EntityTableBuilder(TableNames.FaceSilhouetteVertexBuffer); - tb.AddDataColumn("vector3:Vertex", FaceSilhouetteVertexBuffer); - documentBuilder.Tables.Add(TableNames.FaceSilhouetteVertexBuffer, tb); + var tb = new EntityTableBuilder(TableNames.FaceMeshVertexBuffer); + tb.AddDataColumn("vector3:Vertex", FaceMeshVertexBuffer); + documentBuilder.Tables.Add(TableNames.FaceMeshVertexBuffer, tb); } } diff --git a/src/ts/src/objectModel.ts b/src/ts/src/objectModel.ts index 39b8f3c1..31c9cac1 100644 --- a/src/ts/src/objectModel.ts +++ b/src/ts/src/objectModel.ts @@ -10569,13 +10569,13 @@ export class BuildingTable implements IBuildingTable { } -export interface IFaceSilhouette { +export interface IFaceMesh { index: number - faceSilhouetteIndexBufferStartIndex?: number - faceSilhouetteIndexBufferStart?: IFaceSilhouetteIndexBuffer - faceSilhouetteIndexBufferEndIndex?: number - faceSilhouetteIndexBufferEnd?: IFaceSilhouetteIndexBuffer + faceMeshIndexBufferStartIndex?: number + faceMeshIndexBufferStart?: IFaceMeshIndexBuffer + faceMeshIndexBufferEndIndex?: number + faceMeshIndexBufferEnd?: IFaceMeshIndexBuffer viewIndex?: number view?: IView materialIndex?: number @@ -10584,35 +10584,35 @@ export interface IFaceSilhouette { element?: IElement } -export interface IFaceSilhouetteTable { +export interface IFaceMeshTable { getCount(): Promise - get(faceSilhouetteIndex: number): Promise - getAll(): Promise - - getFaceSilhouetteIndexBufferStartIndex(faceSilhouetteIndex: number): Promise - getAllFaceSilhouetteIndexBufferStartIndex(): Promise - getFaceSilhouetteIndexBufferStart(faceSilhouetteIndex: number): Promise - getFaceSilhouetteIndexBufferEndIndex(faceSilhouetteIndex: number): Promise - getAllFaceSilhouetteIndexBufferEndIndex(): Promise - getFaceSilhouetteIndexBufferEnd(faceSilhouetteIndex: number): Promise - getViewIndex(faceSilhouetteIndex: number): Promise + get(faceMeshIndex: number): Promise + getAll(): Promise + + getFaceMeshIndexBufferStartIndex(faceMeshIndex: number): Promise + getAllFaceMeshIndexBufferStartIndex(): Promise + getFaceMeshIndexBufferStart(faceMeshIndex: number): Promise + getFaceMeshIndexBufferEndIndex(faceMeshIndex: number): Promise + getAllFaceMeshIndexBufferEndIndex(): Promise + getFaceMeshIndexBufferEnd(faceMeshIndex: number): Promise + getViewIndex(faceMeshIndex: number): Promise getAllViewIndex(): Promise - getView(faceSilhouetteIndex: number): Promise - getMaterialIndex(faceSilhouetteIndex: number): Promise + getView(faceMeshIndex: number): Promise + getMaterialIndex(faceMeshIndex: number): Promise getAllMaterialIndex(): Promise - getMaterial(faceSilhouetteIndex: number): Promise - getElementIndex(faceSilhouetteIndex: number): Promise + getMaterial(faceMeshIndex: number): Promise + getElementIndex(faceMeshIndex: number): Promise getAllElementIndex(): Promise - getElement(faceSilhouetteIndex: number): Promise + getElement(faceMeshIndex: number): Promise } -export class FaceSilhouette implements IFaceSilhouette { +export class FaceMesh implements IFaceMesh { index: number - faceSilhouetteIndexBufferStartIndex?: number - faceSilhouetteIndexBufferStart?: IFaceSilhouetteIndexBuffer - faceSilhouetteIndexBufferEndIndex?: number - faceSilhouetteIndexBufferEnd?: IFaceSilhouetteIndexBuffer + faceMeshIndexBufferStartIndex?: number + faceMeshIndexBufferStart?: IFaceMeshIndexBuffer + faceMeshIndexBufferEndIndex?: number + faceMeshIndexBufferEnd?: IFaceMeshIndexBuffer viewIndex?: number view?: IView materialIndex?: number @@ -10620,13 +10620,13 @@ export class FaceSilhouette implements IFaceSilhouette { elementIndex?: number element?: IElement - static async createFromTable(table: IFaceSilhouetteTable, index: number): Promise { - let result = new FaceSilhouette() + static async createFromTable(table: IFaceMeshTable, index: number): Promise { + let result = new FaceMesh() result.index = index await Promise.all([ - table.getFaceSilhouetteIndexBufferStartIndex(index).then(v => result.faceSilhouetteIndexBufferStartIndex = v), - table.getFaceSilhouetteIndexBufferEndIndex(index).then(v => result.faceSilhouetteIndexBufferEndIndex = v), + table.getFaceMeshIndexBufferStartIndex(index).then(v => result.faceMeshIndexBufferStartIndex = v), + table.getFaceMeshIndexBufferEndIndex(index).then(v => result.faceMeshIndexBufferEndIndex = v), table.getViewIndex(index).then(v => result.viewIndex = v), table.getMaterialIndex(index).then(v => result.materialIndex = v), table.getElementIndex(index).then(v => result.elementIndex = v), @@ -10636,18 +10636,18 @@ export class FaceSilhouette implements IFaceSilhouette { } } -export class FaceSilhouetteTable implements IFaceSilhouetteTable { +export class FaceMeshTable implements IFaceMeshTable { private document: VimDocument private entityTable: EntityTable - static async createFromDocument(document: VimDocument): Promise { + static async createFromDocument(document: VimDocument): Promise { const entity = await document.entities.getBfast("Vim.FaceSilhouette") if (!entity) { return undefined } - let table = new FaceSilhouetteTable() + let table = new FaceMeshTable() table.document = document table.entityTable = new EntityTable(entity, document.strings) @@ -10658,90 +10658,90 @@ export class FaceSilhouetteTable implements IFaceSilhouetteTable { return this.entityTable.getCount() } - async get(faceSilhouetteIndex: number): Promise { - return await FaceSilhouette.createFromTable(this, faceSilhouetteIndex) + async get(faceMeshIndex: number): Promise { + return await FaceMesh.createFromTable(this, faceMeshIndex) } - async getAll(): Promise { + async getAll(): Promise { const localTable = await this.entityTable.getLocal() - let faceSilhouetteIndexBufferStartIndex: number[] | undefined - let faceSilhouetteIndexBufferEndIndex: number[] | undefined + let faceMeshIndexBufferStartIndex: number[] | undefined + let faceMeshIndexBufferEndIndex: number[] | undefined let viewIndex: number[] | undefined let materialIndex: number[] | undefined let elementIndex: number[] | undefined await Promise.all([ - (async () => { faceSilhouetteIndexBufferStartIndex = (await localTable.getNumberArray("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart")) })(), - (async () => { faceSilhouetteIndexBufferEndIndex = (await localTable.getNumberArray("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd")) })(), + (async () => { faceMeshIndexBufferStartIndex = (await localTable.getNumberArray("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferStart")) })(), + (async () => { faceMeshIndexBufferEndIndex = (await localTable.getNumberArray("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferEnd")) })(), (async () => { viewIndex = (await localTable.getNumberArray("index:Vim.View:View")) })(), (async () => { materialIndex = (await localTable.getNumberArray("index:Vim.Material:Material")) })(), (async () => { elementIndex = (await localTable.getNumberArray("index:Vim.Element:Element")) })(), ]) - let faceSilhouette: IFaceSilhouette[] = [] + let faceMesh: IFaceMesh[] = [] const rowCount = await this.getCount() for (let i = 0; i < rowCount; i++) { - faceSilhouette.push({ + faceMesh.push({ index: i, - faceSilhouetteIndexBufferStartIndex: faceSilhouetteIndexBufferStartIndex ? faceSilhouetteIndexBufferStartIndex[i] : undefined, - faceSilhouetteIndexBufferEndIndex: faceSilhouetteIndexBufferEndIndex ? faceSilhouetteIndexBufferEndIndex[i] : undefined, + faceMeshIndexBufferStartIndex: faceMeshIndexBufferStartIndex ? faceMeshIndexBufferStartIndex[i] : undefined, + faceMeshIndexBufferEndIndex: faceMeshIndexBufferEndIndex ? faceMeshIndexBufferEndIndex[i] : undefined, viewIndex: viewIndex ? viewIndex[i] : undefined, materialIndex: materialIndex ? materialIndex[i] : undefined, elementIndex: elementIndex ? elementIndex[i] : undefined }) } - return faceSilhouette + return faceMesh } - async getFaceSilhouetteIndexBufferStartIndex(faceSilhouetteIndex: number): Promise { - return await this.entityTable.getNumber(faceSilhouetteIndex, "index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart") + async getFaceMeshIndexBufferStartIndex(faceMeshIndex: number): Promise { + return await this.entityTable.getNumber(faceMeshIndex, "index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferStart") } - async getAllFaceSilhouetteIndexBufferStartIndex(): Promise { - return await this.entityTable.getNumberArray("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferStart") + async getAllFaceMeshIndexBufferStartIndex(): Promise { + return await this.entityTable.getNumberArray("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferStart") } - async getFaceSilhouetteIndexBufferStart(faceSilhouetteIndex: number): Promise { - const index = await this.getFaceSilhouetteIndexBufferStartIndex(faceSilhouetteIndex) + async getFaceMeshIndexBufferStart(faceMeshIndex: number): Promise { + const index = await this.getFaceMeshIndexBufferStartIndex(faceMeshIndex) if (index === undefined) { return undefined } - return await this.document.faceSilhouetteIndexBuffer?.get(index) + return await this.document.faceMeshIndexBuffer?.get(index) } - async getFaceSilhouetteIndexBufferEndIndex(faceSilhouetteIndex: number): Promise { - return await this.entityTable.getNumber(faceSilhouetteIndex, "index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd") + async getFaceMeshIndexBufferEndIndex(faceMeshIndex: number): Promise { + return await this.entityTable.getNumber(faceMeshIndex, "index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferEnd") } - async getAllFaceSilhouetteIndexBufferEndIndex(): Promise { - return await this.entityTable.getNumberArray("index:Vim.FaceSilhouetteIndexBuffer:FaceSilhouetteIndexBufferEnd") + async getAllFaceMeshIndexBufferEndIndex(): Promise { + return await this.entityTable.getNumberArray("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferEnd") } - async getFaceSilhouetteIndexBufferEnd(faceSilhouetteIndex: number): Promise { - const index = await this.getFaceSilhouetteIndexBufferEndIndex(faceSilhouetteIndex) + async getFaceMeshIndexBufferEnd(faceMeshIndex: number): Promise { + const index = await this.getFaceMeshIndexBufferEndIndex(faceMeshIndex) if (index === undefined) { return undefined } - return await this.document.faceSilhouetteIndexBuffer?.get(index) + return await this.document.faceMeshIndexBuffer?.get(index) } - async getViewIndex(faceSilhouetteIndex: number): Promise { - return await this.entityTable.getNumber(faceSilhouetteIndex, "index:Vim.View:View") + async getViewIndex(faceMeshIndex: number): Promise { + return await this.entityTable.getNumber(faceMeshIndex, "index:Vim.View:View") } async getAllViewIndex(): Promise { return await this.entityTable.getNumberArray("index:Vim.View:View") } - async getView(faceSilhouetteIndex: number): Promise { - const index = await this.getViewIndex(faceSilhouetteIndex) + async getView(faceMeshIndex: number): Promise { + const index = await this.getViewIndex(faceMeshIndex) if (index === undefined) { return undefined @@ -10750,16 +10750,16 @@ export class FaceSilhouetteTable implements IFaceSilhouetteTable { return await this.document.view?.get(index) } - async getMaterialIndex(faceSilhouetteIndex: number): Promise { - return await this.entityTable.getNumber(faceSilhouetteIndex, "index:Vim.Material:Material") + async getMaterialIndex(faceMeshIndex: number): Promise { + return await this.entityTable.getNumber(faceMeshIndex, "index:Vim.Material:Material") } async getAllMaterialIndex(): Promise { return await this.entityTable.getNumberArray("index:Vim.Material:Material") } - async getMaterial(faceSilhouetteIndex: number): Promise { - const index = await this.getMaterialIndex(faceSilhouetteIndex) + async getMaterial(faceMeshIndex: number): Promise { + const index = await this.getMaterialIndex(faceMeshIndex) if (index === undefined) { return undefined @@ -10768,16 +10768,16 @@ export class FaceSilhouetteTable implements IFaceSilhouetteTable { return await this.document.material?.get(index) } - async getElementIndex(faceSilhouetteIndex: number): Promise { - return await this.entityTable.getNumber(faceSilhouetteIndex, "index:Vim.Element:Element") + async getElementIndex(faceMeshIndex: number): Promise { + return await this.entityTable.getNumber(faceMeshIndex, "index:Vim.Element:Element") } async getAllElementIndex(): Promise { return await this.entityTable.getNumberArray("index:Vim.Element:Element") } - async getElement(faceSilhouetteIndex: number): Promise { - const index = await this.getElementIndex(faceSilhouetteIndex) + async getElement(faceMeshIndex: number): Promise { + const index = await this.getElementIndex(faceMeshIndex) if (index === undefined) { return undefined @@ -10788,31 +10788,31 @@ export class FaceSilhouetteTable implements IFaceSilhouetteTable { } -export interface IFaceSilhouetteIndexBuffer { +export interface IFaceMeshIndexBuffer { index: number vertexIndexIndex?: number - vertexIndex?: IFaceSilhouetteVertexBuffer + vertexIndex?: IFaceMeshVertexBuffer } -export interface IFaceSilhouetteIndexBufferTable { +export interface IFaceMeshIndexBufferTable { getCount(): Promise - get(faceSilhouetteIndexBufferIndex: number): Promise - getAll(): Promise + get(faceMeshIndexBufferIndex: number): Promise + getAll(): Promise - getVertexIndexIndex(faceSilhouetteIndexBufferIndex: number): Promise + getVertexIndexIndex(faceMeshIndexBufferIndex: number): Promise getAllVertexIndexIndex(): Promise - getVertexIndex(faceSilhouetteIndexBufferIndex: number): Promise + getVertexIndex(faceMeshIndexBufferIndex: number): Promise } -export class FaceSilhouetteIndexBuffer implements IFaceSilhouetteIndexBuffer { +export class FaceMeshIndexBuffer implements IFaceMeshIndexBuffer { index: number vertexIndexIndex?: number - vertexIndex?: IFaceSilhouetteVertexBuffer + vertexIndex?: IFaceMeshVertexBuffer - static async createFromTable(table: IFaceSilhouetteIndexBufferTable, index: number): Promise { - let result = new FaceSilhouetteIndexBuffer() + static async createFromTable(table: IFaceMeshIndexBufferTable, index: number): Promise { + let result = new FaceMeshIndexBuffer() result.index = index await Promise.all([ @@ -10823,18 +10823,18 @@ export class FaceSilhouetteIndexBuffer implements IFaceSilhouetteIndexBuffer { } } -export class FaceSilhouetteIndexBufferTable implements IFaceSilhouetteIndexBufferTable { +export class FaceMeshIndexBufferTable implements IFaceMeshIndexBufferTable { private document: VimDocument private entityTable: EntityTable - static async createFromDocument(document: VimDocument): Promise { + static async createFromDocument(document: VimDocument): Promise { const entity = await document.entities.getBfast("Vim.FaceSilhouetteIndexBuffer") if (!entity) { return undefined } - let table = new FaceSilhouetteIndexBufferTable() + let table = new FaceMeshIndexBufferTable() table.document = document table.entityTable = new EntityTable(entity, document.strings) @@ -10845,11 +10845,11 @@ export class FaceSilhouetteIndexBufferTable implements IFaceSilhouetteIndexBuffe return this.entityTable.getCount() } - async get(faceSilhouetteIndexBufferIndex: number): Promise { - return await FaceSilhouetteIndexBuffer.createFromTable(this, faceSilhouetteIndexBufferIndex) + async get(faceMeshIndexBufferIndex: number): Promise { + return await FaceMeshIndexBuffer.createFromTable(this, faceMeshIndexBufferIndex) } - async getAll(): Promise { + async getAll(): Promise { const localTable = await this.entityTable.getLocal() let vertexIndexIndex: number[] | undefined @@ -10858,59 +10858,59 @@ export class FaceSilhouetteIndexBufferTable implements IFaceSilhouetteIndexBuffe (async () => { vertexIndexIndex = (await localTable.getNumberArray("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex")) })(), ]) - let faceSilhouetteIndexBuffer: IFaceSilhouetteIndexBuffer[] = [] + let faceMeshIndexBuffer: IFaceMeshIndexBuffer[] = [] const rowCount = await this.getCount() for (let i = 0; i < rowCount; i++) { - faceSilhouetteIndexBuffer.push({ + faceMeshIndexBuffer.push({ index: i, vertexIndexIndex: vertexIndexIndex ? vertexIndexIndex[i] : undefined }) } - return faceSilhouetteIndexBuffer + return faceMeshIndexBuffer } - async getVertexIndexIndex(faceSilhouetteIndexBufferIndex: number): Promise { - return await this.entityTable.getNumber(faceSilhouetteIndexBufferIndex, "index:Vim.FaceSilhouetteVertexBuffer:VertexIndex") + async getVertexIndexIndex(faceMeshIndexBufferIndex: number): Promise { + return await this.entityTable.getNumber(faceMeshIndexBufferIndex, "index:Vim.FaceSilhouetteVertexBuffer:VertexIndex") } async getAllVertexIndexIndex(): Promise { return await this.entityTable.getNumberArray("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex") } - async getVertexIndex(faceSilhouetteIndexBufferIndex: number): Promise { - const index = await this.getVertexIndexIndex(faceSilhouetteIndexBufferIndex) + async getVertexIndex(faceMeshIndexBufferIndex: number): Promise { + const index = await this.getVertexIndexIndex(faceMeshIndexBufferIndex) if (index === undefined) { return undefined } - return await this.document.faceSilhouetteVertexBuffer?.get(index) + return await this.document.faceMeshVertexBuffer?.get(index) } } -export interface IFaceSilhouetteVertexBuffer { +export interface IFaceMeshVertexBuffer { index: number vertex?: Vector3 } -export interface IFaceSilhouetteVertexBufferTable { +export interface IFaceMeshVertexBufferTable { getCount(): Promise - get(faceSilhouetteVertexBufferIndex: number): Promise - getAll(): Promise + get(faceMeshVertexBufferIndex: number): Promise + getAll(): Promise - getVertex(faceSilhouetteVertexBufferIndex: number): Promise + getVertex(faceMeshVertexBufferIndex: number): Promise getAllVertex(): Promise } -export class FaceSilhouetteVertexBuffer implements IFaceSilhouetteVertexBuffer { +export class FaceMeshVertexBuffer implements IFaceMeshVertexBuffer { index: number vertex?: Vector3 - static async createFromTable(table: IFaceSilhouetteVertexBufferTable, index: number): Promise { - let result = new FaceSilhouetteVertexBuffer() + static async createFromTable(table: IFaceMeshVertexBufferTable, index: number): Promise { + let result = new FaceMeshVertexBuffer() result.index = index await Promise.all([ @@ -10921,17 +10921,17 @@ export class FaceSilhouetteVertexBuffer implements IFaceSilhouetteVertexBuffer { } } -export class FaceSilhouetteVertexBufferTable implements IFaceSilhouetteVertexBufferTable { +export class FaceMeshVertexBufferTable implements IFaceMeshVertexBufferTable { private entityTable: EntityTable - static async createFromDocument(document: VimDocument): Promise { + static async createFromDocument(document: VimDocument): Promise { const entity = await document.entities.getBfast("Vim.FaceSilhouetteVertexBuffer") if (!entity) { return undefined } - let table = new FaceSilhouetteVertexBufferTable() + let table = new FaceMeshVertexBufferTable() table.entityTable = new EntityTable(entity, document.strings) return table @@ -10941,11 +10941,11 @@ export class FaceSilhouetteVertexBufferTable implements IFaceSilhouetteVertexBuf return this.entityTable.getCount() } - async get(faceSilhouetteVertexBufferIndex: number): Promise { - return await FaceSilhouetteVertexBuffer.createFromTable(this, faceSilhouetteVertexBufferIndex) + async get(faceMeshVertexBufferIndex: number): Promise { + return await FaceMeshVertexBuffer.createFromTable(this, faceMeshVertexBufferIndex) } - async getAll(): Promise { + async getAll(): Promise { const localTable = await this.entityTable.getLocal() let vertex: Vector3[] | undefined @@ -10954,21 +10954,21 @@ export class FaceSilhouetteVertexBufferTable implements IFaceSilhouetteVertexBuf (async () => { vertex = (await localTable.getVector3Array("vector3:Vertex")) })(), ]) - let faceSilhouetteVertexBuffer: IFaceSilhouetteVertexBuffer[] = [] + let faceMeshVertexBuffer: IFaceMeshVertexBuffer[] = [] const rowCount = await this.getCount() for (let i = 0; i < rowCount; i++) { - faceSilhouetteVertexBuffer.push({ + faceMeshVertexBuffer.push({ index: i, vertex: vertex ? vertex[i] : undefined }) } - return faceSilhouetteVertexBuffer + return faceMeshVertexBuffer } - async getVertex(faceSilhouetteVertexBufferIndex: number): Promise { - return (await this.entityTable.getVector3(faceSilhouetteVertexBufferIndex, "vector3:Vertex")) + async getVertex(faceMeshVertexBufferIndex: number): Promise { + return (await this.entityTable.getVector3(faceMeshVertexBufferIndex, "vector3:Vertex")) } async getAllVertex(): Promise { @@ -11032,9 +11032,9 @@ export class VimDocument { viewInViewSheet: IViewInViewSheetTable | undefined site: ISiteTable | undefined building: IBuildingTable | undefined - faceSilhouette: IFaceSilhouetteTable | undefined - faceSilhouetteIndexBuffer: IFaceSilhouetteIndexBufferTable | undefined - faceSilhouetteVertexBuffer: IFaceSilhouetteVertexBufferTable | undefined + faceMesh: IFaceMeshTable | undefined + faceMeshIndexBuffer: IFaceMeshIndexBufferTable | undefined + faceMeshVertexBuffer: IFaceMeshVertexBufferTable | undefined entities: BFast strings: string[] | undefined @@ -11106,9 +11106,9 @@ export class VimDocument { doc.viewInViewSheet = await ViewInViewSheetTable.createFromDocument(doc) doc.site = await SiteTable.createFromDocument(doc) doc.building = await BuildingTable.createFromDocument(doc) - doc.faceSilhouette = await FaceSilhouetteTable.createFromDocument(doc) - doc.faceSilhouetteIndexBuffer = await FaceSilhouetteIndexBufferTable.createFromDocument(doc) - doc.faceSilhouetteVertexBuffer = await FaceSilhouetteVertexBufferTable.createFromDocument(doc) + doc.faceMesh = await FaceMeshTable.createFromDocument(doc) + doc.faceMeshIndexBuffer = await FaceMeshIndexBufferTable.createFromDocument(doc) + doc.faceMeshVertexBuffer = await FaceMeshVertexBufferTable.createFromDocument(doc) return doc } From dab8b8b7e17c85088951d52b8c23c0dd838a7161 Mon Sep 17 00:00:00 2001 From: Martin Ashton Date: Thu, 27 Mar 2025 12:50:47 -0400 Subject: [PATCH 4/7] Moved attributes, added VimSqlIgnore attribute --- .../{ => Attributes}/EntityBufferAttribute.cs | 3 +-- .../{ => Attributes}/EntityColumnLoaderAttribute.cs | 0 .../Vim.Format.Core/{ => Attributes}/TableNameAttribute.cs | 0 .../Vim.Format.Core/Attributes/VimSqlIgnoreAttribute.cs | 7 +++++++ src/cs/vim/Vim.Format.Core/ColumnExtensions.Reflection.cs | 3 +++ .../vim/Vim.Format.Core/Vim.Format.Core.csproj.DotSettings | 2 ++ src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs | 4 +++- 7 files changed, 16 insertions(+), 3 deletions(-) rename src/cs/vim/Vim.Format.Core/{ => Attributes}/EntityBufferAttribute.cs (88%) rename src/cs/vim/Vim.Format.Core/{ => Attributes}/EntityColumnLoaderAttribute.cs (100%) rename src/cs/vim/Vim.Format.Core/{ => Attributes}/TableNameAttribute.cs (100%) create mode 100644 src/cs/vim/Vim.Format.Core/Attributes/VimSqlIgnoreAttribute.cs create mode 100644 src/cs/vim/Vim.Format.Core/Vim.Format.Core.csproj.DotSettings diff --git a/src/cs/vim/Vim.Format.Core/EntityBufferAttribute.cs b/src/cs/vim/Vim.Format.Core/Attributes/EntityBufferAttribute.cs similarity index 88% rename from src/cs/vim/Vim.Format.Core/EntityBufferAttribute.cs rename to src/cs/vim/Vim.Format.Core/Attributes/EntityBufferAttribute.cs index 1555e74f..9e62fc25 100644 --- a/src/cs/vim/Vim.Format.Core/EntityBufferAttribute.cs +++ b/src/cs/vim/Vim.Format.Core/Attributes/EntityBufferAttribute.cs @@ -3,6 +3,5 @@ namespace Vim.Format { public class EntityBufferAttribute : Attribute - { - } + { } } diff --git a/src/cs/vim/Vim.Format.Core/EntityColumnLoaderAttribute.cs b/src/cs/vim/Vim.Format.Core/Attributes/EntityColumnLoaderAttribute.cs similarity index 100% rename from src/cs/vim/Vim.Format.Core/EntityColumnLoaderAttribute.cs rename to src/cs/vim/Vim.Format.Core/Attributes/EntityColumnLoaderAttribute.cs diff --git a/src/cs/vim/Vim.Format.Core/TableNameAttribute.cs b/src/cs/vim/Vim.Format.Core/Attributes/TableNameAttribute.cs similarity index 100% rename from src/cs/vim/Vim.Format.Core/TableNameAttribute.cs rename to src/cs/vim/Vim.Format.Core/Attributes/TableNameAttribute.cs diff --git a/src/cs/vim/Vim.Format.Core/Attributes/VimSqlIgnoreAttribute.cs b/src/cs/vim/Vim.Format.Core/Attributes/VimSqlIgnoreAttribute.cs new file mode 100644 index 00000000..02db8073 --- /dev/null +++ b/src/cs/vim/Vim.Format.Core/Attributes/VimSqlIgnoreAttribute.cs @@ -0,0 +1,7 @@ +using System; + +namespace Vim.Format +{ + public class VimSqlIgnoreAttribute : Attribute + { } +} diff --git a/src/cs/vim/Vim.Format.Core/ColumnExtensions.Reflection.cs b/src/cs/vim/Vim.Format.Core/ColumnExtensions.Reflection.cs index 805b9ffa..241a55bd 100644 --- a/src/cs/vim/Vim.Format.Core/ColumnExtensions.Reflection.cs +++ b/src/cs/vim/Vim.Format.Core/ColumnExtensions.Reflection.cs @@ -78,6 +78,9 @@ public static string GetEntityTableName(this Type t) public static bool IsEntityTableBuffer(this Type t) => (t.GetCustomAttribute(typeof(EntityBufferAttribute)) as EntityBufferAttribute) != null; + public static bool IsEntityTableVimSqlIgnore(this Type t) + => (t.GetCustomAttribute(typeof(VimSqlIgnoreAttribute)) as VimSqlIgnoreAttribute) != null; + public static (string IndexColumnName, string LocalFieldName) GetIndexColumnInfo(this FieldInfo fieldInfo) { if (!fieldInfo.Name.StartsWith("_")) diff --git a/src/cs/vim/Vim.Format.Core/Vim.Format.Core.csproj.DotSettings b/src/cs/vim/Vim.Format.Core/Vim.Format.Core.csproj.DotSettings new file mode 100644 index 00000000..bd95c7d7 --- /dev/null +++ b/src/cs/vim/Vim.Format.Core/Vim.Format.Core.csproj.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs b/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs index 289c249a..347ee84c 100644 --- a/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs +++ b/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs @@ -1777,7 +1777,7 @@ public partial class Building : EntityWithElement /// Represents an element face in a View /// [TableName(TableNames.FaceMesh)] - // TODO: VimSqlIgnore + [VimSqlIgnore] public partial class FaceMesh : EntityWithElement { public Relation _FaceMeshIndexBufferStart; @@ -1791,6 +1791,7 @@ public partial class FaceMesh : EntityWithElement /// [TableName(TableNames.FaceMeshIndexBuffer)] [EntityBuffer] + [VimSqlIgnore] public partial class FaceMeshIndexBuffer : Entity { public Relation _VertexIndex; @@ -1801,6 +1802,7 @@ public partial class FaceMeshIndexBuffer : Entity /// [TableName(TableNames.FaceMeshVertexBuffer)] [EntityBuffer] + [VimSqlIgnore] public partial class FaceMeshVertexBuffer : Entity { public Vector3 Vertex; From 734fe954329eeade4f79b17348573f5df9cda378 Mon Sep 17 00:00:00 2001 From: Martin Ashton Date: Thu, 27 Mar 2025 12:53:25 -0400 Subject: [PATCH 5/7] Updated codegen'd items --- src/cpp/vim/object-model.h | 36 ++++++++-------- .../ObjectModel/ObjectModelGenerated.cs | 42 +++++++++---------- src/ts/src/objectModel.ts | 24 +++++------ 3 files changed, 51 insertions(+), 51 deletions(-) diff --git a/src/cpp/vim/object-model.h b/src/cpp/vim/object-model.h index 5ba9cb24..b3bf8d51 100644 --- a/src/cpp/vim/object-model.h +++ b/src/cpp/vim/object-model.h @@ -13941,8 +13941,8 @@ namespace Vim std::vector* GetAll() { - bool existsFaceMeshIndexBufferStart = mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferStart"); - bool existsFaceMeshIndexBufferEnd = mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferEnd"); + bool existsFaceMeshIndexBufferStart = mEntityTable.column_exists("index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferStart"); + bool existsFaceMeshIndexBufferEnd = mEntityTable.column_exists("index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferEnd"); bool existsView = mEntityTable.column_exists("index:Vim.View:View"); bool existsMaterial = mEntityTable.column_exists("index:Vim.Material:Material"); bool existsElement = mEntityTable.column_exists("index:Vim.Element:Element"); @@ -13952,8 +13952,8 @@ namespace Vim std::vector* faceMesh = new std::vector(); faceMesh->reserve(count); - const std::vector& faceMeshIndexBufferStartData = mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferStart") ? mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferStart"] : std::vector(); - const std::vector& faceMeshIndexBufferEndData = mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferEnd") ? mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferEnd"] : std::vector(); + const std::vector& faceMeshIndexBufferStartData = mEntityTable.column_exists("index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferStart") ? mEntityTable.mIndexColumns["index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferStart"] : std::vector(); + const std::vector& faceMeshIndexBufferEndData = mEntityTable.column_exists("index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferEnd") ? mEntityTable.mIndexColumns["index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferEnd"] : std::vector(); const std::vector& viewData = mEntityTable.column_exists("index:Vim.View:View") ? mEntityTable.mIndexColumns["index:Vim.View:View"] : std::vector(); const std::vector& materialData = mEntityTable.column_exists("index:Vim.Material:Material") ? mEntityTable.mIndexColumns["index:Vim.Material:Material"] : std::vector(); const std::vector& elementData = mEntityTable.column_exists("index:Vim.Element:Element") ? mEntityTable.mIndexColumns["index:Vim.Element:Element"] : std::vector(); @@ -13975,26 +13975,26 @@ namespace Vim int GetFaceMeshIndexBufferStartIndex(int faceMeshIndex) { - if (!mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferStart")) { + if (!mEntityTable.column_exists("index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferStart")) { return -1; } if (faceMeshIndex < 0 || faceMeshIndex >= GetCount()) return -1; - return mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferStart"][faceMeshIndex]; + return mEntityTable.mIndexColumns["index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferStart"][faceMeshIndex]; } int GetFaceMeshIndexBufferEndIndex(int faceMeshIndex) { - if (!mEntityTable.column_exists("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferEnd")) { + if (!mEntityTable.column_exists("index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferEnd")) { return -1; } if (faceMeshIndex < 0 || faceMeshIndex >= GetCount()) return -1; - return mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferEnd"][faceMeshIndex]; + return mEntityTable.mIndexColumns["index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferEnd"][faceMeshIndex]; } int GetViewIndex(int faceMeshIndex) @@ -14037,10 +14037,10 @@ namespace Vim static FaceMeshTable* GetFaceMeshTable(Scene& scene) { - if (scene.mEntityTables.find("Vim.FaceSilhouette") == scene.mEntityTables.end()) + if (scene.mEntityTables.find("Vim.FaceMesh") == scene.mEntityTables.end()) return {}; - return new FaceMeshTable(scene.mEntityTables["Vim.FaceSilhouette"], scene.mStrings); + return new FaceMeshTable(scene.mEntityTables["Vim.FaceMesh"], scene.mStrings); } class FaceMeshIndexBuffer @@ -14077,14 +14077,14 @@ namespace Vim std::vector* GetAll() { - bool existsVertexIndex = mEntityTable.column_exists("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex"); + bool existsVertexIndex = mEntityTable.column_exists("index:Vim.FaceMeshVertexBuffer:VertexIndex"); const auto count = GetCount(); std::vector* faceMeshIndexBuffer = new std::vector(); faceMeshIndexBuffer->reserve(count); - const std::vector& vertexIndexData = mEntityTable.column_exists("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex") ? mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteVertexBuffer:VertexIndex"] : std::vector(); + const std::vector& vertexIndexData = mEntityTable.column_exists("index:Vim.FaceMeshVertexBuffer:VertexIndex") ? mEntityTable.mIndexColumns["index:Vim.FaceMeshVertexBuffer:VertexIndex"] : std::vector(); for (int i = 0; i < count; ++i) { @@ -14099,24 +14099,24 @@ namespace Vim int GetVertexIndexIndex(int faceMeshIndexBufferIndex) { - if (!mEntityTable.column_exists("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex")) { + if (!mEntityTable.column_exists("index:Vim.FaceMeshVertexBuffer:VertexIndex")) { return -1; } if (faceMeshIndexBufferIndex < 0 || faceMeshIndexBufferIndex >= GetCount()) return -1; - return mEntityTable.mIndexColumns["index:Vim.FaceSilhouetteVertexBuffer:VertexIndex"][faceMeshIndexBufferIndex]; + return mEntityTable.mIndexColumns["index:Vim.FaceMeshVertexBuffer:VertexIndex"][faceMeshIndexBufferIndex]; } }; static FaceMeshIndexBufferTable* GetFaceMeshIndexBufferTable(Scene& scene) { - if (scene.mEntityTables.find("Vim.FaceSilhouetteIndexBuffer") == scene.mEntityTables.end()) + if (scene.mEntityTables.find("Vim.FaceMeshIndexBuffer") == scene.mEntityTables.end()) return {}; - return new FaceMeshIndexBufferTable(scene.mEntityTables["Vim.FaceSilhouetteIndexBuffer"], scene.mStrings); + return new FaceMeshIndexBufferTable(scene.mEntityTables["Vim.FaceMeshIndexBuffer"], scene.mStrings); } class FaceMeshVertexBuffer @@ -14209,10 +14209,10 @@ namespace Vim static FaceMeshVertexBufferTable* GetFaceMeshVertexBufferTable(Scene& scene) { - if (scene.mEntityTables.find("Vim.FaceSilhouetteVertexBuffer") == scene.mEntityTables.end()) + if (scene.mEntityTables.find("Vim.FaceMeshVertexBuffer") == scene.mEntityTables.end()) return {}; - return new FaceMeshVertexBufferTable(scene.mEntityTables["Vim.FaceSilhouetteVertexBuffer"], scene.mStrings); + return new FaceMeshVertexBufferTable(scene.mEntityTables["Vim.FaceMeshVertexBuffer"], scene.mStrings); } DocumentModel::DocumentModel(Scene& scene) diff --git a/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs b/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs index 5c892bce..909a681c 100644 --- a/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs +++ b/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs @@ -3957,9 +3957,9 @@ public FaceMeshVertexBuffer GetFaceMeshVertexBuffer(int n) {"Vim.ViewInViewSheet", ViewInViewSheetList.ToEnumerable()}, {"Vim.Site", SiteList.ToEnumerable()}, {"Vim.Building", BuildingList.ToEnumerable()}, - {"Vim.FaceSilhouette", FaceMeshList.ToEnumerable()}, - {"Vim.FaceSilhouetteIndexBuffer", FaceMeshIndexBufferList.ToEnumerable()}, - {"Vim.FaceSilhouetteVertexBuffer", FaceMeshVertexBufferList.ToEnumerable()}, + {"Vim.FaceMesh", FaceMeshList.ToEnumerable()}, + {"Vim.FaceMeshIndexBuffer", FaceMeshIndexBufferList.ToEnumerable()}, + {"Vim.FaceMeshVertexBuffer", FaceMeshVertexBufferList.ToEnumerable()}, }; // Entity types from table names @@ -4018,9 +4018,9 @@ public FaceMeshVertexBuffer GetFaceMeshVertexBuffer(int n) {"Vim.ViewInViewSheet", typeof(ViewInViewSheet)}, {"Vim.Site", typeof(Site)}, {"Vim.Building", typeof(Building)}, - {"Vim.FaceSilhouette", typeof(FaceMesh)}, - {"Vim.FaceSilhouetteIndexBuffer", typeof(FaceMeshIndexBuffer)}, - {"Vim.FaceSilhouetteVertexBuffer", typeof(FaceMeshVertexBuffer)}, + {"Vim.FaceMesh", typeof(FaceMesh)}, + {"Vim.FaceMeshIndexBuffer", typeof(FaceMeshIndexBuffer)}, + {"Vim.FaceMeshVertexBuffer", typeof(FaceMeshVertexBuffer)}, }; public DocumentModel(Document d, bool inParallel = true) { @@ -4081,9 +4081,9 @@ public DocumentModel(Document d, bool inParallel = true) ViewInViewSheetEntityTable = Document.GetTable("Vim.ViewInViewSheet"); SiteEntityTable = Document.GetTable("Vim.Site"); BuildingEntityTable = Document.GetTable("Vim.Building"); - FaceMeshEntityTable = Document.GetTable("Vim.FaceSilhouette"); - FaceMeshIndexBufferEntityTable = Document.GetTable("Vim.FaceSilhouetteIndexBuffer"); - FaceMeshVertexBufferEntityTable = Document.GetTable("Vim.FaceSilhouetteVertexBuffer"); + FaceMeshEntityTable = Document.GetTable("Vim.FaceMesh"); + FaceMeshIndexBufferEntityTable = Document.GetTable("Vim.FaceMeshIndexBuffer"); + FaceMeshVertexBufferEntityTable = Document.GetTable("Vim.FaceMeshVertexBuffer"); // Initialize entity arrays AssetBufferName = AssetEntityTable?.GetStringColumnValues("string:BufferName") ?? Array.Empty().ToIArray(); @@ -4417,12 +4417,12 @@ public DocumentModel(Document d, bool inParallel = true) SiteElementIndex = SiteEntityTable?.GetIndexColumnValues("index:Vim.Element:Element") ?? Array.Empty().ToIArray(); BuildingSiteIndex = BuildingEntityTable?.GetIndexColumnValues("index:Vim.Site:Site") ?? Array.Empty().ToIArray(); BuildingElementIndex = BuildingEntityTable?.GetIndexColumnValues("index:Vim.Element:Element") ?? Array.Empty().ToIArray(); - FaceMeshFaceMeshIndexBufferStartIndex = FaceMeshEntityTable?.GetIndexColumnValues("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferStart") ?? Array.Empty().ToIArray(); - FaceMeshFaceMeshIndexBufferEndIndex = FaceMeshEntityTable?.GetIndexColumnValues("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferEnd") ?? Array.Empty().ToIArray(); + FaceMeshFaceMeshIndexBufferStartIndex = FaceMeshEntityTable?.GetIndexColumnValues("index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferStart") ?? Array.Empty().ToIArray(); + FaceMeshFaceMeshIndexBufferEndIndex = FaceMeshEntityTable?.GetIndexColumnValues("index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferEnd") ?? Array.Empty().ToIArray(); FaceMeshViewIndex = FaceMeshEntityTable?.GetIndexColumnValues("index:Vim.View:View") ?? Array.Empty().ToIArray(); FaceMeshMaterialIndex = FaceMeshEntityTable?.GetIndexColumnValues("index:Vim.Material:Material") ?? Array.Empty().ToIArray(); FaceMeshElementIndex = FaceMeshEntityTable?.GetIndexColumnValues("index:Vim.Element:Element") ?? Array.Empty().ToIArray(); - FaceMeshIndexBufferVertexIndexIndex = FaceMeshIndexBufferEntityTable?.GetIndexColumnValues("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex") ?? Array.Empty().ToIArray(); + FaceMeshIndexBufferVertexIndexIndex = FaceMeshIndexBufferEntityTable?.GetIndexColumnValues("index:Vim.FaceMeshVertexBuffer:VertexIndex") ?? Array.Empty().ToIArray(); // Initialize entity collections AssetList = NumAsset.Select(i => GetAsset(i)); @@ -4665,13 +4665,13 @@ public EntityTableSet(SerializableEntityTable[] rawTables, string[] stringBuffer if (GetRawTableOrDefault("Vim.Building") is SerializableEntityTable buildingTable) BuildingTable = new BuildingTable(buildingTable, stringBuffer); - if (GetRawTableOrDefault("Vim.FaceSilhouette") is SerializableEntityTable facemeshTable) + if (GetRawTableOrDefault("Vim.FaceMesh") is SerializableEntityTable facemeshTable) FaceMeshTable = new FaceMeshTable(facemeshTable, stringBuffer); - if (GetRawTableOrDefault("Vim.FaceSilhouetteIndexBuffer") is SerializableEntityTable facemeshindexbufferTable) + if (GetRawTableOrDefault("Vim.FaceMeshIndexBuffer") is SerializableEntityTable facemeshindexbufferTable) FaceMeshIndexBufferTable = new FaceMeshIndexBufferTable(facemeshindexbufferTable, stringBuffer); - if (GetRawTableOrDefault("Vim.FaceSilhouetteVertexBuffer") is SerializableEntityTable facemeshvertexbufferTable) + if (GetRawTableOrDefault("Vim.FaceMeshVertexBuffer") is SerializableEntityTable facemeshvertexbufferTable) FaceMeshVertexBufferTable = new FaceMeshVertexBufferTable(facemeshvertexbufferTable, stringBuffer); // Initialize element index maps @@ -7718,8 +7718,8 @@ public partial class FaceMeshTable : EntityTable_v2, IEnumerable public FaceMeshTable(SerializableEntityTable rawTable, string[] stringBuffer, EntityTableSet parentTableSet = null) : base(rawTable, stringBuffer) { _parentTableSet = parentTableSet; - Column_FaceMeshIndexBufferStartIndex = GetIndexColumnValues("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferStart") ?? Array.Empty(); - Column_FaceMeshIndexBufferEndIndex = GetIndexColumnValues("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferEnd") ?? Array.Empty(); + Column_FaceMeshIndexBufferStartIndex = GetIndexColumnValues("index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferStart") ?? Array.Empty(); + Column_FaceMeshIndexBufferEndIndex = GetIndexColumnValues("index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferEnd") ?? Array.Empty(); Column_ViewIndex = GetIndexColumnValues("index:Vim.View:View") ?? Array.Empty(); Column_MaterialIndex = GetIndexColumnValues("index:Vim.Material:Material") ?? Array.Empty(); Column_ElementIndex = GetIndexColumnValues("index:Vim.Element:Element") ?? Array.Empty(); @@ -7774,7 +7774,7 @@ public partial class FaceMeshIndexBufferTable : EntityTable_v2, IEnumerable(); + Column_VertexIndexIndex = GetIndexColumnValues("index:Vim.FaceMeshVertexBuffer:VertexIndex") ?? Array.Empty(); } public int[] Column_VertexIndexIndex { get; } @@ -8545,9 +8545,9 @@ public static EntityTableBuilder ToBuildingTableBuilder(this IEnumerable public static EntityTableBuilder ToFaceMeshTableBuilder(this IEnumerable entities) { var typedEntities = entities?.Cast() ?? Enumerable.Empty(); - var tb = new EntityTableBuilder("Vim.FaceSilhouette"); - tb.AddIndexColumn("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferStart", typedEntities.Select(x => x._FaceMeshIndexBufferStart?.Index ?? EntityRelation.None)); - tb.AddIndexColumn("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferEnd", typedEntities.Select(x => x._FaceMeshIndexBufferEnd?.Index ?? EntityRelation.None)); + var tb = new EntityTableBuilder("Vim.FaceMesh"); + tb.AddIndexColumn("index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferStart", typedEntities.Select(x => x._FaceMeshIndexBufferStart?.Index ?? EntityRelation.None)); + tb.AddIndexColumn("index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferEnd", typedEntities.Select(x => x._FaceMeshIndexBufferEnd?.Index ?? EntityRelation.None)); tb.AddIndexColumn("index:Vim.View:View", typedEntities.Select(x => x._View?.Index ?? EntityRelation.None)); tb.AddIndexColumn("index:Vim.Material:Material", typedEntities.Select(x => x._Material?.Index ?? EntityRelation.None)); tb.AddIndexColumn("index:Vim.Element:Element", typedEntities.Select(x => x._Element?.Index ?? EntityRelation.None)); diff --git a/src/ts/src/objectModel.ts b/src/ts/src/objectModel.ts index 31c9cac1..6b206680 100644 --- a/src/ts/src/objectModel.ts +++ b/src/ts/src/objectModel.ts @@ -10641,7 +10641,7 @@ export class FaceMeshTable implements IFaceMeshTable { private entityTable: EntityTable static async createFromDocument(document: VimDocument): Promise { - const entity = await document.entities.getBfast("Vim.FaceSilhouette") + const entity = await document.entities.getBfast("Vim.FaceMesh") if (!entity) { return undefined @@ -10672,8 +10672,8 @@ export class FaceMeshTable implements IFaceMeshTable { let elementIndex: number[] | undefined await Promise.all([ - (async () => { faceMeshIndexBufferStartIndex = (await localTable.getNumberArray("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferStart")) })(), - (async () => { faceMeshIndexBufferEndIndex = (await localTable.getNumberArray("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferEnd")) })(), + (async () => { faceMeshIndexBufferStartIndex = (await localTable.getNumberArray("index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferStart")) })(), + (async () => { faceMeshIndexBufferEndIndex = (await localTable.getNumberArray("index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferEnd")) })(), (async () => { viewIndex = (await localTable.getNumberArray("index:Vim.View:View")) })(), (async () => { materialIndex = (await localTable.getNumberArray("index:Vim.Material:Material")) })(), (async () => { elementIndex = (await localTable.getNumberArray("index:Vim.Element:Element")) })(), @@ -10697,11 +10697,11 @@ export class FaceMeshTable implements IFaceMeshTable { } async getFaceMeshIndexBufferStartIndex(faceMeshIndex: number): Promise { - return await this.entityTable.getNumber(faceMeshIndex, "index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferStart") + return await this.entityTable.getNumber(faceMeshIndex, "index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferStart") } async getAllFaceMeshIndexBufferStartIndex(): Promise { - return await this.entityTable.getNumberArray("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferStart") + return await this.entityTable.getNumberArray("index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferStart") } async getFaceMeshIndexBufferStart(faceMeshIndex: number): Promise { @@ -10715,11 +10715,11 @@ export class FaceMeshTable implements IFaceMeshTable { } async getFaceMeshIndexBufferEndIndex(faceMeshIndex: number): Promise { - return await this.entityTable.getNumber(faceMeshIndex, "index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferEnd") + return await this.entityTable.getNumber(faceMeshIndex, "index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferEnd") } async getAllFaceMeshIndexBufferEndIndex(): Promise { - return await this.entityTable.getNumberArray("index:Vim.FaceSilhouetteIndexBuffer:FaceMeshIndexBufferEnd") + return await this.entityTable.getNumberArray("index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferEnd") } async getFaceMeshIndexBufferEnd(faceMeshIndex: number): Promise { @@ -10828,7 +10828,7 @@ export class FaceMeshIndexBufferTable implements IFaceMeshIndexBufferTable { private entityTable: EntityTable static async createFromDocument(document: VimDocument): Promise { - const entity = await document.entities.getBfast("Vim.FaceSilhouetteIndexBuffer") + const entity = await document.entities.getBfast("Vim.FaceMeshIndexBuffer") if (!entity) { return undefined @@ -10855,7 +10855,7 @@ export class FaceMeshIndexBufferTable implements IFaceMeshIndexBufferTable { let vertexIndexIndex: number[] | undefined await Promise.all([ - (async () => { vertexIndexIndex = (await localTable.getNumberArray("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex")) })(), + (async () => { vertexIndexIndex = (await localTable.getNumberArray("index:Vim.FaceMeshVertexBuffer:VertexIndex")) })(), ]) let faceMeshIndexBuffer: IFaceMeshIndexBuffer[] = [] @@ -10872,11 +10872,11 @@ export class FaceMeshIndexBufferTable implements IFaceMeshIndexBufferTable { } async getVertexIndexIndex(faceMeshIndexBufferIndex: number): Promise { - return await this.entityTable.getNumber(faceMeshIndexBufferIndex, "index:Vim.FaceSilhouetteVertexBuffer:VertexIndex") + return await this.entityTable.getNumber(faceMeshIndexBufferIndex, "index:Vim.FaceMeshVertexBuffer:VertexIndex") } async getAllVertexIndexIndex(): Promise { - return await this.entityTable.getNumberArray("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex") + return await this.entityTable.getNumberArray("index:Vim.FaceMeshVertexBuffer:VertexIndex") } async getVertexIndex(faceMeshIndexBufferIndex: number): Promise { @@ -10925,7 +10925,7 @@ export class FaceMeshVertexBufferTable implements IFaceMeshVertexBufferTable { private entityTable: EntityTable static async createFromDocument(document: VimDocument): Promise { - const entity = await document.entities.getBfast("Vim.FaceSilhouetteVertexBuffer") + const entity = await document.entities.getBfast("Vim.FaceMeshVertexBuffer") if (!entity) { return undefined From 3f35004f8095fc874c78e1e7df5941afd6aa4d9d Mon Sep 17 00:00:00 2001 From: Martin Ashton Date: Thu, 27 Mar 2025 17:31:27 -0400 Subject: [PATCH 6/7] Updated with LineShape --- src/cpp/vim/object-model.h | 315 ++++++++++++++++++ src/cpp/vim/vim.h | 10 + .../ObjectModelCppGenerator.cs | 1 + .../ObjectModelTypeScriptGenerator.cs | 3 + .../ColumnExtensions.Buffer.cs | 8 + .../vim/Vim.Format.Core/ColumnExtensions.cs | 1 + src/cs/vim/Vim.Format.Core/EntityTable.cs | 3 +- .../vim/Vim.Format.Core/EntityTableBuilder.cs | 3 + .../Vim.Format.Core/Geometry/MeshSlicer.cs | 2 +- src/cs/vim/Vim.Format.Core/Serializer.cs | 5 + src/cs/vim/Vim.Format.Core/VimConstants.cs | 3 + .../Vim.Format.Tests/EntityTable_v2_Tests.cs | 1 - .../vim/Vim.Format/ObjectModel/ObjectModel.cs | 45 ++- .../ObjectModel/ObjectModelGenerated.cs | 245 ++++++++++++++ .../ObjectModel/ObjectModelStore.cs | 25 +- src/ts/src/entityTable.ts | 21 +- src/ts/src/objectModel.ts | 313 +++++++++++++++++ 17 files changed, 982 insertions(+), 22 deletions(-) diff --git a/src/cpp/vim/object-model.h b/src/cpp/vim/object-model.h index b3bf8d51..838b3449 100644 --- a/src/cpp/vim/object-model.h +++ b/src/cpp/vim/object-model.h @@ -126,6 +126,10 @@ namespace Vim class FaceMeshIndexBufferTable; class FaceMeshVertexBuffer; class FaceMeshVertexBufferTable; + class LineShape; + class LineShapeTable; + class LineShapeVertexBuffer; + class LineShapeVertexBufferTable; class DocumentModel { @@ -187,6 +191,8 @@ namespace Vim FaceMeshTable* mFaceMesh; FaceMeshIndexBufferTable* mFaceMeshIndexBuffer; FaceMeshVertexBufferTable* mFaceMeshVertexBuffer; + LineShapeTable* mLineShape; + LineShapeVertexBufferTable* mLineShapeVertexBuffer; DocumentModel(Scene& scene); ~DocumentModel(); @@ -14215,6 +14221,311 @@ namespace Vim return new FaceMeshVertexBufferTable(scene.mEntityTables["Vim.FaceMeshVertexBuffer"], scene.mStrings); } + class LineShape + { + public: + int mIndex; + Vector4 mColor; + double mWidth; + + int mLineShapeVertexBufferStartIndex; + LineShapeVertexBuffer* mLineShapeVertexBufferStart; + int mLineShapeVertexBufferEndIndex; + LineShapeVertexBuffer* mLineShapeVertexBufferEnd; + int mViewIndex; + View* mView; + int mElementIndex; + Element* mElement; + + LineShape() {} + }; + + class LineShapeTable + { + EntityTable& mEntityTable; + std::vector& mStrings; + public: + LineShapeTable(EntityTable& entityTable, std::vector& strings): + mEntityTable(entityTable), mStrings(strings) {} + + size_t GetCount() + { + return mEntityTable.get_count(); + } + + LineShape* Get(int lineShapeIndex) + { + LineShape* lineShape = new LineShape(); + lineShape->mIndex = lineShapeIndex; + lineShape->mColor = GetColor(lineShapeIndex); + lineShape->mWidth = GetWidth(lineShapeIndex); + lineShape->mLineShapeVertexBufferStartIndex = GetLineShapeVertexBufferStartIndex(lineShapeIndex); + lineShape->mLineShapeVertexBufferEndIndex = GetLineShapeVertexBufferEndIndex(lineShapeIndex); + lineShape->mViewIndex = GetViewIndex(lineShapeIndex); + lineShape->mElementIndex = GetElementIndex(lineShapeIndex); + return lineShape; + } + + std::vector* GetAll() + { + bool existsColor = mEntityTable.column_exists("vector4:Color"); + bool existsWidth = mEntityTable.column_exists("double:Width"); + bool existsLineShapeVertexBufferStart = mEntityTable.column_exists("index:Vim.LineShapeVertexBuffer:LineShapeVertexBufferStart"); + bool existsLineShapeVertexBufferEnd = mEntityTable.column_exists("index:Vim.LineShapeVertexBuffer:LineShapeVertexBufferEnd"); + bool existsView = mEntityTable.column_exists("index:Vim.View:View"); + bool existsElement = mEntityTable.column_exists("index:Vim.Element:Element"); + + const auto count = GetCount(); + + std::vector* lineShape = new std::vector(); + lineShape->reserve(count); + + Vector4* colorData = new Vector4[count]; + if (mEntityTable.column_exists("vector4:Color")) { + memcpy(colorData, mEntityTable.mDataColumns["vector4:Color"].begin(), count * sizeof(Vector4)); + } + + double* widthData = new double[count]; + if (mEntityTable.column_exists("double:Width")) { + memcpy(widthData, mEntityTable.mDataColumns["double:Width"].begin(), count * sizeof(double)); + } + + const std::vector& lineShapeVertexBufferStartData = mEntityTable.column_exists("index:Vim.LineShapeVertexBuffer:LineShapeVertexBufferStart") ? mEntityTable.mIndexColumns["index:Vim.LineShapeVertexBuffer:LineShapeVertexBufferStart"] : std::vector(); + const std::vector& lineShapeVertexBufferEndData = mEntityTable.column_exists("index:Vim.LineShapeVertexBuffer:LineShapeVertexBufferEnd") ? mEntityTable.mIndexColumns["index:Vim.LineShapeVertexBuffer:LineShapeVertexBufferEnd"] : std::vector(); + const std::vector& viewData = mEntityTable.column_exists("index:Vim.View:View") ? mEntityTable.mIndexColumns["index:Vim.View:View"] : std::vector(); + const std::vector& elementData = mEntityTable.column_exists("index:Vim.Element:Element") ? mEntityTable.mIndexColumns["index:Vim.Element:Element"] : std::vector(); + + for (int i = 0; i < count; ++i) + { + LineShape entity; + entity.mIndex = i; + if (existsColor) + entity.mColor = colorData[i]; + if (existsWidth) + entity.mWidth = widthData[i]; + entity.mLineShapeVertexBufferStartIndex = existsLineShapeVertexBufferStart ? lineShapeVertexBufferStartData[i] : -1; + entity.mLineShapeVertexBufferEndIndex = existsLineShapeVertexBufferEnd ? lineShapeVertexBufferEndData[i] : -1; + entity.mViewIndex = existsView ? viewData[i] : -1; + entity.mElementIndex = existsElement ? elementData[i] : -1; + lineShape->push_back(entity); + } + + delete[] colorData; + delete[] widthData; + + return lineShape; + } + + Vector4 GetColor(int lineShapeIndex) + { + if (lineShapeIndex < 0 || lineShapeIndex >= GetCount()) + return {}; + + if (mEntityTable.column_exists("vector4:Color")) { + return *reinterpret_cast(const_cast(mEntityTable.mDataColumns["vector4:Color"].begin() + lineShapeIndex * sizeof(Vector4))); + } + + return {}; + } + + std::vector* GetAllColor() + { + const auto count = GetCount(); + + Vector4* colorData = new Vector4[count]; + if (mEntityTable.column_exists("vector4:Color")) { + memcpy(colorData, mEntityTable.mDataColumns["vector4:Color"].begin(), count * sizeof(Vector4)); + } + + std::vector* result = new std::vector(colorData, colorData + count); + + delete[] colorData; + + return result; + } + + double GetWidth(int lineShapeIndex) + { + if (lineShapeIndex < 0 || lineShapeIndex >= GetCount()) + return {}; + + if (mEntityTable.column_exists("double:Width")) { + return *reinterpret_cast(const_cast(mEntityTable.mDataColumns["double:Width"].begin() + lineShapeIndex * sizeof(double))); + } + + return {}; + } + + std::vector* GetAllWidth() + { + const auto count = GetCount(); + + double* widthData = new double[count]; + if (mEntityTable.column_exists("double:Width")) { + memcpy(widthData, mEntityTable.mDataColumns["double:Width"].begin(), count * sizeof(double)); + } + + std::vector* result = new std::vector(widthData, widthData + count); + + delete[] widthData; + + return result; + } + + int GetLineShapeVertexBufferStartIndex(int lineShapeIndex) + { + if (!mEntityTable.column_exists("index:Vim.LineShapeVertexBuffer:LineShapeVertexBufferStart")) { + return -1; + } + + if (lineShapeIndex < 0 || lineShapeIndex >= GetCount()) + return -1; + + return mEntityTable.mIndexColumns["index:Vim.LineShapeVertexBuffer:LineShapeVertexBufferStart"][lineShapeIndex]; + } + + int GetLineShapeVertexBufferEndIndex(int lineShapeIndex) + { + if (!mEntityTable.column_exists("index:Vim.LineShapeVertexBuffer:LineShapeVertexBufferEnd")) { + return -1; + } + + if (lineShapeIndex < 0 || lineShapeIndex >= GetCount()) + return -1; + + return mEntityTable.mIndexColumns["index:Vim.LineShapeVertexBuffer:LineShapeVertexBufferEnd"][lineShapeIndex]; + } + + int GetViewIndex(int lineShapeIndex) + { + if (!mEntityTable.column_exists("index:Vim.View:View")) { + return -1; + } + + if (lineShapeIndex < 0 || lineShapeIndex >= GetCount()) + return -1; + + return mEntityTable.mIndexColumns["index:Vim.View:View"][lineShapeIndex]; + } + + int GetElementIndex(int lineShapeIndex) + { + if (!mEntityTable.column_exists("index:Vim.Element:Element")) { + return -1; + } + + if (lineShapeIndex < 0 || lineShapeIndex >= GetCount()) + return -1; + + return mEntityTable.mIndexColumns["index:Vim.Element:Element"][lineShapeIndex]; + } + + }; + + static LineShapeTable* GetLineShapeTable(Scene& scene) + { + if (scene.mEntityTables.find("Vim.LineShape") == scene.mEntityTables.end()) + return {}; + + return new LineShapeTable(scene.mEntityTables["Vim.LineShape"], scene.mStrings); + } + + class LineShapeVertexBuffer + { + public: + int mIndex; + Vector3 mVertex; + + LineShapeVertexBuffer() {} + }; + + class LineShapeVertexBufferTable + { + EntityTable& mEntityTable; + std::vector& mStrings; + public: + LineShapeVertexBufferTable(EntityTable& entityTable, std::vector& strings): + mEntityTable(entityTable), mStrings(strings) {} + + size_t GetCount() + { + return mEntityTable.get_count(); + } + + LineShapeVertexBuffer* Get(int lineShapeVertexBufferIndex) + { + LineShapeVertexBuffer* lineShapeVertexBuffer = new LineShapeVertexBuffer(); + lineShapeVertexBuffer->mIndex = lineShapeVertexBufferIndex; + lineShapeVertexBuffer->mVertex = GetVertex(lineShapeVertexBufferIndex); + return lineShapeVertexBuffer; + } + + std::vector* GetAll() + { + bool existsVertex = mEntityTable.column_exists("vector3:Vertex"); + + const auto count = GetCount(); + + std::vector* lineShapeVertexBuffer = new std::vector(); + lineShapeVertexBuffer->reserve(count); + + Vector3* vertexData = new Vector3[count]; + if (mEntityTable.column_exists("vector3:Vertex")) { + memcpy(vertexData, mEntityTable.mDataColumns["vector3:Vertex"].begin(), count * sizeof(Vector3)); + } + + for (int i = 0; i < count; ++i) + { + LineShapeVertexBuffer entity; + entity.mIndex = i; + if (existsVertex) + entity.mVertex = vertexData[i]; + lineShapeVertexBuffer->push_back(entity); + } + + delete[] vertexData; + + return lineShapeVertexBuffer; + } + + Vector3 GetVertex(int lineShapeVertexBufferIndex) + { + if (lineShapeVertexBufferIndex < 0 || lineShapeVertexBufferIndex >= GetCount()) + return {}; + + if (mEntityTable.column_exists("vector3:Vertex")) { + return *reinterpret_cast(const_cast(mEntityTable.mDataColumns["vector3:Vertex"].begin() + lineShapeVertexBufferIndex * sizeof(Vector3))); + } + + return {}; + } + + std::vector* GetAllVertex() + { + const auto count = GetCount(); + + Vector3* vertexData = new Vector3[count]; + if (mEntityTable.column_exists("vector3:Vertex")) { + memcpy(vertexData, mEntityTable.mDataColumns["vector3:Vertex"].begin(), count * sizeof(Vector3)); + } + + std::vector* result = new std::vector(vertexData, vertexData + count); + + delete[] vertexData; + + return result; + } + + }; + + static LineShapeVertexBufferTable* GetLineShapeVertexBufferTable(Scene& scene) + { + if (scene.mEntityTables.find("Vim.LineShapeVertexBuffer") == scene.mEntityTables.end()) + return {}; + + return new LineShapeVertexBufferTable(scene.mEntityTables["Vim.LineShapeVertexBuffer"], scene.mStrings); + } + DocumentModel::DocumentModel(Scene& scene) { mAsset = GetAssetTable(scene); @@ -14274,6 +14585,8 @@ namespace Vim mFaceMesh = GetFaceMeshTable(scene); mFaceMeshIndexBuffer = GetFaceMeshIndexBufferTable(scene); mFaceMeshVertexBuffer = GetFaceMeshVertexBufferTable(scene); + mLineShape = GetLineShapeTable(scene); + mLineShapeVertexBuffer = GetLineShapeVertexBufferTable(scene); } DocumentModel::~DocumentModel() @@ -14335,6 +14648,8 @@ namespace Vim delete mFaceMesh; delete mFaceMeshIndexBuffer; delete mFaceMeshVertexBuffer; + delete mLineShape; + delete mLineShapeVertexBuffer; } } diff --git a/src/cpp/vim/vim.h b/src/cpp/vim/vim.h index 759e6644..323e7f83 100644 --- a/src/cpp/vim/vim.h +++ b/src/cpp/vim/vim.h @@ -43,6 +43,7 @@ namespace Vim static const std::string data_column_float_prefix = "float:"; static const std::string data_column_double_prefix = "double:"; static const std::string data_column_vector3_prefix = "vector3:"; + static const std::string data_column_vector4_prefix = "vector4:"; static const std::string data_column_matrix4x4_prefix = "matrix4x4:"; class Vector3 @@ -53,6 +54,15 @@ namespace Vim float Z = 0.0f; }; + class Vector4 + { + public: + float X = 0.0f; + float Y = 0.0f; + float Z = 0.0f; + float W = 0.0f; + }; + class Matrix4x4 { public: diff --git a/src/cs/vim/Vim.Format.CodeGen/ObjectModelCppGenerator.cs b/src/cs/vim/Vim.Format.CodeGen/ObjectModelCppGenerator.cs index 85eb9527..0e18612f 100644 --- a/src/cs/vim/Vim.Format.CodeGen/ObjectModelCppGenerator.cs +++ b/src/cs/vim/Vim.Format.CodeGen/ObjectModelCppGenerator.cs @@ -34,6 +34,7 @@ private static string ToCppType(string type) => "Int32" or "int" => "int", "Int64" or "Long" or "long" => "long long", "Vector3" or "vector3" => "Vector3", + "Vector4" or "vector4" => "Vector4", "Matrix4x4" or "matrix4x4" => "Matrix4x4", _ => throw new ArgumentOutOfRangeException(nameof(type), type, $"Type {type} not supported") }; diff --git a/src/cs/vim/Vim.Format.CodeGen/ObjectModelTypeScriptGenerator.cs b/src/cs/vim/Vim.Format.CodeGen/ObjectModelTypeScriptGenerator.cs index 42685f1b..9b5b8340 100644 --- a/src/cs/vim/Vim.Format.CodeGen/ObjectModelTypeScriptGenerator.cs +++ b/src/cs/vim/Vim.Format.CodeGen/ObjectModelTypeScriptGenerator.cs @@ -22,6 +22,7 @@ private static string ToTypeScriptType(string type) "Int64" or "Long" or "long" => "bigint", "String" or "string" => "string", "Vector3" => "Vector3", + "Vector4" => "Vector4", "Matrix4x4" => "Matrix4x4" }; @@ -237,6 +238,7 @@ private static string GetFieldGetter(this FieldInfo fieldInfo) "bigint" => "getBigInt", "string" => "getString", "Vector3" => "getVector3", + "Vector4" => "getVector4", "Matrix4x4" => "getMatrix4x4", _ => throw new ArgumentOutOfRangeException($"There's no getter function for {fieldInfo.FieldType.Name}") }; @@ -249,6 +251,7 @@ private static string GetArrayGetterName(this FieldInfo fieldInfo) => "bigint" => "getBigIntArray", "string" => "getStringArray", "Vector3" => "getVector3Array", + "Vector4" => "getVector4Array", "Matrix4x4" => "getMatrix4x4Array", _ => throw new ArgumentOutOfRangeException($"There's no getter function for {fieldInfo.FieldType.Name}") }; diff --git a/src/cs/vim/Vim.Format.Core/ColumnExtensions.Buffer.cs b/src/cs/vim/Vim.Format.Core/ColumnExtensions.Buffer.cs index 9992244d..191c3d7f 100644 --- a/src/cs/vim/Vim.Format.Core/ColumnExtensions.Buffer.cs +++ b/src/cs/vim/Vim.Format.Core/ColumnExtensions.Buffer.cs @@ -73,6 +73,8 @@ public static object GetDataColumnValue(this IBuffer dataColumn, string typePref return dataColumn.AsArray().ElementAtOrDefault(rowIndex); case VimConstants.Vector3ColumnNameTypePrefix: return dataColumn.AsArray().ElementAtOrDefault(rowIndex); + case VimConstants.Vector4ColumnNameTypePrefix: + return dataColumn.AsArray().ElementAtOrDefault(rowIndex); case VimConstants.Matrix4x4ColumnNameTypePrefix: return dataColumn.AsArray().ElementAtOrDefault(rowIndex); default: @@ -99,6 +101,8 @@ public static IBuffer CreateDefaultDataColumnBuffer(int length, string typePrefi return new double[length].ToBuffer(); case (VimConstants.Vector3ColumnNameTypePrefix): return new Vector3[length].ToBuffer(); + case (VimConstants.Vector4ColumnNameTypePrefix): + return new Vector4[length].ToBuffer(); case (VimConstants.Matrix4x4ColumnNameTypePrefix): return new Matrix4x4[length].ToBuffer(); default: @@ -122,6 +126,8 @@ public static IBuffer CopyDataColumn(this IBuffer dataColumn, string typePrefix, return (dataColumn.Data as byte[]).RemapData(remapping).ToBuffer(); case (VimConstants.Vector3ColumnNameTypePrefix): return (dataColumn.Data as Vector3[]).RemapData(remapping).ToBuffer(); + case (VimConstants.Vector4ColumnNameTypePrefix): + return (dataColumn.Data as Vector4[]).RemapData(remapping).ToBuffer(); case (VimConstants.Matrix4x4ColumnNameTypePrefix): return (dataColumn.Data as Matrix4x4[]).RemapData(remapping).ToBuffer(); default: @@ -154,6 +160,8 @@ public static IBuffer ConcatDataColumnBuffers(this IBuffer thisBuffer, IBuffer o return thisBuffer.Concat(otherBuffer); case (VimConstants.Vector3ColumnNameTypePrefix): return thisBuffer.Concat(otherBuffer); + case (VimConstants.Vector4ColumnNameTypePrefix): + return thisBuffer.Concat(otherBuffer); case (VimConstants.Matrix4x4ColumnNameTypePrefix): return thisBuffer.Concat(otherBuffer); default: diff --git a/src/cs/vim/Vim.Format.Core/ColumnExtensions.cs b/src/cs/vim/Vim.Format.Core/ColumnExtensions.cs index 9988d4a5..70390e26 100644 --- a/src/cs/vim/Vim.Format.Core/ColumnExtensions.cs +++ b/src/cs/vim/Vim.Format.Core/ColumnExtensions.cs @@ -19,6 +19,7 @@ public static readonly IReadOnlyCollection AllColumnInfos new ColumnInfo(ColumnType.DataColumn, VimConstants.DoubleColumnNameTypePrefix, typeof(double)), new ColumnInfo(ColumnType.DataColumn, VimConstants.FloatColumnNameTypePrefix, typeof(float)), new ColumnInfo(ColumnType.DataColumn, VimConstants.Vector3ColumnNameTypePrefix, typeof(Vector3)), + new ColumnInfo(ColumnType.DataColumn, VimConstants.Vector4ColumnNameTypePrefix, typeof(Vector4)), new ColumnInfo(ColumnType.DataColumn, VimConstants.Matrix4x4ColumnNameTypePrefix, typeof(Matrix4x4)) }; diff --git a/src/cs/vim/Vim.Format.Core/EntityTable.cs b/src/cs/vim/Vim.Format.Core/EntityTable.cs index bb19a30f..755f6ecc 100644 --- a/src/cs/vim/Vim.Format.Core/EntityTable.cs +++ b/src/cs/vim/Vim.Format.Core/EntityTable.cs @@ -1,5 +1,4 @@ using System; -using System.Diagnostics; using System.Linq; using Vim.BFast; using Vim.LinqArray; @@ -60,6 +59,6 @@ public T[] GetDataColumnAsTypedArray(string columnName) where T : unmanaged } public IArray GetDataColumnValues(string columnName) where T : unmanaged - => GetDataColumnAsTypedArray(columnName).ToIArray(); + => GetDataColumnAsTypedArray(columnName)?.ToIArray(); } } diff --git a/src/cs/vim/Vim.Format.Core/EntityTableBuilder.cs b/src/cs/vim/Vim.Format.Core/EntityTableBuilder.cs index e6305ed1..b28e7e8f 100644 --- a/src/cs/vim/Vim.Format.Core/EntityTableBuilder.cs +++ b/src/cs/vim/Vim.Format.Core/EntityTableBuilder.cs @@ -97,6 +97,9 @@ public EntityTableBuilder AddDataColumn(string columnName, IEnumerable val public EntityTableBuilder AddDataColumn(string columnName, IEnumerable values) => AddDataColumn(columnName, values.ToArray()); + public EntityTableBuilder AddDataColumn(string columnName, IEnumerable values) + => AddDataColumn(columnName, values.ToArray()); + public EntityTableBuilder AddDataColumn(string columnName, IEnumerable values) => AddDataColumn(columnName, values.ToArray()); diff --git a/src/cs/vim/Vim.Format.Core/Geometry/MeshSlicer.cs b/src/cs/vim/Vim.Format.Core/Geometry/MeshSlicer.cs index 95398cae..1c29728f 100644 --- a/src/cs/vim/Vim.Format.Core/Geometry/MeshSlicer.cs +++ b/src/cs/vim/Vim.Format.Core/Geometry/MeshSlicer.cs @@ -119,7 +119,7 @@ public static MeshSlicerResult SliceMesh( var oldToNewIndexMap = new Dictionary(); var newVertexBuffer = new List(); - // Create a slice of the face silhouette index buffer. + // Create a slice of the index buffer. var oldIndexSlice = new int[indexBufferEnd - indexBufferStart + 1]; for (var i = 0; i < oldIndexSlice.Length; i++) { diff --git a/src/cs/vim/Vim.Format.Core/Serializer.cs b/src/cs/vim/Vim.Format.Core/Serializer.cs index af6d72b6..d45f66f6 100644 --- a/src/cs/vim/Vim.Format.Core/Serializer.cs +++ b/src/cs/vim/Vim.Format.Core/Serializer.cs @@ -114,6 +114,11 @@ public static SerializableEntityTable ReadEntityTable( et.DataColumns.Add(colBr.ReadEntityTableColumn(schemaOnly)); break; } + case VimConstants.Vector4ColumnNameTypePrefix: + { + et.DataColumns.Add(colBr.ReadEntityTableColumn(schemaOnly)); + break; + } case VimConstants.Matrix4x4ColumnNameTypePrefix: { et.DataColumns.Add(colBr.ReadEntityTableColumn(schemaOnly)); diff --git a/src/cs/vim/Vim.Format.Core/VimConstants.cs b/src/cs/vim/Vim.Format.Core/VimConstants.cs index 81182685..92db4243 100644 --- a/src/cs/vim/Vim.Format.Core/VimConstants.cs +++ b/src/cs/vim/Vim.Format.Core/VimConstants.cs @@ -71,6 +71,8 @@ public static class TableNames public const string FaceMesh = "Vim.FaceMesh"; public const string FaceMeshIndexBuffer = "Vim.FaceMeshIndexBuffer"; public const string FaceMeshVertexBuffer = "Vim.FaceMeshVertexBuffer"; + public const string LineShape = "Vim.LineShape"; + public const string LineShapeVertexBuffer = "Vim.LineShapeVertexBuffer"; } public static class VimConstants @@ -89,6 +91,7 @@ public static class VimConstants public const string FloatColumnNameTypePrefix = "float:"; public const string DoubleColumnNameTypePrefix = "double:"; public const string Vector3ColumnNameTypePrefix = "vector3:"; + public const string Vector4ColumnNameTypePrefix = "vector4:"; public const string Matrix4x4ColumnNameTypePrefix = "matrix4x4:"; public const int NoEntityRelation = -1; diff --git a/src/cs/vim/Vim.Format.Tests/EntityTable_v2_Tests.cs b/src/cs/vim/Vim.Format.Tests/EntityTable_v2_Tests.cs index 560e5887..92cf0650 100644 --- a/src/cs/vim/Vim.Format.Tests/EntityTable_v2_Tests.cs +++ b/src/cs/vim/Vim.Format.Tests/EntityTable_v2_Tests.cs @@ -1,6 +1,5 @@ using NUnit.Framework; using System.IO; -using System.Linq; using Vim.Format.ObjectModel; using Vim.LinqArray; using Vim.Util.Tests; diff --git a/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs b/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs index 347ee84c..d323bfe2 100644 --- a/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs +++ b/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs @@ -939,6 +939,7 @@ public object GetStorageKey() /// An associative table binding a Shape to a View. /// [TableName(TableNames.ShapeInView)] + [Obsolete("Moved to LineShape")] public partial class ShapeInView : Entity, IStorageKey { public Relation _Shape; @@ -1269,12 +1270,12 @@ public AABox Box /// The ordering and number of Shapes matches the ordering and number of shapes in the G3D buffer. /// [TableName(TableNames.Shape)] - [G3dAttributeReference("g3d:shape:vertexoffset:0:int32:1", G3dAttributeReferenceMultiplicity.OneToOne, true)] - [G3dAttributeReference("g3d:shape:color:0:float32:4", G3dAttributeReferenceMultiplicity.OneToOne, true)] - [G3dAttributeReference("g3d:shape:width:0:float32:1", G3dAttributeReferenceMultiplicity.OneToOne, true)] + //[G3dAttributeReference("g3d:shape:vertexoffset:0:int32:1", G3dAttributeReferenceMultiplicity.OneToOne, true)] + //[G3dAttributeReference("g3d:shape:color:0:float32:4", G3dAttributeReferenceMultiplicity.OneToOne, true)] + //[G3dAttributeReference("g3d:shape:width:0:float32:1", G3dAttributeReferenceMultiplicity.OneToOne, true)] + [Obsolete("Replaced with LineShape")] public partial class Shape : EntityWithElement - { - } + { } /// /// Represents a collection of shapes associated with an Element. @@ -1282,10 +1283,10 @@ public partial class Shape : EntityWithElement /// faces may have a number of curve loops which may designate the contour of the face and its holes. /// [TableName(TableNames.ShapeCollection)] - [G3dAttributeReference("g3d:shape:vertexoffset:0:int32:1", G3dAttributeReferenceMultiplicity.OneToMany, true)] - [G3dAttributeReference("g3d:shape:color:0:float32:4", G3dAttributeReferenceMultiplicity.OneToMany, true)] - [G3dAttributeReference("g3d:shape:width:0:float32:1", G3dAttributeReferenceMultiplicity.OneToMany, true)] - [Obsolete("Replaced with FaceSilhouette")] + //[G3dAttributeReference("g3d:shape:vertexoffset:0:int32:1", G3dAttributeReferenceMultiplicity.OneToMany, true)] + //[G3dAttributeReference("g3d:shape:color:0:float32:4", G3dAttributeReferenceMultiplicity.OneToMany, true)] + //[G3dAttributeReference("g3d:shape:width:0:float32:1", G3dAttributeReferenceMultiplicity.OneToMany, true)] + [Obsolete("Replaced with FaceMesh")] public partial class ShapeCollection : EntityWithElement { } @@ -1294,6 +1295,7 @@ public partial class ShapeCollection : EntityWithElement /// An associative table binding a Shape to a ShapeCollection. /// [TableName(TableNames.ShapeInShapeCollection)] + [Obsolete("Replaced with FaceMesh")] public partial class ShapeInShapeCollection : Entity, IStorageKey { public Relation _Shape; @@ -1808,6 +1810,31 @@ public partial class FaceMeshVertexBuffer : Entity public Vector3 Vertex; } + /// + /// Represents a sequence of points connected by line segments + /// + [TableName(TableNames.LineShape)] + [VimSqlIgnore] + public partial class LineShape : EntityWithElement + { + public Vector4 Color; // [0..1f] per XYZW component. W component is alpha (0f = transparent, 1f = opaque). + public double Width; + public Relation _LineShapeVertexBufferStart; + public Relation _LineShapeVertexBufferEnd; + public Relation _View; + } + + /// + /// Represents the vertex buffer for LineShapes + /// + [TableName(TableNames.LineShapeVertexBuffer)] + [EntityBuffer] + [VimSqlIgnore] + public partial class LineShapeVertexBuffer : Entity + { + public Vector3 Vertex; + } + /// /// Helper functions for performing reflection over the object model /// diff --git a/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs b/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs index 909a681c..8f2219cf 100644 --- a/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs +++ b/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs @@ -1981,6 +1981,71 @@ public override bool FieldsAreEqual(object obj) } // end of class + // AUTO-GENERATED + public partial class LineShape + { + public Vim.Format.ObjectModel.LineShapeVertexBuffer LineShapeVertexBufferStart => _LineShapeVertexBufferStart.Value; + public Vim.Format.ObjectModel.LineShapeVertexBuffer LineShapeVertexBufferEnd => _LineShapeVertexBufferEnd.Value; + public Vim.Format.ObjectModel.View View => _View.Value; + public Vim.Format.ObjectModel.Element Element => _Element.Value; + public LineShape() + { + _LineShapeVertexBufferStart = new Relation(); + _LineShapeVertexBufferEnd = new Relation(); + _View = new Relation(); + _Element = new Relation(); + } + + public override bool FieldsAreEqual(object obj) + { + if ((obj is LineShape other)) + { + var fieldsAreEqual = + (Index == other.Index) && + (Color == other.Color) && + (Width == other.Width) && + (_LineShapeVertexBufferStart?.Index == other._LineShapeVertexBufferStart?.Index) && + (_LineShapeVertexBufferEnd?.Index == other._LineShapeVertexBufferEnd?.Index) && + (_View?.Index == other._View?.Index) && + (_Element?.Index == other._Element?.Index); + if (!fieldsAreEqual) + { + return false; + } + + return true; + } + return false; + } + + } // end of class + + // AUTO-GENERATED + public partial class LineShapeVertexBuffer + { + public LineShapeVertexBuffer() + { + } + + public override bool FieldsAreEqual(object obj) + { + if ((obj is LineShapeVertexBuffer other)) + { + var fieldsAreEqual = + (Index == other.Index) && + (Vertex == other.Vertex); + if (!fieldsAreEqual) + { + return false; + } + + return true; + } + return false; + } + + } // end of class + public partial class DocumentModel { public ElementIndexMaps ElementIndexMaps { get; } @@ -3901,6 +3966,59 @@ public FaceMeshVertexBuffer GetFaceMeshVertexBuffer(int n) return r; } + + // LineShape + + public EntityTable LineShapeEntityTable { get; } + + public IArray LineShapeColor { get; } + public Vector4 GetLineShapeColor(int index, Vector4 defaultValue = default) => LineShapeColor?.ElementAtOrDefault(index, defaultValue) ?? defaultValue; + public IArray LineShapeWidth { get; } + public Double GetLineShapeWidth(int index, Double defaultValue = default) => LineShapeWidth?.ElementAtOrDefault(index, defaultValue) ?? defaultValue; + public IArray LineShapeLineShapeVertexBufferStartIndex { get; } + public int GetLineShapeLineShapeVertexBufferStartIndex(int index) => LineShapeLineShapeVertexBufferStartIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; + public IArray LineShapeLineShapeVertexBufferEndIndex { get; } + public int GetLineShapeLineShapeVertexBufferEndIndex(int index) => LineShapeLineShapeVertexBufferEndIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; + public IArray LineShapeViewIndex { get; } + public int GetLineShapeViewIndex(int index) => LineShapeViewIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; + public IArray LineShapeElementIndex { get; } + public int GetLineShapeElementIndex(int index) => LineShapeElementIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; + public int NumLineShape => LineShapeEntityTable?.NumRows ?? 0; + public IArray LineShapeList { get; } + public LineShape GetLineShape(int n) + { + if (n < 0) return null; + var r = new LineShape(); + r.Document = Document; + r.Index = n; + r.Color = LineShapeColor.ElementAtOrDefault(n); + r.Width = LineShapeWidth.ElementAtOrDefault(n); + r._LineShapeVertexBufferStart = new Relation(GetLineShapeLineShapeVertexBufferStartIndex(n), GetLineShapeVertexBuffer); + r._LineShapeVertexBufferEnd = new Relation(GetLineShapeLineShapeVertexBufferEndIndex(n), GetLineShapeVertexBuffer); + r._View = new Relation(GetLineShapeViewIndex(n), GetView); + r._Element = new Relation(GetLineShapeElementIndex(n), GetElement); + return r; + } + + + // LineShapeVertexBuffer + + public EntityTable LineShapeVertexBufferEntityTable { get; } + + public IArray LineShapeVertexBufferVertex { get; } + public Vector3 GetLineShapeVertexBufferVertex(int index, Vector3 defaultValue = default) => LineShapeVertexBufferVertex?.ElementAtOrDefault(index, defaultValue) ?? defaultValue; + public int NumLineShapeVertexBuffer => LineShapeVertexBufferEntityTable?.NumRows ?? 0; + public IArray LineShapeVertexBufferList { get; } + public LineShapeVertexBuffer GetLineShapeVertexBuffer(int n) + { + if (n < 0) return null; + var r = new LineShapeVertexBuffer(); + r.Document = Document; + r.Index = n; + r.Vertex = LineShapeVertexBufferVertex.ElementAtOrDefault(n); + return r; + } + // All entity collections public Dictionary> AllEntities => new Dictionary>() { {"Vim.Asset", AssetList.ToEnumerable()}, @@ -3960,6 +4078,8 @@ public FaceMeshVertexBuffer GetFaceMeshVertexBuffer(int n) {"Vim.FaceMesh", FaceMeshList.ToEnumerable()}, {"Vim.FaceMeshIndexBuffer", FaceMeshIndexBufferList.ToEnumerable()}, {"Vim.FaceMeshVertexBuffer", FaceMeshVertexBufferList.ToEnumerable()}, + {"Vim.LineShape", LineShapeList.ToEnumerable()}, + {"Vim.LineShapeVertexBuffer", LineShapeVertexBufferList.ToEnumerable()}, }; // Entity types from table names @@ -4021,6 +4141,8 @@ public FaceMeshVertexBuffer GetFaceMeshVertexBuffer(int n) {"Vim.FaceMesh", typeof(FaceMesh)}, {"Vim.FaceMeshIndexBuffer", typeof(FaceMeshIndexBuffer)}, {"Vim.FaceMeshVertexBuffer", typeof(FaceMeshVertexBuffer)}, + {"Vim.LineShape", typeof(LineShape)}, + {"Vim.LineShapeVertexBuffer", typeof(LineShapeVertexBuffer)}, }; public DocumentModel(Document d, bool inParallel = true) { @@ -4084,6 +4206,8 @@ public DocumentModel(Document d, bool inParallel = true) FaceMeshEntityTable = Document.GetTable("Vim.FaceMesh"); FaceMeshIndexBufferEntityTable = Document.GetTable("Vim.FaceMeshIndexBuffer"); FaceMeshVertexBufferEntityTable = Document.GetTable("Vim.FaceMeshVertexBuffer"); + LineShapeEntityTable = Document.GetTable("Vim.LineShape"); + LineShapeVertexBufferEntityTable = Document.GetTable("Vim.LineShapeVertexBuffer"); // Initialize entity arrays AssetBufferName = AssetEntityTable?.GetStringColumnValues("string:BufferName") ?? Array.Empty().ToIArray(); @@ -4315,6 +4439,9 @@ public DocumentModel(Document d, bool inParallel = true) BuildingTerrainElevation = BuildingEntityTable?.GetDataColumnValues("double:TerrainElevation") ?? Array.Empty().ToIArray(); BuildingAddress = BuildingEntityTable?.GetStringColumnValues("string:Address") ?? Array.Empty().ToIArray(); FaceMeshVertexBufferVertex = FaceMeshVertexBufferEntityTable?.GetDataColumnValues("vector3:Vertex") ?? Array.Empty().ToIArray(); + LineShapeColor = LineShapeEntityTable?.GetDataColumnValues("vector4:Color") ?? Array.Empty().ToIArray(); + LineShapeWidth = LineShapeEntityTable?.GetDataColumnValues("double:Width") ?? Array.Empty().ToIArray(); + LineShapeVertexBufferVertex = LineShapeVertexBufferEntityTable?.GetDataColumnValues("vector3:Vertex") ?? Array.Empty().ToIArray(); // Initialize entity relational columns ParameterDescriptorDisplayUnitIndex = ParameterDescriptorEntityTable?.GetIndexColumnValues("index:Vim.DisplayUnit:DisplayUnit") ?? Array.Empty().ToIArray(); @@ -4423,6 +4550,10 @@ public DocumentModel(Document d, bool inParallel = true) FaceMeshMaterialIndex = FaceMeshEntityTable?.GetIndexColumnValues("index:Vim.Material:Material") ?? Array.Empty().ToIArray(); FaceMeshElementIndex = FaceMeshEntityTable?.GetIndexColumnValues("index:Vim.Element:Element") ?? Array.Empty().ToIArray(); FaceMeshIndexBufferVertexIndexIndex = FaceMeshIndexBufferEntityTable?.GetIndexColumnValues("index:Vim.FaceMeshVertexBuffer:VertexIndex") ?? Array.Empty().ToIArray(); + LineShapeLineShapeVertexBufferStartIndex = LineShapeEntityTable?.GetIndexColumnValues("index:Vim.LineShapeVertexBuffer:LineShapeVertexBufferStart") ?? Array.Empty().ToIArray(); + LineShapeLineShapeVertexBufferEndIndex = LineShapeEntityTable?.GetIndexColumnValues("index:Vim.LineShapeVertexBuffer:LineShapeVertexBufferEnd") ?? Array.Empty().ToIArray(); + LineShapeViewIndex = LineShapeEntityTable?.GetIndexColumnValues("index:Vim.View:View") ?? Array.Empty().ToIArray(); + LineShapeElementIndex = LineShapeEntityTable?.GetIndexColumnValues("index:Vim.Element:Element") ?? Array.Empty().ToIArray(); // Initialize entity collections AssetList = NumAsset.Select(i => GetAsset(i)); @@ -4482,6 +4613,8 @@ public DocumentModel(Document d, bool inParallel = true) FaceMeshList = NumFaceMesh.Select(i => GetFaceMesh(i)); FaceMeshIndexBufferList = NumFaceMeshIndexBuffer.Select(i => GetFaceMeshIndexBuffer(i)); FaceMeshVertexBufferList = NumFaceMeshVertexBuffer.Select(i => GetFaceMeshVertexBuffer(i)); + LineShapeList = NumLineShape.Select(i => GetLineShape(i)); + LineShapeVertexBufferList = NumLineShapeVertexBuffer.Select(i => GetLineShapeVertexBuffer(i)); // Initialize element index maps ElementIndexMaps = new ElementIndexMaps(this, inParallel); @@ -4674,6 +4807,12 @@ public EntityTableSet(SerializableEntityTable[] rawTables, string[] stringBuffer if (GetRawTableOrDefault("Vim.FaceMeshVertexBuffer") is SerializableEntityTable facemeshvertexbufferTable) FaceMeshVertexBufferTable = new FaceMeshVertexBufferTable(facemeshvertexbufferTable, stringBuffer); + if (GetRawTableOrDefault("Vim.LineShape") is SerializableEntityTable lineshapeTable) + LineShapeTable = new LineShapeTable(lineshapeTable, stringBuffer); + + if (GetRawTableOrDefault("Vim.LineShapeVertexBuffer") is SerializableEntityTable lineshapevertexbufferTable) + LineShapeVertexBufferTable = new LineShapeVertexBufferTable(lineshapevertexbufferTable, stringBuffer); + // Initialize element index maps ElementIndexMaps = new ElementIndexMaps(this, inParallel); @@ -4793,6 +4932,10 @@ public EntityTableSet(SerializableEntityTable[] rawTables, string[] stringBuffer public FaceMeshIndexBuffer GetFaceMeshIndexBuffer(int index) => FaceMeshIndexBufferTable?.Get(index); public FaceMeshVertexBufferTable FaceMeshVertexBufferTable { get; } // can be null public FaceMeshVertexBuffer GetFaceMeshVertexBuffer(int index) => FaceMeshVertexBufferTable?.Get(index); + public LineShapeTable LineShapeTable { get; } // can be null + public LineShape GetLineShape(int index) => LineShapeTable?.Get(index); + public LineShapeVertexBufferTable LineShapeVertexBufferTable { get; } // can be null + public LineShapeVertexBuffer GetLineShapeVertexBuffer(int index) => LineShapeVertexBufferTable?.Get(index); } // class EntityTableSet public partial class AssetTable : EntityTable_v2, IEnumerable @@ -7829,6 +7972,94 @@ public IEnumerator GetEnumerator() } } // class FaceMeshVertexBufferTable + public partial class LineShapeTable : EntityTable_v2, IEnumerable + { + private readonly EntityTableSet _parentTableSet; // can be null + + public LineShapeTable(SerializableEntityTable rawTable, string[] stringBuffer, EntityTableSet parentTableSet = null) : base(rawTable, stringBuffer) + { + _parentTableSet = parentTableSet; + Column_Color = GetDataColumnValues("vector4:Color") ?? Array.Empty(); + Column_Width = GetDataColumnValues("double:Width") ?? Array.Empty(); + Column_LineShapeVertexBufferStartIndex = GetIndexColumnValues("index:Vim.LineShapeVertexBuffer:LineShapeVertexBufferStart") ?? Array.Empty(); + Column_LineShapeVertexBufferEndIndex = GetIndexColumnValues("index:Vim.LineShapeVertexBuffer:LineShapeVertexBufferEnd") ?? Array.Empty(); + Column_ViewIndex = GetIndexColumnValues("index:Vim.View:View") ?? Array.Empty(); + Column_ElementIndex = GetIndexColumnValues("index:Vim.Element:Element") ?? Array.Empty(); + } + + public Vector4[] Column_Color { get; } + public Vector4 GetColor(int index, Vector4 @default = default) => Column_Color.ElementAtOrDefault(index, @default); + public Double[] Column_Width { get; } + public Double GetWidth(int index, Double @default = default) => Column_Width.ElementAtOrDefault(index, @default); + public int[] Column_LineShapeVertexBufferStartIndex { get; } + public int GetLineShapeVertexBufferStartIndex(int index) => Column_LineShapeVertexBufferStartIndex.ElementAtOrDefault(index, EntityRelation.None); + public LineShapeVertexBuffer GetLineShapeVertexBufferStart(int index) => _GetReferencedLineShapeVertexBufferStart(GetLineShapeVertexBufferStartIndex(index)); + private LineShapeVertexBuffer _GetReferencedLineShapeVertexBufferStart(int referencedIndex) => _parentTableSet.GetLineShapeVertexBuffer(referencedIndex); + public int[] Column_LineShapeVertexBufferEndIndex { get; } + public int GetLineShapeVertexBufferEndIndex(int index) => Column_LineShapeVertexBufferEndIndex.ElementAtOrDefault(index, EntityRelation.None); + public LineShapeVertexBuffer GetLineShapeVertexBufferEnd(int index) => _GetReferencedLineShapeVertexBufferEnd(GetLineShapeVertexBufferEndIndex(index)); + private LineShapeVertexBuffer _GetReferencedLineShapeVertexBufferEnd(int referencedIndex) => _parentTableSet.GetLineShapeVertexBuffer(referencedIndex); + public int[] Column_ViewIndex { get; } + public int GetViewIndex(int index) => Column_ViewIndex.ElementAtOrDefault(index, EntityRelation.None); + public View GetView(int index) => _GetReferencedView(GetViewIndex(index)); + private View _GetReferencedView(int referencedIndex) => _parentTableSet.GetView(referencedIndex); + public int[] Column_ElementIndex { get; } + public int GetElementIndex(int index) => Column_ElementIndex.ElementAtOrDefault(index, EntityRelation.None); + public Element GetElement(int index) => _GetReferencedElement(GetElementIndex(index)); + private Element _GetReferencedElement(int referencedIndex) => _parentTableSet.GetElement(referencedIndex); + // Object Getter + public LineShape Get(int index) + { + if (index < 0) return null; + var r = new LineShape(); + r.Index = index; + r.Color = GetColor(index); + r.Width = GetWidth(index); + r._LineShapeVertexBufferStart = new Relation(GetLineShapeVertexBufferStartIndex(index), _GetReferencedLineShapeVertexBufferStart); + r._LineShapeVertexBufferEnd = new Relation(GetLineShapeVertexBufferEndIndex(index), _GetReferencedLineShapeVertexBufferEnd); + r._View = new Relation(GetViewIndex(index), _GetReferencedView); + r._Element = new Relation(GetElementIndex(index), _GetReferencedElement); + return r; + } + // Enumerator + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + public IEnumerator GetEnumerator() + { + for (var i = 0; i < RowCount; ++i) + yield return Get(i); + } + } // class LineShapeTable + + public partial class LineShapeVertexBufferTable : EntityTable_v2, IEnumerable + { + private readonly EntityTableSet _parentTableSet; // can be null + + public LineShapeVertexBufferTable(SerializableEntityTable rawTable, string[] stringBuffer, EntityTableSet parentTableSet = null) : base(rawTable, stringBuffer) + { + _parentTableSet = parentTableSet; + Column_Vertex = GetDataColumnValues("vector3:Vertex") ?? Array.Empty(); + } + + public Vector3[] Column_Vertex { get; } + public Vector3 GetVertex(int index, Vector3 @default = default) => Column_Vertex.ElementAtOrDefault(index, @default); + // Object Getter + public LineShapeVertexBuffer Get(int index) + { + if (index < 0) return null; + var r = new LineShapeVertexBuffer(); + r.Index = index; + r.Vertex = GetVertex(index); + return r; + } + // Enumerator + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + public IEnumerator GetEnumerator() + { + for (var i = 0; i < RowCount; ++i) + yield return Get(i); + } + } // class LineShapeVertexBufferTable + public static class DocumentBuilderExtensions { public static Func, EntityTableBuilder> GetTableBuilderFunc(this Type type) @@ -7888,6 +8119,7 @@ public static Func, EntityTableBuilder> GetTableBuilderFunc( if (type == typeof(Site)) return ToSiteTableBuilder; if (type == typeof(Building)) return ToBuildingTableBuilder; if (type == typeof(FaceMesh)) return ToFaceMeshTableBuilder; + if (type == typeof(LineShape)) return ToLineShapeTableBuilder; throw new ArgumentException(nameof(type)); } public static EntityTableBuilder ToAssetTableBuilder(this IEnumerable entities) @@ -8553,6 +8785,18 @@ public static EntityTableBuilder ToFaceMeshTableBuilder(this IEnumerable tb.AddIndexColumn("index:Vim.Element:Element", typedEntities.Select(x => x._Element?.Index ?? EntityRelation.None)); return tb; } + public static EntityTableBuilder ToLineShapeTableBuilder(this IEnumerable entities) + { + var typedEntities = entities?.Cast() ?? Enumerable.Empty(); + var tb = new EntityTableBuilder("Vim.LineShape"); + tb.AddDataColumn("vector4:Color", typedEntities.Select(x => x.Color)); + tb.AddDataColumn("double:Width", typedEntities.Select(x => x.Width)); + tb.AddIndexColumn("index:Vim.LineShapeVertexBuffer:LineShapeVertexBufferStart", typedEntities.Select(x => x._LineShapeVertexBufferStart?.Index ?? EntityRelation.None)); + tb.AddIndexColumn("index:Vim.LineShapeVertexBuffer:LineShapeVertexBufferEnd", typedEntities.Select(x => x._LineShapeVertexBufferEnd?.Index ?? EntityRelation.None)); + tb.AddIndexColumn("index:Vim.View:View", typedEntities.Select(x => x._View?.Index ?? EntityRelation.None)); + tb.AddIndexColumn("index:Vim.Element:Element", typedEntities.Select(x => x._Element?.Index ?? EntityRelation.None)); + return tb; + } } // DocumentBuilderExtensions public partial class ObjectModelBuilder @@ -8614,6 +8858,7 @@ public partial class ObjectModelBuilder {typeof(Site), new EntityTableBuilder()}, {typeof(Building), new EntityTableBuilder()}, {typeof(FaceMesh), new EntityTableBuilder()}, + {typeof(LineShape), new EntityTableBuilder()}, }; } // ObjectModelBuilder } // namespace diff --git a/src/cs/vim/Vim.Format/ObjectModel/ObjectModelStore.cs b/src/cs/vim/Vim.Format/ObjectModel/ObjectModelStore.cs index 3faf35e4..e1f89173 100644 --- a/src/cs/vim/Vim.Format/ObjectModel/ObjectModelStore.cs +++ b/src/cs/vim/Vim.Format/ObjectModel/ObjectModelStore.cs @@ -22,7 +22,7 @@ public class ObjectModelStore public DocumentBuilder ToDocumentBuilder(string generator, string versionString) { var db = ObjectModelBuilder.ToDocumentBuilder(generator, versionString); - AddFaceSilhouetteBuffers(db); + AddEntityTableBuffers(db); return db .AddMeshes(Meshes.Select(g => g.Subdivide())) @@ -34,7 +34,9 @@ public DocumentBuilder ToDocumentBuilder(string generator, string versionString) public List FaceMeshIndexBuffer { get; } = new List(); public List FaceMeshVertexBuffer { get; } = new List(); - private void AddFaceSilhouetteBuffers(DocumentBuilder documentBuilder) + public List LineShapeVertexBuffer { get; } = new List(); + + private void AddEntityTableBuffers(DocumentBuilder documentBuilder) { #if DEBUG // Validate the index buffer and the vertex buffer @@ -42,18 +44,25 @@ private void AddFaceSilhouetteBuffers(DocumentBuilder documentBuilder) Debug.Assert(index >= 0 && index < FaceMeshVertexBuffer.Count); #endif - // Add the face silhouette index buffer. + // Add the face mesh index buffer. { var tb = new EntityTableBuilder(TableNames.FaceMeshIndexBuffer); - tb.AddIndexColumn("index:Vim.FaceSilhouetteVertexBuffer:VertexIndex", FaceMeshIndexBuffer); - documentBuilder.Tables.Add(TableNames.FaceMeshIndexBuffer, tb); + tb.AddIndexColumn($"index:{TableNames.FaceMeshVertexBuffer}:{nameof(ObjectModel.FaceMeshIndexBuffer.VertexIndex)}", FaceMeshIndexBuffer); + documentBuilder.Tables.Add(tb.Name, tb); } - // Add the face silhouette vertex buffer. + // Add the face mesh vertex buffer. { var tb = new EntityTableBuilder(TableNames.FaceMeshVertexBuffer); - tb.AddDataColumn("vector3:Vertex", FaceMeshVertexBuffer); - documentBuilder.Tables.Add(TableNames.FaceMeshVertexBuffer, tb); + tb.AddDataColumn($"vector3:{nameof(ObjectModel.FaceMeshVertexBuffer.Vertex)}", FaceMeshVertexBuffer); + documentBuilder.Tables.Add(tb.Name, tb); + } + + // Add the line shape vertex buffer. + { + var tb = new EntityTableBuilder(TableNames.LineShapeVertexBuffer); + tb.AddDataColumn($"vector3:{nameof(ObjectModel.LineShapeVertexBuffer.Vertex)}", LineShapeVertexBuffer); + documentBuilder.Tables.Add(tb.Name, tb); } } diff --git a/src/ts/src/entityTable.ts b/src/ts/src/entityTable.ts index 52647e37..9b1892b4 100644 --- a/src/ts/src/entityTable.ts +++ b/src/ts/src/entityTable.ts @@ -3,7 +3,7 @@ */ import { BFast, NumericArray, Range } from './bfast' -import { Vector3, Matrix4x4 } from './structures' +import { Vector3, Matrix4x4, Vector4 } from './structures' export class EntityTable { private readonly bfast: BFast @@ -200,6 +200,25 @@ export class EntityTable { return await this.bfast.getBuffer(columnName) } + async getVector4(elementIndex: number, columnName: string): Promise + { + const arrayBuffer = await this.bfast.getBuffer(columnName) + const floatView = new Float32Array(arrayBuffer) + + const startIndex = elementIndex * 4; // (x,y,z,w) => 4 + return { + x: floatView[startIndex], + y: floatView[startIndex + 1], + z: floatView[startIndex + 2], + w: floatView[startIndex + 3] + } + } + + // TODO: Promise is a shortcut... should actually be Promise + async getVector4Array(columnName: string): Promise { + return await this.bfast.getBuffer(columnName) + } + async getMatrix4x4(elementIndex: number, columnName: string): Promise { const arrayBuffer = await this.bfast.getBuffer(columnName) diff --git a/src/ts/src/objectModel.ts b/src/ts/src/objectModel.ts index 6b206680..9da4eb9d 100644 --- a/src/ts/src/objectModel.ts +++ b/src/ts/src/objectModel.ts @@ -10977,6 +10977,315 @@ export class FaceMeshVertexBufferTable implements IFaceMeshVertexBufferTable { } +export interface ILineShape { + index: number + color?: Vector4 + width?: number + + lineShapeVertexBufferStartIndex?: number + lineShapeVertexBufferStart?: ILineShapeVertexBuffer + lineShapeVertexBufferEndIndex?: number + lineShapeVertexBufferEnd?: ILineShapeVertexBuffer + viewIndex?: number + view?: IView + elementIndex?: number + element?: IElement +} + +export interface ILineShapeTable { + getCount(): Promise + get(lineShapeIndex: number): Promise + getAll(): Promise + + getColor(lineShapeIndex: number): Promise + getAllColor(): Promise + getWidth(lineShapeIndex: number): Promise + getAllWidth(): Promise + + getLineShapeVertexBufferStartIndex(lineShapeIndex: number): Promise + getAllLineShapeVertexBufferStartIndex(): Promise + getLineShapeVertexBufferStart(lineShapeIndex: number): Promise + getLineShapeVertexBufferEndIndex(lineShapeIndex: number): Promise + getAllLineShapeVertexBufferEndIndex(): Promise + getLineShapeVertexBufferEnd(lineShapeIndex: number): Promise + getViewIndex(lineShapeIndex: number): Promise + getAllViewIndex(): Promise + getView(lineShapeIndex: number): Promise + getElementIndex(lineShapeIndex: number): Promise + getAllElementIndex(): Promise + getElement(lineShapeIndex: number): Promise +} + +export class LineShape implements ILineShape { + index: number + color?: Vector4 + width?: number + + lineShapeVertexBufferStartIndex?: number + lineShapeVertexBufferStart?: ILineShapeVertexBuffer + lineShapeVertexBufferEndIndex?: number + lineShapeVertexBufferEnd?: ILineShapeVertexBuffer + viewIndex?: number + view?: IView + elementIndex?: number + element?: IElement + + static async createFromTable(table: ILineShapeTable, index: number): Promise { + let result = new LineShape() + result.index = index + + await Promise.all([ + table.getColor(index).then(v => result.color = v), + table.getWidth(index).then(v => result.width = v), + table.getLineShapeVertexBufferStartIndex(index).then(v => result.lineShapeVertexBufferStartIndex = v), + table.getLineShapeVertexBufferEndIndex(index).then(v => result.lineShapeVertexBufferEndIndex = v), + table.getViewIndex(index).then(v => result.viewIndex = v), + table.getElementIndex(index).then(v => result.elementIndex = v), + ]) + + return result + } +} + +export class LineShapeTable implements ILineShapeTable { + private document: VimDocument + private entityTable: EntityTable + + static async createFromDocument(document: VimDocument): Promise { + const entity = await document.entities.getBfast("Vim.LineShape") + + if (!entity) { + return undefined + } + + let table = new LineShapeTable() + table.document = document + table.entityTable = new EntityTable(entity, document.strings) + + return table + } + + getCount(): Promise { + return this.entityTable.getCount() + } + + async get(lineShapeIndex: number): Promise { + return await LineShape.createFromTable(this, lineShapeIndex) + } + + async getAll(): Promise { + const localTable = await this.entityTable.getLocal() + + let color: Vector4[] | undefined + let width: number[] | undefined + let lineShapeVertexBufferStartIndex: number[] | undefined + let lineShapeVertexBufferEndIndex: number[] | undefined + let viewIndex: number[] | undefined + let elementIndex: number[] | undefined + + await Promise.all([ + (async () => { color = (await localTable.getVector4Array("vector4:Color")) })(), + (async () => { width = (await localTable.getNumberArray("double:Width")) })(), + (async () => { lineShapeVertexBufferStartIndex = (await localTable.getNumberArray("index:Vim.LineShapeVertexBuffer:LineShapeVertexBufferStart")) })(), + (async () => { lineShapeVertexBufferEndIndex = (await localTable.getNumberArray("index:Vim.LineShapeVertexBuffer:LineShapeVertexBufferEnd")) })(), + (async () => { viewIndex = (await localTable.getNumberArray("index:Vim.View:View")) })(), + (async () => { elementIndex = (await localTable.getNumberArray("index:Vim.Element:Element")) })(), + ]) + + let lineShape: ILineShape[] = [] + + const rowCount = await this.getCount() + for (let i = 0; i < rowCount; i++) { + lineShape.push({ + index: i, + color: color ? color[i] : undefined, + width: width ? width[i] : undefined, + lineShapeVertexBufferStartIndex: lineShapeVertexBufferStartIndex ? lineShapeVertexBufferStartIndex[i] : undefined, + lineShapeVertexBufferEndIndex: lineShapeVertexBufferEndIndex ? lineShapeVertexBufferEndIndex[i] : undefined, + viewIndex: viewIndex ? viewIndex[i] : undefined, + elementIndex: elementIndex ? elementIndex[i] : undefined + }) + } + + return lineShape + } + + async getColor(lineShapeIndex: number): Promise { + return (await this.entityTable.getVector4(lineShapeIndex, "vector4:Color")) + } + + async getAllColor(): Promise { + return (await this.entityTable.getVector4Array("vector4:Color")) + } + + async getWidth(lineShapeIndex: number): Promise { + return (await this.entityTable.getNumber(lineShapeIndex, "double:Width")) + } + + async getAllWidth(): Promise { + return (await this.entityTable.getNumberArray("double:Width")) + } + + async getLineShapeVertexBufferStartIndex(lineShapeIndex: number): Promise { + return await this.entityTable.getNumber(lineShapeIndex, "index:Vim.LineShapeVertexBuffer:LineShapeVertexBufferStart") + } + + async getAllLineShapeVertexBufferStartIndex(): Promise { + return await this.entityTable.getNumberArray("index:Vim.LineShapeVertexBuffer:LineShapeVertexBufferStart") + } + + async getLineShapeVertexBufferStart(lineShapeIndex: number): Promise { + const index = await this.getLineShapeVertexBufferStartIndex(lineShapeIndex) + + if (index === undefined) { + return undefined + } + + return await this.document.lineShapeVertexBuffer?.get(index) + } + + async getLineShapeVertexBufferEndIndex(lineShapeIndex: number): Promise { + return await this.entityTable.getNumber(lineShapeIndex, "index:Vim.LineShapeVertexBuffer:LineShapeVertexBufferEnd") + } + + async getAllLineShapeVertexBufferEndIndex(): Promise { + return await this.entityTable.getNumberArray("index:Vim.LineShapeVertexBuffer:LineShapeVertexBufferEnd") + } + + async getLineShapeVertexBufferEnd(lineShapeIndex: number): Promise { + const index = await this.getLineShapeVertexBufferEndIndex(lineShapeIndex) + + if (index === undefined) { + return undefined + } + + return await this.document.lineShapeVertexBuffer?.get(index) + } + + async getViewIndex(lineShapeIndex: number): Promise { + return await this.entityTable.getNumber(lineShapeIndex, "index:Vim.View:View") + } + + async getAllViewIndex(): Promise { + return await this.entityTable.getNumberArray("index:Vim.View:View") + } + + async getView(lineShapeIndex: number): Promise { + const index = await this.getViewIndex(lineShapeIndex) + + if (index === undefined) { + return undefined + } + + return await this.document.view?.get(index) + } + + async getElementIndex(lineShapeIndex: number): Promise { + return await this.entityTable.getNumber(lineShapeIndex, "index:Vim.Element:Element") + } + + async getAllElementIndex(): Promise { + return await this.entityTable.getNumberArray("index:Vim.Element:Element") + } + + async getElement(lineShapeIndex: number): Promise { + const index = await this.getElementIndex(lineShapeIndex) + + if (index === undefined) { + return undefined + } + + return await this.document.element?.get(index) + } + +} + +export interface ILineShapeVertexBuffer { + index: number + vertex?: Vector3 +} + +export interface ILineShapeVertexBufferTable { + getCount(): Promise + get(lineShapeVertexBufferIndex: number): Promise + getAll(): Promise + + getVertex(lineShapeVertexBufferIndex: number): Promise + getAllVertex(): Promise +} + +export class LineShapeVertexBuffer implements ILineShapeVertexBuffer { + index: number + vertex?: Vector3 + + static async createFromTable(table: ILineShapeVertexBufferTable, index: number): Promise { + let result = new LineShapeVertexBuffer() + result.index = index + + await Promise.all([ + table.getVertex(index).then(v => result.vertex = v), + ]) + + return result + } +} + +export class LineShapeVertexBufferTable implements ILineShapeVertexBufferTable { + private entityTable: EntityTable + + static async createFromDocument(document: VimDocument): Promise { + const entity = await document.entities.getBfast("Vim.LineShapeVertexBuffer") + + if (!entity) { + return undefined + } + + let table = new LineShapeVertexBufferTable() + table.entityTable = new EntityTable(entity, document.strings) + + return table + } + + getCount(): Promise { + return this.entityTable.getCount() + } + + async get(lineShapeVertexBufferIndex: number): Promise { + return await LineShapeVertexBuffer.createFromTable(this, lineShapeVertexBufferIndex) + } + + async getAll(): Promise { + const localTable = await this.entityTable.getLocal() + + let vertex: Vector3[] | undefined + + await Promise.all([ + (async () => { vertex = (await localTable.getVector3Array("vector3:Vertex")) })(), + ]) + + let lineShapeVertexBuffer: ILineShapeVertexBuffer[] = [] + + const rowCount = await this.getCount() + for (let i = 0; i < rowCount; i++) { + lineShapeVertexBuffer.push({ + index: i, + vertex: vertex ? vertex[i] : undefined + }) + } + + return lineShapeVertexBuffer + } + + async getVertex(lineShapeVertexBufferIndex: number): Promise { + return (await this.entityTable.getVector3(lineShapeVertexBufferIndex, "vector3:Vertex")) + } + + async getAllVertex(): Promise { + return (await this.entityTable.getVector3Array("vector3:Vertex")) + } + +} + export class VimDocument { asset: IAssetTable | undefined displayUnit: IDisplayUnitTable | undefined @@ -11035,6 +11344,8 @@ export class VimDocument { faceMesh: IFaceMeshTable | undefined faceMeshIndexBuffer: IFaceMeshIndexBufferTable | undefined faceMeshVertexBuffer: IFaceMeshVertexBufferTable | undefined + lineShape: ILineShapeTable | undefined + lineShapeVertexBuffer: ILineShapeVertexBufferTable | undefined entities: BFast strings: string[] | undefined @@ -11109,6 +11420,8 @@ export class VimDocument { doc.faceMesh = await FaceMeshTable.createFromDocument(doc) doc.faceMeshIndexBuffer = await FaceMeshIndexBufferTable.createFromDocument(doc) doc.faceMeshVertexBuffer = await FaceMeshVertexBufferTable.createFromDocument(doc) + doc.lineShape = await LineShapeTable.createFromDocument(doc) + doc.lineShapeVertexBuffer = await LineShapeVertexBufferTable.createFromDocument(doc) return doc } From 910fcf2ce9fe599ba835d9f632e096675ef5da7f Mon Sep 17 00:00:00 2001 From: Martin Ashton Date: Mon, 31 Mar 2025 09:07:19 -0400 Subject: [PATCH 7/7] (WIP - DNC) Experimenting with Instance and Mesh entities --- src/cs/vim/Vim.Format.Core/VimConstants.cs | 7 +- .../vim/Vim.Format/ObjectModel/ObjectModel.cs | 116 ++++++++++++++--- .../ObjectModel/ObjectModelGenerated.cs | 122 +++++++++--------- .../ObjectModel/ObjectModelStore.cs | 8 +- 4 files changed, 167 insertions(+), 86 deletions(-) diff --git a/src/cs/vim/Vim.Format.Core/VimConstants.cs b/src/cs/vim/Vim.Format.Core/VimConstants.cs index 92db4243..2519ab94 100644 --- a/src/cs/vim/Vim.Format.Core/VimConstants.cs +++ b/src/cs/vim/Vim.Format.Core/VimConstants.cs @@ -68,9 +68,10 @@ public static class TableNames public const string ViewInViewSheet = "Vim.ViewInViewSheet"; public const string Site = "Vim.Site"; public const string Building = "Vim.Building"; - public const string FaceMesh = "Vim.FaceMesh"; - public const string FaceMeshIndexBuffer = "Vim.FaceMeshIndexBuffer"; - public const string FaceMeshVertexBuffer = "Vim.FaceMeshVertexBuffer"; + public const string Instance = "Vim.Instance"; + public const string Mesh = "Vim.Mesh"; + public const string MeshIndexBuffer = "Vim.MeshIndexBuffer"; + public const string MeshVertexBuffer = "Vim.MeshVertexBuffer"; public const string LineShape = "Vim.LineShape"; public const string LineShapeVertexBuffer = "Vim.LineShapeVertexBuffer"; } diff --git a/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs b/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs index d323bfe2..19bf7bc0 100644 --- a/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs +++ b/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs @@ -1775,41 +1775,121 @@ public partial class Building : EntityWithElement public Relation _Site; } + + TODO // Table names /// - /// Represents an element face in a View + /// A group of instances which represents an element in a view. /// - [TableName(TableNames.FaceMesh)] - [VimSqlIgnore] - public partial class FaceMesh : EntityWithElement + public partial class InstanceGroup : EntityWithElement { - public Relation _FaceMeshIndexBufferStart; - public Relation _FaceMeshIndexBufferEnd; - public Relation _View; + public int InstanceFlags; // None | Hidden | IsRoom | IsLevel ... // 32 + public Relation _View; // Optional for IFC case // 32 + public Relation _Transform; // 32 + public Relation _InstanceIndexStart; // 32 + public int InstanceIndexCount; // 32 + } + + /// + /// Contains sequences of instance indices. Referenced by instance group. + /// + public partial class InstanceIndex : Entity + { + public Relation _Instance; + } + + /// + /// An instance of a mesh with a local transform. + /// + public partial class Instance : Entity + { + public Relation _Mesh; public Relation _Material; + public Relation _LocalTransform; } /// - /// Represents a continuous index buffer of triangular faces. + /// A mesh composed of vertex indices and vertices. /// - [TableName(TableNames.FaceMeshIndexBuffer)] - [EntityBuffer] - [VimSqlIgnore] - public partial class FaceMeshIndexBuffer : Entity + public partial class Mesh : Entity { - public Relation _VertexIndex; + public Relation _MeshIndexBufferStart; + public int MeshIndexBufferCount; + public Relation _MeshVertexBufferStart; + public int MeshVertexBufferCount; } /// - /// Represents a continuous vertex buffer. + /// Contains sequences of vertex indices. Referenced by meshes. /// - [TableName(TableNames.FaceMeshVertexBuffer)] - [EntityBuffer] - [VimSqlIgnore] - public partial class FaceMeshVertexBuffer : Entity + public partial class MeshIndexBuffer : Entity + { + // ex: [ ..., 10300, 10301, 10302, 10300, 10302, 10303, ...] <-- indexes into MeshVertexBuffer + public Relation _VertexIndex; + } + + /// + /// Contains sequences of vertices. Referenced by meshes. + /// + public partial class MeshVertexBuffer : Entity { public Vector3 Vertex; } + /// + /// Transformation matrices. + /// + public partial class Transform : Entity + { + public Matrix4x4 Matrix4x4; + } + + //[TableName(TableNames.Instance)] + //[VimSqlIgnore] + //public partial class Instance : EntityWithElement + //{ + // public Matrix4x4 Transform; + // public int InstanceFlags; + // public Relation _View; // Optional for IFC case + // public Relation _Material; + // public Relation _Mesh; + //} + + ///// + ///// Represents a mesh + ///// + //[TableName(TableNames.Mesh)] + //[VimSqlIgnore] + //public partial class Mesh : Entity + //{ + // public Relation _MeshIndexBufferStart; + // public Relation _MeshIndexBufferEnd; + // public Relation _MeshVertexBufferStart; + // public Relation _MeshVertexBufferEnd; + //} + + ///// + ///// Represents a continuous index buffer of triangular meshes. + ///// + //[TableName(TableNames.MeshIndexBuffer)] + //[EntityBuffer] + //[VimSqlIgnore] + //public partial class MeshIndexBuffer : Entity + //{ + // // ex: [ ..., 10300, 10301, 10302, 10300, 10302, 10303, ...] <-- indexes into the VertexBuffer + // public Relation _VertexIndex; + //} + + ///// + ///// Represents a continuous vertex buffer. + ///// + //[TableName(TableNames.MeshVertexBuffer)] + //[EntityBuffer] + //[VimSqlIgnore] + //public partial class MeshVertexBuffer : Entity + //{ + // public Vector3 Vertex; + //} + /// /// Represents a sequence of points connected by line segments /// diff --git a/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs b/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs index 8f2219cf..9a4eb182 100644 --- a/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs +++ b/src/cs/vim/Vim.Format/ObjectModel/ObjectModelGenerated.cs @@ -1888,17 +1888,17 @@ public override bool FieldsAreEqual(object obj) } // end of class // AUTO-GENERATED - public partial class FaceMesh + public partial class Mesh { - public Vim.Format.ObjectModel.FaceMeshIndexBuffer FaceMeshIndexBufferStart => _FaceMeshIndexBufferStart.Value; - public Vim.Format.ObjectModel.FaceMeshIndexBuffer FaceMeshIndexBufferEnd => _FaceMeshIndexBufferEnd.Value; + public Vim.Format.ObjectModel.MeshIndexList MeshIndexListStart => _MeshIndexBufferStart.Value; + public Vim.Format.ObjectModel.MeshIndexList MeshIndexListEnd => _MeshIndexBufferEnd.Value; public Vim.Format.ObjectModel.View View => _View.Value; public Vim.Format.ObjectModel.Material Material => _Material.Value; public Vim.Format.ObjectModel.Element Element => _Element.Value; - public FaceMesh() + public Mesh() { - _FaceMeshIndexBufferStart = new Relation(); - _FaceMeshIndexBufferEnd = new Relation(); + _MeshIndexBufferStart = new Relation(); + _MeshIndexBufferEnd = new Relation(); _View = new Relation(); _Material = new Relation(); _Element = new Relation(); @@ -1906,12 +1906,12 @@ public FaceMesh() public override bool FieldsAreEqual(object obj) { - if ((obj is FaceMesh other)) + if ((obj is Mesh other)) { var fieldsAreEqual = (Index == other.Index) && - (_FaceMeshIndexBufferStart?.Index == other._FaceMeshIndexBufferStart?.Index) && - (_FaceMeshIndexBufferEnd?.Index == other._FaceMeshIndexBufferEnd?.Index) && + (_MeshIndexBufferStart?.Index == other._MeshIndexBufferStart?.Index) && + (_MeshIndexBufferEnd?.Index == other._MeshIndexBufferEnd?.Index) && (_View?.Index == other._View?.Index) && (_Material?.Index == other._Material?.Index) && (_Element?.Index == other._Element?.Index); @@ -1928,17 +1928,17 @@ public override bool FieldsAreEqual(object obj) } // end of class // AUTO-GENERATED - public partial class FaceMeshIndexBuffer + public partial class MeshIndexList { - public Vim.Format.ObjectModel.FaceMeshVertexBuffer VertexIndex => _VertexIndex.Value; - public FaceMeshIndexBuffer() + public Vim.Format.ObjectModel.MeshVertexList VertexIndex => _VertexIndex.Value; + public MeshIndexList() { - _VertexIndex = new Relation(); + _VertexIndex = new Relation(); } public override bool FieldsAreEqual(object obj) { - if ((obj is FaceMeshIndexBuffer other)) + if ((obj is MeshIndexList other)) { var fieldsAreEqual = (Index == other.Index) && @@ -1956,15 +1956,15 @@ public override bool FieldsAreEqual(object obj) } // end of class // AUTO-GENERATED - public partial class FaceMeshVertexBuffer + public partial class MeshVertexList { - public FaceMeshVertexBuffer() + public MeshVertexList() { } public override bool FieldsAreEqual(object obj) { - if ((obj is FaceMeshVertexBuffer other)) + if ((obj is MeshVertexList other)) { var fieldsAreEqual = (Index == other.Index) && @@ -3913,15 +3913,15 @@ public Building GetBuilding(int n) public IArray FaceMeshElementIndex { get; } public int GetFaceMeshElementIndex(int index) => FaceMeshElementIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; public int NumFaceMesh => FaceMeshEntityTable?.NumRows ?? 0; - public IArray FaceMeshList { get; } - public FaceMesh GetFaceMesh(int n) + public IArray FaceMeshList { get; } + public Mesh GetFaceMesh(int n) { if (n < 0) return null; - var r = new FaceMesh(); + var r = new Mesh(); r.Document = Document; r.Index = n; - r._FaceMeshIndexBufferStart = new Relation(GetFaceMeshFaceMeshIndexBufferStartIndex(n), GetFaceMeshIndexBuffer); - r._FaceMeshIndexBufferEnd = new Relation(GetFaceMeshFaceMeshIndexBufferEndIndex(n), GetFaceMeshIndexBuffer); + r._MeshIndexBufferStart = new Relation(GetFaceMeshFaceMeshIndexBufferStartIndex(n), GetFaceMeshIndexBuffer); + r._MeshIndexBufferEnd = new Relation(GetFaceMeshFaceMeshIndexBufferEndIndex(n), GetFaceMeshIndexBuffer); r._View = new Relation(GetFaceMeshViewIndex(n), GetView); r._Material = new Relation(GetFaceMeshMaterialIndex(n), GetMaterial); r._Element = new Relation(GetFaceMeshElementIndex(n), GetElement); @@ -3936,14 +3936,14 @@ public FaceMesh GetFaceMesh(int n) public IArray FaceMeshIndexBufferVertexIndexIndex { get; } public int GetFaceMeshIndexBufferVertexIndexIndex(int index) => FaceMeshIndexBufferVertexIndexIndex?.ElementAtOrDefault(index, EntityRelation.None) ?? EntityRelation.None; public int NumFaceMeshIndexBuffer => FaceMeshIndexBufferEntityTable?.NumRows ?? 0; - public IArray FaceMeshIndexBufferList { get; } - public FaceMeshIndexBuffer GetFaceMeshIndexBuffer(int n) + public IArray FaceMeshIndexBufferList { get; } + public MeshIndexList GetFaceMeshIndexBuffer(int n) { if (n < 0) return null; - var r = new FaceMeshIndexBuffer(); + var r = new MeshIndexList(); r.Document = Document; r.Index = n; - r._VertexIndex = new Relation(GetFaceMeshIndexBufferVertexIndexIndex(n), GetFaceMeshVertexBuffer); + r._VertexIndex = new Relation(GetFaceMeshIndexBufferVertexIndexIndex(n), GetFaceMeshVertexBuffer); return r; } @@ -3955,11 +3955,11 @@ public FaceMeshIndexBuffer GetFaceMeshIndexBuffer(int n) public IArray FaceMeshVertexBufferVertex { get; } public Vector3 GetFaceMeshVertexBufferVertex(int index, Vector3 defaultValue = default) => FaceMeshVertexBufferVertex?.ElementAtOrDefault(index, defaultValue) ?? defaultValue; public int NumFaceMeshVertexBuffer => FaceMeshVertexBufferEntityTable?.NumRows ?? 0; - public IArray FaceMeshVertexBufferList { get; } - public FaceMeshVertexBuffer GetFaceMeshVertexBuffer(int n) + public IArray FaceMeshVertexBufferList { get; } + public MeshVertexList GetFaceMeshVertexBuffer(int n) { if (n < 0) return null; - var r = new FaceMeshVertexBuffer(); + var r = new MeshVertexList(); r.Document = Document; r.Index = n; r.Vertex = FaceMeshVertexBufferVertex.ElementAtOrDefault(n); @@ -4138,9 +4138,9 @@ public LineShapeVertexBuffer GetLineShapeVertexBuffer(int n) {"Vim.ViewInViewSheet", typeof(ViewInViewSheet)}, {"Vim.Site", typeof(Site)}, {"Vim.Building", typeof(Building)}, - {"Vim.FaceMesh", typeof(FaceMesh)}, - {"Vim.FaceMeshIndexBuffer", typeof(FaceMeshIndexBuffer)}, - {"Vim.FaceMeshVertexBuffer", typeof(FaceMeshVertexBuffer)}, + {"Vim.FaceMesh", typeof(Mesh)}, + {"Vim.FaceMeshIndexBuffer", typeof(MeshIndexList)}, + {"Vim.FaceMeshVertexBuffer", typeof(MeshVertexList)}, {"Vim.LineShape", typeof(LineShape)}, {"Vim.LineShapeVertexBuffer", typeof(LineShapeVertexBuffer)}, }; @@ -4927,11 +4927,11 @@ public EntityTableSet(SerializableEntityTable[] rawTables, string[] stringBuffer public BuildingTable BuildingTable { get; } // can be null public Building GetBuilding(int index) => BuildingTable?.Get(index); public FaceMeshTable FaceMeshTable { get; } // can be null - public FaceMesh GetFaceMesh(int index) => FaceMeshTable?.Get(index); + public Mesh GetFaceMesh(int index) => FaceMeshTable?.Get(index); public FaceMeshIndexBufferTable FaceMeshIndexBufferTable { get; } // can be null - public FaceMeshIndexBuffer GetFaceMeshIndexBuffer(int index) => FaceMeshIndexBufferTable?.Get(index); + public MeshIndexList GetFaceMeshIndexBuffer(int index) => FaceMeshIndexBufferTable?.Get(index); public FaceMeshVertexBufferTable FaceMeshVertexBufferTable { get; } // can be null - public FaceMeshVertexBuffer GetFaceMeshVertexBuffer(int index) => FaceMeshVertexBufferTable?.Get(index); + public MeshVertexList GetFaceMeshVertexBuffer(int index) => FaceMeshVertexBufferTable?.Get(index); public LineShapeTable LineShapeTable { get; } // can be null public LineShape GetLineShape(int index) => LineShapeTable?.Get(index); public LineShapeVertexBufferTable LineShapeVertexBufferTable { get; } // can be null @@ -7854,7 +7854,7 @@ public IEnumerator GetEnumerator() } } // class BuildingTable - public partial class FaceMeshTable : EntityTable_v2, IEnumerable + public partial class FaceMeshTable : EntityTable_v2, IEnumerable { private readonly EntityTableSet _parentTableSet; // can be null @@ -7870,12 +7870,12 @@ public FaceMeshTable(SerializableEntityTable rawTable, string[] stringBuffer, En public int[] Column_FaceMeshIndexBufferStartIndex { get; } public int GetFaceMeshIndexBufferStartIndex(int index) => Column_FaceMeshIndexBufferStartIndex.ElementAtOrDefault(index, EntityRelation.None); - public FaceMeshIndexBuffer GetFaceMeshIndexBufferStart(int index) => _GetReferencedFaceMeshIndexBufferStart(GetFaceMeshIndexBufferStartIndex(index)); - private FaceMeshIndexBuffer _GetReferencedFaceMeshIndexBufferStart(int referencedIndex) => _parentTableSet.GetFaceMeshIndexBuffer(referencedIndex); + public MeshIndexList GetFaceMeshIndexBufferStart(int index) => _GetReferencedFaceMeshIndexBufferStart(GetFaceMeshIndexBufferStartIndex(index)); + private MeshIndexList _GetReferencedFaceMeshIndexBufferStart(int referencedIndex) => _parentTableSet.GetFaceMeshIndexBuffer(referencedIndex); public int[] Column_FaceMeshIndexBufferEndIndex { get; } public int GetFaceMeshIndexBufferEndIndex(int index) => Column_FaceMeshIndexBufferEndIndex.ElementAtOrDefault(index, EntityRelation.None); - public FaceMeshIndexBuffer GetFaceMeshIndexBufferEnd(int index) => _GetReferencedFaceMeshIndexBufferEnd(GetFaceMeshIndexBufferEndIndex(index)); - private FaceMeshIndexBuffer _GetReferencedFaceMeshIndexBufferEnd(int referencedIndex) => _parentTableSet.GetFaceMeshIndexBuffer(referencedIndex); + public MeshIndexList GetFaceMeshIndexBufferEnd(int index) => _GetReferencedFaceMeshIndexBufferEnd(GetFaceMeshIndexBufferEndIndex(index)); + private MeshIndexList _GetReferencedFaceMeshIndexBufferEnd(int referencedIndex) => _parentTableSet.GetFaceMeshIndexBuffer(referencedIndex); public int[] Column_ViewIndex { get; } public int GetViewIndex(int index) => Column_ViewIndex.ElementAtOrDefault(index, EntityRelation.None); public View GetView(int index) => _GetReferencedView(GetViewIndex(index)); @@ -7889,13 +7889,13 @@ public FaceMeshTable(SerializableEntityTable rawTable, string[] stringBuffer, En public Element GetElement(int index) => _GetReferencedElement(GetElementIndex(index)); private Element _GetReferencedElement(int referencedIndex) => _parentTableSet.GetElement(referencedIndex); // Object Getter - public FaceMesh Get(int index) + public Mesh Get(int index) { if (index < 0) return null; - var r = new FaceMesh(); + var r = new Mesh(); r.Index = index; - r._FaceMeshIndexBufferStart = new Relation(GetFaceMeshIndexBufferStartIndex(index), _GetReferencedFaceMeshIndexBufferStart); - r._FaceMeshIndexBufferEnd = new Relation(GetFaceMeshIndexBufferEndIndex(index), _GetReferencedFaceMeshIndexBufferEnd); + r._MeshIndexBufferStart = new Relation(GetFaceMeshIndexBufferStartIndex(index), _GetReferencedFaceMeshIndexBufferStart); + r._MeshIndexBufferEnd = new Relation(GetFaceMeshIndexBufferEndIndex(index), _GetReferencedFaceMeshIndexBufferEnd); r._View = new Relation(GetViewIndex(index), _GetReferencedView); r._Material = new Relation(GetMaterialIndex(index), _GetReferencedMaterial); r._Element = new Relation(GetElementIndex(index), _GetReferencedElement); @@ -7903,14 +7903,14 @@ public FaceMesh Get(int index) } // Enumerator IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); - public IEnumerator GetEnumerator() + public IEnumerator GetEnumerator() { for (var i = 0; i < RowCount; ++i) yield return Get(i); } } // class FaceMeshTable - public partial class FaceMeshIndexBufferTable : EntityTable_v2, IEnumerable + public partial class FaceMeshIndexBufferTable : EntityTable_v2, IEnumerable { private readonly EntityTableSet _parentTableSet; // can be null @@ -7922,27 +7922,27 @@ public FaceMeshIndexBufferTable(SerializableEntityTable rawTable, string[] strin public int[] Column_VertexIndexIndex { get; } public int GetVertexIndexIndex(int index) => Column_VertexIndexIndex.ElementAtOrDefault(index, EntityRelation.None); - public FaceMeshVertexBuffer GetVertexIndex(int index) => _GetReferencedVertexIndex(GetVertexIndexIndex(index)); - private FaceMeshVertexBuffer _GetReferencedVertexIndex(int referencedIndex) => _parentTableSet.GetFaceMeshVertexBuffer(referencedIndex); + public MeshVertexList GetVertexIndex(int index) => _GetReferencedVertexIndex(GetVertexIndexIndex(index)); + private MeshVertexList _GetReferencedVertexIndex(int referencedIndex) => _parentTableSet.GetFaceMeshVertexBuffer(referencedIndex); // Object Getter - public FaceMeshIndexBuffer Get(int index) + public MeshIndexList Get(int index) { if (index < 0) return null; - var r = new FaceMeshIndexBuffer(); + var r = new MeshIndexList(); r.Index = index; - r._VertexIndex = new Relation(GetVertexIndexIndex(index), _GetReferencedVertexIndex); + r._VertexIndex = new Relation(GetVertexIndexIndex(index), _GetReferencedVertexIndex); return r; } // Enumerator IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); - public IEnumerator GetEnumerator() + public IEnumerator GetEnumerator() { for (var i = 0; i < RowCount; ++i) yield return Get(i); } } // class FaceMeshIndexBufferTable - public partial class FaceMeshVertexBufferTable : EntityTable_v2, IEnumerable + public partial class FaceMeshVertexBufferTable : EntityTable_v2, IEnumerable { private readonly EntityTableSet _parentTableSet; // can be null @@ -7955,17 +7955,17 @@ public FaceMeshVertexBufferTable(SerializableEntityTable rawTable, string[] stri public Vector3[] Column_Vertex { get; } public Vector3 GetVertex(int index, Vector3 @default = default) => Column_Vertex.ElementAtOrDefault(index, @default); // Object Getter - public FaceMeshVertexBuffer Get(int index) + public MeshVertexList Get(int index) { if (index < 0) return null; - var r = new FaceMeshVertexBuffer(); + var r = new MeshVertexList(); r.Index = index; r.Vertex = GetVertex(index); return r; } // Enumerator IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); - public IEnumerator GetEnumerator() + public IEnumerator GetEnumerator() { for (var i = 0; i < RowCount; ++i) yield return Get(i); @@ -8118,7 +8118,7 @@ public static Func, EntityTableBuilder> GetTableBuilderFunc( if (type == typeof(ViewInViewSheet)) return ToViewInViewSheetTableBuilder; if (type == typeof(Site)) return ToSiteTableBuilder; if (type == typeof(Building)) return ToBuildingTableBuilder; - if (type == typeof(FaceMesh)) return ToFaceMeshTableBuilder; + if (type == typeof(Mesh)) return ToFaceMeshTableBuilder; if (type == typeof(LineShape)) return ToLineShapeTableBuilder; throw new ArgumentException(nameof(type)); } @@ -8776,10 +8776,10 @@ public static EntityTableBuilder ToBuildingTableBuilder(this IEnumerable } public static EntityTableBuilder ToFaceMeshTableBuilder(this IEnumerable entities) { - var typedEntities = entities?.Cast() ?? Enumerable.Empty(); + var typedEntities = entities?.Cast() ?? Enumerable.Empty(); var tb = new EntityTableBuilder("Vim.FaceMesh"); - tb.AddIndexColumn("index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferStart", typedEntities.Select(x => x._FaceMeshIndexBufferStart?.Index ?? EntityRelation.None)); - tb.AddIndexColumn("index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferEnd", typedEntities.Select(x => x._FaceMeshIndexBufferEnd?.Index ?? EntityRelation.None)); + tb.AddIndexColumn("index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferStart", typedEntities.Select(x => x._MeshIndexBufferStart?.Index ?? EntityRelation.None)); + tb.AddIndexColumn("index:Vim.FaceMeshIndexBuffer:FaceMeshIndexBufferEnd", typedEntities.Select(x => x._MeshIndexBufferEnd?.Index ?? EntityRelation.None)); tb.AddIndexColumn("index:Vim.View:View", typedEntities.Select(x => x._View?.Index ?? EntityRelation.None)); tb.AddIndexColumn("index:Vim.Material:Material", typedEntities.Select(x => x._Material?.Index ?? EntityRelation.None)); tb.AddIndexColumn("index:Vim.Element:Element", typedEntities.Select(x => x._Element?.Index ?? EntityRelation.None)); @@ -8857,7 +8857,7 @@ public partial class ObjectModelBuilder {typeof(ViewInViewSheet), new EntityTableBuilder()}, {typeof(Site), new EntityTableBuilder()}, {typeof(Building), new EntityTableBuilder()}, - {typeof(FaceMesh), new EntityTableBuilder()}, + {typeof(Mesh), new EntityTableBuilder()}, {typeof(LineShape), new EntityTableBuilder()}, }; } // ObjectModelBuilder diff --git a/src/cs/vim/Vim.Format/ObjectModel/ObjectModelStore.cs b/src/cs/vim/Vim.Format/ObjectModel/ObjectModelStore.cs index e1f89173..51e2ad04 100644 --- a/src/cs/vim/Vim.Format/ObjectModel/ObjectModelStore.cs +++ b/src/cs/vim/Vim.Format/ObjectModel/ObjectModelStore.cs @@ -46,15 +46,15 @@ private void AddEntityTableBuffers(DocumentBuilder documentBuilder) // Add the face mesh index buffer. { - var tb = new EntityTableBuilder(TableNames.FaceMeshIndexBuffer); - tb.AddIndexColumn($"index:{TableNames.FaceMeshVertexBuffer}:{nameof(ObjectModel.FaceMeshIndexBuffer.VertexIndex)}", FaceMeshIndexBuffer); + var tb = new EntityTableBuilder(TableNames.MeshIndexBuffer); + tb.AddIndexColumn($"index:{TableNames.MeshVertexBuffer}:{nameof(ObjectModel.MeshIndexList.VertexIndex)}", FaceMeshIndexBuffer); documentBuilder.Tables.Add(tb.Name, tb); } // Add the face mesh vertex buffer. { - var tb = new EntityTableBuilder(TableNames.FaceMeshVertexBuffer); - tb.AddDataColumn($"vector3:{nameof(ObjectModel.FaceMeshVertexBuffer.Vertex)}", FaceMeshVertexBuffer); + var tb = new EntityTableBuilder(TableNames.MeshVertexBuffer); + tb.AddDataColumn($"vector3:{nameof(ObjectModel.MeshVertexList.Vertex)}", FaceMeshVertexBuffer); documentBuilder.Tables.Add(tb.Name, tb); }