Files

91 lines
2.4 KiB
Go

package editor
import (
"aego/asset"
"aego/core/ids"
"aego/core/mathx"
"aego/editor/core/shape"
"aego/editor/ext"
"aego/engine/module"
"aego/modules/render2d"
"aego/scene"
)
const PixelsPerUnit = render2d.DefaultPixelsPerUnit
func Hook(e *ext.Registry) error {
if err := e.Bounds("engine.SpriteRenderer", SpriteShape); err != nil {
return err
}
e.Overlay(cameraFrames)
return e.AssetDrop("texture", scene.Space2D, func(s *scene.Scene, h scene.NodeHandle, id ids.AssetID) {
dropTexture(s, h, id, ProjectPPU(e))
})
}
func ProjectPPU(e *ext.Registry) float32 {
if ed := e.Editor(); ed != nil {
if s, ok := module.SectionValue[render2d.Settings](ed.Sections, render2d.SectionID); ok {
return s.PPU()
}
}
return render2d.DefaultPixelsPerUnit
}
func Rect(sr *render2d.SpriteRenderer, res asset.Resolver) (mathx.Rect, bool) {
size := sr.Size
if size.X == 0 && size.Y == 0 {
if res == nil {
return mathx.Rect{}, false
}
reg, ok := sr.Sprite.Region(res)
if !ok {
return mathx.Rect{}, false
}
size = reg.Size()
}
return mathx.Rect{X: -sr.Origin.X * size.X, Y: -sr.Origin.Y * size.Y, W: size.X, H: size.Y}, true
}
func SpriteShape(s *scene.Scene, res asset.Resolver, h scene.NodeHandle) (shape.Shape, bool) {
sr, ok := scene.Get[render2d.SpriteRenderer](s, h)
if !ok {
return shape.Shape{}, false
}
lr, ok := Rect(sr, res)
if !ok {
return shape.Shape{}, false
}
order := (int64(sr.Layer)+1<<15)<<16 | (int64(sr.Order) + 1<<15)
return shape.Shape{Kind: shape.Rect, Local: lr, Order: order}, true
}
func cameraFrames(c *shape.OverlayCtx) {
if c.Mode3D {
return
}
s := c.Scene
scene.Query1[render2d.Camera2D](s).Each(func(h scene.NodeHandle, cam *render2d.Camera2D) {
if cam.Zoom <= 0 {
return
}
m := s.World(h)
pos := mathx.Vec2{X: m[6], Y: m[7]}
size := mathx.Vec2{X: c.Window.X / cam.Zoom, Y: c.Window.Y / cam.Zoom}
c.Debug.RectRot(pos, size, mathx.Atan2(m[1], m[0]), c.Color)
c.Debug.Cross(pos, c.Px*10, c.Color)
})
}
func dropTexture(s *scene.Scene, h scene.NodeHandle, id ids.AssetID, ppu float32) {
sr := scene.Add[render2d.SpriteRenderer](s, h)
*sr = render2d.DefaultSpriteRenderer()
sr.Sprite.SetAssetRefID(id)
sr.Size = mathx.Vec2{X: 1, Y: 1}
if res := s.Resolver(); res != nil && !id.IsZero() {
if reg, ok := res.Texture(id); ok && reg.W > 0 && reg.H > 0 {
sr.Size = mathx.Vec2{X: float32(reg.W) / ppu, Y: float32(reg.H) / ppu}
}
}
}