From aa35ce4db5326928cf13c7604014fb7aaaedf203 Mon Sep 17 00:00:00 2001 From: Physcik Date: Sat, 24 Jan 2026 00:25:45 +0500 Subject: Dynamic object loading --- engine/Dynamic/Descriptors/Objects.go | 78 +++++++++++++++++++++++++++++++++++ engine/Dynamic/Descriptors/World.go | 2 + engine/Dynamic/Manager.go | 2 + engine/Dynamic/Package.go | 34 ++++++++++++--- 4 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 engine/Dynamic/Descriptors/Objects.go (limited to 'engine/Dynamic') diff --git a/engine/Dynamic/Descriptors/Objects.go b/engine/Dynamic/Descriptors/Objects.go new file mode 100644 index 0000000..92a44d7 --- /dev/null +++ b/engine/Dynamic/Descriptors/Objects.go @@ -0,0 +1,78 @@ +package descriptors + +import ( + "encoding/json" + "fmt" + + components "github.com/DegustatorPonos/RuinesOfRafdolon/Components" + coreobjects "github.com/DegustatorPonos/RuinesOfRafdolon/CoreObjects" + rl "github.com/gen2brain/raylib-go/raylib" +) + +const ObjectsDirName string = "Objects" + +type ObjectDescriptor struct { + Name string + Textures []*ObjectTextureBlock +} + +// Maps objects by their IDs +func MapObjectDescriptors(loaded []*ObjectDescriptor) map[string]*ObjectDescriptor { + var outp = make(map[string]*ObjectDescriptor, 0) + for _, v := range loaded { + outp[v.Name] = v + } + return outp +} + +func (base *ObjectDescriptor) IsValid() error { + if base.Textures == nil { + return fmt.Errorf("The textures are not specified") + } + for i, v := range base.Textures { + // The texture was not specified + if v.TextureId == nil && len(v.Name) == 0 { + return fmt.Errorf("The texture #%d was not specified (neither texture name nor ID)", i) + } + } + return nil +} + +func (base *ObjectDescriptor) Parse() coreobjects.DynamicObject { + var outp = coreobjects.DynamicObject{ + Textures: make([]*coreobjects.TextureBlock, len(base.Textures)), + } + for i, v := range base.Textures { + var texture, err = v.GetTexture() + if err != nil { + rl.TraceLog(rl.LogWarning, "Failed to get the required by the object %s texture: %s", base.Name, err.Error()) + continue + } + outp.Textures[i] = &coreobjects.TextureBlock { + Texture: texture, + Offset: v.Offset, + } + } + return outp +} + +type ObjectTextureBlock struct { + Name string + TextureId *uint64 + Offset rl.Vector2 +} + +func (base *ObjectTextureBlock) GetTexture() (*rl.Texture2D, error) { + if base.TextureId != nil { + return components.Resources.Textures.GetTexture(*base.TextureId) + } + return components.Resources.Textures.GetTextureByName(base.Name) +} + +func (base *ObjectDescriptor) String() string { + var outp, jsonErr = json.Marshal(base) + if jsonErr != nil { + return fmt.Sprintf("Failed to parse settings: %s", jsonErr.Error()) + } + return string(outp) +} diff --git a/engine/Dynamic/Descriptors/World.go b/engine/Dynamic/Descriptors/World.go index 0a6a7d9..c449ab0 100644 --- a/engine/Dynamic/Descriptors/World.go +++ b/engine/Dynamic/Descriptors/World.go @@ -5,6 +5,8 @@ import ( rl "github.com/gen2brain/raylib-go/raylib" ) +const WorldsDirName string = "Worlds" + type WorldDescriptor struct { Name string // Deprecated diff --git a/engine/Dynamic/Manager.go b/engine/Dynamic/Manager.go index 7b7d6b4..5e2001c 100644 --- a/engine/Dynamic/Manager.go +++ b/engine/Dynamic/Manager.go @@ -33,7 +33,9 @@ func loadPackages() (*PackageManager, error) { } newPackage.location = packagePath + // Do not change this order - some descriptors rely on other newPackage.ReadTextures() + newPackage.ReadObjects() newPackage.ReadWorlds() outp.AvaliablePackages[newPackage.Description.Name] = *newPackage diff --git a/engine/Dynamic/Package.go b/engine/Dynamic/Package.go index 2d8cc72..fe03aae 100644 --- a/engine/Dynamic/Package.go +++ b/engine/Dynamic/Package.go @@ -42,6 +42,7 @@ type Package struct { Description PackageDescription Textures *descriptors.TexturesDescriptor + Objects map[string]*descriptors.ObjectDescriptor Worlds map[string]*descriptors.WorldDescriptor location string @@ -108,7 +109,7 @@ func (base *Package) ReadWorlds() { if base.Description.Type != "story" { return } - var worlds, loadErr = loadWorldsFromDir(utils.JoinFileLocation(base.location, "Worlds")) + var worlds, loadErr = loadWorldsFromDir(utils.JoinFileLocation(base.location, descriptors.WorldsDirName)) if loadErr != nil { rl.TraceLog(rl.LogWarning, "Failed to load world from the module %s: %s", base.location, loadErr) } else { @@ -116,6 +117,7 @@ func (base *Package) ReadWorlds() { } } +// Loads worlds in the resource manager func (base *Package) LoadWorlds() { if base.Description.Type != "story" { return @@ -126,6 +128,27 @@ func (base *Package) LoadWorlds() { } } +func (base *Package) ReadObjects() { + var loaded, err = loadObjectsFromDir(utils.JoinFileLocation(base.location, descriptors.ObjectsDirName)) + if err != nil { + rl.TraceLog(rl.LogWarning, "Failed to load objects from the module %s: %s", base.location, err) + return + } + base.Objects = loaded +} + +// Loads objects in the resource manager +func (base *Package) LoadObjects() { + rl.TraceLog(rl.LogInfo, "%s", base.Objects) + for _, v := range base.Objects { + var parsed = v.Parse() + var err = components.Resources.RegisterObject(base.Description.Name, v.Name, &parsed) + if err != nil { + rl.TraceLog(rl.LogWarning, "Failed to register object %s: %s", v.Name, err.Error()) + } + } +} + func loadWorldsFromDir(dirLocation string) (map[string]*descriptors.WorldDescriptor, error) { var loaded, err = loadAssetsFromDir(dirLocation, func() *descriptors.WorldDescriptor{ return &descriptors.WorldDescriptor{} }) if err != nil { @@ -134,11 +157,12 @@ func loadWorldsFromDir(dirLocation string) (map[string]*descriptors.WorldDescrip return descriptors.MapWorldDescriptors(loaded), nil } -// Deprecated -func loadTilesFromDir(dirLocation string) (map[uint64]*descriptors.TileDescriptor, error) { - var loaded, err = loadAssetsFromDir(dirLocation, func() *descriptors.TileDescriptor{ return &descriptors.TileDescriptor{} }) +func loadObjectsFromDir(dir string) (map[string]*descriptors.ObjectDescriptor, error) { + var loaded, err = loadAssetsFromDir(dir, func() *descriptors.ObjectDescriptor { + return &descriptors.ObjectDescriptor{} + }) if err != nil { return nil, err } - return descriptors.MapTileDescriptors(loaded), nil + return descriptors.MapObjectDescriptors(loaded), nil } -- cgit v1.3