Browse Source

add cylinder geometry instance, fix `input` :eyes:

Ethosa 3 years ago
parent
commit
afa997be87

+ 2 - 3
src/nodesnim/core/input.nim

@@ -155,10 +155,9 @@ proc isActionPressed*(name: string): bool =
       elif action.kind == TOUCH and last_event.kind == TOUCH:
         if press_state > 0:
           result = true
-      elif action.kind == KEYBOARD and last_event.kind == KEYBOARD:
+      elif action.kind == KEYBOARD:
         if action.key_int in pressed_keys_ints or action.key in pressed_keys:
-          if press_state > 0:
-            result = true
+          result = true
 
 proc isActionReleased*(name: string): bool =
   ## Returns true, when action no more active.

+ 0 - 2
src/nodesnim/graphics/gradient_drawable.nim

@@ -23,8 +23,6 @@ proc GradientDrawable*: GradientDrawableRef =
                     Color(1f, 1f, 1f, 1.0),
                     Color(1f, 1f, 1f, 1.0))
 
-let shadow_color: ColorRef = Color(0f, 0f, 0f, 0.5f)
-
 
 template draw_template*(drawtype, color, function, secondfunc: untyped, is_gradient: bool = true): untyped =
   ## Draws colorized vertexes

+ 22 - 0
src/nodesnim/nodes3d/geometry_instance.nim

@@ -17,9 +17,11 @@ import
 type
   GeometryType* {.pure.} = enum
     GEOMETRY_CUBE,
+    GEOMETRY_CYLINDER,
     GEOMETRY_SPHERE
   GeometryInstanceObj* = object of Node3DObj
     geometry*: GeometryType
+    sides*: int
     color*: ColorRef
     radius*: float
   GeometryInstanceRef* = ref GeometryInstanceObj
@@ -35,6 +37,7 @@ proc GeometryInstance*(name: string = "GeometryInstance", geometry: GeometryType
   nodepattern(GeometryInstanceRef)
   node3dpattern()
   result.geometry = geometry
+  result.sides = 8
   result.radius = 1
   result.color = Color(1.0, 1.0, 1.0)
   result.kind = GEOMETRY_INSTANCE_NODE
@@ -92,6 +95,25 @@ method draw*(self: GeometryInstanceRef, w, h: Glfloat) =
     glVertex3f(1,  1,  1)
     glVertex3f(1,  1, -1)
     glEnd()
+  of GEOMETRY_CYLINDER:
+    glBegin(GL_QUAD_STRIP)
+    for i in 0..self.sides:
+      let angle = TAU*i.float/self.sides.float
+      glVertex3f(sin(angle)*self.radius, 1, cos(angle)*self.radius)
+      glVertex3f(sin(angle)*self.radius, -1, cos(angle)*self.radius)
+    glEnd()
+
+    glBegin(GL_POLYGON)
+    for i in 0..self.sides:
+      let angle = TAU*i.float/self.sides.float
+      glVertex3f(sin(angle)*self.radius, 1, cos(angle)*self.radius)
+    glEnd()
+
+    glBegin(GL_POLYGON)
+    for i in 0..self.sides:
+      let angle = TAU*i.float/self.sides.float
+      glVertex3f(sin(angle)*self.radius, -1, cos(angle)*self.radius)
+    glEnd()
   of GEOMETRY_SPHERE:
     var
       R = 2 * PI / 24f

+ 6 - 0
tests/test37.nim

@@ -19,6 +19,10 @@ build:
       translation: Vector3(1, 0, 2)
       color: Color(144, 111, 144)
       geometry: GEOMETRY_SPHERE
+    - GeometryInstance geometry4:
+      translation: Vector3(3, 0, 2)
+      color: Color(111, 144, 122)
+      geometry: GEOMETRY_CYLINDER
     - Button button:
       text: stext"Hello! ^^"
       call resize(256, 64)
@@ -32,6 +36,8 @@ geometry1@on_input(self, event):
     geometry2.rotateY(-event.xrel)
     geometry3.rotateX(event.yrel)
     geometry3.rotateY(-event.xrel)
+    geometry4.rotateX(event.yrel)
+    geometry4.rotateY(-event.xrel)
 
 addMainScene(scene)
 windowLaunch()

+ 8 - 2
tests/test48.nim

@@ -24,6 +24,10 @@ build:
       translation: Vector3(-1, -1, 1)
       color: Color(144, 77, 144, 1.0)
       geometry: GEOMETRY_SPHERE
+    - GeometryInstance cylinder:
+      translation: Vector3(2, -1, 1)
+      color: Color(144, 77, 144, 1.0)
+      geometry: GEOMETRY_CYLINDER
     - ProgressBar health:
       call resize(256, 48)
       call setAnchor(0, 1, 0, 1)
@@ -36,9 +40,11 @@ addKeyAction("back", "s")
 addKeyAction("left", "a")
 addKeyAction("right", "d")
 
-root@on_input(self, event):
+root@onInput(self, event):
   if event.isInputEventMouseMotion() and event.pressed:
-    camera.rotate(-event.xrel*0.1, event.yrel*0.1)
+    camera.rotate(-event.xrel*0.25, event.yrel*0.25)
+
+root@onProcess(self):
   if isActionPressed("left"):
     root.translate(camera.right * -0.1)
   if isActionPressed("right"):