diff --git a/go.mod b/go.mod index d5ba8be..b4ef0ae 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module github.com/Patch2PDF/MVR-Parser go 1.25.4 require ( - github.com/Patch2PDF/GDTF-Mesh-Reader v1.1.2 - github.com/Patch2PDF/GDTF-Parser v0.2.2 + github.com/Patch2PDF/GDTF-Mesh-Reader/v2 v2.0.1 + github.com/Patch2PDF/GDTF-Parser v0.3.0 golang.org/x/sync v0.19.0 ) diff --git a/go.sum b/go.sum index 5d0e45e..51cff22 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ -github.com/Patch2PDF/GDTF-Mesh-Reader v1.1.2 h1:4LHeQjH+cwRoXuv+O4X9YoJaZAO/DihGGN5t3jVIFFk= -github.com/Patch2PDF/GDTF-Mesh-Reader v1.1.2/go.mod h1:4Uipj5UA1HhD3v032aSnEFlpItN80UY5zKB15mIeVwQ= -github.com/Patch2PDF/GDTF-Parser v0.2.2 h1:MpUqTsRVxsgqfsM6oTFx1BPUgVL5TaAXfiomI2mMqYI= -github.com/Patch2PDF/GDTF-Parser v0.2.2/go.mod h1:sXYpcmWKjVBL0JuRWyHwSFHRGzx6kex+HaS/vEPLZ2Y= +github.com/Patch2PDF/GDTF-Mesh-Reader/v2 v2.0.1 h1:xc6xxlDRv9s19um206MW6lYsZU7sXOfHgROuo7PxTZg= +github.com/Patch2PDF/GDTF-Mesh-Reader/v2 v2.0.1/go.mod h1:zAcGHlYdE75hdFo624nQfQHTzw9+NfPJT8Eo2mB1lI8= +github.com/Patch2PDF/GDTF-Parser v0.3.0 h1:aUPiTMJrlNW06nMdzxbRuqU4ZVsrskC14ZzKN7gsUz0= +github.com/Patch2PDF/GDTF-Parser v0.3.0/go.mod h1:4NWUS8fNAQJjQetvlZvrVE/lv2oFaEkuPUKc/r/TugE= github.com/go-test/deep v1.0.1 h1:UQhStjbkDClarlmv0am7OXXO4/GaPdCGiUiMTvi28sg= github.com/go-test/deep v1.0.1/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/qmuntal/gltf v0.28.0 h1:C4A1temWMPtcI2+qNfpfRq8FEJxoBGUN3ZZM8BCc+xU= diff --git a/internal/gdtfreader/getgdtf.go b/internal/gdtfreader/getgdtf.go index 4bf3a79..add13a0 100644 --- a/internal/gdtfreader/getgdtf.go +++ b/internal/gdtfreader/getgdtf.go @@ -4,7 +4,6 @@ import ( "archive/zip" "strings" - "github.com/Patch2PDF/GDTF-Mesh-Reader/pkg/MeshTypes" GDTFParser "github.com/Patch2PDF/GDTF-Parser" MVRTypes "github.com/Patch2PDF/MVR-Parser/pkg/types" "golang.org/x/sync/errgroup" @@ -43,20 +42,17 @@ func getGDTF(jobs <-chan *GDTFTask, results chan<- *MVRTypes.GDTF, fileMap map[s if err != nil { return err } - meshes := map[string]*MeshTypes.Mesh{} for gdtfMode := range task.GDTFModes { - if config.MeshHandling >= MVRTypes.BuildFixtureModels { - mesh, err := gdtf.BuildMesh(gdtfMode) + if config.MeshHandling >= MVRTypes.BuildFixtureModels && gdtf.FixtureType.DMXModes[gdtfMode].MeshModels == nil { + _, err := gdtf.BuildMesh(gdtfMode) if err != nil { return err } - meshes[gdtfMode] = mesh } } results <- &MVRTypes.GDTF{ - Name: task.GDTFSpec, - Data: gdtf, - Meshes: meshes, + Name: task.GDTFSpec, + Data: gdtf, } } return nil diff --git a/internal/types/mvrxml/general.go b/internal/types/mvrxml/general.go index 73de108..5aa9670 100644 --- a/internal/types/mvrxml/general.go +++ b/internal/types/mvrxml/general.go @@ -6,7 +6,7 @@ import ( "strconv" "strings" - "github.com/Patch2PDF/GDTF-Mesh-Reader/pkg/MeshTypes" + "github.com/Patch2PDF/GDTF-Mesh-Reader/v2/pkg/MeshTypes" GDTFReader "github.com/Patch2PDF/MVR-Parser/internal/gdtfreader" ) diff --git a/mvr-parser.go b/mvr-parser.go index 6fffc3e..317668d 100644 --- a/mvr-parser.go +++ b/mvr-parser.go @@ -63,10 +63,7 @@ func ParseMVRZipReader(zipfile *zip.Reader, config MVRTypes.MVRParserConfig) (*M if config.MeshHandling >= MVRTypes.BuildStageModel { meshTasks := MVRTypes.MeshTasks{} - parsedData.CreateMeshTasks(&meshTasks, config.ModelConfig) - fmt.Println(len(meshTasks)) - - parsedData.StageModel = MVRTypes.CompleteMeshTasks(&meshTasks, config) + parsedData.GenerateMeshes(&meshTasks, config.ModelConfig) } return parsedData, nil diff --git a/pkg/types/fixture.go b/pkg/types/fixture.go index 70e7299..4cb4868 100644 --- a/pkg/types/fixture.go +++ b/pkg/types/fixture.go @@ -3,7 +3,7 @@ package MVRTypes import ( "archive/zip" - "github.com/Patch2PDF/GDTF-Mesh-Reader/pkg/MeshTypes" + "github.com/Patch2PDF/GDTF-Mesh-Reader/v2/pkg/MeshTypes" ) type Fixture struct { diff --git a/pkg/types/focuspoint.go b/pkg/types/focuspoint.go index 4c3bc13..e94ba2c 100644 --- a/pkg/types/focuspoint.go +++ b/pkg/types/focuspoint.go @@ -3,7 +3,7 @@ package MVRTypes import ( "archive/zip" - "github.com/Patch2PDF/GDTF-Mesh-Reader/pkg/MeshTypes" + "github.com/Patch2PDF/GDTF-Mesh-Reader/v2/pkg/MeshTypes" ) type FocusPoint struct { diff --git a/pkg/types/gdtfdata.go b/pkg/types/gdtfdata.go index d867791..06052a0 100644 --- a/pkg/types/gdtfdata.go +++ b/pkg/types/gdtfdata.go @@ -1,12 +1,10 @@ package MVRTypes import ( - "github.com/Patch2PDF/GDTF-Mesh-Reader/pkg/MeshTypes" GDTFTypes "github.com/Patch2PDF/GDTF-Parser/pkg/types" ) type GDTF struct { - Name string - Data *GDTFTypes.GDTF - Meshes map[string]*MeshTypes.Mesh + Name string + Data *GDTFTypes.GDTF } diff --git a/pkg/types/general.go b/pkg/types/general.go index 7b935dd..a3b68f9 100644 --- a/pkg/types/general.go +++ b/pkg/types/general.go @@ -4,7 +4,7 @@ import ( "strconv" "strings" - "github.com/Patch2PDF/GDTF-Mesh-Reader/pkg/MeshTypes" + "github.com/Patch2PDF/GDTF-Mesh-Reader/v2/pkg/MeshTypes" ) type Matrix = MeshTypes.Matrix diff --git a/pkg/types/generalscenedescription.go b/pkg/types/generalscenedescription.go index e4bc2ac..4e79bdd 100644 --- a/pkg/types/generalscenedescription.go +++ b/pkg/types/generalscenedescription.go @@ -1,7 +1,5 @@ package MVRTypes -import "github.com/Patch2PDF/GDTF-Mesh-Reader/pkg/MeshTypes" - type GeneralSceneDescription struct { VersionMajor int VersionMinor int @@ -9,7 +7,7 @@ type GeneralSceneDescription struct { ProviderVersion string UserData *UserData Scene *Scene - StageModel *MeshTypes.Mesh + StageModel *StageModel } func (a *GeneralSceneDescription) CreateReferencePointer(refPointers *ReferencePointers) { diff --git a/pkg/types/geometries.go b/pkg/types/geometries.go index 565a835..73e026d 100644 --- a/pkg/types/geometries.go +++ b/pkg/types/geometries.go @@ -4,8 +4,8 @@ import ( "archive/zip" "path" - GDTFMeshReader "github.com/Patch2PDF/GDTF-Mesh-Reader" - "github.com/Patch2PDF/GDTF-Mesh-Reader/pkg/MeshTypes" + GDTFMeshReader "github.com/Patch2PDF/GDTF-Mesh-Reader/v2" + "github.com/Patch2PDF/GDTF-Mesh-Reader/v2/pkg/MeshTypes" ) type Geometries struct { diff --git a/pkg/types/groupobject.go b/pkg/types/groupobject.go index 957fd8b..121b1cc 100644 --- a/pkg/types/groupobject.go +++ b/pkg/types/groupobject.go @@ -3,7 +3,7 @@ package MVRTypes import ( "archive/zip" - "github.com/Patch2PDF/GDTF-Mesh-Reader/pkg/MeshTypes" + "github.com/Patch2PDF/GDTF-Mesh-Reader/v2/pkg/MeshTypes" ) type GroupObject struct { diff --git a/pkg/types/meshTasks.go b/pkg/types/meshTasks.go index c42f221..87f708d 100644 --- a/pkg/types/meshTasks.go +++ b/pkg/types/meshTasks.go @@ -3,14 +3,15 @@ package MVRTypes import ( "sync" - "github.com/Patch2PDF/GDTF-Mesh-Reader/pkg/MeshTypes" + "github.com/Patch2PDF/GDTF-Mesh-Reader/v2/pkg/MeshTypes" + GDTFTypes "github.com/Patch2PDF/GDTF-Parser/pkg/types" ) type MeshTasks = []MeshTransformationTask type MeshTransformationTask struct { - Matrix MeshTypes.Matrix - OriginalMesh *MeshTypes.Mesh + Matrix MeshTypes.Matrix + Mesh *MeshTypes.Mesh } type ParentMeshConfig struct { @@ -19,7 +20,7 @@ type ParentMeshConfig struct { } type MeshTaskCreator interface { - CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) + GenerateMesh(meshTasks *MeshTasks, stageModel *StageModel, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) } func getConfigOverrides(modelConfig ModelConfig, parentMeshConfig ParentMeshConfig, uuid string) ModelNodeConfig { @@ -36,33 +37,36 @@ func getConfigOverrides(modelConfig ModelConfig, parentMeshConfig ParentMeshConf return configOverrides } -func CreateMeshTasks[T MeshTaskCreator](objects []T, meshTasks *MeshTasks, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { +func GenerateMeshes[T MeshTaskCreator](objects []T, meshTasks *MeshTasks, stageModel *StageModel, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { for _, obj := range objects { - obj.CreateMeshTask(meshTasks, modelConfig, parentMeshConfig) + obj.GenerateMesh(meshTasks, stageModel, modelConfig, parentMeshConfig) } } -func (a *GeneralSceneDescription) CreateMeshTasks(meshTasks *MeshTasks, modelConfig ModelConfig) { +func (a *GeneralSceneDescription) GenerateMeshes(meshTasks *MeshTasks, modelConfig ModelConfig) { + if a.StageModel == nil { + a.StageModel = &StageModel{} + } for _, layer := range a.Scene.Layers { - layer.CreateMeshTask(meshTasks, modelConfig, ParentMeshConfig{ + layer.GenerateMesh(meshTasks, a.StageModel, modelConfig, ParentMeshConfig{ Transformation: MeshTypes.IdentityMatrix(), ModelConfig: modelConfig.Global.asNodeConfig(), }) } } -func (a *ChildList) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { - CreateMeshTasks(a.SceneObjects, meshTasks, modelConfig, parentMeshConfig) - CreateMeshTasks(a.GroupObjects, meshTasks, modelConfig, parentMeshConfig) - CreateMeshTasks(a.FocusPoints, meshTasks, modelConfig, parentMeshConfig) - CreateMeshTasks(a.Fixtures, meshTasks, modelConfig, parentMeshConfig) - CreateMeshTasks(a.Supports, meshTasks, modelConfig, parentMeshConfig) - CreateMeshTasks(a.Trusses, meshTasks, modelConfig, parentMeshConfig) - CreateMeshTasks(a.VideoScreens, meshTasks, modelConfig, parentMeshConfig) - CreateMeshTasks(a.Projectors, meshTasks, modelConfig, parentMeshConfig) +func (a *ChildList) GenerateMesh(meshTasks *MeshTasks, stageModel *StageModel, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { + GenerateMeshes(a.SceneObjects, meshTasks, stageModel, modelConfig, parentMeshConfig) + GenerateMeshes(a.GroupObjects, meshTasks, stageModel, modelConfig, parentMeshConfig) + GenerateMeshes(a.FocusPoints, meshTasks, stageModel, modelConfig, parentMeshConfig) + GenerateMeshes(a.Fixtures, meshTasks, stageModel, modelConfig, parentMeshConfig) + GenerateMeshes(a.Supports, meshTasks, stageModel, modelConfig, parentMeshConfig) + GenerateMeshes(a.Trusses, meshTasks, stageModel, modelConfig, parentMeshConfig) + GenerateMeshes(a.VideoScreens, meshTasks, stageModel, modelConfig, parentMeshConfig) + GenerateMeshes(a.Projectors, meshTasks, stageModel, modelConfig, parentMeshConfig) } -func (obj *GroupObject) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { +func (obj *GroupObject) GenerateMesh(meshTasks *MeshTasks, stageModel *StageModel, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { config := getConfigOverrides(modelConfig, parentMeshConfig, obj.UUID) if config.Exclude != nil && *config.Exclude { @@ -71,13 +75,13 @@ func (obj *GroupObject) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelCo matrix := parentMeshConfig.Transformation.Mul(obj.Matrix) - obj.ChildList.CreateMeshTask(meshTasks, modelConfig, ParentMeshConfig{ + obj.ChildList.GenerateMesh(meshTasks, stageModel, modelConfig, ParentMeshConfig{ Transformation: matrix, ModelConfig: config, }) } -func (obj *SceneObject) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { +func (obj *SceneObject) GenerateMesh(meshTasks *MeshTasks, stageModel *StageModel, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { config := getConfigOverrides(modelConfig, parentMeshConfig, obj.UUID) if config.Exclude != nil && *config.Exclude { @@ -86,10 +90,17 @@ func (obj *SceneObject) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelCo matrix := parentMeshConfig.Transformation.Mul(obj.Matrix) if obj.GDTFSpec.Ptr != nil { - *meshTasks = append(*meshTasks, MeshTransformationTask{ - Matrix: matrix, - OriginalMesh: obj.GDTFSpec.Ptr.Meshes[obj.GDTFMode], - }) + model := SceneObjectModel{ + SceneObject: obj, + TransformationMatrix: matrix, + MeshModel: make([]GDTFTypes.MeshModel, 0, len(obj.GDTFSpec.Ptr.Data.FixtureType.DMXModes[obj.GDTFMode].MeshModels)), + } + for _, part := range obj.GDTFSpec.Ptr.Data.FixtureType.DMXModes[obj.GDTFMode].MeshModels { + copy := part.Copy() + copy.Mesh.RotateAndTranslate(matrix) + model.MeshModel = append(model.MeshModel, copy) + } + stageModel.SceneObjectModels = append(stageModel.SceneObjectModels, model) } parentConf := ParentMeshConfig{ @@ -97,15 +108,15 @@ func (obj *SceneObject) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelCo ModelConfig: config, } - obj.Geometries.CreateMeshTask(meshTasks, modelConfig, parentConf) + obj.Geometries.GenerateMesh(meshTasks, stageModel, modelConfig, parentConf) - obj.ChildList.CreateMeshTask(meshTasks, modelConfig, ParentMeshConfig{ + obj.ChildList.GenerateMesh(meshTasks, stageModel, modelConfig, ParentMeshConfig{ Transformation: matrix, ModelConfig: config, }) } -func (obj *FocusPoint) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { +func (obj *FocusPoint) GenerateMesh(meshTasks *MeshTasks, stageModel *StageModel, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { config := getConfigOverrides(modelConfig, parentMeshConfig, obj.UUID) if config.Exclude != nil && *config.Exclude { @@ -113,13 +124,13 @@ func (obj *FocusPoint) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelCon } matrix := parentMeshConfig.Transformation.Mul(obj.Matrix) - obj.Geometries.CreateMeshTask(meshTasks, modelConfig, ParentMeshConfig{ + obj.Geometries.GenerateMesh(meshTasks, stageModel, modelConfig, ParentMeshConfig{ Transformation: matrix, ModelConfig: config, }) } -func (obj *Fixture) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { +func (obj *Fixture) GenerateMesh(meshTasks *MeshTasks, stageModel *StageModel, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { config := getConfigOverrides(modelConfig, parentMeshConfig, obj.UUID) if config.Exclude != nil && *config.Exclude { @@ -131,19 +142,26 @@ func (obj *Fixture) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelConfig matrix := parentMeshConfig.Transformation.Mul(obj.Matrix) if obj.GDTFSpec.Ptr != nil { - *meshTasks = append(*meshTasks, MeshTransformationTask{ - Matrix: matrix, - OriginalMesh: obj.GDTFSpec.Ptr.Meshes[obj.GDTFMode], - }) + model := FixtureModel{ + Fixture: obj, + TransformationMatrix: matrix, + MeshModel: make([]GDTFTypes.MeshModel, 0, len(obj.GDTFSpec.Ptr.Data.FixtureType.DMXModes[obj.GDTFMode].MeshModels)), + } + for _, part := range obj.GDTFSpec.Ptr.Data.FixtureType.DMXModes[obj.GDTFMode].MeshModels { + copy := part.Copy() + copy.Mesh.RotateAndTranslate(matrix) + model.MeshModel = append(model.MeshModel, copy) + } + stageModel.FixtureModels = append(stageModel.FixtureModels, model) } - obj.ChildList.CreateMeshTask(meshTasks, modelConfig, ParentMeshConfig{ + obj.ChildList.GenerateMesh(meshTasks, stageModel, modelConfig, ParentMeshConfig{ Transformation: matrix, ModelConfig: config, }) } -func (obj *Support) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { +func (obj *Support) GenerateMesh(meshTasks *MeshTasks, stageModel *StageModel, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { config := getConfigOverrides(modelConfig, parentMeshConfig, obj.UUID) if config.Exclude != nil && *config.Exclude { @@ -152,10 +170,17 @@ func (obj *Support) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelConfig matrix := parentMeshConfig.Transformation.Mul(obj.Matrix) if obj.GDTFSpec.Ptr != nil { - *meshTasks = append(*meshTasks, MeshTransformationTask{ - Matrix: matrix, - OriginalMesh: obj.GDTFSpec.Ptr.Meshes[obj.GDTFMode], - }) + model := SupportModel{ + Support: obj, + TransformationMatrix: matrix, + MeshModel: make([]GDTFTypes.MeshModel, 0, len(obj.GDTFSpec.Ptr.Data.FixtureType.DMXModes[obj.GDTFMode].MeshModels)), + } + for _, part := range obj.GDTFSpec.Ptr.Data.FixtureType.DMXModes[obj.GDTFMode].MeshModels { + copy := part.Copy() + copy.Mesh.RotateAndTranslate(matrix) + model.MeshModel = append(model.MeshModel, copy) + } + stageModel.SupportModels = append(stageModel.SupportModels, model) } parentConf := ParentMeshConfig{ @@ -163,12 +188,12 @@ func (obj *Support) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelConfig ModelConfig: config, } - obj.Geometries.CreateMeshTask(meshTasks, modelConfig, parentConf) + obj.Geometries.GenerateMesh(meshTasks, stageModel, modelConfig, parentConf) - obj.ChildList.CreateMeshTask(meshTasks, modelConfig, parentConf) + obj.ChildList.GenerateMesh(meshTasks, stageModel, modelConfig, parentConf) } -func (obj *Truss) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { +func (obj *Truss) GenerateMesh(meshTasks *MeshTasks, stageModel *StageModel, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { config := getConfigOverrides(modelConfig, parentMeshConfig, obj.UUID) if config.Exclude != nil && *config.Exclude { @@ -177,10 +202,17 @@ func (obj *Truss) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelConfig, matrix := parentMeshConfig.Transformation.Mul(obj.Matrix) if obj.GDTFSpec.Ptr != nil { - *meshTasks = append(*meshTasks, MeshTransformationTask{ - Matrix: matrix, - OriginalMesh: obj.GDTFSpec.Ptr.Meshes[obj.GDTFMode], - }) + model := TrussModel{ + Truss: obj, + TransformationMatrix: matrix, + MeshModel: make([]GDTFTypes.MeshModel, 0, len(obj.GDTFSpec.Ptr.Data.FixtureType.DMXModes[obj.GDTFMode].MeshModels)), + } + for _, part := range obj.GDTFSpec.Ptr.Data.FixtureType.DMXModes[obj.GDTFMode].MeshModels { + copy := part.Copy() + copy.Mesh.RotateAndTranslate(matrix) + model.MeshModel = append(model.MeshModel, copy) + } + stageModel.TrussModels = append(stageModel.TrussModels, model) } parentConf := ParentMeshConfig{ @@ -188,12 +220,12 @@ func (obj *Truss) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelConfig, ModelConfig: config, } - obj.Geometries.CreateMeshTask(meshTasks, modelConfig, parentConf) + obj.Geometries.GenerateMesh(meshTasks, stageModel, modelConfig, parentConf) - obj.ChildList.CreateMeshTask(meshTasks, modelConfig, parentConf) + obj.ChildList.GenerateMesh(meshTasks, stageModel, modelConfig, parentConf) } -func (obj *VideoScreen) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { +func (obj *VideoScreen) GenerateMesh(meshTasks *MeshTasks, stageModel *StageModel, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { config := getConfigOverrides(modelConfig, parentMeshConfig, obj.UUID) if config.Exclude != nil && *config.Exclude { @@ -202,10 +234,17 @@ func (obj *VideoScreen) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelCo matrix := parentMeshConfig.Transformation.Mul(obj.Matrix) if obj.GDTFSpec.Ptr != nil { - *meshTasks = append(*meshTasks, MeshTransformationTask{ - Matrix: matrix, - OriginalMesh: obj.GDTFSpec.Ptr.Meshes[obj.GDTFMode], - }) + model := VideoScreenModel{ + VideoScreen: obj, + TransformationMatrix: matrix, + MeshModel: make([]GDTFTypes.MeshModel, 0, len(obj.GDTFSpec.Ptr.Data.FixtureType.DMXModes[obj.GDTFMode].MeshModels)), + } + for _, part := range obj.GDTFSpec.Ptr.Data.FixtureType.DMXModes[obj.GDTFMode].MeshModels { + copy := part.Copy() + copy.Mesh.RotateAndTranslate(matrix) + model.MeshModel = append(model.MeshModel, copy) + } + stageModel.VideoScreenModels = append(stageModel.VideoScreenModels, model) } parentConf := ParentMeshConfig{ @@ -213,12 +252,12 @@ func (obj *VideoScreen) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelCo ModelConfig: config, } - obj.Geometries.CreateMeshTask(meshTasks, modelConfig, parentConf) + obj.Geometries.GenerateMesh(meshTasks, stageModel, modelConfig, parentConf) - obj.ChildList.CreateMeshTask(meshTasks, modelConfig, parentConf) + obj.ChildList.GenerateMesh(meshTasks, stageModel, modelConfig, parentConf) } -func (obj *Projector) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { +func (obj *Projector) GenerateMesh(meshTasks *MeshTasks, stageModel *StageModel, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { config := getConfigOverrides(modelConfig, parentMeshConfig, obj.UUID) if config.Exclude != nil && *config.Exclude { @@ -227,10 +266,17 @@ func (obj *Projector) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelConf matrix := parentMeshConfig.Transformation.Mul(obj.Matrix) if obj.GDTFSpec.Ptr != nil { - *meshTasks = append(*meshTasks, MeshTransformationTask{ - Matrix: matrix, - OriginalMesh: obj.GDTFSpec.Ptr.Meshes[obj.GDTFMode], - }) + model := ProjectorModel{ + Projector: obj, + TransformationMatrix: matrix, + MeshModel: make([]GDTFTypes.MeshModel, 0, len(obj.GDTFSpec.Ptr.Data.FixtureType.DMXModes[obj.GDTFMode].MeshModels)), + } + for _, part := range obj.GDTFSpec.Ptr.Data.FixtureType.DMXModes[obj.GDTFMode].MeshModels { + copy := part.Copy() + copy.Mesh.RotateAndTranslate(matrix) + model.MeshModel = append(model.MeshModel, copy) + } + stageModel.ProjectorModels = append(stageModel.ProjectorModels, model) } parentConf := ParentMeshConfig{ @@ -238,62 +284,62 @@ func (obj *Projector) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelConf ModelConfig: config, } - obj.Geometries.CreateMeshTask(meshTasks, modelConfig, parentConf) + obj.Geometries.GenerateMesh(meshTasks, stageModel, modelConfig, parentConf) - obj.ChildList.CreateMeshTask(meshTasks, modelConfig, parentConf) + obj.ChildList.GenerateMesh(meshTasks, stageModel, modelConfig, parentConf) } -func (obj *Geometries) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { +func (obj *Geometries) GenerateMesh(meshTasks *MeshTasks, stageModel *StageModel, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { for _, element := range obj.Geometry3D { matrix := parentMeshConfig.Transformation.Mul(element.Matrix) *meshTasks = append(*meshTasks, MeshTransformationTask{ - Matrix: matrix, - OriginalMesh: element.Mesh, + Matrix: matrix, + Mesh: element.Mesh, }) } for _, element := range obj.Symbol { matrix := parentMeshConfig.Transformation.Mul(element.Matrix) - element.CreateMeshTask(meshTasks, modelConfig, ParentMeshConfig{ + element.GenerateMesh(meshTasks, stageModel, modelConfig, ParentMeshConfig{ Transformation: matrix, ModelConfig: parentMeshConfig.ModelConfig, }) } } -func (a *Symbol) CreateMeshTask(meshTasks *MeshTasks, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { +func (a *Symbol) GenerateMesh(meshTasks *MeshTasks, stageModel *StageModel, modelConfig ModelConfig, parentMeshConfig ParentMeshConfig) { config := getConfigOverrides(modelConfig, parentMeshConfig, a.UUID) if config.Exclude != nil && *config.Exclude { return } if a.SymDef.Ptr != nil { matrix := parentMeshConfig.Transformation.Mul(a.Matrix) - a.SymDef.Ptr.Geometries.CreateMeshTask(meshTasks, modelConfig, ParentMeshConfig{ + a.SymDef.Ptr.Geometries.GenerateMesh(meshTasks, stageModel, modelConfig, ParentMeshConfig{ Transformation: matrix, ModelConfig: config, }) } } -func meshTaskWorker(jobs <-chan MeshTransformationTask, results chan<- *MeshTypes.Mesh, wg *sync.WaitGroup) { +func meshTaskWorker(jobs <-chan MeshTransformationTask, wg *sync.WaitGroup) { defer wg.Done() for j := range jobs { - mesh := j.OriginalMesh.Copy() - mesh.RotateAndTranslate(j.Matrix) - results <- &mesh + j.Mesh.RotateAndTranslate(j.Matrix) + // mesh := j.Mesh.Copy() + // mesh.RotateAndTranslate(j.Matrix) + // *j.Mesh = mesh } } -func CompleteMeshTasks(meshTasks *MeshTasks, config MVRParserConfig) *MeshTypes.Mesh { +func CompleteMeshTasks(meshTasks *MeshTasks, config MVRParserConfig) { var numWorkers = config.StageMeshWorkers jobs := make(chan MeshTransformationTask, len(*meshTasks)) - results := make(chan *MeshTypes.Mesh, len(*meshTasks)) var wg sync.WaitGroup for range numWorkers { wg.Add(1) - go meshTaskWorker(jobs, results, &wg) + go meshTaskWorker(jobs, &wg) } for _, t := range *meshTasks { @@ -302,22 +348,6 @@ func CompleteMeshTasks(meshTasks *MeshTasks, config MVRParserConfig) *MeshTypes. close(jobs) wg.Wait() - close(results) - - // pre allocate length to reduce array resizings - meshes := make([]*MeshTypes.Mesh, 0, len(results)) - var totalTriangles int = 0 - - for mesh := range results { - totalTriangles += len(mesh.Triangles) - meshes = append(meshes, mesh) - } - - result := MeshTypes.Mesh{ - Triangles: make([]*MeshTypes.Triangle, 0, totalTriangles), - } - - result.Add(meshes...) - return &result + // return } diff --git a/pkg/types/scene.go b/pkg/types/scene.go index 2e8b04d..83095fe 100644 --- a/pkg/types/scene.go +++ b/pkg/types/scene.go @@ -3,7 +3,7 @@ package MVRTypes import ( "archive/zip" - "github.com/Patch2PDF/GDTF-Mesh-Reader/pkg/MeshTypes" + "github.com/Patch2PDF/GDTF-Mesh-Reader/v2/pkg/MeshTypes" ) type Scene struct { diff --git a/pkg/types/sceneobject.go b/pkg/types/sceneobject.go index de666fb..c9e089a 100644 --- a/pkg/types/sceneobject.go +++ b/pkg/types/sceneobject.go @@ -3,7 +3,7 @@ package MVRTypes import ( "archive/zip" - "github.com/Patch2PDF/GDTF-Mesh-Reader/pkg/MeshTypes" + "github.com/Patch2PDF/GDTF-Mesh-Reader/v2/pkg/MeshTypes" ) type SceneObject struct { diff --git a/pkg/types/stagemodel.go b/pkg/types/stagemodel.go new file mode 100644 index 0000000..56b0cb5 --- /dev/null +++ b/pkg/types/stagemodel.go @@ -0,0 +1,125 @@ +package MVRTypes + +import ( + "github.com/Patch2PDF/GDTF-Mesh-Reader/v2/pkg/MeshTypes" + GDTFTypes "github.com/Patch2PDF/GDTF-Parser/pkg/types" +) + +type DeepCopy[T any] interface { + Copy() T +} + +func CopySlice[Source DeepCopy[Destination], Destination any](source []Source) []Destination { + if source == nil { + return []Destination{} + } + var destination []Destination = make([]Destination, len(source)) + for index, element := range source { + destination[index] = element.Copy() + } + return destination +} + +type StageModel struct { + SceneObjectModels []SceneObjectModel + FixtureModels []FixtureModel + SupportModels []SupportModel + TrussModels []TrussModel + VideoScreenModels []VideoScreenModel + ProjectorModels []ProjectorModel +} + +func (obj *StageModel) Copy() StageModel { + return StageModel{ + SceneObjectModels: CopySlice(obj.SceneObjectModels), + FixtureModels: CopySlice(obj.FixtureModels), + SupportModels: CopySlice(obj.SupportModels), + TrussModels: CopySlice(obj.TrussModels), + VideoScreenModels: CopySlice(obj.VideoScreenModels), + ProjectorModels: CopySlice(obj.ProjectorModels), + } +} + +type SceneObjectModel struct { + SceneObject *SceneObject + TransformationMatrix MeshTypes.Matrix + MeshModel []GDTFTypes.MeshModel +} + +func (obj SceneObjectModel) Copy() SceneObjectModel { + return SceneObjectModel{ + SceneObject: obj.SceneObject, + TransformationMatrix: obj.TransformationMatrix, + MeshModel: CopySlice(obj.MeshModel), + } +} + +type FixtureModel struct { + Fixture *Fixture + TransformationMatrix MeshTypes.Matrix + MeshModel []GDTFTypes.MeshModel +} + +func (obj FixtureModel) Copy() FixtureModel { + return FixtureModel{ + Fixture: obj.Fixture, + TransformationMatrix: obj.TransformationMatrix, + MeshModel: CopySlice(obj.MeshModel), + } +} + +type SupportModel struct { + Support *Support + TransformationMatrix MeshTypes.Matrix + MeshModel []GDTFTypes.MeshModel +} + +func (obj SupportModel) Copy() SupportModel { + return SupportModel{ + Support: obj.Support, + TransformationMatrix: obj.TransformationMatrix, + MeshModel: CopySlice(obj.MeshModel), + } +} + +type TrussModel struct { + Truss *Truss + TransformationMatrix MeshTypes.Matrix + MeshModel []GDTFTypes.MeshModel +} + +func (obj TrussModel) Copy() TrussModel { + return TrussModel{ + Truss: obj.Truss, + TransformationMatrix: obj.TransformationMatrix, + MeshModel: CopySlice(obj.MeshModel), + } +} + +type VideoScreenModel struct { + VideoScreen *VideoScreen + TransformationMatrix MeshTypes.Matrix + MeshModel []GDTFTypes.MeshModel +} + +func (obj VideoScreenModel) Copy() VideoScreenModel { + return VideoScreenModel{ + VideoScreen: obj.VideoScreen, + TransformationMatrix: obj.TransformationMatrix, + MeshModel: CopySlice(obj.MeshModel), + } +} + +type ProjectorModel struct { + Projector *Projector + TransformationMatrix MeshTypes.Matrix + MeshModel []GDTFTypes.MeshModel +} + +func (obj ProjectorModel) Copy() ProjectorModel { + return ProjectorModel{ + Projector: obj.Projector, + TransformationMatrix: obj.TransformationMatrix, + MeshModel: CopySlice(obj.MeshModel), + } +} diff --git a/pkg/types/support.go b/pkg/types/support.go index 3d963e5..308a168 100644 --- a/pkg/types/support.go +++ b/pkg/types/support.go @@ -3,7 +3,7 @@ package MVRTypes import ( "archive/zip" - "github.com/Patch2PDF/GDTF-Mesh-Reader/pkg/MeshTypes" + "github.com/Patch2PDF/GDTF-Mesh-Reader/v2/pkg/MeshTypes" ) type Support struct { diff --git a/pkg/types/truss.go b/pkg/types/truss.go index 53293ae..4c2c4db 100644 --- a/pkg/types/truss.go +++ b/pkg/types/truss.go @@ -3,7 +3,7 @@ package MVRTypes import ( "archive/zip" - "github.com/Patch2PDF/GDTF-Mesh-Reader/pkg/MeshTypes" + "github.com/Patch2PDF/GDTF-Mesh-Reader/v2/pkg/MeshTypes" ) type Truss struct { diff --git a/pkg/types/video.go b/pkg/types/video.go index 2faf22e..19abb28 100644 --- a/pkg/types/video.go +++ b/pkg/types/video.go @@ -3,7 +3,7 @@ package MVRTypes import ( "archive/zip" - "github.com/Patch2PDF/GDTF-Mesh-Reader/pkg/MeshTypes" + "github.com/Patch2PDF/GDTF-Mesh-Reader/v2/pkg/MeshTypes" ) type VideoScreen struct {