rgss 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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