minor edits (#486)

* adding comments to d2interface for linter

* moved d2render renderer interfaces and types into d2interface
This commit is contained in:
dk 2020-06-28 21:41:58 -07:00 committed by GitHub
parent 9f7f1ae072
commit 55dc3e42ed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
56 changed files with 259 additions and 234 deletions

View File

@ -1,5 +1,7 @@
package d2interface package d2interface
// AudioProvider is something that can play music, load audio files managed
// by the asset manager, and set the game engine's volume levels
type AudioProvider interface { type AudioProvider interface {
PlayBGM(song string) PlayBGM(song string)
LoadSoundEffect(sfx string) (SoundEffect, error) LoadSoundEffect(sfx string) (SoundEffect, error)

View File

@ -1,4 +1,4 @@
package d2render package d2interface
type CompositeMode int type CompositeMode int

View File

@ -0,0 +1,2 @@
// Package d2interface defines interfaces for the OpenDiablo2 engine
package d2interface

View File

@ -1,4 +1,4 @@
package d2render package d2interface
// Filter represents the type of texture filter to be used when an image is magnified or minified. // Filter represents the type of texture filter to be used when an image is magnified or minified.
type Filter int type Filter int

View File

@ -1,4 +1,4 @@
package d2render package d2interface
// Defines the type of rendering engine to use // Defines the type of rendering engine to use
type RenderType int type RenderType int

View File

@ -1,4 +1,4 @@
package d2render package d2interface
type Renderer interface { type Renderer interface {
GetRendererName() string GetRendererName() string

View File

@ -1,5 +1,6 @@
package d2interface package d2interface
// SoundEffect is something that that the AudioProvider can Play or Stop
type SoundEffect interface { type SoundEffect interface {
Play() Play()
Stop() Stop()

View File

@ -1,4 +1,4 @@
package d2render package d2interface
import ( import (
"image" "image"

View File

@ -2,9 +2,9 @@ package d2interface
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
// TermCategory applies styles to the lines in the Terminal
type TermCategory int type TermCategory int
const ( const (
@ -14,17 +14,10 @@ const (
TermCategoryError TermCategoryError
) )
const ( // TermVis is an enumeration of the Terminal's visibility states
termCharWidth = 6
termCharHeight = 16
termRowCount = 24
termRowCountMax = 32
termColCountMax = 128
termAnimLength = 0.5
)
type termVis int type termVis int
// Terminal visibility state
const ( const (
termVisHidden termVis = iota termVisHidden termVis = iota
termVisShowing termVisShowing
@ -32,13 +25,16 @@ const (
termVisHiding termVisHiding
) )
// Terminal is a drop-down terminal and shell
// It is used throughout the codebase, most parts of the engine will
// `bind` commands, which are available for use in the shell
type Terminal interface { type Terminal interface {
BindLogger() BindLogger()
Advance(elapsed float64) error Advance(elapsed float64) error
OnKeyDown(event d2input.KeyEvent) bool OnKeyDown(event d2input.KeyEvent) bool
OnKeyChars(event d2input.KeyCharsEvent) bool OnKeyChars(event d2input.KeyCharsEvent) bool
Render(surface d2render.Surface) error Render(surface Surface) error
Execute(command string) error Execute(command string) error
OutputRaw(text string, category TermCategory) OutputRaw(text string, category TermCategory)
Output(format string, params ...interface{}) Output(format string, params ...interface{})
@ -53,6 +49,8 @@ type Terminal interface {
UnbindAction(name string) error UnbindAction(name string) error
} }
// TerminalLogger is used tomake the Terminal write out
// (eg. to the system shell or to a file)
type TerminalLogger interface { type TerminalLogger interface {
Write(p []byte) (int, error) Write(p []byte) (int, error)
} }

View File

@ -5,6 +5,8 @@ import (
"image/color" "image/color"
"math" "math"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2dat" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2dat"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2dc6" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2dc6"
@ -27,7 +29,7 @@ type animationFrame struct {
offsetX int offsetX int
offsetY int offsetY int
image d2render.Surface image d2interface.Surface
} }
type animationDirection struct { type animationDirection struct {
@ -41,7 +43,7 @@ type Animation struct {
lastFrameTime float64 lastFrameTime float64
playedCount int playedCount int
compositeMode d2render.CompositeMode compositeMode d2interface.CompositeMode
colorMod color.Color colorMod color.Color
originAtBottom bool originAtBottom bool
@ -87,7 +89,7 @@ func CreateAnimationFromDCC(dcc *d2dcc.DCC, palette *d2dat.DATPalette, transpare
} }
} }
image, err := d2render.NewSurface(frameWidth, frameHeight, d2render.FilterNearest) image, err := d2render.NewSurface(frameWidth, frameHeight, d2interface.FilterNearest)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -122,7 +124,7 @@ func CreateAnimationFromDC6(dc6 *d2dc6.DC6, palette *d2dat.DATPalette) (*Animati
} }
for frameIndex, dc6Frame := range dc6.Frames { for frameIndex, dc6Frame := range dc6.Frames {
image, err := d2render.NewSurface(int(dc6Frame.Width), int(dc6Frame.Height), d2render.FilterNearest) image, err := d2render.NewSurface(int(dc6Frame.Width), int(dc6Frame.Height), d2interface.FilterNearest)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -253,7 +255,7 @@ func (a *Animation) Advance(elapsed float64) error {
return nil return nil
} }
func (a *Animation) Render(target d2render.Surface) error { func (a *Animation) Render(target d2interface.Surface) error {
direction := a.directions[a.directionIndex] direction := a.directions[a.directionIndex]
frame := direction.frames[a.frameIndex] frame := direction.frames[a.frameIndex]
@ -264,7 +266,7 @@ func (a *Animation) Render(target d2render.Surface) error {
return target.Render(frame.image) return target.Render(frame.image)
} }
func (a *Animation) RenderFromOrigin(target d2render.Surface) error { func (a *Animation) RenderFromOrigin(target d2interface.Surface) error {
if a.originAtBottom { if a.originAtBottom {
direction := a.directions[a.directionIndex] direction := a.directions[a.directionIndex]
frame := direction.frames[a.frameIndex] frame := direction.frames[a.frameIndex]
@ -397,8 +399,8 @@ func (a *Animation) ResetPlayedCount() {
func (a *Animation) SetBlend(blend bool) { func (a *Animation) SetBlend(blend bool) {
if blend { if blend {
a.compositeMode = d2render.CompositeModeLighter a.compositeMode = d2interface.CompositeModeLighter
} else { } else {
a.compositeMode = d2render.CompositeModeSourceOver a.compositeMode = d2interface.CompositeModeSourceOver
} }
} }

View File

@ -6,10 +6,11 @@ import (
"math" "math"
"strings" "strings"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
type Composite struct { type Composite struct {
@ -45,7 +46,7 @@ func (c *Composite) Advance(elapsed float64) error {
return nil return nil
} }
func (c *Composite) Render(target d2render.Surface) error { func (c *Composite) Render(target d2interface.Surface) error {
if c.mode == nil { if c.mode == nil {
return nil return nil
} }

View File

@ -6,8 +6,9 @@ import (
"image/color" "image/color"
"strings" "strings"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
type fontGlyph struct { type fontGlyph struct {
@ -98,7 +99,7 @@ func (f *Font) Clone() *Font {
} }
} }
func (f *Font) RenderText(text string, target d2render.Surface) error { func (f *Font) RenderText(text string, target d2interface.Surface) error {
f.sheet.SetColorMod(f.color) f.sheet.SetColorMod(f.color)
f.sheet.SetBlend(false) f.sheet.SetBlend(false)

View File

@ -4,6 +4,8 @@ import (
"errors" "errors"
"image/color" "image/color"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
@ -24,7 +26,7 @@ type Button struct {
width int width int
height int height int
state buttonState state buttonState
surfaces []d2render.Surface surfaces []d2interface.Surface
} }
func createButton(text string, buttonStyle ButtonStyle) (*Button, error) { func createButton(text string, buttonStyle ButtonStyle) (*Button, error) {
@ -69,9 +71,9 @@ func createButton(text string, buttonStyle ButtonStyle) (*Button, error) {
textY := buttonHeight/2 - textHeight/2 + config.textOffset textY := buttonHeight/2 - textHeight/2 + config.textOffset
surfaceCount := animation.GetFrameCount() / (config.segmentsX * config.segmentsY) surfaceCount := animation.GetFrameCount() / (config.segmentsX * config.segmentsY)
surfaces := make([]d2render.Surface, surfaceCount) surfaces := make([]d2interface.Surface, surfaceCount)
for i := 0; i < surfaceCount; i++ { for i := 0; i < surfaceCount; i++ {
surface, err := d2render.NewSurface(buttonWidth, buttonHeight, d2render.FilterNearest) surface, err := d2render.NewSurface(buttonWidth, buttonHeight, d2interface.FilterNearest)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -121,7 +123,7 @@ func (b *Button) onMouseLeave(event d2input.MouseMoveEvent) bool {
return false return false
} }
func (b *Button) render(target d2render.Surface) error { func (b *Button) render(target d2interface.Surface) error {
return target.Render(b.surfaces[b.state]) return target.Render(b.surfaces[b.state])
} }

View File

@ -3,9 +3,10 @@ package d2gui
import ( import (
"errors" "errors"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
func loadFont(fontStyle FontStyle) (*d2asset.Font, error) { func loadFont(fontStyle FontStyle) (*d2asset.Font, error) {
@ -17,7 +18,7 @@ func loadFont(fontStyle FontStyle) (*d2asset.Font, error) {
return d2asset.LoadFont(config.fontBasePath+".tbl", config.fontBasePath+".dc6", config.palettePath) return d2asset.LoadFont(config.fontBasePath+".tbl", config.fontBasePath+".dc6", config.palettePath)
} }
func renderSegmented(animation *d2asset.Animation, segmentsX, segmentsY, frameOffset int, target d2render.Surface) error { func renderSegmented(animation *d2asset.Animation, segmentsX, segmentsY, frameOffset int, target d2interface.Surface) error {
var currentY int var currentY int
for y := 0; y < segmentsY; y++ { for y := 0; y < segmentsY; y++ {
var currentX int var currentX int

View File

@ -3,7 +3,7 @@ package d2gui
import ( import (
"errors" "errors"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
) )
var ( var (
@ -24,7 +24,7 @@ func Initialize() error {
return nil return nil
} }
func Render(target d2render.Surface) error { func Render(target d2interface.Surface) error {
verifyWasInit() verifyWasInit()
return singleton.render(target) return singleton.render(target)
} }

View File

@ -1,6 +1,7 @@
package d2gui package d2gui
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
@ -10,7 +11,7 @@ type Label struct {
text string text string
font *d2asset.Font font *d2asset.Font
surface d2render.Surface surface d2interface.Surface
} }
func createLabel(text string, fontStyle FontStyle) (*Label, error) { func createLabel(text string, fontStyle FontStyle) (*Label, error) {
@ -26,7 +27,7 @@ func createLabel(text string, fontStyle FontStyle) (*Label, error) {
return label, nil return label, nil
} }
func (l *Label) render(target d2render.Surface) error { func (l *Label) render(target d2interface.Surface) error {
return target.Render(l.surface) return target.Render(l.surface)
} }
@ -47,7 +48,7 @@ func (l *Label) SetText(text string) error {
func (l *Label) setText(text string) error { func (l *Label) setText(text string) error {
width, height := l.font.GetTextMetrics(text) width, height := l.font.GetTextMetrics(text)
surface, err := d2render.NewSurface(width, height, d2render.FilterNearest) surface, err := d2render.NewSurface(width, height, d2interface.FilterNearest)
if err != nil { if err != nil {
return err return err
} }

View File

@ -3,9 +3,10 @@ package d2gui
import ( import (
"image/color" "image/color"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
type layoutEntry struct { type layoutEntry struct {
@ -137,7 +138,7 @@ func (l *Layout) Clear() {
l.entries = nil l.entries = nil
} }
func (l *Layout) render(target d2render.Surface) error { func (l *Layout) render(target d2interface.Surface) error {
l.AdjustEntryPlacement() l.AdjustEntryPlacement()
for _, entry := range l.entries { for _, entry := range l.entries {
@ -168,14 +169,14 @@ func (l *Layout) advance(elapsed float64) error {
return nil return nil
} }
func (l *Layout) renderEntry(entry *layoutEntry, target d2render.Surface) error { func (l *Layout) renderEntry(entry *layoutEntry, target d2interface.Surface) error {
target.PushTranslation(entry.x, entry.y) target.PushTranslation(entry.x, entry.y)
defer target.Pop() defer target.Pop()
return entry.widget.render(target) return entry.widget.render(target)
} }
func (l *Layout) renderEntryDebug(entry *layoutEntry, target d2render.Surface) error { func (l *Layout) renderEntryDebug(entry *layoutEntry, target d2interface.Surface) error {
target.PushTranslation(entry.x, entry.y) target.PushTranslation(entry.x, entry.y)
defer target.Pop() defer target.Pop()

View File

@ -4,10 +4,11 @@ import (
"image/color" "image/color"
"math" "math"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
type manager struct { type manager struct {
@ -78,7 +79,7 @@ func (m *manager) OnMouseMove(event d2input.MouseMoveEvent) bool {
return m.layout.onMouseMove(event) return m.layout.onMouseMove(event)
} }
func (m *manager) render(target d2render.Surface) error { func (m *manager) render(target d2interface.Surface) error {
if m.loading { if m.loading {
if err := m.renderLoadScreen(target); err != nil { if err := m.renderLoadScreen(target); err != nil {
return err return err
@ -99,7 +100,7 @@ func (m *manager) render(target d2render.Surface) error {
return nil return nil
} }
func (m *manager) renderLoadScreen(target d2render.Surface) error { func (m *manager) renderLoadScreen(target d2interface.Surface) error {
target.Clear(color.Black) target.Clear(color.Black)
screenWidth, screenHeight := target.GetSize() screenWidth, screenHeight := target.GetSize()
@ -111,7 +112,7 @@ func (m *manager) renderLoadScreen(target d2render.Surface) error {
return m.loadingAnim.Render(target) return m.loadingAnim.Render(target)
} }
func (m *manager) renderCursor(target d2render.Surface) error { func (m *manager) renderCursor(target d2interface.Surface) error {
_, height := m.cursorAnim.GetCurrentFrameSize() _, height := m.cursorAnim.GetCurrentFrameSize()
target.PushTranslation(m.cursorX, m.cursorY) target.PushTranslation(m.cursorX, m.cursorY)
target.PushTranslation(0, -height) target.PushTranslation(0, -height)

View File

@ -1,8 +1,8 @@
package d2gui package d2gui
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
type AnimationDirection int type AnimationDirection int
@ -59,7 +59,7 @@ func createAnimatedSprite(imagePath, palettePath string, direction AnimationDire
return sprite, nil return sprite, nil
} }
func (s *AnimatedSprite) render(target d2render.Surface) error { func (s *AnimatedSprite) render(target d2interface.Surface) error {
_, frameHeight := s.animation.GetCurrentFrameSize() _, frameHeight := s.animation.GetCurrentFrameSize()
target.PushTranslation(s.x, s.y-frameHeight) target.PushTranslation(s.x, s.y-frameHeight)
@ -73,7 +73,7 @@ func (s *Sprite) SetSegmented(segmentsX, segmentsY, frameOffset int) {
s.frameOffset = frameOffset s.frameOffset = frameOffset
} }
func (s *Sprite) render(target d2render.Surface) error { func (s *Sprite) render(target d2interface.Surface) error {
return renderSegmented(s.animation, s.segmentsX, s.segmentsY, s.frameOffset, target) return renderSegmented(s.animation, s.segmentsX, s.segmentsY, s.frameOffset, target)
} }

View File

@ -1,15 +1,15 @@
package d2gui package d2gui
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
type MouseHandler func(d2input.MouseEvent) type MouseHandler func(d2input.MouseEvent)
type MouseMoveHandler func(d2input.MouseMoveEvent) type MouseMoveHandler func(d2input.MouseMoveEvent)
type widget interface { type widget interface {
render(target d2render.Surface) error render(target d2interface.Surface) error
advance(elapsed float64) error advance(elapsed float64) error
onMouseMove(event d2input.MouseMoveEvent) bool onMouseMove(event d2input.MouseMoveEvent) bool
@ -105,7 +105,7 @@ func (w *widgetBase) isExpanding() bool {
return w.expanding return w.expanding
} }
func (w *widgetBase) render(target d2render.Surface) error { func (w *widgetBase) render(target d2interface.Surface) error {
return nil return nil
} }

View File

@ -1,8 +1,8 @@
package d2mapentity package d2mapentity
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
// AnimatedEntity represents an animation that can be projected onto the map. // AnimatedEntity represents an animation that can be projected onto the map.
@ -26,7 +26,7 @@ func CreateAnimatedEntity(x, y int, animation *d2asset.Animation) *AnimatedEntit
} }
// Render draws this animated entity onto the target // Render draws this animated entity onto the target
func (ae *AnimatedEntity) Render(target d2render.Surface) { func (ae *AnimatedEntity) Render(target d2interface.Surface) {
target.PushTranslation( target.PushTranslation(
ae.offsetX+int((ae.subcellX-ae.subcellY)*16), ae.offsetX+int((ae.subcellX-ae.subcellY)*16),
ae.offsetY+int(((ae.subcellX+ae.subcellY)*8)-5), ae.offsetY+int(((ae.subcellX+ae.subcellY)*8)-5),

View File

@ -3,16 +3,17 @@ package d2mapentity
import ( import (
"math" "math"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2astar" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2astar"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
type MapEntity interface { type MapEntity interface {
Render(target d2render.Surface) Render(target d2interface.Surface)
Advance(tickTime float64) Advance(tickTime float64)
GetPosition() (float64, float64) GetPosition() (float64, float64)
GetLayer() (int) GetLayer() int
GetPositionF() (float64, float64) GetPositionF() (float64, float64)
Name() string Name() string
Selectable() bool Selectable() bool

View File

@ -3,12 +3,13 @@ package d2mapentity
import ( import (
"math/rand" "math/rand"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
type NPC struct { type NPC struct {
@ -49,7 +50,7 @@ func CreateNPC(x, y int, object *d2datadict.ObjectLookupRecord, direction int) *
return result return result
} }
func (v *NPC) Render(target d2render.Surface) { func (v *NPC) Render(target d2interface.Surface) {
target.PushTranslation( target.PushTranslation(
v.offsetX+int((v.subcellX-v.subcellY)*16), v.offsetX+int((v.subcellX-v.subcellY)*16),
v.offsetY+int(((v.subcellX+v.subcellY)*8)-5), v.offsetY+int(((v.subcellX+v.subcellY)*8)-5),

View File

@ -4,9 +4,9 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
) )
@ -32,7 +32,7 @@ func CreateObject(x, y int, object *d2datadict.ObjectLookupRecord, palettePath s
mapEntity: createMapEntity(x, y), mapEntity: createMapEntity(x, y),
composite: composite, composite: composite,
objectLookup: object, objectLookup: object,
nameLabel: d2ui.CreateLabel(d2resource.FontFormal11, d2resource.PaletteStatic), nameLabel: d2ui.CreateLabel(d2resource.FontFormal11, d2resource.PaletteStatic),
} }
entity.mapEntity.directioner = entity.rotate entity.mapEntity.directioner = entity.rotate
entity.objectRecord = d2datadict.Objects[object.ObjectsTxtId] entity.objectRecord = d2datadict.Objects[object.ObjectsTxtId]
@ -74,7 +74,7 @@ func (ob *Object) Selectable() bool {
} }
// Render draws this animated entity onto the target // Render draws this animated entity onto the target
func (ob *Object) Render(target d2render.Surface) { func (ob *Object) Render(target d2interface.Surface) {
target.PushTranslation( target.PushTranslation(
ob.offsetX+int((ob.subcellX-ob.subcellY)*16), ob.offsetX+int((ob.subcellX-ob.subcellY)*16),
ob.offsetY+int(((ob.subcellX+ob.subcellY)*8)-5), ob.offsetY+int(((ob.subcellX+ob.subcellY)*8)-5),

View File

@ -3,13 +3,14 @@ package d2mapentity
import ( import (
"image/color" "image/color"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2data/d2datadict"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2hero" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2hero"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
) )
@ -132,7 +133,7 @@ func (v *Player) Advance(tickTime float64) {
} }
} }
func (v *Player) Render(target d2render.Surface) { func (v *Player) Render(target d2interface.Surface) {
target.PushTranslation( target.PushTranslation(
v.offsetX+int((v.subcellX-v.subcellY)*16), v.offsetX+int((v.subcellX-v.subcellY)*16),
v.offsetY+int(((v.subcellX+v.subcellY)*8)-5), v.offsetY+int(((v.subcellX+v.subcellY)*8)-5),

View File

@ -2,25 +2,25 @@ package d2maprenderer
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
) )
var imageCacheRecords map[uint32]d2render.Surface var imageCacheRecords map[uint32]d2interface.Surface
// Invalidates the global region image cache. Call this when you are changing regions // Invalidates the global region image cache. Call this when you are changing regions
func InvalidateImageCache() { func InvalidateImageCache() {
imageCacheRecords = nil imageCacheRecords = nil
} }
func (mr *MapRenderer) getImageCacheRecord(style, sequence byte, tileType d2enum.TileType, randomIndex byte) d2render.Surface { func (mr *MapRenderer) getImageCacheRecord(style, sequence byte, tileType d2enum.TileType, randomIndex byte) d2interface.Surface {
lookupIndex := uint32(style)<<24 | uint32(sequence)<<16 | uint32(tileType)<<8 | uint32(randomIndex) lookupIndex := uint32(style)<<24 | uint32(sequence)<<16 | uint32(tileType)<<8 | uint32(randomIndex)
return imageCacheRecords[lookupIndex] return imageCacheRecords[lookupIndex]
} }
func (mr *MapRenderer) setImageCacheRecord(style, sequence byte, tileType d2enum.TileType, randomIndex byte, image d2render.Surface) { func (mr *MapRenderer) setImageCacheRecord(style, sequence byte, tileType d2enum.TileType, randomIndex byte, image d2interface.Surface) {
lookupIndex := uint32(style)<<24 | uint32(sequence)<<16 | uint32(tileType)<<8 | uint32(randomIndex) lookupIndex := uint32(style)<<24 | uint32(sequence)<<16 | uint32(tileType)<<8 | uint32(randomIndex)
if imageCacheRecords == nil { if imageCacheRecords == nil {
imageCacheRecords = make(map[uint32]d2render.Surface) imageCacheRecords = make(map[uint32]d2interface.Surface)
} }
imageCacheRecords[lookupIndex] = image imageCacheRecords[lookupIndex] = image
} }

View File

@ -15,7 +15,6 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2ds1" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2ds1"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
// The map renderer, used to render the map // The map renderer, used to render the map
@ -58,7 +57,7 @@ func (mr *MapRenderer) SetMapEngine(mapEngine *d2mapengine.MapEngine) {
mr.generateTileCache() mr.generateTileCache()
} }
func (mr *MapRenderer) Render(target d2render.Surface) { func (mr *MapRenderer) Render(target d2interface.Surface) {
mapSize := mr.mapEngine.Size() mapSize := mr.mapEngine.Size()
stxf, styf := mr.viewport.ScreenToWorld(400, -200) stxf, styf := mr.viewport.ScreenToWorld(400, -200)
etxf, etyf := mr.viewport.ScreenToWorld(400, 1050) etxf, etyf := mr.viewport.ScreenToWorld(400, 1050)
@ -97,7 +96,7 @@ func (mr *MapRenderer) WorldToOrtho(x, y float64) (float64, float64) {
} }
// Lower wall tiles, tile shadews, floor tiles // Lower wall tiles, tile shadews, floor tiles
func (mr *MapRenderer) renderPass1(target d2render.Surface, startX, startY, endX, endY int) { func (mr *MapRenderer) renderPass1(target d2interface.Surface, startX, startY, endX, endY int) {
for tileY := startY; tileY < endY; tileY++ { for tileY := startY; tileY < endY; tileY++ {
for tileX := startX; tileX < endX; tileX++ { for tileX := startX; tileX < endX; tileX++ {
tile := mr.mapEngine.TileAt(tileX, tileY) tile := mr.mapEngine.TileAt(tileX, tileY)
@ -109,7 +108,7 @@ func (mr *MapRenderer) renderPass1(target d2render.Surface, startX, startY, endX
} }
// Objects below walls // Objects below walls
func (mr *MapRenderer) renderPass2(target d2render.Surface, startX, startY, endX, endY int) { func (mr *MapRenderer) renderPass2(target d2interface.Surface, startX, startY, endX, endY int) {
for tileY := startY; tileY < endY; tileY++ { for tileY := startY; tileY < endY; tileY++ {
for tileX := startX; tileX < endX; tileX++ { for tileX := startX; tileX < endX; tileX++ {
mr.viewport.PushTranslationWorld(float64(tileX), float64(tileY)) mr.viewport.PushTranslationWorld(float64(tileX), float64(tileY))
@ -133,7 +132,7 @@ func (mr *MapRenderer) renderPass2(target d2render.Surface, startX, startY, endX
} }
// Upper wall tiles, objects that are on top of walls // Upper wall tiles, objects that are on top of walls
func (mr *MapRenderer) renderPass3(target d2render.Surface, startX, startY, endX, endY int) { func (mr *MapRenderer) renderPass3(target d2interface.Surface, startX, startY, endX, endY int) {
for tileY := startY; tileY < endY; tileY++ { for tileY := startY; tileY < endY; tileY++ {
for tileX := startX; tileX < endX; tileX++ { for tileX := startX; tileX < endX; tileX++ {
tile := mr.mapEngine.TileAt(tileX, tileY) tile := mr.mapEngine.TileAt(tileX, tileY)
@ -159,7 +158,7 @@ func (mr *MapRenderer) renderPass3(target d2render.Surface, startX, startY, endX
} }
// Roof tiles // Roof tiles
func (mr *MapRenderer) renderPass4(target d2render.Surface, startX, startY, endX, endY int) { func (mr *MapRenderer) renderPass4(target d2interface.Surface, startX, startY, endX, endY int) {
for tileY := startY; tileY < endY; tileY++ { for tileY := startY; tileY < endY; tileY++ {
for tileX := startX; tileX < endX; tileX++ { for tileX := startX; tileX < endX; tileX++ {
tile := mr.mapEngine.TileAt(tileX, tileY) tile := mr.mapEngine.TileAt(tileX, tileY)
@ -172,7 +171,7 @@ func (mr *MapRenderer) renderPass4(target d2render.Surface, startX, startY, endX
} }
func (mr *MapRenderer) renderTilePass1(tile *d2ds1.TileRecord, target d2render.Surface) { func (mr *MapRenderer) renderTilePass1(tile *d2ds1.TileRecord, target d2interface.Surface) {
for _, wall := range tile.Walls { for _, wall := range tile.Walls {
if !wall.Hidden && wall.Prop1 != 0 && wall.Type.LowerWall() { if !wall.Hidden && wall.Prop1 != 0 && wall.Type.LowerWall() {
mr.renderWall(wall, mr.viewport, target) mr.renderWall(wall, mr.viewport, target)
@ -192,7 +191,7 @@ func (mr *MapRenderer) renderTilePass1(tile *d2ds1.TileRecord, target d2render.S
} }
} }
func (mr *MapRenderer) renderTilePass2(tile *d2ds1.TileRecord, target d2render.Surface) { func (mr *MapRenderer) renderTilePass2(tile *d2ds1.TileRecord, target d2interface.Surface) {
for _, wall := range tile.Walls { for _, wall := range tile.Walls {
if !wall.Hidden && wall.Type.UpperWall() { if !wall.Hidden && wall.Type.UpperWall() {
mr.renderWall(wall, mr.viewport, target) mr.renderWall(wall, mr.viewport, target)
@ -200,7 +199,7 @@ func (mr *MapRenderer) renderTilePass2(tile *d2ds1.TileRecord, target d2render.S
} }
} }
func (mr *MapRenderer) renderTilePass3(tile *d2ds1.TileRecord, target d2render.Surface) { func (mr *MapRenderer) renderTilePass3(tile *d2ds1.TileRecord, target d2interface.Surface) {
for _, wall := range tile.Walls { for _, wall := range tile.Walls {
if wall.Type == d2enum.Roof { if wall.Type == d2enum.Roof {
mr.renderWall(wall, mr.viewport, target) mr.renderWall(wall, mr.viewport, target)
@ -208,8 +207,8 @@ func (mr *MapRenderer) renderTilePass3(tile *d2ds1.TileRecord, target d2render.S
} }
} }
func (mr *MapRenderer) renderFloor(tile d2ds1.FloorShadowRecord, target d2render.Surface) { func (mr *MapRenderer) renderFloor(tile d2ds1.FloorShadowRecord, target d2interface.Surface) {
var img d2render.Surface var img d2interface.Surface
if !tile.Animated { if !tile.Animated {
img = mr.getImageCacheRecord(tile.Style, tile.Sequence, 0, tile.RandomIndex) img = mr.getImageCacheRecord(tile.Style, tile.Sequence, 0, tile.RandomIndex)
} else { } else {
@ -229,7 +228,7 @@ func (mr *MapRenderer) renderFloor(tile d2ds1.FloorShadowRecord, target d2render
target.Render(img) target.Render(img)
} }
func (mr *MapRenderer) renderWall(tile d2ds1.WallRecord, viewport *Viewport, target d2render.Surface) { func (mr *MapRenderer) renderWall(tile d2ds1.WallRecord, viewport *Viewport, target d2interface.Surface) {
img := mr.getImageCacheRecord(tile.Style, tile.Sequence, tile.Type, tile.RandomIndex) img := mr.getImageCacheRecord(tile.Style, tile.Sequence, tile.Type, tile.RandomIndex)
if img == nil { if img == nil {
log.Printf("Render called on uncached wall {%v,%v,%v}", tile.Style, tile.Sequence, tile.Type) log.Printf("Render called on uncached wall {%v,%v,%v}", tile.Style, tile.Sequence, tile.Type)
@ -245,7 +244,7 @@ func (mr *MapRenderer) renderWall(tile d2ds1.WallRecord, viewport *Viewport, tar
target.Render(img) target.Render(img)
} }
func (mr *MapRenderer) renderShadow(tile d2ds1.FloorShadowRecord, target d2render.Surface) { func (mr *MapRenderer) renderShadow(tile d2ds1.FloorShadowRecord, target d2interface.Surface) {
img := mr.getImageCacheRecord(tile.Style, tile.Sequence, 13, tile.RandomIndex) img := mr.getImageCacheRecord(tile.Style, tile.Sequence, 13, tile.RandomIndex)
if img == nil { if img == nil {
log.Printf("Render called on uncached shadow {%v,%v}", tile.Style, tile.Sequence) log.Printf("Render called on uncached shadow {%v,%v}", tile.Style, tile.Sequence)
@ -261,7 +260,7 @@ func (mr *MapRenderer) renderShadow(tile d2ds1.FloorShadowRecord, target d2rende
target.Render(img) target.Render(img)
} }
func (mr *MapRenderer) renderDebug(debugVisLevel int, target d2render.Surface, startX, startY, endX, endY int) { func (mr *MapRenderer) renderDebug(debugVisLevel int, target d2interface.Surface, startX, startY, endX, endY int) {
for tileY := startY; tileY < endY; tileY++ { for tileY := startY; tileY < endY; tileY++ {
for tileX := startX; tileX < endX; tileX++ { for tileX := startX; tileX < endX; tileX++ {
mr.viewport.PushTranslationWorld(float64(tileX), float64(tileY)) mr.viewport.PushTranslationWorld(float64(tileX), float64(tileY))
@ -279,7 +278,7 @@ func (mr *MapRenderer) WorldToScreenF(x, y float64) (float64, float64) {
return mr.viewport.WorldToScreenF(x, y) return mr.viewport.WorldToScreenF(x, y)
} }
func (mr *MapRenderer) renderTileDebug(ax, ay int, debugVisLevel int, target d2render.Surface) { func (mr *MapRenderer) renderTileDebug(ax, ay int, debugVisLevel int, target d2interface.Surface) {
subTileColor := color.RGBA{R: 80, G: 80, B: 255, A: 50} subTileColor := color.RGBA{R: 80, G: 80, B: 255, A: 50}
tileColor := color.RGBA{R: 255, G: 255, B: 255, A: 100} tileColor := color.RGBA{R: 255, G: 255, B: 255, A: 100}
tileCollisionColor := color.RGBA{R: 128, G: 0, B: 0, A: 100} tileCollisionColor := color.RGBA{R: 128, G: 0, B: 0, A: 100}

View File

@ -3,6 +3,8 @@ package d2maprenderer
import ( import (
"log" "log"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
@ -74,7 +76,7 @@ func (mr *MapRenderer) generateFloorCache(tile *d2ds1.FloorShadowRecord, tileX,
} }
tileYOffset := d2common.AbsInt32(tileYMinimum) tileYOffset := d2common.AbsInt32(tileYMinimum)
tileHeight := d2common.AbsInt32(tileData[i].Height) tileHeight := d2common.AbsInt32(tileData[i].Height)
image, _ := d2render.NewSurface(int(tileData[i].Width), int(tileHeight), d2render.FilterNearest) image, _ := d2render.NewSurface(int(tileData[i].Width), int(tileHeight), d2interface.FilterNearest)
pixels := make([]byte, 4*tileData[i].Width*tileHeight) pixels := make([]byte, 4*tileData[i].Width*tileHeight)
mr.decodeTileGfxData(tileData[i].Blocks, &pixels, tileYOffset, tileData[i].Width) mr.decodeTileGfxData(tileData[i].Blocks, &pixels, tileYOffset, tileData[i].Width)
image.ReplacePixels(pixels) image.ReplacePixels(pixels)
@ -113,7 +115,7 @@ func (mr *MapRenderer) generateShadowCache(tile *d2ds1.FloorShadowRecord, tileX,
return return
} }
image, _ := d2render.NewSurface(int(tileData.Width), tileHeight, d2render.FilterNearest) image, _ := d2render.NewSurface(int(tileData.Width), tileHeight, d2interface.FilterNearest)
pixels := make([]byte, 4*tileData.Width*int32(tileHeight)) pixels := make([]byte, 4*tileData.Width*int32(tileHeight))
mr.decodeTileGfxData(tileData.Blocks, &pixels, tileYOffset, tileData.Width) mr.decodeTileGfxData(tileData.Blocks, &pixels, tileYOffset, tileData.Width)
image.ReplacePixels(pixels) image.ReplacePixels(pixels)
@ -174,7 +176,7 @@ func (mr *MapRenderer) generateWallCache(tile *d2ds1.WallRecord, tileX, tileY in
return return
} }
image, _ := d2render.NewSurface(160, int(realHeight), d2render.FilterNearest) image, _ := d2render.NewSurface(160, int(realHeight), d2interface.FilterNearest)
pixels := make([]byte, 4*160*realHeight) pixels := make([]byte, 4*160*realHeight)
mr.decodeTileGfxData(tileData.Blocks, &pixels, tileYOffset, 160) mr.decodeTileGfxData(tileData.Blocks, &pixels, tileYOffset, 160)

View File

@ -3,6 +3,8 @@ package d2render
import ( import (
"errors" "errors"
"log" "log"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
) )
var ( var (
@ -11,9 +13,9 @@ var (
ErrInvalidRenderer = errors.New("invalid rendering system specified") ErrInvalidRenderer = errors.New("invalid rendering system specified")
) )
var singleton Renderer var singleton d2interface.Renderer
func Initialize(rend Renderer) error { func Initialize(rend d2interface.Renderer) error {
verifyNotInit() verifyNotInit()
singleton = rend singleton = rend
log.Printf("Initialized the %s renderer...", singleton.GetRendererName()) log.Printf("Initialized the %s renderer...", singleton.GetRendererName())
@ -25,7 +27,7 @@ func SetWindowIcon(fileName string) {
singleton.SetWindowIcon(fileName) singleton.SetWindowIcon(fileName)
} }
func Run(f func(Surface) error, width, height int, title string) error { func Run(f func(d2interface.Surface) error, width, height int, title string) error {
verifyWasInit() verifyWasInit()
singleton.Run(f, width, height, title) singleton.Run(f, width, height, title)
return nil return nil
@ -36,12 +38,12 @@ func IsDrawingSkipped() bool {
return singleton.IsDrawingSkipped() return singleton.IsDrawingSkipped()
} }
func CreateSurface(surface Surface) (Surface, error) { func CreateSurface(surface d2interface.Surface) (d2interface.Surface, error) {
verifyWasInit() verifyWasInit()
return singleton.CreateSurface(surface) return singleton.CreateSurface(surface)
} }
func NewSurface(width, height int, filter Filter) (Surface, error) { func NewSurface(width, height int, filter d2interface.Filter) (d2interface.Surface, error) {
verifyWasInit() verifyWasInit()
return singleton.NewSurface(width, height, filter) return singleton.NewSurface(width, height, filter)
} }

View File

@ -1,72 +1,72 @@
package ebiten package ebiten
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/hajimehoshi/ebiten" "github.com/hajimehoshi/ebiten"
) )
func d2ToEbitenCompositeMode(comp d2render.CompositeMode) ebiten.CompositeMode { func d2ToEbitenCompositeMode(comp d2interface.CompositeMode) ebiten.CompositeMode {
switch comp { switch comp {
case d2render.CompositeModeSourceOver: case d2interface.CompositeModeSourceOver:
return ebiten.CompositeModeSourceOver return ebiten.CompositeModeSourceOver
case d2render.CompositeModeClear: case d2interface.CompositeModeClear:
return ebiten.CompositeModeClear return ebiten.CompositeModeClear
case d2render.CompositeModeCopy: case d2interface.CompositeModeCopy:
return ebiten.CompositeModeCopy return ebiten.CompositeModeCopy
case d2render.CompositeModeDestination: case d2interface.CompositeModeDestination:
return ebiten.CompositeModeDestination return ebiten.CompositeModeDestination
case d2render.CompositeModeDestinationOver: case d2interface.CompositeModeDestinationOver:
return ebiten.CompositeModeDestinationOver return ebiten.CompositeModeDestinationOver
case d2render.CompositeModeSourceIn: case d2interface.CompositeModeSourceIn:
return ebiten.CompositeModeSourceIn return ebiten.CompositeModeSourceIn
case d2render.CompositeModeDestinationIn: case d2interface.CompositeModeDestinationIn:
return ebiten.CompositeModeDestinationIn return ebiten.CompositeModeDestinationIn
case d2render.CompositeModeSourceOut: case d2interface.CompositeModeSourceOut:
return ebiten.CompositeModeSourceOut return ebiten.CompositeModeSourceOut
case d2render.CompositeModeDestinationOut: case d2interface.CompositeModeDestinationOut:
return ebiten.CompositeModeDestinationOut return ebiten.CompositeModeDestinationOut
case d2render.CompositeModeSourceAtop: case d2interface.CompositeModeSourceAtop:
return ebiten.CompositeModeSourceAtop return ebiten.CompositeModeSourceAtop
case d2render.CompositeModeDestinationAtop: case d2interface.CompositeModeDestinationAtop:
return ebiten.CompositeModeDestinationAtop return ebiten.CompositeModeDestinationAtop
case d2render.CompositeModeXor: case d2interface.CompositeModeXor:
return ebiten.CompositeModeXor return ebiten.CompositeModeXor
case d2render.CompositeModeLighter: case d2interface.CompositeModeLighter:
return ebiten.CompositeModeLighter return ebiten.CompositeModeLighter
} }
return ebiten.CompositeModeSourceOver return ebiten.CompositeModeSourceOver
} }
func ebitenToD2CompositeMode(comp ebiten.CompositeMode) d2render.CompositeMode { func ebitenToD2CompositeMode(comp ebiten.CompositeMode) d2interface.CompositeMode {
switch comp { switch comp {
case ebiten.CompositeModeSourceOver: case ebiten.CompositeModeSourceOver:
return d2render.CompositeModeSourceOver return d2interface.CompositeModeSourceOver
case ebiten.CompositeModeClear: case ebiten.CompositeModeClear:
return d2render.CompositeModeClear return d2interface.CompositeModeClear
case ebiten.CompositeModeCopy: case ebiten.CompositeModeCopy:
return d2render.CompositeModeCopy return d2interface.CompositeModeCopy
case ebiten.CompositeModeDestination: case ebiten.CompositeModeDestination:
return d2render.CompositeModeDestination return d2interface.CompositeModeDestination
case ebiten.CompositeModeDestinationOver: case ebiten.CompositeModeDestinationOver:
return d2render.CompositeModeDestinationOver return d2interface.CompositeModeDestinationOver
case ebiten.CompositeModeSourceIn: case ebiten.CompositeModeSourceIn:
return d2render.CompositeModeSourceIn return d2interface.CompositeModeSourceIn
case ebiten.CompositeModeDestinationIn: case ebiten.CompositeModeDestinationIn:
return d2render.CompositeModeDestinationIn return d2interface.CompositeModeDestinationIn
case ebiten.CompositeModeSourceOut: case ebiten.CompositeModeSourceOut:
return d2render.CompositeModeSourceOut return d2interface.CompositeModeSourceOut
case ebiten.CompositeModeDestinationOut: case ebiten.CompositeModeDestinationOut:
return d2render.CompositeModeDestinationOut return d2interface.CompositeModeDestinationOut
case ebiten.CompositeModeSourceAtop: case ebiten.CompositeModeSourceAtop:
return d2render.CompositeModeSourceAtop return d2interface.CompositeModeSourceAtop
case ebiten.CompositeModeDestinationAtop: case ebiten.CompositeModeDestinationAtop:
return d2render.CompositeModeDestinationAtop return d2interface.CompositeModeDestinationAtop
case ebiten.CompositeModeXor: case ebiten.CompositeModeXor:
return d2render.CompositeModeXor return d2interface.CompositeModeXor
case ebiten.CompositeModeLighter: case ebiten.CompositeModeLighter:
return d2render.CompositeModeLighter return d2interface.CompositeModeLighter
} }
return d2render.CompositeModeSourceOver return d2interface.CompositeModeSourceOver
} }

View File

@ -3,15 +3,16 @@ package ebiten
import ( import (
"image" "image"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/hajimehoshi/ebiten" "github.com/hajimehoshi/ebiten"
"github.com/hajimehoshi/ebiten/ebitenutil" "github.com/hajimehoshi/ebiten/ebitenutil"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2config" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2config"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
type Renderer struct { type Renderer struct {
renderCallback func(surface d2render.Surface) error renderCallback func(surface d2interface.Surface) error
} }
func (r *Renderer) Update(screen *ebiten.Image) error { func (r *Renderer) Update(screen *ebiten.Image) error {
@ -55,7 +56,7 @@ func (r *Renderer) IsDrawingSkipped() bool {
return ebiten.IsDrawingSkipped() return ebiten.IsDrawingSkipped()
} }
func (r *Renderer) Run(f func(surface d2render.Surface) error, width, height int, title string) error { func (r *Renderer) Run(f func(surface d2interface.Surface) error, width, height int, title string) error {
r.renderCallback = f r.renderCallback = f
ebiten.SetWindowTitle(title) ebiten.SetWindowTitle(title)
ebiten.SetWindowResizable(true) ebiten.SetWindowResizable(true)
@ -63,7 +64,7 @@ func (r *Renderer) Run(f func(surface d2render.Surface) error, width, height int
return ebiten.RunGame(r) return ebiten.RunGame(r)
} }
func (r *Renderer) CreateSurface(surface d2render.Surface) (d2render.Surface, error) { func (r *Renderer) CreateSurface(surface d2interface.Surface) (d2interface.Surface, error) {
result := &ebitenSurface{ result := &ebitenSurface{
image: surface.(*ebitenSurface).image, image: surface.(*ebitenSurface).image,
stateCurrent: surfaceState{ stateCurrent: surfaceState{
@ -74,7 +75,7 @@ func (r *Renderer) CreateSurface(surface d2render.Surface) (d2render.Surface, er
return result, nil return result, nil
} }
func (r *Renderer) NewSurface(width, height int, filter d2render.Filter) (d2render.Surface, error) { func (r *Renderer) NewSurface(width, height int, filter d2interface.Filter) (d2interface.Surface, error) {
ebitenFilter := d2ToEbitenFilter(filter) ebitenFilter := d2ToEbitenFilter(filter)
img, err := ebiten.NewImage(width, height, ebitenFilter) img, err := ebiten.NewImage(width, height, ebitenFilter)
if err != nil { if err != nil {

View File

@ -5,7 +5,7 @@ import (
"image" "image"
"image/color" "image/color"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/hajimehoshi/ebiten" "github.com/hajimehoshi/ebiten"
"github.com/hajimehoshi/ebiten/ebitenutil" "github.com/hajimehoshi/ebiten/ebitenutil"
@ -23,12 +23,12 @@ func (s *ebitenSurface) PushTranslation(x, y int) {
s.stateCurrent.y += y s.stateCurrent.y += y
} }
func (s *ebitenSurface) PushCompositeMode(mode d2render.CompositeMode) { func (s *ebitenSurface) PushCompositeMode(mode d2interface.CompositeMode) {
s.stateStack = append(s.stateStack, s.stateCurrent) s.stateStack = append(s.stateStack, s.stateCurrent)
s.stateCurrent.mode = d2ToEbitenCompositeMode(mode) s.stateCurrent.mode = d2ToEbitenCompositeMode(mode)
} }
func (s *ebitenSurface) PushFilter(filter d2render.Filter) { func (s *ebitenSurface) PushFilter(filter d2interface.Filter) {
s.stateStack = append(s.stateStack, s.stateCurrent) s.stateStack = append(s.stateStack, s.stateCurrent)
s.stateCurrent.filter = d2ToEbitenFilter(filter) s.stateCurrent.filter = d2ToEbitenFilter(filter)
} }
@ -59,7 +59,7 @@ func (s *ebitenSurface) PopN(n int) {
} }
} }
func (s *ebitenSurface) Render(sfc d2render.Surface) error { func (s *ebitenSurface) Render(sfc d2interface.Surface) error {
opts := &ebiten.DrawImageOptions{CompositeMode: s.stateCurrent.mode} opts := &ebiten.DrawImageOptions{CompositeMode: s.stateCurrent.mode}
opts.GeoM.Translate(float64(s.stateCurrent.x), float64(s.stateCurrent.y)) opts.GeoM.Translate(float64(s.stateCurrent.x), float64(s.stateCurrent.y))
opts.Filter = s.stateCurrent.filter opts.Filter = s.stateCurrent.filter

View File

@ -1,32 +1,32 @@
package ebiten package ebiten
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/hajimehoshi/ebiten" "github.com/hajimehoshi/ebiten"
) )
func d2ToEbitenFilter(filter d2render.Filter) ebiten.Filter { func d2ToEbitenFilter(filter d2interface.Filter) ebiten.Filter {
switch filter { switch filter {
case d2render.FilterDefault: case d2interface.FilterDefault:
return ebiten.FilterDefault return ebiten.FilterDefault
case d2render.FilterLinear: case d2interface.FilterLinear:
return ebiten.FilterLinear return ebiten.FilterLinear
case d2render.FilterNearest: case d2interface.FilterNearest:
return ebiten.FilterNearest return ebiten.FilterNearest
} }
return ebiten.FilterDefault return ebiten.FilterDefault
} }
func ebitenToD2Filter(filter ebiten.Filter) d2render.Filter { func ebitenToD2Filter(filter ebiten.Filter) d2interface.Filter {
switch filter { switch filter {
case ebiten.FilterDefault: case ebiten.FilterDefault:
return d2render.FilterDefault return d2interface.FilterDefault
case ebiten.FilterLinear: case ebiten.FilterLinear:
return d2render.FilterLinear return d2interface.FilterLinear
case ebiten.FilterNearest: case ebiten.FilterNearest:
return d2render.FilterNearest return d2interface.FilterNearest
} }
return d2render.FilterDefault return d2interface.FilterDefault
} }

View File

@ -3,8 +3,9 @@ package d2screen
import ( import (
"log" "log"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
) )
@ -22,7 +23,7 @@ type ScreenUnloadHandler interface {
} }
type ScreenRenderHandler interface { type ScreenRenderHandler interface {
Render(target d2render.Surface) error Render(target d2interface.Surface) error
} }
type ScreenAdvanceHandler interface { type ScreenAdvanceHandler interface {
@ -95,7 +96,7 @@ func Advance(elapsed float64) error {
return nil return nil
} }
func Render(surface d2render.Surface) error { func Render(surface d2interface.Surface) error {
if handler, ok := singleton.currentScreen.(ScreenRenderHandler); ok { if handler, ok := singleton.currentScreen.(ScreenRenderHandler); ok {
if err := handler.Render(surface); err != nil { if err := handler.Render(surface); err != nil {
return err return err

View File

@ -15,7 +15,6 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
type TermCategory d2interface.TermCategory type TermCategory d2interface.TermCategory
@ -211,7 +210,7 @@ func (t *terminal) OnKeyChars(event d2input.KeyCharsEvent) bool {
return handled return handled
} }
func (t *terminal) Render(surface d2render.Surface) error { func (t *terminal) Render(surface d2interface.Surface) error {
if !t.IsVisible() { if !t.IsVisible() {
return nil return nil
} }

View File

@ -4,6 +4,8 @@ import (
"image" "image"
"image/color" "image/color"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
@ -93,11 +95,11 @@ type Button struct {
visible bool visible bool
pressed bool pressed bool
toggled bool toggled bool
normalSurface d2render.Surface normalSurface d2interface.Surface
pressedSurface d2render.Surface pressedSurface d2interface.Surface
toggledSurface d2render.Surface toggledSurface d2interface.Surface
pressedToggledSurface d2render.Surface pressedToggledSurface d2interface.Surface
disabledSurface d2render.Surface disabledSurface d2interface.Surface
buttonLayout ButtonLayout buttonLayout ButtonLayout
onClick func() onClick func()
} }
@ -127,7 +129,7 @@ func CreateButton(buttonType ButtonType, text string) Button {
result.height += h result.height += h
} }
result.normalSurface, _ = d2render.NewSurface(result.width, result.height, d2render.FilterNearest) result.normalSurface, _ = d2render.NewSurface(result.width, result.height, d2interface.FilterNearest)
_, fontHeight := font.GetTextMetrics(text) _, fontHeight := font.GetTextMetrics(text)
textY := (result.height / 2) - (fontHeight / 2) + buttonLayout.TextOffset textY := (result.height / 2) - (fontHeight / 2) + buttonLayout.TextOffset
@ -137,22 +139,22 @@ func CreateButton(buttonType ButtonType, text string) Button {
font.Render(0, textY, text, color.RGBA{R: 100, G: 100, B: 100, A: 255}, result.normalSurface) font.Render(0, textY, text, color.RGBA{R: 100, G: 100, B: 100, A: 255}, result.normalSurface)
if buttonLayout.AllowFrameChange { if buttonLayout.AllowFrameChange {
if totalButtonTypes > 1 { if totalButtonTypes > 1 {
result.pressedSurface, _ = d2render.NewSurface(result.width, result.height, d2render.FilterNearest) result.pressedSurface, _ = d2render.NewSurface(result.width, result.height, d2interface.FilterNearest)
buttonSprite.RenderSegmented(result.pressedSurface, buttonLayout.XSegments, buttonLayout.YSegments, buttonLayout.BaseFrame+1) buttonSprite.RenderSegmented(result.pressedSurface, buttonLayout.XSegments, buttonLayout.YSegments, buttonLayout.BaseFrame+1)
font.Render(-2, textY+2, text, color.RGBA{R: 100, G: 100, B: 100, A: 255}, result.pressedSurface) font.Render(-2, textY+2, text, color.RGBA{R: 100, G: 100, B: 100, A: 255}, result.pressedSurface)
} }
if totalButtonTypes > 2 { if totalButtonTypes > 2 {
result.toggledSurface, _ = d2render.NewSurface(result.width, result.height, d2render.FilterNearest) result.toggledSurface, _ = d2render.NewSurface(result.width, result.height, d2interface.FilterNearest)
buttonSprite.RenderSegmented(result.toggledSurface, buttonLayout.XSegments, buttonLayout.YSegments, buttonLayout.BaseFrame+2) buttonSprite.RenderSegmented(result.toggledSurface, buttonLayout.XSegments, buttonLayout.YSegments, buttonLayout.BaseFrame+2)
font.Render(0, textY, text, color.RGBA{R: 100, G: 100, B: 100, A: 255}, result.toggledSurface) font.Render(0, textY, text, color.RGBA{R: 100, G: 100, B: 100, A: 255}, result.toggledSurface)
} }
if totalButtonTypes > 3 { if totalButtonTypes > 3 {
result.pressedToggledSurface, _ = d2render.NewSurface(result.width, result.height, d2render.FilterNearest) result.pressedToggledSurface, _ = d2render.NewSurface(result.width, result.height, d2interface.FilterNearest)
buttonSprite.RenderSegmented(result.pressedToggledSurface, buttonLayout.XSegments, buttonLayout.YSegments, buttonLayout.BaseFrame+3) buttonSprite.RenderSegmented(result.pressedToggledSurface, buttonLayout.XSegments, buttonLayout.YSegments, buttonLayout.BaseFrame+3)
font.Render(0, textY, text, color.RGBA{R: 100, G: 100, B: 100, A: 255}, result.pressedToggledSurface) font.Render(0, textY, text, color.RGBA{R: 100, G: 100, B: 100, A: 255}, result.pressedToggledSurface)
} }
if buttonLayout.DisabledFrame != -1 { if buttonLayout.DisabledFrame != -1 {
result.disabledSurface, _ = d2render.NewSurface(result.width, result.height, d2render.FilterNearest) result.disabledSurface, _ = d2render.NewSurface(result.width, result.height, d2interface.FilterNearest)
buttonSprite.RenderSegmented(result.disabledSurface, buttonLayout.XSegments, buttonLayout.YSegments, buttonLayout.DisabledFrame) buttonSprite.RenderSegmented(result.disabledSurface, buttonLayout.XSegments, buttonLayout.YSegments, buttonLayout.DisabledFrame)
font.Render(0, textY, text, color.RGBA{R: 100, G: 100, B: 100, A: 255}, result.disabledSurface) font.Render(0, textY, text, color.RGBA{R: 100, G: 100, B: 100, A: 255}, result.disabledSurface)
} }
@ -174,9 +176,9 @@ func (v *Button) Activate() {
} }
// Render renders the button // Render renders the button
func (v *Button) Render(target d2render.Surface) { func (v *Button) Render(target d2interface.Surface) {
target.PushCompositeMode(d2render.CompositeModeSourceAtop) target.PushCompositeMode(d2interface.CompositeModeSourceAtop)
target.PushFilter(d2render.FilterNearest) target.PushFilter(d2interface.FilterNearest)
target.PushTranslation(v.x, v.y) target.PushTranslation(v.x, v.y)
defer target.PopN(3) defer target.PopN(3)

View File

@ -1,6 +1,7 @@
package d2ui package d2ui
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
@ -11,8 +12,8 @@ type Checkbox struct {
checkState bool checkState bool
visible bool visible bool
width, height int width, height int
Image d2render.Surface Image d2interface.Surface
checkedImage d2render.Surface checkedImage d2interface.Surface
onClick func() onClick func()
enabled bool enabled bool
} }
@ -31,18 +32,18 @@ func CreateCheckbox(checkState bool) Checkbox {
result.width, result.height, _ = checkboxSprite.GetFrameSize(0) result.width, result.height, _ = checkboxSprite.GetFrameSize(0)
checkboxSprite.SetPosition(0, 0) checkboxSprite.SetPosition(0, 0)
result.Image, _ = d2render.NewSurface(result.width, result.height, d2render.FilterNearest) result.Image, _ = d2render.NewSurface(result.width, result.height, d2interface.FilterNearest)
checkboxSprite.RenderSegmented(result.Image, 1, 1, 0) checkboxSprite.RenderSegmented(result.Image, 1, 1, 0)
result.checkedImage, _ = d2render.NewSurface(result.width, result.height, d2render.FilterNearest) result.checkedImage, _ = d2render.NewSurface(result.width, result.height, d2interface.FilterNearest)
checkboxSprite.RenderSegmented(result.checkedImage, 1, 1, 1) checkboxSprite.RenderSegmented(result.checkedImage, 1, 1, 1)
return result return result
} }
func (v *Checkbox) Render(target d2render.Surface) { func (v *Checkbox) Render(target d2interface.Surface) {
target.PushCompositeMode(d2render.CompositeModeSourceAtop) target.PushCompositeMode(d2interface.CompositeModeSourceAtop)
target.PushTranslation(v.x, v.y) target.PushTranslation(v.x, v.y)
target.PushFilter(d2render.FilterNearest) target.PushFilter(d2interface.FilterNearest)
defer target.PopN(3) defer target.PopN(3)
if v.checkState { if v.checkState {

View File

@ -7,7 +7,6 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
// CursorButton represents a mouse button // CursorButton represents a mouse button
@ -91,7 +90,7 @@ func (u *UI) OnMouseButtonDown(event d2input.MouseEvent) bool {
} }
// Render renders all of the UI elements // Render renders all of the UI elements
func Render(target d2render.Surface) { func Render(target d2interface.Surface) {
for _, widget := range singleton.widgets { for _, widget := range singleton.widgets {
if widget.GetVisible() { if widget.GetVisible() {
widget.Render(target) widget.Render(target)

View File

@ -1,10 +1,12 @@
package d2ui package d2ui
import "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
)
// Drawable represents an instance that can be drawn // Drawable represents an instance that can be drawn
type Drawable interface { type Drawable interface {
Render(target d2render.Surface) Render(target d2interface.Surface)
Advance(elapsed float64) Advance(elapsed float64)
GetSize() (width, height int) GetSize() (width, height int)
SetPosition(x, y int) SetPosition(x, y int)

View File

@ -6,9 +6,10 @@ import (
"strings" "strings"
"unicode" "unicode"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
var fontCache = map[string]*Font{} var fontCache = map[string]*Font{}
@ -102,7 +103,7 @@ func (v *Font) GetTextMetrics(text string) (width, height int) {
} }
// Render draws the font on the target surface // Render draws the font on the target surface
func (v *Font) Render(x, y int, text string, color color.Color, target d2render.Surface) { func (v *Font) Render(x, y int, text string, color color.Color, target d2interface.Surface) {
v.fontSprite.SetColorMod(color) v.fontSprite.SetColorMod(color)
v.fontSprite.SetBlend(false) v.fontSprite.SetBlend(false)

View File

@ -3,6 +3,8 @@ package d2ui
import ( import (
"image/color" "image/color"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
@ -27,7 +29,7 @@ type Label struct {
Height int Height int
Alignment LabelAlignment Alignment LabelAlignment
font *Font font *Font
imageData map[string]d2render.Surface imageData map[string]d2interface.Surface
Color color.Color Color color.Color
} }
@ -37,14 +39,14 @@ func CreateLabel(fontPath, palettePath string) Label {
Alignment: LabelAlignLeft, Alignment: LabelAlignLeft,
Color: color.White, Color: color.White,
font: GetFont(fontPath, palettePath), font: GetFont(fontPath, palettePath),
imageData: make(map[string]d2render.Surface), imageData: make(map[string]d2interface.Surface),
} }
return result return result
} }
// Render draws the label on the screen // Render draws the label on the screen
func (v *Label) Render(target d2render.Surface) { func (v *Label) Render(target d2interface.Surface) {
if len(v.text) == 0 { if len(v.text) == 0 {
return return
} }
@ -57,8 +59,8 @@ func (v *Label) Render(target d2render.Surface) {
x, y = v.X-v.Width, v.Y x, y = v.X-v.Width, v.Y
} }
target.PushFilter(d2render.FilterNearest) target.PushFilter(d2interface.FilterNearest)
target.PushCompositeMode(d2render.CompositeModeSourceAtop) target.PushCompositeMode(d2interface.CompositeModeSourceAtop)
target.PushTranslation(x, y) target.PushTranslation(x, y)
defer target.PopN(3) defer target.PopN(3)
@ -82,7 +84,7 @@ func (v *Label) cacheImage() {
width, height := v.font.GetTextMetrics(v.text) width, height := v.font.GetTextMetrics(v.text)
v.Width = width v.Width = width
v.Height = height v.Height = height
v.imageData[v.text], _ = d2render.NewSurface(width, height, d2render.FilterNearest) v.imageData[v.text], _ = d2render.NewSurface(width, height, d2interface.FilterNearest)
surface, _ := d2render.CreateSurface(v.imageData[v.text]) surface, _ := d2render.CreateSurface(v.imageData[v.text])
v.font.Render(0, 0, v.text, v.Color, surface) v.font.Render(0, 0, v.text, v.Color, surface)
} }

View File

@ -1,9 +1,9 @@
package d2ui package d2ui
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
type Scrollbar struct { type Scrollbar struct {
@ -74,7 +74,7 @@ func (v *Scrollbar) GetLastDirChange() int {
return v.lastDirChange return v.lastDirChange
} }
func (v *Scrollbar) Render(target d2render.Surface) { func (v *Scrollbar) Render(target d2interface.Surface) {
if !v.visible || v.maxOffset == 0 { if !v.visible || v.maxOffset == 0 {
return return
} }

View File

@ -4,9 +4,10 @@ import (
"errors" "errors"
"image/color" "image/color"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
type Sprite struct { type Sprite struct {
@ -26,7 +27,7 @@ func LoadSprite(animation *d2asset.Animation) (*Sprite, error) {
return &Sprite{animation: animation}, nil return &Sprite{animation: animation}, nil
} }
func (s *Sprite) Render(target d2render.Surface) error { func (s *Sprite) Render(target d2interface.Surface) error {
_, frameHeight := s.animation.GetCurrentFrameSize() _, frameHeight := s.animation.GetCurrentFrameSize()
target.PushTranslation(s.x, s.y-frameHeight) target.PushTranslation(s.x, s.y-frameHeight)
@ -34,7 +35,7 @@ func (s *Sprite) Render(target d2render.Surface) error {
return s.animation.Render(target) return s.animation.Render(target)
} }
func (s *Sprite) RenderSegmented(target d2render.Surface, segmentsX, segmentsY, frameOffset int) error { func (s *Sprite) RenderSegmented(target d2interface.Surface, segmentsX, segmentsY, frameOffset int) error {
var currentY int var currentY int
for y := 0; y < segmentsY; y++ { for y := 0; y < segmentsY; y++ {
var currentX int var currentX int

View File

@ -4,10 +4,11 @@ import (
"strings" "strings"
"time" "time"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
) )
// TextBox with cursor focus // TextBox with cursor focus
@ -46,7 +47,7 @@ func (v *TextBox) SetFilter(filter string) {
v.filter = filter v.filter = filter
} }
func (v *TextBox) Render(target d2render.Surface) { func (v *TextBox) Render(target d2interface.Surface) {
if !v.visible { if !v.visible {
return return
} }

View File

@ -15,7 +15,6 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapentity" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapentity"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
"github.com/OpenDiablo2/OpenDiablo2/d2game/d2player" "github.com/OpenDiablo2/OpenDiablo2/d2game/d2player"
@ -187,7 +186,7 @@ func (v *CharacterSelect) onExitButtonClicked() {
d2screen.SetNextScreen(mainMenu) d2screen.SetNextScreen(mainMenu)
} }
func (v *CharacterSelect) Render(screen d2render.Surface) error { func (v *CharacterSelect) Render(screen d2interface.Surface) error {
v.background.RenderSegmented(screen, 4, 3, 0) v.background.RenderSegmented(screen, 4, 3, 0)
v.d2HeroTitle.Render(screen) v.d2HeroTitle.Render(screen)
actualSelectionIndex := v.selectedCharacter - (v.charScrollbar.GetCurrentOffset() * 2) actualSelectionIndex := v.selectedCharacter - (v.charScrollbar.GetCurrentOffset() * 2)

View File

@ -14,7 +14,6 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
) )
@ -99,7 +98,7 @@ func (v *Credits) OnLoad(loading d2screen.LoadingState) {
} }
// Render renders the credits screen // Render renders the credits screen
func (v *Credits) Render(screen d2render.Surface) error { func (v *Credits) Render(screen d2interface.Surface) error {
v.creditsBackground.RenderSegmented(screen, 4, 3, 0) v.creditsBackground.RenderSegmented(screen, 4, 3, 0)
for _, label := range v.labels { for _, label := range v.labels {
if label.Available { if label.Available {

View File

@ -14,7 +14,6 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapentity" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2mapentity"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2maprenderer" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2map/d2maprenderer"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/OpenDiablo2/OpenDiablo2/d2game/d2player" "github.com/OpenDiablo2/OpenDiablo2/d2game/d2player"
"github.com/OpenDiablo2/OpenDiablo2/d2networking/d2client" "github.com/OpenDiablo2/OpenDiablo2/d2networking/d2client"
"github.com/OpenDiablo2/OpenDiablo2/d2networking/d2netpacket" "github.com/OpenDiablo2/OpenDiablo2/d2networking/d2netpacket"
@ -59,7 +58,7 @@ func (v *Game) OnUnload() error {
return nil return nil
} }
func (v *Game) Render(screen d2render.Surface) error { func (v *Game) Render(screen d2interface.Surface) error {
if v.gameClient.RegenMap { if v.gameClient.RegenMap {
v.gameClient.RegenMap = false v.gameClient.RegenMap = false
v.mapRenderer.RegenerateTileCache() v.mapRenderer.RegenerateTileCache()

View File

@ -1,8 +1,8 @@
package d2gamescreen package d2gamescreen
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
) )
@ -42,7 +42,7 @@ func (g *GuiTestMain) OnLoad(loading d2screen.LoadingState) {
d2gui.SetLayout(layout) d2gui.SetLayout(layout)
} }
func (g *GuiTestMain) Render(screen d2render.Surface) error { func (g *GuiTestMain) Render(screen d2interface.Surface) error {
return nil return nil
} }

View File

@ -20,7 +20,6 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
) )
@ -301,7 +300,7 @@ func (v *MainMenu) onCreditsButtonClicked() {
} }
// Render renders the main menu // Render renders the main menu
func (v *MainMenu) Render(screen d2render.Surface) error { func (v *MainMenu) Render(screen d2interface.Surface) error {
switch v.screenMode { switch v.screenMode {
case ScreenModeTrademark: case ScreenModeTrademark:
v.trademarkBackground.RenderSegmented(screen, 4, 3, 0) v.trademarkBackground.RenderSegmented(screen, 4, 3, 0)

View File

@ -13,7 +13,6 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
"github.com/OpenDiablo2/OpenDiablo2/d2game/d2player" "github.com/OpenDiablo2/OpenDiablo2/d2game/d2player"
) )
@ -161,7 +160,7 @@ func (met *MapEngineTest) OnUnload() error {
return nil return nil
} }
func (met *MapEngineTest) Render(screen d2render.Surface) error { func (met *MapEngineTest) Render(screen d2interface.Surface) error {
met.mapRenderer.Render(screen) met.mapRenderer.Render(screen)
// //

View File

@ -17,7 +17,6 @@ import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2screen"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
) )
@ -445,7 +444,7 @@ func (v *SelectHeroClass) onOkButtonClicked() {
d2screen.SetNextScreen(CreateGame(v.audioProvider, gameClient, v.terminal)) d2screen.SetNextScreen(CreateGame(v.audioProvider, gameClient, v.terminal))
} }
func (v *SelectHeroClass) Render(screen d2render.Surface) error { func (v *SelectHeroClass) Render(screen d2interface.Surface) error {
v.bgImage.RenderSegmented(screen, 4, 3, 0) v.bgImage.RenderSegmented(screen, 4, 3, 0)
v.headingLabel.Render(screen) v.headingLabel.Render(screen)
if v.selectedHero != d2enum.HeroNone { if v.selectedHero != d2enum.HeroNone {
@ -557,7 +556,7 @@ func (v *SelectHeroClass) updateHeroSelectionHover(hero d2enum.Hero, canSelect b
} }
func (v *SelectHeroClass) renderHero(screen d2render.Surface, hero d2enum.Hero) { func (v *SelectHeroClass) renderHero(screen d2interface.Surface, hero d2enum.Hero) {
renderInfo := v.heroRenderInfo[hero] renderInfo := v.heroRenderInfo[hero]
switch renderInfo.Stance { switch renderInfo.Stance {
case d2enum.HeroStanceIdle: case d2enum.HeroStanceIdle:
@ -645,7 +644,7 @@ func setSpriteToFirstFrame(sprite *d2ui.Sprite) {
} }
} }
func drawSprite(sprite *d2ui.Sprite, target d2render.Surface) { func drawSprite(sprite *d2ui.Sprite, target d2interface.Surface) {
if sprite != nil { if sprite != nil {
sprite.Render(target) sprite.Render(target)
} }

View File

@ -52,8 +52,8 @@ type GameControls struct {
// UI // UI
globeSprite *d2ui.Sprite globeSprite *d2ui.Sprite
hpManaStatusSprite *d2ui.Sprite hpManaStatusSprite *d2ui.Sprite
hpStatusBar d2render.Surface hpStatusBar d2interface.Surface
manaStatusBar d2render.Surface manaStatusBar d2interface.Surface
mainPanel *d2ui.Sprite mainPanel *d2ui.Sprite
menuButton *d2ui.Sprite menuButton *d2ui.Sprite
skillIcon *d2ui.Sprite skillIcon *d2ui.Sprite
@ -254,7 +254,7 @@ func (g *GameControls) Load() {
animation, _ = d2asset.LoadAnimation(d2resource.HealthManaIndicator, d2resource.PaletteSky) animation, _ = d2asset.LoadAnimation(d2resource.HealthManaIndicator, d2resource.PaletteSky)
g.hpManaStatusSprite, _ = d2ui.LoadSprite(animation) g.hpManaStatusSprite, _ = d2ui.LoadSprite(animation)
g.hpStatusBar, _ = d2render.NewSurface(globeWidth, globeHeight, d2render.FilterNearest) g.hpStatusBar, _ = d2render.NewSurface(globeWidth, globeHeight, d2interface.FilterNearest)
animation, _ = d2asset.LoadAnimation(d2resource.GamePanels, d2resource.PaletteSky) animation, _ = d2asset.LoadAnimation(d2resource.GamePanels, d2resource.PaletteSky)
g.mainPanel, _ = d2ui.LoadSprite(animation) g.mainPanel, _ = d2ui.LoadSprite(animation)
@ -334,7 +334,7 @@ func (g *GameControls) isInActiveMenusRect(px int, py int) bool {
} }
// TODO: consider caching the panels to single image that is reused. // TODO: consider caching the panels to single image that is reused.
func (g *GameControls) Render(target d2render.Surface) { func (g *GameControls) Render(target d2interface.Surface) {
for entityIdx := range *g.mapEngine.Entities() { for entityIdx := range *g.mapEngine.Entities() {
entity := (*g.mapEngine.Entities())[entityIdx] entity := (*g.mapEngine.Entities())[entityIdx]
if !entity.Selectable() { if !entity.Selectable() {
@ -376,7 +376,7 @@ func (g *GameControls) Render(target d2render.Surface) {
healthPercent := float64(g.hero.Stats.Health) / float64(g.hero.Stats.MaxHealth) healthPercent := float64(g.hero.Stats.Health) / float64(g.hero.Stats.MaxHealth)
hpBarHeight := int(healthPercent * float64(globeHeight)) hpBarHeight := int(healthPercent * float64(globeHeight))
if g.lastHealthPercent != healthPercent { if g.lastHealthPercent != healthPercent {
g.hpStatusBar, _ = d2render.NewSurface(globeWidth, hpBarHeight, d2render.FilterNearest) g.hpStatusBar, _ = d2render.NewSurface(globeWidth, hpBarHeight, d2interface.FilterNearest)
g.hpManaStatusSprite.SetCurrentFrame(0) g.hpManaStatusSprite.SetCurrentFrame(0)
g.hpStatusBar.PushTranslation(0, hpBarHeight) g.hpStatusBar.PushTranslation(0, hpBarHeight)
@ -414,7 +414,7 @@ func (g *GameControls) Render(target d2render.Surface) {
// Stamina status bar // Stamina status bar
target.PushTranslation(273, 572) target.PushTranslation(273, 572)
target.PushCompositeMode(d2render.CompositeModeLighter) target.PushCompositeMode(d2interface.CompositeModeLighter)
staminaPercent := float64(g.hero.Stats.Stamina) / float64(g.hero.Stats.MaxStamina) staminaPercent := float64(g.hero.Stats.Stamina) / float64(g.hero.Stats.MaxStamina)
target.DrawRect(int(staminaPercent*staminaBarWidth), 19, color.RGBA{R: 175, G: 136, B: 72, A: 200}) target.DrawRect(int(staminaPercent*staminaBarWidth), 19, color.RGBA{R: 175, G: 136, B: 72, A: 200})
target.PopN(2) target.PopN(2)
@ -468,7 +468,7 @@ func (g *GameControls) Render(target d2render.Surface) {
manaPercent := float64(g.hero.Stats.Mana) / float64(g.hero.Stats.MaxMana) manaPercent := float64(g.hero.Stats.Mana) / float64(g.hero.Stats.MaxMana)
manaBarHeight := int(manaPercent * float64(globeHeight)) manaBarHeight := int(manaPercent * float64(globeHeight))
if manaPercent != g.lastManaPercent { if manaPercent != g.lastManaPercent {
g.manaStatusBar, _ = d2render.NewSurface(globeWidth, manaBarHeight, d2render.FilterNearest) g.manaStatusBar, _ = d2render.NewSurface(globeWidth, manaBarHeight, d2interface.FilterNearest)
g.hpManaStatusSprite.SetCurrentFrame(1) g.hpManaStatusSprite.SetCurrentFrame(1)
g.manaStatusBar.PushTranslation(0, manaBarHeight) g.manaStatusBar.PushTranslation(0, manaBarHeight)

View File

@ -3,6 +3,8 @@ package d2player
import ( import (
"strconv" "strconv"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
@ -72,7 +74,7 @@ type HeroStatsPanel struct {
heroState *d2hero.HeroStatsState heroState *d2hero.HeroStatsState
heroName string heroName string
heroClass d2enum.Hero heroClass d2enum.Hero
staticMenuImageCache *d2render.Surface staticMenuImageCache *d2interface.Surface
labels *StatsPanelLabels labels *StatsPanelLabels
originX int originX int
@ -88,7 +90,7 @@ func NewHeroStatsPanel(heroName string, heroClass d2enum.Hero, heroState d2hero.
originX: originX, originX: originX,
originY: originY, originY: originY,
heroState: &heroState, heroState: &heroState,
heroName: heroName, heroName: heroName,
heroClass: heroClass, heroClass: heroClass,
labels: &StatsPanelLabels{}, labels: &StatsPanelLabels{},
} }
@ -118,7 +120,7 @@ func (s *HeroStatsPanel) Close() {
s.isOpen = false s.isOpen = false
} }
func (s *HeroStatsPanel) Render(target d2render.Surface) { func (s *HeroStatsPanel) Render(target d2interface.Surface) {
if !s.isOpen { if !s.isOpen {
return return
} }
@ -126,7 +128,7 @@ func (s *HeroStatsPanel) Render(target d2render.Surface) {
if s.staticMenuImageCache == nil { if s.staticMenuImageCache == nil {
frameWidth, frameHeight := s.frame.GetFrameBounds() frameWidth, frameHeight := s.frame.GetFrameBounds()
framesCount := s.frame.GetFrameCount() framesCount := s.frame.GetFrameCount()
surface, err := d2render.NewSurface(frameWidth*framesCount, frameHeight*framesCount, d2render.FilterNearest) surface, err := d2render.NewSurface(frameWidth*framesCount, frameHeight*framesCount, d2interface.FilterNearest)
if err != nil { if err != nil {
return return
@ -138,7 +140,7 @@ func (s *HeroStatsPanel) Render(target d2render.Surface) {
s.renderStatValues(target) s.renderStatValues(target)
} }
func (s *HeroStatsPanel) renderStaticMenu(target d2render.Surface) { func (s *HeroStatsPanel) renderStaticMenu(target d2interface.Surface) {
x, y := s.originX, s.originY x, y := s.originX, s.originY
// Frame // Frame
@ -226,7 +228,7 @@ func (s *HeroStatsPanel) initStatValueLabels() {
s.labels.Experience = s.createStatValueLabel(s.heroState.Experience, 200, 110) s.labels.Experience = s.createStatValueLabel(s.heroState.Experience, 200, 110)
s.labels.NextLevelExp = s.createStatValueLabel(s.heroState.NextLevelExp, 330, 110) s.labels.NextLevelExp = s.createStatValueLabel(s.heroState.NextLevelExp, 330, 110)
s.labels.Strength = s.createStatValueLabel(s.heroState.Strength, 175, 147) s.labels.Strength = s.createStatValueLabel(s.heroState.Strength, 175, 147)
s.labels.Dexterity = s.createStatValueLabel(s.heroState.Dexterity, 175, 207) s.labels.Dexterity = s.createStatValueLabel(s.heroState.Dexterity, 175, 207)
s.labels.Vitality = s.createStatValueLabel(s.heroState.Vitality, 175, 295) s.labels.Vitality = s.createStatValueLabel(s.heroState.Vitality, 175, 295)
s.labels.Energy = s.createStatValueLabel(s.heroState.Energy, 175, 355) s.labels.Energy = s.createStatValueLabel(s.heroState.Energy, 175, 355)
@ -241,7 +243,7 @@ func (s *HeroStatsPanel) initStatValueLabels() {
s.labels.Mana = s.createStatValueLabel(s.heroState.Mana, 370, 355) s.labels.Mana = s.createStatValueLabel(s.heroState.Mana, 370, 355)
} }
func (s *HeroStatsPanel) renderStatValues(target d2render.Surface) { func (s *HeroStatsPanel) renderStatValues(target d2interface.Surface) {
s.renderStatValueNum(s.labels.Level, s.heroState.Level, target) s.renderStatValueNum(s.labels.Level, s.heroState.Level, target)
s.renderStatValueNum(s.labels.Experience, s.heroState.Experience, target) s.renderStatValueNum(s.labels.Experience, s.heroState.Experience, target)
s.renderStatValueNum(s.labels.NextLevelExp, s.heroState.NextLevelExp, target) s.renderStatValueNum(s.labels.NextLevelExp, s.heroState.NextLevelExp, target)
@ -261,7 +263,7 @@ func (s *HeroStatsPanel) renderStatValues(target d2render.Surface) {
s.renderStatValueNum(s.labels.Mana, s.heroState.Mana, target) s.renderStatValueNum(s.labels.Mana, s.heroState.Mana, target)
} }
func (s *HeroStatsPanel) renderStatValueNum(label d2ui.Label, value int, target d2render.Surface) { func (s *HeroStatsPanel) renderStatValueNum(label d2ui.Label, value int, target d2interface.Surface) {
label.SetText(strconv.Itoa(value)) label.SetText(strconv.Itoa(value))
label.Render(target) label.Render(target)
} }

View File

@ -2,10 +2,10 @@ package d2player
import ( import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2inventory"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
) )
@ -72,7 +72,7 @@ func (g *Inventory) Load() {
g.grid.Add(items...) g.grid.Add(items...)
} }
func (g *Inventory) Render(target d2render.Surface) { func (g *Inventory) Render(target d2interface.Surface) {
if !g.isOpen { if !g.isOpen {
return return
} }

View File

@ -3,11 +3,12 @@ package d2player
import ( import (
"errors" "errors"
"fmt" "fmt"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"log" "log"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
@ -199,7 +200,7 @@ func (g *ItemGrid) Remove(item InventoryItem) {
g.items = g.items[:n] g.items = g.items[:n]
} }
func (g *ItemGrid) renderItem(item InventoryItem, target d2render.Surface, x int, y int) { func (g *ItemGrid) renderItem(item InventoryItem, target d2interface.Surface, x int, y int) {
itemSprite := g.sprites[item.GetItemCode()] itemSprite := g.sprites[item.GetItemCode()]
if itemSprite != nil { if itemSprite != nil {
itemSprite.SetPosition(x, y) itemSprite.SetPosition(x, y)
@ -208,12 +209,12 @@ func (g *ItemGrid) renderItem(item InventoryItem, target d2render.Surface, x int
} }
} }
func (g *ItemGrid) Render(target d2render.Surface) { func (g *ItemGrid) Render(target d2interface.Surface) {
g.renderInventoryItems(target) g.renderInventoryItems(target)
g.renderEquippedItems(target) g.renderEquippedItems(target)
} }
func (g *ItemGrid) renderInventoryItems(target d2render.Surface) { func (g *ItemGrid) renderInventoryItems(target d2interface.Surface) {
for _, item := range g.items { for _, item := range g.items {
itemSprite := g.sprites[item.GetItemCode()] itemSprite := g.sprites[item.GetItemCode()]
slotX, slotY := g.SlotToScreen(item.InventoryGridSlot()) slotX, slotY := g.SlotToScreen(item.InventoryGridSlot())
@ -223,7 +224,7 @@ func (g *ItemGrid) renderInventoryItems(target d2render.Surface) {
} }
} }
func (g *ItemGrid) renderEquippedItems(target d2render.Surface) { func (g *ItemGrid) renderEquippedItems(target d2interface.Surface) {
for _, eq := range g.equipmentSlots { for _, eq := range g.equipmentSlots {
if eq.item != nil { if eq.item != nil {
itemSprite := g.sprites[eq.item.GetItemCode()] itemSprite := g.sprites[eq.item.GetItemCode()]

17
main.go
View File

@ -4,7 +4,6 @@ import (
"bytes" "bytes"
"errors" "errors"
"fmt" "fmt"
ebiten_input "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input/ebiten"
"image" "image"
"image/gif" "image/gif"
"image/png" "image/png"
@ -16,6 +15,8 @@ import (
"strings" "strings"
"sync" "sync"
ebiten_input "github.com/OpenDiablo2/OpenDiablo2/d2core/d2input/ebiten"
ebiten2 "github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio/ebiten" ebiten2 "github.com/OpenDiablo2/OpenDiablo2/d2core/d2audio/ebiten"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
@ -83,7 +84,6 @@ func main() {
panic(err) panic(err)
} }
d2input.Initialize(ebiten_input.InputService{}) // TODO d2input singleton must be init before d2term d2input.Initialize(ebiten_input.InputService{}) // TODO d2input singleton must be init before d2term
term, err := d2term.Initialize() term, err := d2term.Initialize()
terminal_hack = term // needs to be used in advance, no easy way for that right now terminal_hack = term // needs to be used in advance, no easy way for that right now
@ -136,7 +136,6 @@ func initialize(audioProvider d2interface.AudioProvider, term d2interface.Termin
} }
d2render.SetWindowIcon("d2logo.png") d2render.SetWindowIcon("d2logo.png")
term.BindLogger() term.BindLogger()
term.BindAction("dumpheap", "dumps the heap to pprof/heap.pprof", func() { term.BindAction("dumpheap", "dumps the heap to pprof/heap.pprof", func() {
os.Mkdir("./pprof/", 0755) os.Mkdir("./pprof/", 0755)
@ -213,7 +212,7 @@ func initialize(audioProvider d2interface.AudioProvider, term d2interface.Termin
return nil return nil
} }
func run(updateFunc func(d2render.Surface) error) { func run(updateFunc func(d2interface.Surface) error) {
if len(GitBranch) == 0 { if len(GitBranch) == 0 {
GitBranch = "Local Build" GitBranch = "Local Build"
} }
@ -224,7 +223,7 @@ func run(updateFunc func(d2render.Surface) error) {
} }
} }
func update(target d2render.Surface) error { func update(target d2interface.Surface) error {
currentTime := d2common.Now() currentTime := d2common.Now()
elapsedTime := (currentTime - singleton.lastTime) * singleton.timeScale elapsedTime := (currentTime - singleton.lastTime) * singleton.timeScale
singleton.lastTime = currentTime singleton.lastTime = currentTime
@ -244,7 +243,7 @@ func update(target d2render.Surface) error {
return nil return nil
} }
func updateInitError(target d2render.Surface) error { func updateInitError(target d2interface.Surface) error {
width, height := target.GetSize() width, height := target.GetSize()
target.PushTranslation(width/5, height/2) target.PushTranslation(width/5, height/2)
target.DrawText("Could not find the MPQ files in the directory: %s\nPlease put the files and re-run the game.", d2config.Get().MpqPath) target.DrawText("Could not find the MPQ files in the directory: %s\nPlease put the files and re-run the game.", d2config.Get().MpqPath)
@ -280,7 +279,7 @@ func advance(elapsed, current float64) error {
return nil return nil
} }
func render(target d2render.Surface) error { func render(target d2interface.Surface) error {
if err := d2screen.Render(target); err != nil { if err := d2screen.Render(target); err != nil {
return err return err
} }
@ -306,7 +305,7 @@ func render(target d2render.Surface) error {
return nil return nil
} }
func renderCapture(target d2render.Surface) error { func renderCapture(target d2interface.Surface) error {
cleanupCapture := func() { cleanupCapture := func() {
singleton.captureState = captureStateNone singleton.captureState = captureStateNone
singleton.capturePath = "" singleton.capturePath = ""
@ -386,7 +385,7 @@ func renderCapture(target d2render.Surface) error {
return nil return nil
} }
func renderDebug(target d2render.Surface) error { func renderDebug(target d2interface.Surface) error {
if singleton.showFPS { if singleton.showFPS {
vsyncEnabled := d2render.GetVSyncEnabled() vsyncEnabled := d2render.GetVSyncEnabled()
fps := d2render.CurrentFPS() fps := d2render.CurrentFPS()