Просмотр исходного кода

upgrade `drawable`, refactoring `scene_loader` :eyes::heart:

Ethosa 3 лет назад
Родитель
Сommit
c6e59e4298

+ 5 - 0
src/nodesnim/core/color.nim

@@ -1,5 +1,6 @@
 # author: Ethosa
 import
+  ../thirdparty/opengl,
   strutils,
   re
 
@@ -201,6 +202,10 @@ proc lerp*(self, other: ColorRef, lerpv: float): uint32 =
   lerp(r1, g1, b1, a1, r2, g2, b2, a2, lerpv)
 
 
+proc glColor*(clr: ColorRef) =
+  glColor4f(clr.r, clr.g, clr.b, clr.a)
+
+
 # --- Operators --- #
 proc `$`*(color: ColorRef): string =
   "Color(" & $color.r & ", " & $color.g & ", " & $color.b & ", " & $color.a & ")"

+ 15 - 8
src/nodesnim/graphics/drawable.nim

@@ -21,11 +21,14 @@ type
     border_radius*: array[4, float]  ## left-top, right-top, right-bottom, left-bottom
     shadow_offset*: Vector2Obj
     border_color*: ColorRef
+    shadow_color*: ColorRef
     background_color*: ColorRef
     texture*: GlTextureObj
   DrawableRef* = ref DrawableObj
 
 
+let standard_shadow_color: ColorRef = Color(0f, 0f, 0f, 0.5f)
+
 template drawablepattern*(`type`: untyped): untyped =
   result = `type`(
     texture: GlTextureObj(), border_width: 0,
@@ -33,14 +36,13 @@ template drawablepattern*(`type`: untyped): untyped =
     border_radius: [0.float, 0, 0, 0],
     border_color: Color(0, 0, 0, 0),
     background_color: Color(0, 0, 0, 0),
-    shadow_offset: Vector2(0, 0), shadow: false
+    shadow_offset: Vector2(0, 0), shadow: false,
+    shadow_color: standard_shadow_color
   )
 
 proc Drawable*: DrawableRef =
   drawablepattern(DrawableRef)
 
-let shadow_color: ColorRef = Color(0f, 0f, 0f, 0.5f)
-
 
 template vd* =
   ## void template
@@ -76,7 +78,7 @@ template recalc*(shadow: bool = false) =
                          Vector2(0, 0), Vector2(self.border_radius[0], 0)):
       glColor4f(0, 0, 0, 0)
       glVertex2f(x + i.x + self.shadow_offset.x, y + i.y - self.shadow_offset.y)
-      glColor4f(shadow_color.r, shadow_color.g, shadow_color.b, shadow_color.a)
+      glColor(self.shadow_color)
       glVertex2f(x + i.x, y + i.y)
 
     # right top
@@ -84,7 +86,7 @@ template recalc*(shadow: bool = false) =
                          Vector2(0, 0), Vector2(0, -self.border_radius[1])):
       glColor4f(0, 0, 0, 0)
       glVertex2f(xw + i.x + self.shadow_offset.x, y + i.y - self.shadow_offset.y)
-      glColor4f(shadow_color.r, shadow_color.g, shadow_color.b, shadow_color.a)
+      glColor(self.shadow_color)
       glVertex2f(xw + i.x, y + i.y)
 
     # right bottom
@@ -92,7 +94,7 @@ template recalc*(shadow: bool = false) =
                          Vector2(0, 0), Vector2(-self.border_radius[2], 0)):
       glColor4f(0, 0, 0, 0)
       glVertex2f(xw + i.x + self.shadow_offset.x, yh - i.y - self.shadow_offset.y)
-      glColor4f(shadow_color.r, shadow_color.g, shadow_color.b, shadow_color.a)
+      glColor(self.shadow_color)
       glVertex2f(xw + i.x, yh - i.y)
 
     # left bottom
@@ -100,12 +102,12 @@ template recalc*(shadow: bool = false) =
                          Vector2(0, 0), Vector2(0, self.border_radius[3])):
       glColor4f(0, 0, 0, 0)
       glVertex2f(x + i.x + self.shadow_offset.x, yh + i.y - self.shadow_offset.y)
-      glColor4f(shadow_color.r, shadow_color.g, shadow_color.b, shadow_color.a)
+      glColor(self.shadow_color)
       glVertex2f(x + i.x, yh + i.y)
 
     glColor4f(0, 0, 0, 0)
     glVertex2f(x + self.shadow_offset.x, y - self.border_radius[0] - self.shadow_offset.y)
