Skip to content

Commit 6e1b053

Browse files
committed
Using concrete types for ADI metadata
1 parent d687b27 commit 6e1b053

23 files changed

+169
-71
lines changed

src/assets/asset_importer/glb_importer.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,16 @@ import (
1010

1111
type GlbImporter struct{}
1212

13+
func (m GlbImporter) MetadataStructure() any {
14+
return &MeshMetadata{}
15+
}
16+
1317
func (m GlbImporter) Handles(path string) bool {
1418
return filepath.Ext(path) == editor_config.FileExtensionGlb
1519
}
1620

1721
func (m GlbImporter) Import(path string) error {
18-
adi, err := createADI(path, cleanupMesh)
22+
adi, err := createADI(m, path, cleanupMesh)
1923
if err != nil {
2024
return err
2125
}

src/assets/asset_importer/gltf_importer.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,16 @@ import (
1010

1111
type GltfImporter struct{}
1212

13+
func (m GltfImporter) MetadataStructure() any {
14+
return &MeshMetadata{}
15+
}
16+
1317
func (m GltfImporter) Handles(path string) bool {
1418
return filepath.Ext(path) == editor_config.FileExtensionGltf
1519
}
1620

1721
func (m GltfImporter) Import(path string) error {
18-
adi, err := createADI(path, cleanupMesh)
22+
adi, err := createADI(m, path, cleanupMesh)
1923
if err != nil {
2024
return err
2125
}

src/assets/asset_importer/html_importer.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,20 @@ import (
4343
"path/filepath"
4444
)
4545

46-
type HTMLImporter struct{}
46+
type HtmlImporter struct{}
4747

48-
func (m HTMLImporter) Handles(path string) bool {
48+
type HtmlMetadata struct{}
49+
50+
func (m HtmlImporter) MetadataStructure() any {
51+
return &HtmlMetadata{}
52+
}
53+
54+
func (m HtmlImporter) Handles(path string) bool {
4955
return filepath.Ext(path) == editor_config.FileExtensionHTML
5056
}
5157

52-
func (m HTMLImporter) Import(path string) error {
53-
adi, err := createADI(path, nil)
58+
func (m HtmlImporter) Import(path string) error {
59+
adi, err := createADI(m, path, nil)
5460
if err != nil {
5561
return err
5662
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package asset_importer
2+
3+
type ImageMetadata struct {
4+
FilterName string `options:"textureFilterOptions"`
5+
Mipmaps int32
6+
}

src/assets/asset_importer/importer.go

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ package asset_importer
4040
import (
4141
"errors"
4242
"kaiju/assets/asset_info"
43-
"kaiju/editor/editor_config"
4443
"path/filepath"
4544

4645
"github.com/KaijuEngine/uuid"
@@ -54,6 +53,7 @@ import (
5453
type Importer interface {
5554
Handles(path string) bool
5655
Import(path string) error
56+
MetadataStructure() any
5757
}
5858

5959
type ImportRegistry struct {
@@ -93,6 +93,19 @@ func (r *ImportRegistry) Import(path string) error {
9393
return ErrNoImporter
9494
}
9595

96+
func (r *ImportRegistry) MetadataStructure(path string) any {
97+
if filepath.Ext(path) == asset_info.InfoExtension {
98+
return nil
99+
}
100+
// We go back to front so devs can override default importers
101+
for i := len(r.importers) - 1; i >= 0; i-- {
102+
if r.importers[i].Handles(path) {
103+
return r.importers[i].MetadataStructure()
104+
}
105+
}
106+
return nil
107+
}
108+
96109
func (r *ImportRegistry) ImportUsingDefault(path string) error {
97110
for i := range r.importers {
98111
if r.importers[i].Handles(path) {
@@ -102,8 +115,8 @@ func (r *ImportRegistry) ImportUsingDefault(path string) error {
102115
return ErrNoImporter
103116
}
104117

105-
func createADI(path string, cleanup func(adi asset_info.AssetDatabaseInfo)) (asset_info.AssetDatabaseInfo, error) {
106-
adi, err := asset_info.Read(path)
118+
func createADI(importer Importer, path string, cleanup func(adi asset_info.AssetDatabaseInfo)) (asset_info.AssetDatabaseInfo, error) {
119+
adi, err := asset_info.Read(path, importer.MetadataStructure())
107120
if errors.Is(err, asset_info.ErrNoInfo) {
108121
adi = asset_info.New(path, uuid.New().String())
109122
err = nil
@@ -112,12 +125,3 @@ func createADI(path string, cleanup func(adi asset_info.AssetDatabaseInfo)) (ass
112125
}
113126
return adi, err
114127
}
115-
116-
func noMutationImport(path string, aType editor_config.AssetType) error {
117-
adi, err := createADI(path, nil)
118-
if err != nil {
119-
return err
120-
}
121-
adi.Type = aType
122-
return asset_info.Write(adi)
123-
}

src/assets/asset_importer/material_importer.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,18 @@ import (
88

99
type MaterialImporter struct{}
1010

11+
type MaterialMetadata struct{}
12+
13+
func (m MaterialImporter) MetadataStructure() any {
14+
return &MaterialMetadata{}
15+
}
16+
1117
func (m MaterialImporter) Handles(path string) bool {
1218
return filepath.Ext(path) == editor_config.FileExtensionMaterial
1319
}
1420

1521
func (m MaterialImporter) Import(path string) error {
16-
adi, err := createADI(path, nil)
22+
adi, err := createADI(m, path, nil)
1723
if err != nil {
1824
return err
1925
}

src/assets/asset_importer/mesh_importer.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ import (
1111
"github.com/KaijuEngine/uuid"
1212
)
1313

14+
type MeshMetadata struct {
15+
Name string
16+
Material string
17+
}
18+
1419
func cleanupMesh(adi asset_info.AssetDatabaseInfo) {
1520
project_cache.DeleteMesh(adi)
1621
adi.Children = adi.Children[:0]
@@ -21,17 +26,21 @@ func importMeshToCache(adi *asset_info.AssetDatabaseInfo, mesh load_result.Resul
2126
if len(mesh.Meshes) == 0 {
2227
return errors.New("no meshes found in OBJ file")
2328
}
24-
adi.Metadata["name"] = mesh.Meshes[0].Name
29+
adi.Metadata = MeshMetadata{
30+
Name: mesh.Meshes[0].Name,
31+
}
2532
for _, o := range mesh.Meshes {
2633
info := adi.SpawnChild(uuid.New().String())
2734
info.Type = editor_config.AssetTypeMesh
2835
info.ParentID = adi.ID
29-
if err := project_cache.CacheMesh(info, o); err != nil {
36+
if err := project_cache.CacheMesh(info.ID, o); err != nil {
3037
return err
3138
}
32-
// TODO: Write the correct material to the adi
33-
info.Metadata["material"] = assets.MaterialDefinitionBasic
34-
info.Metadata["name"] = o.MeshName
39+
info.Metadata = MeshMetadata{
40+
// TODO: Write the correct material to the adi
41+
Material: assets.MaterialDefinitionBasic,
42+
Name: o.MeshName,
43+
}
3544
adi.Children = append(adi.Children, info)
3645
}
3746
return nil

src/assets/asset_importer/obj_importer.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ import (
4848

4949
type ObjImporter struct{}
5050

51+
func (m ObjImporter) MetadataStructure() any {
52+
return &MeshMetadata{}
53+
}
54+
5155
func (m ObjImporter) Handles(path string) bool {
5256
return filepath.Ext(path) == editor_config.FileExtensionObj
5357
}
@@ -59,7 +63,7 @@ func cleanupOBJ(adi asset_info.AssetDatabaseInfo) {
5963
}
6064

6165
func (m ObjImporter) Import(path string) error {
62-
adi, err := createADI(path, cleanupOBJ)
66+
adi, err := createADI(m, path, cleanupOBJ)
6367
if err != nil {
6468
return err
6569
}

src/assets/asset_importer/png_importer.go

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,44 @@
3838
package asset_importer
3939

4040
import (
41+
"kaiju/assets/asset_info"
4142
"kaiju/editor/editor_config"
43+
"kaiju/rendering"
44+
"log/slog"
4245
"path/filepath"
4346
)
4447

45-
type PNGImporter struct{}
48+
var (
49+
textureFilterOptions = map[string]rendering.TextureFilter{
50+
"Linear": rendering.TextureFilterLinear,
51+
"Nearest": rendering.TextureFilterNearest,
52+
}
53+
)
54+
55+
type PngImporter struct{}
56+
57+
func (m PngImporter) MetadataStructure() any {
58+
return &ImageMetadata{}
59+
}
4660

47-
func (m PNGImporter) Handles(path string) bool {
61+
func (m PngImporter) Handles(path string) bool {
4862
return filepath.Ext(path) == ".png"
4963
}
5064

51-
func (m PNGImporter) Import(path string) error {
52-
return noMutationImport(path, editor_config.AssetTypeImage)
65+
func (m PngImporter) Import(path string) error {
66+
adi, err := createADI(m, path, nil)
67+
if err != nil {
68+
return err
69+
}
70+
adi.Type = editor_config.AssetTypeImage
71+
return asset_info.Write(adi)
72+
}
73+
74+
func (m *ImageMetadata) Filter() rendering.TextureFilter {
75+
if f, ok := textureFilterOptions[m.FilterName]; ok {
76+
return f
77+
}
78+
slog.Warn("tried to read image metadata filter but has invalid key",
79+
"key", m.FilterName)
80+
return rendering.TextureFilterLinear
5381
}

src/assets/asset_importer/render_pass_importer.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,18 @@ import (
88

99
type RenderPassImporter struct{}
1010

11+
type RenderPassMetadata struct{}
12+
13+
func (m RenderPassImporter) MetadataStructure() any {
14+
return &RenderPassMetadata{}
15+
}
16+
1117
func (m RenderPassImporter) Handles(path string) bool {
1218
return filepath.Ext(path) == editor_config.FileExtensionRenderPass
1319
}
1420

1521
func (m RenderPassImporter) Import(path string) error {
16-
adi, err := createADI(path, nil)
22+
adi, err := createADI(m, path, nil)
1723
if err != nil {
1824
return err
1925
}

0 commit comments

Comments
 (0)