try write material system
This commit is contained in:
parent
72b8118c60
commit
6019de4159
@ -2,12 +2,14 @@ package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
"runtime"
|
||||
|
||||
"git.influ.su/artmares/art3de/pkg/engine"
|
||||
"git.influ.su/artmares/art3de/pkg/engine/renderer"
|
||||
)
|
||||
|
||||
func main() {
|
||||
runtime.LockOSThread()
|
||||
// Создаем движок
|
||||
eng := engine.NewEngine("My Game", 1280, 1024)
|
||||
|
||||
|
||||
5
go.mod
5
go.mod
@ -3,6 +3,7 @@ module git.influ.su/artmares/art3de
|
||||
go 1.25.6
|
||||
|
||||
require (
|
||||
github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 // indirect
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20250301202403-da16c1255728 // indirect
|
||||
github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20250301202403-da16c1255728
|
||||
github.com/go-gl/mathgl v1.2.0
|
||||
)
|
||||
|
||||
2
go.sum
2
go.sum
@ -2,3 +2,5 @@ github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 h1:5BVwOaUSBTlVZowGO6VZGw
|
||||
github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20250301202403-da16c1255728 h1:RkGhqHxEVAvPM0/R+8g7XRwQnHatO0KAuVcwHo8q9W8=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20250301202403-da16c1255728/go.mod h1:SyRD8YfuKk+ZXlDqYiqe1qMSqjNgtHzBTG810KUagMc=
|
||||
github.com/go-gl/mathgl v1.2.0 h1:v2eOj/y1B2afDxF6URV1qCYmo1KW08lAMtTbOn3KXCY=
|
||||
github.com/go-gl/mathgl v1.2.0/go.mod h1:pf9+b5J3LFP7iZ4XXaVzZrCle0Q/vNpB/vDe5+3ulRE=
|
||||
|
||||
55
pkg/render/material/interface.go
Normal file
55
pkg/render/material/interface.go
Normal file
@ -0,0 +1,55 @@
|
||||
package material
|
||||
|
||||
// Material - интерфейс материала
|
||||
type Material interface {
|
||||
// ID возвращает уникальный идентификатор материала
|
||||
ID() uint32
|
||||
// Name возвращает имя материала
|
||||
Name() string
|
||||
// Type возвращает тип материала
|
||||
Type() Type
|
||||
// Shader возвращает шейдерную программу
|
||||
Shader() uint32
|
||||
// Apply применяет материал для рендеринга
|
||||
Apply(instance Instance)
|
||||
// Update обновляет состояние материала (для анимированных)
|
||||
Update(deltaTime float32)
|
||||
// CreateInstace создает экземпляр материала
|
||||
CreateInstance() Instance
|
||||
// Destroy освобождает ресурсы материала
|
||||
Destroy()
|
||||
}
|
||||
|
||||
// Instance - экземпляр материала с переопределенными параметрами
|
||||
type Instance interface {
|
||||
// Material возвращает базовый материал
|
||||
Material() Material
|
||||
// SetParameter устанавливает параметр
|
||||
SetParameter(name string, value any) error
|
||||
// GetParameter возвращает параметер
|
||||
GetParameter(name string) (any, error)
|
||||
// SetTexture переопределяет текстуру
|
||||
SetTexture(textureType TextureType, texture Texture) error
|
||||
// GetTexture возвращает текстуру
|
||||
GetTexture(textureType TextureType) Texture
|
||||
// Clone создает копию экземпляра
|
||||
Clone() Instance
|
||||
}
|
||||
|
||||
// Texture - интерфейс текстуры
|
||||
type Texture interface {
|
||||
// ID возвращает OpenGL ID текстуры
|
||||
ID() uint32
|
||||
// Type возвращает тип текстуры
|
||||
Type() TextureType
|
||||
// Path возвращает путь к файлу
|
||||
Path() string
|
||||
// Width возвращает ширину
|
||||
Width() int
|
||||
// Height возвращает высоту
|
||||
Height() int
|
||||
// Format возвращает формат
|
||||
Format() uint32
|
||||
// Destroy освобождает ресурсы
|
||||
Destroy()
|
||||
}
|
||||
45
pkg/render/material/manager/interface.go
Normal file
45
pkg/render/material/manager/interface.go
Normal file
@ -0,0 +1,45 @@
|
||||
package manager
|
||||
|
||||
import "git.influ.su/artmares/art3de/pkg/render/material"
|
||||
|
||||
// Manager - Интерфейс менеджера материалов
|
||||
type Manager interface {
|
||||
// CreatePBRMaterial создает PBR материал
|
||||
CreatePBRMaterial(name string, shader uint32, config *PBRConfig) (material.Material, error)
|
||||
// GetMaterial возвращает материал по имени
|
||||
GetMaterial(name string) material.Material
|
||||
// HasMaterial проверяет существование материала
|
||||
HasMaterial(name string) bool
|
||||
// DestroyMaterial уничтожает материал
|
||||
DestroyMaterial(name string) error
|
||||
// LoadTexture загружает текстуру
|
||||
LoadTexture(path string, textureType material.TextureType) (material.Texture, error)
|
||||
// GetTexture возвращает текстуру из кэша
|
||||
GetTexture(path string) material.Texture
|
||||
// PreloadTextures предзагружает текстуры из директории
|
||||
PreloadTextures(dir string) error
|
||||
// Update обновляет все материалы
|
||||
Update(deltaTime float32)
|
||||
// Cleanup освобождает все ресурсы
|
||||
Cleanup()
|
||||
// Stats возвращает статистику
|
||||
Stats() Stats
|
||||
}
|
||||
|
||||
// PBRConfig - конфигурация PBR материала
|
||||
type PBRConfig struct {
|
||||
Name string
|
||||
Shader uint32
|
||||
Format material.TextureFormat
|
||||
TextureDir string
|
||||
TexturePrefix string
|
||||
Params *material.PBRParams
|
||||
}
|
||||
|
||||
// Stats - статистика менеджера
|
||||
type Stats struct {
|
||||
Materials int
|
||||
Textures int
|
||||
TextureMemory int64
|
||||
Instances int
|
||||
}
|
||||
34
pkg/render/material/manager/manager.go
Normal file
34
pkg/render/material/manager/manager.go
Normal file
@ -0,0 +1,34 @@
|
||||
package manager
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
"git.influ.su/artmares/art3de/pkg/render/material"
|
||||
)
|
||||
|
||||
type materialManager struct {
|
||||
materials map[string]material.Material
|
||||
textureCache *textureCache
|
||||
boundShader uint32
|
||||
mu sync.RWMutex
|
||||
stats Stats
|
||||
}
|
||||
|
||||
// New создает новый менеджер материалов
|
||||
func New() Manager {
|
||||
return &materialManager{
|
||||
materials: make(map[string]material.Material),
|
||||
textureCache: newTextureCache(),
|
||||
}
|
||||
}
|
||||
|
||||
func (m *materialManager) CreatePBRMaterial(name string, shader uint32, config *PBRConfig) (material.Material, error) {
|
||||
m.mu.Lock()
|
||||
defer m.mu.Unlock()
|
||||
|
||||
if _, exists := m.materials[name]; exists {
|
||||
return nil, fmt.Errorf("material %s already exists", name)
|
||||
}
|
||||
|
||||
}
|
||||
63
pkg/render/material/types.go
Normal file
63
pkg/render/material/types.go
Normal file
@ -0,0 +1,63 @@
|
||||
package material
|
||||
|
||||
import (
|
||||
"github.com/go-gl/mathgl/mgl32"
|
||||
)
|
||||
|
||||
// Type - тип материала
|
||||
type Type int
|
||||
|
||||
const (
|
||||
TypeUnknown Type = iota
|
||||
TypePBR
|
||||
TypeUnlit
|
||||
TypeLiquid
|
||||
TypeGas
|
||||
)
|
||||
|
||||
// TextureType - тип текстуры
|
||||
type TextureType int
|
||||
|
||||
const (
|
||||
TextureUnknown TextureType = iota
|
||||
TextureAlbedo
|
||||
TextureNormal
|
||||
TextureORM
|
||||
TextureEmissive
|
||||
TextureMetallic
|
||||
TextureRoughness
|
||||
TextureAO
|
||||
TextureHeight
|
||||
TextureSpecular
|
||||
)
|
||||
|
||||
// TextureFormat - формат текстурного набора
|
||||
type TextureFormat int
|
||||
|
||||
const (
|
||||
FormatSeparate TextureFormat = iota // Отдельные текстуры
|
||||
FormatORM // ORM _ Albedo + Normal
|
||||
FormatPBRSet // Полный PBR набор
|
||||
)
|
||||
|
||||
// PBRParams - параметры PBR материала
|
||||
type PBRParams struct {
|
||||
Albedo mgl32.Vec3
|
||||
Metallic float32
|
||||
Roughness float32
|
||||
AO float32
|
||||
Emissive mgl32.Vec3
|
||||
Alpha float32
|
||||
}
|
||||
|
||||
// DefaultPBRParams возвращает параметры по уполчанию
|
||||
func DefaultPBRParams() PBRParams {
|
||||
return PBRParams{
|
||||
Albedo: mgl32.Vec3{1.0, 1.0, 1.0},
|
||||
Metallic: 0.0,
|
||||
Roughness: 0.5,
|
||||
AO: 1.0,
|
||||
Emissive: mgl32.Vec3{0.0, 0.0, 0.0},
|
||||
Alpha: 1.0,
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user