-    glColor4f(shadow_color.r, shadow_color.g, shadow_color.b, shadow_color.a)
+    glColor(self.shadow_color)
     glVertex2f(x, y - self.border_radius[0])
     glEnd()
 
@@ -249,6 +251,9 @@ method setTexture*(self: DrawableRef, texture: GlTextureObj) {.base.} =
   self.texture = texture
   self.background_color = Color(1f, 1f, 1f, 1f)
 
+method setShadowColor*(self: DrawableRef, clr: ColorRef) {.base.} =
+  self.shadow_color = clr
+
 method setShadowOffset*(self: DrawableRef, offset: Vector2Obj) {.base.} =
   ## Changes shadow offset.
   self.shadow_offset = offset
@@ -336,5 +341,7 @@ method setStyle*(self: DrawableRef, s: StyleSheetRef) {.base.} =
         self.setShadowOffset(Vector2(parseFloat(tmp[0])))
       elif tmp.len() == 2:
         self.setShadowOffset(Vector2(parseFloat(tmp[0]), parseFloat(tmp[1])))
+    of "shadow-color":
+      self.setShadowColor(Color(i.value))
     else:
       discard

+ 4 - 4
src/nodesnim/graphics/gradient_drawable.nim

@@ -41,13 +41,13 @@ template draw_template*(drawtype, color, function, secondfunc: untyped, is_gradi
     for i in 0..vertex.high:
       let tmp = i/vertex.len()
       if tmp < 0.25:
-        glColor4f(self.corners[0].r, self.corners[0].g, self.corners[0].b, self.corners[0].a)
+        glColor(self.corners[0])
       elif tmp < 0.5:
-        glColor4f(self.corners[1].r, self.corners[1].g, self.corners[1].b, self.corners[1].a)
+        glColor(self.corners[1])
       elif tmp < 0.75:
-        glColor4f(self.corners[2].r, self.corners[2].g, self.corners[2].b, self.corners[2].a)
+        glColor(self.corners[2])
       else:
-        glColor4f(self.corners[3].r, self.corners[3].g, self.corners[3].b, self.corners[3].a)
+        glColor(self.corners[3])
       glVertex2f(vertex[i].x, vertex[i].y)
   else:
     for i in vertex:

+ 1 - 1
src/nodesnim/nodes2d/sprite.nim

@@ -63,7 +63,7 @@ method draw*(self: SpriteRef, w, h: GLfloat) =
       glTranslatef(x, y, self.z_index_global)
       self.position = Vector2()
     glRotatef(self.rotation, 0, 0, 1)
-    glColor4f(self.filter.r, self.filter.g, self.filter.b, self.filter.a)
+    glColor(self.filter)
 
     glEnable(GL_TEXTURE_2D)
     glEnable(GL_DEPTH_TEST)

+ 1 - 1
src/nodesnim/nodes2d/tilemap.nim

@@ -17,7 +17,7 @@ type
     map_size*: tuple[x, y, z: int]
     tileset*: TileSetObj
     map*: seq[ref Vector2Obj]
-  TileMapRef = ref TileMapObj
+  TileMapRef* = ref TileMapObj
 
 
 proc TileMap*(name: string = "TileMap"): TileMapRef =

+ 1 - 1
src/nodesnim/nodes3d/geometry_instance.nim

@@ -50,7 +50,7 @@ method draw*(self: GeometryInstanceRef, w, h: Glfloat) =
   glRotatef(self.global_rotation.y, 0, 1, 0)
   glRotatef(self.global_rotation.z, 0, 0, 1)
   glScalef(self.scale.x, self.scale.y, self.scale.z)
-  glColor4f(self.color.r, self.color.g, self.color.b, self.color.a)
+  glColor(self.color)
   glEnable(GL_DEPTH_TEST)
 
   case self.geometry

+ 1 - 1
src/nodesnim/nodes3d/sprite3d.nim

@@ -51,7 +51,7 @@ method draw*(self: Sprite3DRef, w, h: GLfloat) =
     glRotatef(self.global_rotation.y, 0, 1, 0)
     glRotatef(self.global_rotation.z, 0, 0, 1)
     glScalef(self.scale.x, self.scale.y, self.scale.z)
-    glColor4f(self.filter.r, self.filter.g, self.filter.b, self.filter.a)
+    glColor(self.filter)
 
     glEnable(GL_TEXTURE_2D)
     glEnable(GL_DEPTH_TEST)

+ 1 - 1
src/nodesnim/nodescontrol/color_rect.nim

@@ -43,7 +43,7 @@ method draw*(self: ColorRectRef, w, h: GLfloat) =
     y = h/2 - self.global_position.y
 
   if self.background.getColor().a == 0.0:
-    glColor4f(self.color.r, self.color.g, self.color.b, self.color.a)
+    glColor(self.color)
     glRectf(x, y, x + self.rect_size.x, y - self.rect_size.y)
   else:
     self.background.draw(x, y, self.rect_size.x, self.rect_size.y)

+ 3 - 3
src/nodesnim/nodescontrol/progress_bar.nim

@@ -61,7 +61,7 @@ method draw*(self: ProgressBarRef, w, h: GLfloat) =
   case self.progress_type
   of PROGRESS_BAR_HORIZONTAL:
     procCall self.ControlRef.draw(w, h)
-    glColor4f(self.progress_color.r, self.progress_color.g, self.progress_color.b, self.progress_color.a)
+    glColor(self.progress_color)
     let progress_width = progress_percent * self.rect_size.x
     if self.indeterminate:
       if self.indeterminate_val - progress_width < self.rect_size.x:
@@ -76,7 +76,7 @@ method draw*(self: ProgressBarRef, w, h: GLfloat) =
 
   of PROGRESS_BAR_VERTICAL:
     procCall self.ControlRef.draw(w, h)
-    glColor4f(self.progress_color.r, self.progress_color.g, self.progress_color.b, self.progress_color.a)
+    glColor(self.progress_color)
     let progress_width = progress_percent * self.rect_size.y
     if self.indeterminate:
       if self.indeterminate_val - progress_width < self.rect_size.y:
@@ -98,7 +98,7 @@ method draw*(self: ProgressBarRef, w, h: GLfloat) =
       orad = min(self.rect_size.x, self.rect_size.y) / 2
       irad = (min(self.rect_size.x, self.rect_size.y) / 2) - 5f
     # background:
-    glColor4f(self.background.getColor().r, self.background.getColor().g, self.background.getColor().b, self.background.getColor().a)
+    glColor(self.background.getColor())
     glBegin(GL_TRIANGLE_STRIP)
     for i in 0..90:
       let angle = TAU * (i/90)

+ 2 - 2
src/nodesnim/nodescontrol/slider.nim

@@ -62,7 +62,7 @@ method draw*(self: SliderRef, w, h: GLfloat) =
   case self.slider_type
   of SLIDER_HORIZONTAL:
     let progress = self.rect_size.x * (self.value.float / self.max_value.float)
-    glColor4f(self.progress_color.r, self.progress_color.g, self.progress_color.b, self.progress_color.a)
+    glColor(self.progress_color)
     glRectf(x, y, x + progress, y - self.rect_size.y)
 
     # Thumb
@@ -70,7 +70,7 @@ method draw*(self: SliderRef, w, h: GLfloat) =
 
   of SLIDER_VERTICAL:
     let progress = self.rect_size.y * (self.value.float / self.max_value.float)
-    glColor4f(self.progress_color.r, self.progress_color.g, self.progress_color.b, self.progress_color.a)
+    glColor(self.progress_color)
     glRectf(x, y - self.rect_size.y + progress, x + self.rect_size.x, y - self.rect_size.y)
 
     # Thumb

+ 1 - 0
src/nodesnim/nodescontrol/subwindow.nim

@@ -103,6 +103,7 @@ method draw*(self: SubWindowRef, w, h: GLfloat) =
   self.title.draw(w, h)
 
   if self.icon.texture > 0'u32:
+    glColor4f(1, 1, 1, 1)
     glEnable(GL_TEXTURE_2D)
     glBindTexture(GL_TEXTURE_2D, self.icon.texture)
     glBegin(GL_QUADS)

+ 2 - 2
src/nodesnim/nodescontrol/switch.nim

@@ -53,10 +53,10 @@ method draw*(self: SwitchRef, w, h: GLfloat) =
     color = if self.value: self.color_enable else: self.color_disable
     back = if self.value: self.back_enable else: self.back_disable
 
-  glColor4f(back.r, back.g, back.b, back.a)
+  glColor(back)
   glRectf(x, y, x+self.rect_size.x, y-self.rect_size.y)
 
-  glColor4f(color.r, color.g, color.b, color.a)
+  glColor(color)
   if self.value:
     glRectf(x + self.rect_size.x - 10, y, x + self.rect_size.x, y-self.rect_size.y)
   else:

+ 1 - 1
src/nodesnim/nodescontrol/texture_rect.nim

@@ -53,7 +53,7 @@ method draw*(self: TextureRectRef, w, h: GLfloat) =
     y = h/2 - self.global_position.y
 
   self.background.draw(x, y, self.rect_size.x, self.rect_size.y)
-  glColor4f(self.texture_filter.r, self.texture_filter.g, self.texture_filter.b, self.texture_filter.a)
+  glColor(self.texture_filter)
 
   if self.texture > 0'u32:
     glEnable(GL_TEXTURE_2D)

+ 3 - 0
src/nodesnim/nodescontrol/tooltip.nim

@@ -58,6 +58,9 @@ method showAt*(self: ToolTipRef, x, y: float) {.base.} =
   self.show()
 
 method showAtMouse*(self: ToolTipRef) {.base.} =
+  ## Shows ToolTip at mouse position.
+  ##
+  ## See also `showAt method <#showAt.e,ToolTipRef,float,float>`_
   let
     pos = self.getGlobalMousePosition()
     textsize = self.text.getTextSize()

+ 25 - 25
src/nodesnim/runtime/scene_loader.nim

@@ -15,31 +15,6 @@ import
   macros
 
 
-var parsable = {
-  # default
-  "Node": Node, "Scene": Scene, "AudioStreamPlayer": AudioStreamPlayer,
-  "AnimationPlayer": AnimationPlayer,
-  # control
-  "Control": Control, "Box": Box, "VBox": VBox, "HBox": HBox,
-  "ColorRect": ColorRect, "Label": Label,"Button": Button, 
-  "EditText": proc(name: string = "EditText"): EditTextRef = EditText(name, "Edit text ..."),
-  "TextureButton": TextureButton, "TextureRect": TextureRect,
-  "TextureProgressBar": TextureProgressBar, "Switch": Switch,
-  "ToolTip": proc(name: string = "ToolTip"): ToolTipRef = ToolTip(name, "ToolTip"),
-  "SubWindow": SubWindow, "Scroll": Scroll, "ProgressBar": ProgressBar, "Slider": Slider,
-  "Popup": Popup, "Counter": Counter,
-  # 2D
-  "Node2D": Node2D, "Sprite": Sprite, "Sprite2D", "CollisionShape2D": CollisionShape2D,
-  "KinematicBody2D": KinematicBody2D, "TileMap": TileMap, "Camera2D": Camera2D,
-  "YSort": YSort,
-  # 3D
-  "Node3D": Node3D, "Sprite3D": Sprite3D, "Camera3D": Camera3D,
-  "GeometryInstance": proc(name: string = "GeometryInstance"): GeometryInstanceRef =
-                      GeometryInstance(name, GEOMETRY_CUBE)
-}.toTable()
-
-
-var properties = initTable[system.string, proc (node: NodeRef, value: string)]()
 macro `!`(props, fn, code: untyped): untyped =
   let
     node = ident("node")
@@ -49,6 +24,31 @@ macro `!`(props, fn, code: untyped): untyped =
       proc(`node`: NodeRef, `value`: string) =
         `code`
 
+macro mkparse*(nodes: varargs[untyped]): untyped =
+  result = newStmtList()
+  for node in nodes:
+    if node.kind in [nnkIdent, nnkStrLit]:
+      let
+        name = ident($node)
+        strname = $node
+        refname = ident(strname & "Ref")
+      result.add:
+        quote do:
+          parsable[`strname`] = proc(name: string = `strname`): `refname` = `name`(`strname`)
+
+
+var
+  parsable = initTable[system.string, proc (name: string): NodeRef]()
+  properties = initTable[system.string, proc (node: NodeRef, value: string)]()
+
+mkparse(Node, Scene, AudioStreamPlayer, AnimationPlayer)
+mkparse(Control, Box, VBox, HBox, ColorRect, Label, SubWindow, ToolTip,
+        Button, EditText, TextureButton, TextureRect, GridBox,
+        Slider, Switch, Popup, Scroll, Counter, ProgressBar, TextureProgressBar)
+mkparse(Node2D, Sprite, AnimatedSprite, KinematicBody2D, CollisionShape2D, TileMap, Camera2D, YSort)
+mkparse(Node3D, Sprite3D, GeometryInstance)
+
+
 properties!"color":
   node.ColorRectRef.color = Color(value)