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 +++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 engine/Dynamic/Descriptors/Objects.go (limited to 'engine/Dynamic/Descriptors/Objects.go') 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) +} -- cgit v1.3