From 939d44c7ac594b5ab5abde15e49a9c85f4f78f2d Mon Sep 17 00:00:00 2001 From: Jannik-Hm Date: Wed, 11 Mar 2026 21:53:40 +0100 Subject: [PATCH] added `Class` filter option to `GetStageModel` --- pkg/types/childlist.go | 18 +++++++------- pkg/types/config.go | 35 ++++++++++++++++++++++++++-- pkg/types/fixture.go | 11 +++++++-- pkg/types/focuspoint.go | 6 +++-- pkg/types/generalscenedescription.go | 2 +- pkg/types/groupobject.go | 12 ++++++++-- pkg/types/scene.go | 8 +++++-- pkg/types/sceneobject.go | 12 +++++++--- pkg/types/stagemodel.go | 6 ++--- pkg/types/support.go | 12 +++++++--- pkg/types/truss.go | 12 +++++++--- pkg/types/video.go | 24 ++++++++++++++----- 12 files changed, 120 insertions(+), 38 deletions(-) diff --git a/pkg/types/childlist.go b/pkg/types/childlist.go index 8e04aec..3133b08 100644 --- a/pkg/types/childlist.go +++ b/pkg/types/childlist.go @@ -85,13 +85,13 @@ func ReadMeshes[T MeshReader](src []T, fileMap map[string]*zip.File) error { return nil } -func (c *ChildList) addNodeModelsToStageModel(stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig) { - addNodeModelsToStageModel(c.SceneObjects, stageModel, modelConfig, parentConfig) - addNodeModelsToStageModel(c.GroupObjects, stageModel, modelConfig, parentConfig) - addNodeModelsToStageModel(c.FocusPoints, stageModel, modelConfig, parentConfig) - addNodeModelsToStageModel(c.Fixtures, stageModel, modelConfig, parentConfig) - addNodeModelsToStageModel(c.Supports, stageModel, modelConfig, parentConfig) - addNodeModelsToStageModel(c.Trusses, stageModel, modelConfig, parentConfig) - addNodeModelsToStageModel(c.VideoScreens, stageModel, modelConfig, parentConfig) - addNodeModelsToStageModel(c.Projectors, stageModel, modelConfig, parentConfig) +func (c *ChildList) addNodeModelsToStageModel(stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig, parentParameters parentNodeParameters) { + addNodeModelsToStageModel(c.SceneObjects, stageModel, modelConfig, parentConfig, parentParameters) + addNodeModelsToStageModel(c.GroupObjects, stageModel, modelConfig, parentConfig, parentParameters) + addNodeModelsToStageModel(c.FocusPoints, stageModel, modelConfig, parentConfig, parentParameters) + addNodeModelsToStageModel(c.Fixtures, stageModel, modelConfig, parentConfig, parentParameters) + addNodeModelsToStageModel(c.Supports, stageModel, modelConfig, parentConfig, parentParameters) + addNodeModelsToStageModel(c.Trusses, stageModel, modelConfig, parentConfig, parentParameters) + addNodeModelsToStageModel(c.VideoScreens, stageModel, modelConfig, parentConfig, parentParameters) + addNodeModelsToStageModel(c.Projectors, stageModel, modelConfig, parentConfig, parentParameters) } diff --git a/pkg/types/config.go b/pkg/types/config.go index a45f74e..36d5619 100644 --- a/pkg/types/config.go +++ b/pkg/types/config.go @@ -1,8 +1,9 @@ package MVRTypes type ModelConfig struct { - Global GlobalModelConfig - Individual map[string]ModelNodeConfig // configure by Node (fixture, ...) UUID (also applies to children) + Global GlobalModelConfig + Individual map[string]ModelNodeConfig // configure by Node (fixture, ...) UUID (also applies to children) + ClassConfig ModelClassConfig } type GlobalModelConfig struct { @@ -25,6 +26,32 @@ type ModelNodeConfig struct { Exclude *bool } +// Note: include has precedence over exclude +type ModelClassConfig struct { + Excludes map[string]struct{} // specify if you want to exclude these Class UUIDs from the model + Includes map[string]struct{} // specify if only want to include these Class UUIDs in the model +} + +func checkShouldIncludeClassInModel(classConfig ModelClassConfig, classID *string, parentClassID *string) (result bool, newParentClassID *string) { + if classID == nil { + if parentClassID == nil { + return false, nil + } else { + classID = parentClassID + } + } + if len(classConfig.Includes) > 0 { + if _, ok := classConfig.Includes[*classID]; ok { + return true, classID + } + } else { + if _, ok := classConfig.Excludes[*classID]; !ok { + return true, classID + } + } + return false, classID +} + type MVRParserConfig struct { MeshHandling int ReadThumbnail bool @@ -44,3 +71,7 @@ func getConfigOverrides(modelConfig ModelConfig, parentModelConfig ModelNodeConf } return parentModelConfig } + +type parentNodeParameters struct { + classID *string +} diff --git a/pkg/types/fixture.go b/pkg/types/fixture.go index 868abbd..7e805e3 100644 --- a/pkg/types/fixture.go +++ b/pkg/types/fixture.go @@ -63,17 +63,24 @@ func (a *Fixture) ReadMesh(fileMap map[string]*zip.File) error { return a.ChildList.ReadMesh(fileMap) } -func (a *Fixture) addNodeModelsToStageModel(stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig) { +func (a *Fixture) addNodeModelsToStageModel(stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig, parentParameters parentNodeParameters) { config := getConfigOverrides(modelConfig, parentConfig, a.UUID) + validClass, classID := checkShouldIncludeClassInModel(modelConfig.ClassConfig, a.Class.String, parentParameters.classID) + if (config.Exclude == nil || !(*config.Exclude)) && + validClass && !(config.RenderOnlyAddressedFixture != nil && *config.RenderOnlyAddressedFixture && (a.Addresses == nil || len(a.Addresses.Addresses) == 0)) { // remove unpatched fixtures if desired stageModel.FixtureModels = append(stageModel.FixtureModels, a.Model.Copy()) } - a.ChildList.addNodeModelsToStageModel(stageModel, modelConfig, config) + childParameters := parentNodeParameters{ + classID: classID, + } + + a.ChildList.addNodeModelsToStageModel(stageModel, modelConfig, config, childParameters) } type Gobo struct { diff --git a/pkg/types/focuspoint.go b/pkg/types/focuspoint.go index ce3c67a..c764486 100644 --- a/pkg/types/focuspoint.go +++ b/pkg/types/focuspoint.go @@ -30,10 +30,12 @@ func (a *FocusPoint) ReadMesh(fileMap map[string]*zip.File) error { return a.Geometries.ReadMesh(fileMap) } -func (a *FocusPoint) addNodeModelsToStageModel(stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig) { +func (a *FocusPoint) addNodeModelsToStageModel(stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig, parentParameters parentNodeParameters) { config := getConfigOverrides(modelConfig, parentConfig, a.UUID) - if config.Exclude == nil || !(*config.Exclude) { + validClass, _ := checkShouldIncludeClassInModel(modelConfig.ClassConfig, a.Class.String, parentParameters.classID) + + if (config.Exclude == nil || !(*config.Exclude)) && validClass { stageModel.FocusPointModels = append(stageModel.FocusPointModels, a.Model.Copy()) } } diff --git a/pkg/types/generalscenedescription.go b/pkg/types/generalscenedescription.go index 97366a1..ff29946 100644 --- a/pkg/types/generalscenedescription.go +++ b/pkg/types/generalscenedescription.go @@ -22,7 +22,7 @@ func (a *GeneralSceneDescription) GetStageModel(config ModelConfig) StageModel { local_config := config.Global.asNodeConfig() - addNodeModelsToStageModel(a.Scene.Layers, &model, config, local_config) + addNodeModelsToStageModel(a.Scene.Layers, &model, config, local_config, parentNodeParameters{}) return model } diff --git a/pkg/types/groupobject.go b/pkg/types/groupobject.go index 0beaa51..b711f8a 100644 --- a/pkg/types/groupobject.go +++ b/pkg/types/groupobject.go @@ -29,8 +29,16 @@ func (a *GroupObject) ReadMesh(fileMap map[string]*zip.File) error { return a.ChildList.ReadMesh(fileMap) } -func (a *GroupObject) addNodeModelsToStageModel(stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig) { +func (a *GroupObject) addNodeModelsToStageModel(stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig, parentParameters parentNodeParameters) { config := getConfigOverrides(modelConfig, parentConfig, a.UUID) - a.ChildList.addNodeModelsToStageModel(stageModel, modelConfig, config) + classID := a.Class.String + if classID == nil { + classID = parentParameters.classID + } + childParameters := parentNodeParameters{ + classID: classID, + } + + a.ChildList.addNodeModelsToStageModel(stageModel, modelConfig, config, childParameters) } diff --git a/pkg/types/scene.go b/pkg/types/scene.go index 858548b..89c1552 100644 --- a/pkg/types/scene.go +++ b/pkg/types/scene.go @@ -108,8 +108,12 @@ func (a *Layer) ResolveReference(refPointers *ReferencePointers) { a.ChildList.ResolveReference(refPointers) } -func (a *Layer) addNodeModelsToStageModel(stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig) { +func (a *Layer) addNodeModelsToStageModel(stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig, parentParameters parentNodeParameters) { config := getConfigOverrides(modelConfig, parentConfig, a.UUID) - a.ChildList.addNodeModelsToStageModel(stageModel, modelConfig, config) + childParameters := parentNodeParameters{ + classID: nil, + } + + a.ChildList.addNodeModelsToStageModel(stageModel, modelConfig, config, childParameters) } diff --git a/pkg/types/sceneobject.go b/pkg/types/sceneobject.go index b7c427b..e028b87 100644 --- a/pkg/types/sceneobject.go +++ b/pkg/types/sceneobject.go @@ -53,14 +53,20 @@ func (a *SceneObject) ReadMesh(fileMap map[string]*zip.File) error { return a.ChildList.ReadMesh(fileMap) } -func (a *SceneObject) addNodeModelsToStageModel(stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig) { +func (a *SceneObject) addNodeModelsToStageModel(stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig, parentParameters parentNodeParameters) { config := getConfigOverrides(modelConfig, parentConfig, a.UUID) - if config.Exclude == nil || !(*config.Exclude) { + validClass, classID := checkShouldIncludeClassInModel(modelConfig.ClassConfig, a.Class.String, parentParameters.classID) + + if (config.Exclude == nil || !(*config.Exclude)) && validClass { stageModel.SceneObjectModels = append(stageModel.SceneObjectModels, a.Model.Copy()) } - a.ChildList.addNodeModelsToStageModel(stageModel, modelConfig, config) + childParameters := parentNodeParameters{ + classID: classID, + } + + a.ChildList.addNodeModelsToStageModel(stageModel, modelConfig, config, childParameters) } type Alignment struct { diff --git a/pkg/types/stagemodel.go b/pkg/types/stagemodel.go index 427affb..f3625f7 100644 --- a/pkg/types/stagemodel.go +++ b/pkg/types/stagemodel.go @@ -29,15 +29,15 @@ func CopyMeshSlice(source []MeshTypes.Mesh) []MeshTypes.Mesh { } type NodeModel interface { - addNodeModelsToStageModel(stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig) + addNodeModelsToStageModel(stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig, parentParameters parentNodeParameters) } -func addNodeModelsToStageModel[T NodeModel](source []T, stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig) { +func addNodeModelsToStageModel[T NodeModel](source []T, stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig, parentParameters parentNodeParameters) { if source == nil { return } for i := range source { - source[i].addNodeModelsToStageModel(stageModel, modelConfig, parentConfig) + source[i].addNodeModelsToStageModel(stageModel, modelConfig, parentConfig, parentParameters) } } diff --git a/pkg/types/support.go b/pkg/types/support.go index 0c48229..9c1fd71 100644 --- a/pkg/types/support.go +++ b/pkg/types/support.go @@ -59,12 +59,18 @@ func (a *Support) ReadMesh(fileMap map[string]*zip.File) error { return a.ChildList.ReadMesh(fileMap) } -func (a *Support) addNodeModelsToStageModel(stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig) { +func (a *Support) addNodeModelsToStageModel(stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig, parentParameters parentNodeParameters) { config := getConfigOverrides(modelConfig, parentConfig, a.UUID) - if config.Exclude == nil || !(*config.Exclude) { + validClass, classID := checkShouldIncludeClassInModel(modelConfig.ClassConfig, a.Class.String, parentParameters.classID) + + if (config.Exclude == nil || !(*config.Exclude)) && validClass { stageModel.SupportModels = append(stageModel.SupportModels, a.Model.Copy()) } - a.ChildList.addNodeModelsToStageModel(stageModel, modelConfig, config) + childParameters := parentNodeParameters{ + classID: classID, + } + + a.ChildList.addNodeModelsToStageModel(stageModel, modelConfig, config, childParameters) } diff --git a/pkg/types/truss.go b/pkg/types/truss.go index 3fe3725..592a711 100644 --- a/pkg/types/truss.go +++ b/pkg/types/truss.go @@ -59,12 +59,18 @@ func (a *Truss) ReadMesh(fileMap map[string]*zip.File) error { return a.ChildList.ReadMesh(fileMap) } -func (a *Truss) addNodeModelsToStageModel(stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig) { +func (a *Truss) addNodeModelsToStageModel(stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig, parentParameters parentNodeParameters) { config := getConfigOverrides(modelConfig, parentConfig, a.UUID) - if config.Exclude == nil || !(*config.Exclude) { + validClass, classID := checkShouldIncludeClassInModel(modelConfig.ClassConfig, a.Class.String, parentParameters.classID) + + if (config.Exclude == nil || !(*config.Exclude)) && validClass { stageModel.TrussModels = append(stageModel.TrussModels, a.Model.Copy()) } - a.ChildList.addNodeModelsToStageModel(stageModel, modelConfig, config) + childParameters := parentNodeParameters{ + classID: classID, + } + + a.ChildList.addNodeModelsToStageModel(stageModel, modelConfig, config, childParameters) } diff --git a/pkg/types/video.go b/pkg/types/video.go index 1e9853a..7193467 100644 --- a/pkg/types/video.go +++ b/pkg/types/video.go @@ -55,14 +55,20 @@ func (a *VideoScreen) ReadMesh(fileMap map[string]*zip.File) error { return a.ChildList.ReadMesh(fileMap) } -func (a *VideoScreen) addNodeModelsToStageModel(stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig) { +func (a *VideoScreen) addNodeModelsToStageModel(stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig, parentParameters parentNodeParameters) { config := getConfigOverrides(modelConfig, parentConfig, a.UUID) - if config.Exclude == nil || !(*config.Exclude) { + validClass, classID := checkShouldIncludeClassInModel(modelConfig.ClassConfig, a.Class.String, parentParameters.classID) + + if (config.Exclude == nil || !(*config.Exclude)) && validClass { stageModel.VideoScreenModels = append(stageModel.VideoScreenModels, a.Model.Copy()) } - a.ChildList.addNodeModelsToStageModel(stageModel, modelConfig, config) + childParameters := parentNodeParameters{ + classID: classID, + } + + a.ChildList.addNodeModelsToStageModel(stageModel, modelConfig, config, childParameters) } type Projector struct { @@ -114,14 +120,20 @@ func (a *Projector) ReadMesh(fileMap map[string]*zip.File) error { return a.ChildList.ReadMesh(fileMap) } -func (a *Projector) addNodeModelsToStageModel(stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig) { +func (a *Projector) addNodeModelsToStageModel(stageModel *StageModel, modelConfig ModelConfig, parentConfig ModelNodeConfig, parentParameters parentNodeParameters) { config := getConfigOverrides(modelConfig, parentConfig, a.UUID) - if config.Exclude == nil || !(*config.Exclude) { + validClass, classID := checkShouldIncludeClassInModel(modelConfig.ClassConfig, a.Class.String, parentParameters.classID) + + if (config.Exclude == nil || !(*config.Exclude)) && validClass { stageModel.ProjectorModels = append(stageModel.ProjectorModels, a.Model.Copy()) } - a.ChildList.addNodeModelsToStageModel(stageModel, modelConfig, config) + childParameters := parentNodeParameters{ + classID: classID, + } + + a.ChildList.addNodeModelsToStageModel(stageModel, modelConfig, config, childParameters) } type Source struct {