Skip to content

Commit 55654b7

Browse files
committed
Add layering controls to change limb part draw order in the output (Resolve #7)
1 parent f9b38d4 commit 55654b7

File tree

4 files changed

+110
-27
lines changed

4 files changed

+110
-27
lines changed

Bender.bmx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ Repeat
8080
'Indexed Filetype
8181
Case g_UserInterface.m_SettingsIndexedFileTypeComboBox
8282
g_FileIO.SetIndexedFileType(GadgetText(g_UserInterface.m_SettingsIndexedFileTypeComboBox))
83+
'Layering Controls
84+
Case g_UserInterface.m_LayeringArmFGCheckbox, g_UserInterface.m_LayeringArmBGCheckbox, g_UserInterface.m_LayeringLegFGCheckbox, g_UserInterface.m_LayeringLegBGCheckbox
85+
g_GraphicsOutput.SetBentLimbPartDrawOrder(g_UserInterface.SetLayerCheckboxLabels(g_UserInterface.GetLayerCheckboxValues()))
8386
EndSelect
8487
Case EVENT_WINDOWCLOSE, EVENT_APPTERMINATE
8588
If Confirm("Quit program?") Then End

Types/GraphicsOutput.bmx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Type GraphicsOutput
1616
Field m_TileSize:Int = 24 * m_InputZoom
1717
Field m_FrameCount:Int = g_DefaultFrameCount
1818
Field m_BackgroundColor:Int[] = [g_DefaultBackgroundRed, g_DefaultBackgroundGreen, g_DefaultBackgroundBlue]
19+
Field m_BentLimbPartDrawOrder:Int[c_LimbCount, 1]
1920

2021
Field m_DrawOutputFrameBounds:Int = False
2122
Field m_FrameBoundingBoxPosX:Int[c_LimbCount, c_MaxFrameCount]
@@ -110,6 +111,12 @@ Type GraphicsOutput
110111
m_DrawOutputFrameBounds = drawOrNot
111112
EndMethod
112113

114+
'////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
115+
116+
Method SetBentLimbPartDrawOrder(drawOrder:Int[,])
117+
m_BentLimbPartDrawOrder = drawOrder
118+
EndMethod
119+
113120
'////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
114121

115122
Method GrabOutputForSaving:TPixmap()
@@ -184,7 +191,7 @@ Type GraphicsOutput
184191
Cls()
185192

186193
Local vertOffsetFromSource:Int = (m_SourceImageSize[1] * m_InputZoom) + 34
187-
m_LimbManager.DrawBentLimbs(New SVec2I(100, vertOffsetFromSource), m_FrameCount)
194+
m_LimbManager.DrawBentLimbs(New SVec2I(100, vertOffsetFromSource), m_FrameCount, m_BentLimbPartDrawOrder)
188195

189196
SetColor(m_Magenta[0], m_Magenta[1], m_Magenta[2])
190197
DrawRect(0, 0, GraphicsWidth(), (m_SourceImageSize[1] * m_InputZoom) + 1) 'Extend the source image magenta strip all the way to the right and adjust height to input zoom

Types/LimbManager.bmx

Lines changed: 45 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -152,38 +152,57 @@ Type LimbManager
152152

153153
'////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
154154

155-
Method DrawBentLimbs(drawPos:SVec2I, frameCount:Int)
155+
Method DrawBentLimbs(drawPos:SVec2I, frameCount:Int, drawOrder:Int[,])
156156
BendLimbs(frameCount)
157157
For Local frame:Int = 0 Until frameCount
158-
'These might be in a specific draw-order for joint overlapping purposes
159158
'Arm FG
160-
Local limbPart:Int = 0
161-
SetRotation(m_LimbPartAngle[limbPart, frame])
162-
DrawImageRect(m_LimbPartImage[limbPart], m_LimbPartPosX[limbPart, frame] + drawPos[0], m_LimbPartPosY[limbPart, frame] + drawPos[1], m_LimbPartImage[limbPart].Width / m_InputZoom, m_LimbPartImage[limbPart].Height / m_InputZoom)
163-
limbPart = 1
164-
SetRotation(m_LimbPartAngle[limbPart, frame])
165-
DrawImageRect(m_LimbPartImage[limbPart], m_LimbPartPosX[limbPart, frame] + drawPos[0], m_LimbPartPosY[limbPart, frame] + drawPos[1], m_LimbPartImage[limbPart].Width / m_InputZoom, m_LimbPartImage[limbPart].Height / m_InputZoom)
159+
If drawOrder[0, 0] = False Then
160+
For Local limbPart:Int = 0 To 1
161+
SetRotation(m_LimbPartAngle[limbPart, frame])
162+
DrawImageRect(m_LimbPartImage[limbPart], m_LimbPartPosX[limbPart, frame] + drawPos[0], m_LimbPartPosY[limbPart, frame] + drawPos[1], m_LimbPartImage[limbPart].Width / m_InputZoom, m_LimbPartImage[limbPart].Height / m_InputZoom)
163+
Next
164+
Else
165+
For Local limbPart = 1 To 0 Step -1
166+
SetRotation(m_LimbPartAngle[limbPart, frame])
167+
DrawImageRect(m_LimbPartImage[limbPart], m_LimbPartPosX[limbPart, frame] + drawPos[0], m_LimbPartPosY[limbPart, frame] + drawPos[1], m_LimbPartImage[limbPart].Width / m_InputZoom, m_LimbPartImage[limbPart].Height / m_InputZoom)
168+
Next
169+
EndIf
166170
'Arm BG
167-
limbPart = 2
168-
SetRotation(m_LimbPartAngle[limbPart, frame])
169-
DrawImageRect(m_LimbPartImage[limbPart], m_LimbPartPosX[limbPart, frame] + drawPos[0], m_LimbPartPosY[limbPart, frame] + drawPos[1], m_LimbPartImage[limbPart].Width / m_InputZoom, m_LimbPartImage[limbPart].Height / m_InputZoom)
170-
limbPart = 3
171-
SetRotation(m_LimbPartAngle[limbPart, frame])
172-
DrawImageRect(m_LimbPartImage[limbPart], m_LimbPartPosX[limbPart, frame] + drawPos[0], m_LimbPartPosY[limbPart, frame] + drawPos[1], m_LimbPartImage[limbPart].Width / m_InputZoom, m_LimbPartImage[limbPart].Height / m_InputZoom)
171+
If drawOrder[1, 0] = False Then
172+
For Local limbPart:Int = 2 To 3
173+
SetRotation(m_LimbPartAngle[limbPart, frame])
174+
DrawImageRect(m_LimbPartImage[limbPart], m_LimbPartPosX[limbPart, frame] + drawPos[0], m_LimbPartPosY[limbPart, frame] + drawPos[1], m_LimbPartImage[limbPart].Width / m_InputZoom, m_LimbPartImage[limbPart].Height / m_InputZoom)
175+
Next
176+
Else
177+
For Local limbPart = 3 To 2 Step -1
178+
SetRotation(m_LimbPartAngle[limbPart, frame])
179+
DrawImageRect(m_LimbPartImage[limbPart], m_LimbPartPosX[limbPart, frame] + drawPos[0], m_LimbPartPosY[limbPart, frame] + drawPos[1], m_LimbPartImage[limbPart].Width / m_InputZoom, m_LimbPartImage[limbPart].Height / m_InputZoom)
180+
Next
181+
EndIf
173182
'Leg FG
174-
limbPart = 4
175-
SetRotation(m_LimbPartAngle[limbPart, frame])
176-
DrawImageRect(m_LimbPartImage[limbPart], m_LimbPartPosX[limbPart, frame] + drawPos[0], m_LimbPartPosY[limbPart, frame] + drawPos[1], m_LimbPartImage[limbPart].Width / m_InputZoom, m_LimbPartImage[limbPart].Height / m_InputZoom)
177-
limbPart = 5
178-
SetRotation(m_LimbPartAngle[limbPart, frame])
179-
DrawImageRect(m_LimbPartImage[limbPart], m_LimbPartPosX[limbPart, frame] + drawPos[0], m_LimbPartPosY[limbPart, frame] + drawPos[1], m_LimbPartImage[limbPart].Width / m_InputZoom, m_LimbPartImage[limbPart].Height / m_InputZoom)
183+
If drawOrder[2, 0] = False Then
184+
For Local limbPart:Int = 4 To 5
185+
SetRotation(m_LimbPartAngle[limbPart, frame])
186+
DrawImageRect(m_LimbPartImage[limbPart], m_LimbPartPosX[limbPart, frame] + drawPos[0], m_LimbPartPosY[limbPart, frame] + drawPos[1], m_LimbPartImage[limbPart].Width / m_InputZoom, m_LimbPartImage[limbPart].Height / m_InputZoom)
187+
Next
188+
Else
189+
For Local limbPart = 5 To 4 Step -1
190+
SetRotation(m_LimbPartAngle[limbPart, frame])
191+
DrawImageRect(m_LimbPartImage[limbPart], m_LimbPartPosX[limbPart, frame] + drawPos[0], m_LimbPartPosY[limbPart, frame] + drawPos[1], m_LimbPartImage[limbPart].Width / m_InputZoom, m_LimbPartImage[limbPart].Height / m_InputZoom)
192+
Next
193+
EndIf
180194
'Leg BG
181-
limbPart = 6
182-
SetRotation(m_LimbPartAngle[limbPart, frame])
183-
DrawImageRect(m_LimbPartImage[limbPart], m_LimbPartPosX[limbPart, frame] + drawPos[0], m_LimbPartPosY[limbPart, frame] + drawPos[1], m_LimbPartImage[limbPart].Width / m_InputZoom, m_LimbPartImage[limbPart].Height / m_InputZoom)
184-
limbPart = 7
185-
SetRotation(m_LimbPartAngle[limbPart, frame])
186-
DrawImageRect(m_LimbPartImage[limbPart], m_LimbPartPosX[limbPart, frame] + drawPos[0], m_LimbPartPosY[limbPart, frame] + drawPos[1], m_LimbPartImage[limbPart].Width / m_InputZoom, m_LimbPartImage[limbPart].Height / m_InputZoom)
195+
If drawOrder[3, 0] = False Then
196+
For Local limbPart:Int = 6 To 7
197+
SetRotation(m_LimbPartAngle[limbPart, frame])
198+
DrawImageRect(m_LimbPartImage[limbPart], m_LimbPartPosX[limbPart, frame] + drawPos[0], m_LimbPartPosY[limbPart, frame] + drawPos[1], m_LimbPartImage[limbPart].Width / m_InputZoom, m_LimbPartImage[limbPart].Height / m_InputZoom)
199+
Next
200+
Else
201+
For Local limbPart = 7 To 6 Step -1
202+
SetRotation(m_LimbPartAngle[limbPart, frame])
203+
DrawImageRect(m_LimbPartImage[limbPart], m_LimbPartPosX[limbPart, frame] + drawPos[0], m_LimbPartPosY[limbPart, frame] + drawPos[1], m_LimbPartImage[limbPart].Width / m_InputZoom, m_LimbPartImage[limbPart].Height / m_InputZoom)
204+
Next
205+
EndIf
187206
Next
188207
SetRotation(0)
189208
EndMethod

Types/UserInterface.bmx

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,15 @@ Type UserInterface
5757
Field m_SettingsSaveAsFramesLabel:TGadget = Null
5858
Field m_SettingsSaveAsFramesCheckbox:TGadget = Null
5959

60+
Field m_LayeringPanel:TGadget = Null
61+
Field m_LayeringPanelAnchor:SVec2I = New SVec2I(10, m_ButtonPanelSize[1] + m_SettingsPanelSize[1] + 25)
62+
Field m_LayeringPanelSize:SVec2I = New SVec2I(m_CanvasGraphicsAnchor[0] - 20, 150)
63+
64+
Field m_LayeringArmFGCheckbox:TGadget = Null
65+
Field m_LayeringArmBGCheckbox:TGadget = Null
66+
Field m_LayeringLegFGCheckbox:TGadget = Null
67+
Field m_LayeringLegBGCheckbox:TGadget = Null
68+
6069
Field m_LogoImage:TPixmap = LoadPixmap("Incbin::Assets/Logo")
6170
Field m_LogoImagePanel:TGadget = Null
6271
Field m_LogoImagePanelAnchor:SVec2I = New SVec2I(0, m_LeftColumnSize[1] - m_LogoImage.Height)
@@ -130,6 +139,14 @@ Type UserInterface
130139
AddGadgetItem(m_SettingsIndexedFileTypeComboBox, "BMP", GADGETITEM_NORMAL)
131140
HideGadget(m_SettingsIndexedFileTypeComboBox)
132141

142+
m_LayeringPanel = CreatePanel(m_LayeringPanelAnchor[0], m_LayeringPanelAnchor[1], m_LayeringPanelSize[0], m_LayeringPanelSize[1], m_LeftColumn, PANEL_GROUP, " Layering Controls : ")
143+
SetGadgetLayout(m_LayeringPanel, m_LayeringPanelAnchor[0], m_LayeringPanelSize[0], m_LayeringPanelAnchor[1], m_LayeringPanelSize[1])
144+
145+
m_LayeringArmFGCheckbox = CreateButton(" Arm FG — Lower Arm on top", horizMargin, vertMargin, m_LayeringPanelSize[0] - 20, 20, m_LayeringPanel, BUTTON_CHECKBOX)
146+
m_LayeringArmBGCheckbox = CreateButton(" Arm BG — Lower Arm on top", horizMargin, GadgetY(m_LayeringArmFGCheckbox) + labelVertOffset, m_LayeringPanelSize[0] - 20, 20, m_LayeringPanel, BUTTON_CHECKBOX)
147+
m_LayeringLegFGCheckbox = CreateButton(" Leg FG — Lower Leg on top", horizMargin, GadgetY(m_LayeringArmBGCheckbox) + labelVertOffset, m_LayeringPanelSize[0] - 20, 20, m_LayeringPanel, BUTTON_CHECKBOX)
148+
m_LayeringLegBGCheckbox = CreateButton(" Leg BG — Lower Leg on top", horizMargin, GadgetY(m_LayeringLegFGCheckbox) + labelVertOffset, m_LayeringPanelSize[0] - 20, 20, m_LayeringPanel, BUTTON_CHECKBOX)
149+
133150
m_LogoImagePanel = CreatePanel(m_LogoImagePanelAnchor[0], m_LogoImagePanelAnchor[1], m_LogoImagePanelSize[0], m_LogoImagePanelSize[1], m_LeftColumn, Null)
134151
SetPanelPixmap(m_LogoImagePanel, m_LogoImage, PANELPIXMAP_CENTER)
135152
EndMethod
@@ -197,6 +214,43 @@ Type UserInterface
197214
SetGadgetText(m_SettingsZoomTextbox, newValue)
198215
EndMethod
199216

217+
'////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
218+
219+
Method GetLayerCheckboxValues:Int[,]()
220+
Local checkboxValues:Int[4, 1]
221+
checkboxValues[0, 0] = ButtonState(m_LayeringArmFGCheckbox)
222+
checkboxValues[1, 0] = ButtonState(m_LayeringArmBGCheckbox)
223+
checkboxValues[2, 0] = ButtonState(m_LayeringLegFGCheckbox)
224+
checkboxValues[3, 0] = ButtonState(m_LayeringLegBGCheckbox)
225+
Return checkboxValues
226+
EndMethod
227+
228+
'////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
229+
230+
Method SetLayerCheckboxLabels:Int[,](checkboxValues:Int[,])
231+
If checkboxValues[0, 0] = False Then
232+
SetGadgetText(m_LayeringArmFGCheckbox, " Arm FG — Lower Arm on top")
233+
Else
234+
SetGadgetText(m_LayeringArmFGCheckbox, " Arm FG — Upper Arm on top")
235+
EndIf
236+
If checkboxValues[1, 0] = False Then
237+
SetGadgetText(m_LayeringArmBGCheckbox, " Arm BG — Lower Arm on top")
238+
Else
239+
SetGadgetText(m_LayeringArmBGCheckbox, " Arm BG — Upper Arm on top")
240+
EndIf
241+
If checkboxValues[2, 0] = False Then
242+
SetGadgetText(m_LayeringLegFGCheckbox, " Leg FG — Lower Leg on top")
243+
Else
244+
SetGadgetText(m_LayeringLegFGCheckbox, " Leg FG — Upper Leg on top")
245+
EndIf
246+
If checkboxValues[3, 0] = False Then
247+
SetGadgetText(m_LayeringLegBGCheckbox, " Leg BG — Lower Leg on top")
248+
Else
249+
SetGadgetText(m_LayeringLegBGCheckbox, " Leg BG — Upper Leg on top")
250+
EndIf
251+
Return checkboxValues
252+
EndMethod
253+
200254
'////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
201255

202256
Method MoveGadget(gadgetToMove:TGadget, newPosX:Int, newPosY:Int)

0 commit comments

Comments
 (0)