rgss 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/.clang-format +6 -0
  3. data/.gitignore +167 -0
  4. data/.yardopts +6 -0
  5. data/CHANGELOG.md +4 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +21 -0
  8. data/Rakefile +9 -0
  9. data/ext/rgss/cglm-v0.7.9.tar.gz +0 -0
  10. data/ext/rgss/color.c +599 -0
  11. data/ext/rgss/entity.c +373 -0
  12. data/ext/rgss/extconf.rb +53 -0
  13. data/ext/rgss/font.c +135 -0
  14. data/ext/rgss/game.c +469 -0
  15. data/ext/rgss/game.h +99 -0
  16. data/ext/rgss/gl.c +3217 -0
  17. data/ext/rgss/glad.c +1140 -0
  18. data/ext/rgss/glad.h +2129 -0
  19. data/ext/rgss/glfw.c +1453 -0
  20. data/ext/rgss/graphics.c +324 -0
  21. data/ext/rgss/image.c +274 -0
  22. data/ext/rgss/input.c +745 -0
  23. data/ext/rgss/khrplatform.h +290 -0
  24. data/ext/rgss/mat4.c +279 -0
  25. data/ext/rgss/pax_global_header +1 -0
  26. data/ext/rgss/point.c +253 -0
  27. data/ext/rgss/rect.c +449 -0
  28. data/ext/rgss/rgss.c +56 -0
  29. data/ext/rgss/rgss.h +241 -0
  30. data/ext/rgss/stb_image.h +7762 -0
  31. data/ext/rgss/stb_image_write.h +1690 -0
  32. data/ext/rgss/stb_rect_pack.h +628 -0
  33. data/ext/rgss/stb_truetype.h +5011 -0
  34. data/ext/rgss/utf8.h +1652 -0
  35. data/ext/rgss/uthash.h +1133 -0
  36. data/ext/rgss/vec.c +114 -0
  37. data/ext/rgss/vec.h +192 -0
  38. data/ext/rgss/vec2.c +489 -0
  39. data/ext/rgss/vec3.c +751 -0
  40. data/ext/rgss/vec4.c +681 -0
  41. data/lib/rgss.rb +140 -0
  42. data/lib/rgss/batch.rb +57 -0
  43. data/lib/rgss/blend.rb +47 -0
  44. data/lib/rgss/game_object.rb +28 -0
  45. data/lib/rgss/plane.rb +95 -0
  46. data/lib/rgss/renderable.rb +158 -0
  47. data/lib/rgss/rgss.so +0 -0
  48. data/lib/rgss/shader.rb +94 -0
  49. data/lib/rgss/shaders/sprite-frag.glsl +40 -0
  50. data/lib/rgss/shaders/sprite-vert.glsl +17 -0
  51. data/lib/rgss/sprite.rb +139 -0
  52. data/lib/rgss/stubs/color.rb +318 -0
  53. data/lib/rgss/stubs/gl.rb +1999 -0
  54. data/lib/rgss/stubs/glfw.rb +626 -0
  55. data/lib/rgss/stubs/rect.rb +324 -0
  56. data/lib/rgss/stubs/rpg.rb +267 -0
  57. data/lib/rgss/stubs/tone.rb +65 -0
  58. data/lib/rgss/texture.rb +132 -0
  59. data/lib/rgss/tilemap.rb +116 -0
  60. data/lib/rgss/version.rb +3 -0
  61. data/lib/rgss/viewport.rb +67 -0
  62. data/rgss.gemspec +44 -0
  63. data/test.png +0 -0
  64. metadata +178 -0
@@ -0,0 +1,140 @@
1
+
2
+ module RGSS
3
+
4
+ require 'logger'
5
+
6
+ Log = Logger.new(STDOUT)
7
+
8
+ Log.formatter = proc do |severity, datetime, progname, msg|
9
+
10
+ time = datetime.strftime('%H:%M:%S')
11
+ prefix = case severity
12
+ when 'DEBUG' then "\33[1;35mDEBUG\33[0m"
13
+ when 'INFO' then "\33[1;32mINFO\33[0m"
14
+ when 'WARN' then "\33[1;33mWARN\33[0m"
15
+ when 'ERROR' then "\33[1;31mERROR\33[0m"
16
+ when 'FATAL' then "\33[1;31mFATAL\33[0m"
17
+ else "LOG"
18
+ end
19
+ "#{time} [#{prefix}] #{msg}\n"
20
+ end
21
+ end
22
+
23
+ require_relative 'rgss/version'
24
+ require_relative 'rgss/rgss'
25
+
26
+ require_relative 'rgss/game_object'
27
+ require_relative 'rgss/shader'
28
+ require_relative 'rgss/texture'
29
+
30
+ require_relative 'rgss/blend'
31
+ require_relative 'rgss/batch'
32
+ require_relative 'rgss/renderable'
33
+ require_relative 'rgss/sprite'
34
+ require_relative 'rgss/viewport'
35
+ require_relative 'rgss/plane'
36
+
37
+
38
+ module RGSS
39
+
40
+
41
+ module Game
42
+
43
+ SPEED = 8
44
+
45
+ def self.update(delta)
46
+
47
+ $sprite.cy += 1 if Game.ticks % 8 == 0
48
+
49
+ $v.y -= SPEED if Input.press?(:UP)
50
+ $v.y += SPEED if Input.press?(:DOWN)
51
+ $v.x -= SPEED if Input.press?(:LEFT)
52
+ $v.x += SPEED if Input.press?(:RIGHT)
53
+ $fog.zoom += vec2(0.05) if Input.press?(:RAISE)
54
+ $fog.zoom -= vec2(0.05) if Input.press?(:LOWER)
55
+
56
+ $sprite.update(delta)
57
+ $v.update(delta)
58
+ $fog.update(delta)
59
+
60
+ if Input.trigger?(:FULLSCREEN)
61
+ p Graphics.fps
62
+ p $v.position
63
+ end
64
+
65
+ if Input.press?(:QUIT)
66
+ Game.close(true)
67
+ end
68
+ end
69
+ end
70
+
71
+ module Graphics
72
+
73
+ def self.render(state)
74
+ @batch.each { |obj| obj.render(state) }
75
+ end
76
+ end
77
+
78
+
79
+ Game.create(256, 256, "RGSS", resizable: true, vsync: true)
80
+ Graphics.back_color = Color::CORNFLOWER_BLUE
81
+
82
+
83
+ Game.icon = '/storage/images/anvil.png'
84
+
85
+ Input.bind(:UP, [Input::KEY_W, Input::KEY_UP])
86
+ Input.bind(:LEFT, [Input::KEY_A, Input::KEY_LEFT])
87
+ Input.bind(:DOWN, [Input::KEY_S, Input::KEY_DOWN])
88
+ Input.bind(:RIGHT, [Input::KEY_D, Input::KEY_RIGHT])
89
+
90
+ Input.bind(:RAISE, Input::KEY_Q)
91
+ Input.bind(:LOWER, Input::KEY_E)
92
+
93
+ Input.bind(:CONFIRM, Input::KEY_SPACE)
94
+ Input.bind(:FULLSCREEN, Input::KEY_F)
95
+ Input.bind(:QUIT, Input::KEY_ESCAPE)
96
+
97
+ Input.cursor_image('/home/eric/Desktop/cursor.png')
98
+ $v = Viewport.new(1, 1, 128, 128)
99
+ $v.back_color = Color::BLACK
100
+
101
+ $v.angle = 23
102
+
103
+ $fog = Plane.new
104
+ $fog.texture = Texture.new('/storage/images/RTP/XP/Graphics/Fogs/001-Fog01.png')
105
+ $fog.size = Size.new(400, 400)
106
+ $fog.scroll = vec2(24.0, 32.0)
107
+ $fog.opacity = 0.5
108
+
109
+ tex = Texture.new('/home/eric/Desktop/TimeFantasy_PCK/Characters/!$fireplace.png')
110
+
111
+ w = tex.width / 3
112
+ h = tex.height
113
+ region = Rect.new(w, 0, w, h)
114
+
115
+
116
+ $sprite = SpriteAtlas.new(region: region, rows: 4, columns: 1)
117
+ $sprite.texture = tex
118
+
119
+ font = TrueType.new('/home/eric/Desktop/dev/NotoSansMono-Regular.ttf')
120
+ p font.scale(12, mode: :em)
121
+
122
+ # tex.fill_rect(Rect.new(32, 32, 32, 32), Color::RED)
123
+ # $sprite.scale = vec2(1, 1)
124
+ # $sprite.velocity = vec2(64, 0)
125
+ # $sprite.angle = 45
126
+ # $sprite.pivot = vec3(16, 16, 0)
127
+ # $sprite.scale = vec2(2, 2)
128
+
129
+
130
+ # $v.angle = 45
131
+
132
+ Game.speed = 1.0
133
+
134
+
135
+
136
+
137
+ Game.main(30)
138
+ Game.terminate
139
+
140
+ end
@@ -0,0 +1,57 @@
1
+ module RGSS
2
+
3
+ class Batch
4
+
5
+ include Enumerable
6
+
7
+ def initialize
8
+ @invalid = false
9
+ @items = Array.new
10
+ end
11
+
12
+ def each
13
+ return enum_for(__method__) unless block_given?
14
+ if @invalid
15
+ @items.sort! { |a, b| a.z <=> b.z }
16
+ @invalid = false
17
+ end
18
+ @items.each { |item| yield item }
19
+ end
20
+
21
+ def add(object)
22
+ unless object.respond_to?(:z) && object.respond_to?(:render)
23
+ raise(TypeError, "#{object} is not a #{Renderable} instance")
24
+ end
25
+ return false if @items.include?(object)
26
+ @items.push(object)
27
+ @invalid = true
28
+ true
29
+ end
30
+
31
+ def remove(object)
32
+ @items.delete(object)
33
+ end
34
+
35
+ def contains?(object)
36
+ object.is_a?(Renderable) ? @items.include?(object) : false
37
+ end
38
+
39
+ def invalidate
40
+ @invalid = true
41
+ end
42
+
43
+ alias_method :push, :add
44
+ alias_method :<<, :add
45
+ alias_method :delete, :remove
46
+ alias_method :include?, :contains?
47
+ end
48
+
49
+ module Graphics
50
+
51
+ class << self
52
+ attr_reader :batch
53
+ end
54
+
55
+ @batch = Batch.new
56
+ end
57
+ end
@@ -0,0 +1,47 @@
1
+
2
+ module RGSS
3
+
4
+ class Blend
5
+
6
+ ZERO = 0x0000
7
+ ONE = 0x0001
8
+ SRC_COLOR = 0x0300
9
+ ONE_MINUS_SRC_COLOR = 0x0301
10
+ DST_COLOR = 0x0306
11
+ ONE_MINUS_DST_COLOR = 0x0307
12
+ SRC_ALPHA = 0x0302
13
+ ONE_MINUS_SRC_ALPHA = 0x0303
14
+ DST_ALPHA = 0x0304
15
+ ONE_MINUS_DST_ALPHA = 0x0305
16
+ CONSTANT_COLOR = 0x8001
17
+ ONE_MINUS_CONSTANT_COLOR = 0x8002
18
+ CONSTANT_ALPHA = 0x8003
19
+ ONE_MINUS_CONSTANT_ALPHA = 0x8004
20
+ SRC_ALPHA_SATURATE = 0x0308
21
+ SRC1_COLOR = 0x88F9
22
+ ONE_MINUS_SRC1_COLOR = 0x88FA
23
+ SRC1_ALPHA = 0x8589
24
+ ONE_MINUS_SRC1_ALPHA = 0x88FB
25
+
26
+ OP_ADD = 0x8006
27
+ OP_SUBTRACT = 0x800A
28
+ OP_REVERSE_SUBTRACT = 0x800B
29
+ OP_MIN = 0x8007
30
+ OP_MAX = 0x8008
31
+
32
+ attr_accessor :op
33
+ attr_accessor :src
34
+ attr_accessor :dst
35
+
36
+ def initialize(op, src, dst)
37
+ @op = op
38
+ @src = src
39
+ @dst = dst
40
+ end
41
+
42
+ def self.default
43
+ new(OP_ADD, SRC_ALPHA, ONE_MINUS_SRC_ALPHA)
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,28 @@
1
+
2
+ module RGSS
3
+
4
+ ##
5
+ # @abstract
6
+ # Abstract base class for game objects that represent a native type.
7
+ class GameObject
8
+
9
+ attr_accessor :id
10
+
11
+ def initialize(id)
12
+ @id = id
13
+ end
14
+
15
+ def ==(other)
16
+ self.class == other.class && @id == other.id
17
+ end
18
+
19
+ def valid?
20
+ raise(NotImplementedError, "#{__method__} must be overriden in derived classes")
21
+ end
22
+
23
+ def dispose
24
+ @id = 0
25
+ nil
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,95 @@
1
+
2
+
3
+ module RGSS
4
+
5
+ class Plane < Renderable
6
+
7
+ attr_reader :zoom
8
+ attr_reader :scroll
9
+ attr_reader :texture
10
+
11
+ def initialize(viewport = nil)
12
+ super(viewport&.batch || Graphics.batch)
13
+
14
+ vertex_setup
15
+
16
+ @sampler = glGenSampler
17
+ glSamplerParameteri(@sampler, GL_TEXTURE_WRAP_S, GL_REPEAT)
18
+ glSamplerParameteri(@sampler, GL_TEXTURE_WRAP_T, GL_REPEAT)
19
+ glSamplerParameteri(@sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST) # TODO: Linear
20
+ glSamplerParameteri(@sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
21
+
22
+ @scroll = Vec2.zero
23
+ @zoom = Vec2.one
24
+ @origin = Vec2.zero
25
+ @texture = nil
26
+ self.size = Size.empty
27
+ end
28
+
29
+ def scroll=(value)
30
+ @scroll = value || Vec2.zero
31
+ value
32
+ end
33
+
34
+ def texture=(value)
35
+ @texture = value
36
+ update_vertices
37
+ value
38
+ end
39
+
40
+ def size=(value)
41
+ super
42
+ update_vertices
43
+ value
44
+ end
45
+
46
+ def zoom=(value)
47
+ @zoom = value || Vec2.one
48
+ # update_vertices
49
+ value
50
+ end
51
+
52
+ def update(delta)
53
+ super(delta)
54
+ @origin += @scroll * delta
55
+ update_vertices
56
+ end
57
+
58
+ def render(alpha)
59
+ return unless @texture && @visible && @opacity > 0.0
60
+ super(alpha)
61
+
62
+ glBindSampler(0, @sampler)
63
+ @texture.bind
64
+
65
+ glBindVertexArray(@vao)
66
+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, nil)
67
+
68
+ glBindVertexArray(GL_NONE)
69
+ glBindSampler(0, GL_NONE)
70
+ end
71
+
72
+ protected
73
+
74
+ def update_vertices
75
+ return unless @texture
76
+
77
+ l = (@origin.x / self.width) * @zoom.x;
78
+ t = (@origin.y / self.height) * @zoom.y;
79
+ r = l + ((self.width / @texture.width.to_f) * @zoom.x);
80
+ b = t + ((self.height / @texture.height.to_f) * @zoom.y);
81
+
82
+ vertices =
83
+ [
84
+ 0.0, 1.0, l, b, # Bottom-Left
85
+ 1.0, 0.0, r, t, # Top-Right
86
+ 0.0, 0.0, l, t, # Top-Left
87
+ 1.0, 1.0, r, b, # Bottom-Right
88
+ ].pack('f*')
89
+ glBindBuffer(GL_ARRAY_BUFFER, @vbo)
90
+ glBufferSubData(GL_ARRAY_BUFFER, 0, vertices.size, vertices)
91
+ glBindBuffer(GL_ARRAY_BUFFER, 0)
92
+ end
93
+
94
+ end
95
+ end
@@ -0,0 +1,158 @@
1
+
2
+ module RGSS
3
+
4
+ class Renderable < Entity
5
+
6
+ include GL
7
+
8
+ VERTICES_COUNT = 16
9
+ VERTICES_SIZE = SIZEOF_FLOAT * VERTICES_COUNT
10
+ VERTICES_STRIDE = SIZEOF_FLOAT * 4
11
+
12
+ class << self
13
+
14
+ attr_reader :projection_id
15
+ attr_reader :model_id
16
+ attr_reader :color_id
17
+ attr_reader :tone_id
18
+ attr_reader :hue_id
19
+ attr_reader :opacity_id
20
+ attr_reader :flash_id
21
+
22
+ def shader
23
+ return @shader if @shader
24
+
25
+ v = File.read(File.join(__dir__, 'shaders', 'sprite-vert.glsl'))
26
+ f = File.read(File.join(__dir__, 'shaders', 'sprite-frag.glsl'))
27
+
28
+ @shader = Shader.new(v, f)
29
+ @projection_id = @shader.locate('projection')
30
+ @model_id = @shader.locate('model')
31
+ @hue_id = @shader.locate('hue')
32
+ @color_id = @shader.locate('color')
33
+ @tone_id = @shader.locate('tone')
34
+ @flash_id = @shader.locate('flash')
35
+ @opacity_id = @shader.locate('opacity')
36
+ @shader
37
+ end
38
+
39
+ end
40
+
41
+ ##
42
+ # @return [Color]
43
+ attr_accessor :color
44
+
45
+ ##
46
+ # @return [Tone]
47
+ attr_accessor :tone
48
+
49
+ ##
50
+ # @return [Float]
51
+ attr_accessor :hue
52
+
53
+ ##
54
+ # @return [Float]
55
+ attr_reader :opacity
56
+
57
+ ##
58
+ # @return [Color]
59
+ attr_reader :flash_color
60
+
61
+ ##
62
+ # @return [Boolean]
63
+ attr_accessor :visible
64
+
65
+ ##
66
+ # @return [Blend]
67
+ attr_accessor :blend
68
+
69
+ def initialize(parent)
70
+ super()
71
+ @parent = parent.is_a?(RGSS::Batch) ? parent : Graphics.batch
72
+ @parent.add(self)
73
+
74
+ @visible = true
75
+ @color = Color::NONE
76
+ @tone = Tone.new(0, 0, 0, 0)
77
+ @flash_color = Color::NONE
78
+ @flash_duration = -1
79
+ @hue = 0.0
80
+ @opacity = 1.0
81
+ @blend = Blend.default
82
+ end
83
+
84
+ def dispose
85
+ @parent&.remove(self)
86
+ glDeleteVertexArray(@vao) if @vao
87
+ glDeleteBuffer(@vbo) if @vbo
88
+ glDeleteBuffer(@ebo) if @ebo
89
+ end
90
+
91
+ def flashing?
92
+ @flash_duration > -1
93
+ end
94
+
95
+ def opacity=(value)
96
+ @opacity = [0.0, [1.0, value.to_f].min].max
97
+ end
98
+
99
+ def update(delta)
100
+ super
101
+ if @flash_duration > -1
102
+ @flash_duration -= 1
103
+ @flash_color = Color::NONE if @flash_duration < 0
104
+ end
105
+ end
106
+
107
+ def flash(color, duration)
108
+ @flash_color = color
109
+ @flash_duration = duration
110
+ end
111
+
112
+ def render(delta)
113
+
114
+ if @blend
115
+ glBlendEquation(@blend.op)
116
+ glBlendFunc(@blend.src, @blend.dst)
117
+ end
118
+
119
+ Renderable.shader.use
120
+ glUniformMatrix4fv(Renderable.model_id, 1, false, self.model)
121
+ glUniform4fv(Renderable.color_id, 1, self.color)
122
+ glUniform4fv(Renderable.tone_id, 1, self.tone)
123
+ glUniform4fv(Renderable.flash_id, 1, self.flash_color)
124
+ glUniform1f(Renderable.hue_id, self.hue)
125
+ glUniform1f(Renderable.opacity_id, self.opacity)
126
+ end
127
+
128
+ def z=(value)
129
+ @parent.invalidate
130
+ super(value)
131
+ end
132
+
133
+ protected
134
+
135
+ def parent
136
+ @parent
137
+ end
138
+
139
+ def vertex_setup(vertices = nil, indices = nil, vbo_usage = GL_DYNAMIC_DRAW, ebo_usage = GL_STATIC_DRAW)
140
+
141
+ @vao = glGenVertexArray
142
+ @vbo = glGenBuffer
143
+ @ebo = glGenBuffer
144
+
145
+ glBindVertexArray(@vao)
146
+ glBindBuffer(GL_ARRAY_BUFFER, @vbo)
147
+ glBufferData(GL_ARRAY_BUFFER, vertices&.bytesize || VERTICES_SIZE, vertices, vbo_usage)
148
+
149
+ indices ||= [0, 1, 2, 0, 3, 1].pack('C*')
150
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, @ebo)
151
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.bytesize, indices, ebo_usage)
152
+
153
+ glEnableVertexAttribArray(0)
154
+ glVertexAttribPointer(0, 4, GL_FLOAT, false, SIZEOF_FLOAT * 4, nil)
155
+ glBindVertexArray(GL_NONE)
156
+ end
157
+ end
158
+ end