Newer
Older
MyGames / 3d_object.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>rbCanvas</title>
<!-- rbcCanvas editor v0.8.2 -->
</head>
<body>
<script type="text/javascript" src="https://rbcanvas.net/0.8.2/runtime/opal/opal_patched.min.js" onload="Opal.load('opal')"></script>
<script type="text/javascript" src="https://rbcanvas.net/0.8.2/runtime/opal/opal-parser_patched.min.js" onload="Opal.load('opal-parser'); Opal.load('parser/ruby23');"></script>
<script type="text/javascript" src="https://rbcanvas.net/0.8.2/runtime/opal/native.min.js" onload="Opal.load('native')"></script>
<script type="text/javascript" src="https://rbcanvas.net/0.8.2/runtime/p5/p5.min.js"></script>
<script type="text/javascript" src="https://rbcanvas.net/0.8.2/runtime/rbcanvas/monkeypatch_p5.js"></script>
<script type="text/javascript" src="https://rbcanvas.net/0.8.2/runtime/rbcanvas/rbcanvas_transpiled_helper.js"></script>
<script type="text/javascript" src="https://rbcanvas.net/0.8.2/runtime/rbcanvas/rbcanvas_transpiled.js"></script>
<script type="text/javascript" src="https://rbcanvas.net/0.8.2/runtime/rbcanvas/microbit_bleuart.js"></script>
<script type="text/javascript" src="https://rbcanvas.net/0.8.2/runtime/rbcanvas/microbit_bleuart_rb.js"></script>
<script type="text/ruby" section="s00" name="main">
def setup
  puts RBCanvas::CODE_USER
  eval(RBCanvas::CODE_CONSTANT)
  eval(RBCanvas::CODE_USER)
end
module RBCanvas
  CODE_CONSTANT = <<-'EOC_CONSTANT'
    %x{
      cv = document.getElementById("defaultCanvas0");
      if (cv) {
        cv.remove();  // remove default Canvas (100 x 100)
      }
      // document.body.innerHTML = ""
    }
  EOC_CONSTANT
  CODE_USER = <<-'EOC_USER'
include DX
include Console
$PROGRAM_NAME = "main"
Window.width   = 640
Window.height  = 480
Window.bgcolor = 'AliceBlue'

Window.loop do
  #test
  puts Box.new(1, 2, 3).inspect
  puts TDO.new.yaw
  puts Box[].inspect
  exit
end

$PROGRAM_NAME = "main"
  EOC_USER
end
</script>
<script type="text/ruby" section="s01" name="3D">
$PROGRAM_NAME = "3D"
class TDO    # 3d object(s)
  # pos=>[x, y, z], rot=>[pitch, yaw, roll]
  
  @@eye_pos = [0, 0, 0]    # meter
  @@eye_rot = [0, 0, 0]    # degree
  @@scale = 30             # px/m
  
  @@instances = []
  
  
  def initialize(pos = [0, 0, 0], rot = [0, 0, 0], *, color: 'White', shade: true, otl_w: 0, otl_c: 'Black')    # *, outline weight, outline color
    @pos, @rot = pos, rot
    @color, @shade, @otl_w, @otl_c = color, shade, otl_w, otl_c
    @@instances << self
  end
  
  def self.[] (*args)
    self.new(*args)
  end
  
  
  def x() @pos[0] end
  def y() @pos[1] end
  def z() @pos[2] end
  def pitch() @rot[0] end
  def yaw() @rot[1] end
  def roll() @rot[2] end
  def pos() @pos end
  def rot() @rot end
  
  def x=(val) @pos[0] = val end
  def y=(val) @pos[1] = val end
  def z=(val) @pos[2] = val end
  def pitch=(val) @rot[0] = val end
  def yaw=(val) @rot[1] = val end
  def roll=(val) @rot[2] = val end
  def pos=(val) @pos = val end
  def rot=(val) @rot = val end
  
  def draw
    Window.save do
      Window.rotate(-@@rot[2])
      Window.scale(@@scale)
      
      yeild    # drawing proc.
    end
  end
  
  private
  
  def eye_x() @@eye_pos[0] end
  def eye_y() @@eye_pos[1] end
  def eye_z() @@eye_pos[2] end
  def eye_roll() @@eye_rot[0] end
  def eye_yaw() @@eye_rot[1] end
  def eye_pitch() @@eye_rot[2] end
  def eye_pos() @@eye_pos end
  def eye_rot() @@eye_rot end
  def scale() @@scale end
  
  def eye_x=(val) @@eye_pos[0] = val end
  def eye_y=(val) @@eye_pos[1] = val end
  def eye_z=(val) @@eye_pos[2] = val end
  def eye_roll=(val) @@eye_rot[0] = val end
  def eye_yaw=(val) @@eye_rot[1] = val end
  def eye_pitch=(val) @@eye_rot[2] = val end
  def eye_pos=(val) @@eye_pos = val end
  def eye_rot=(val) @@eye_rot = val end
  def scale=(val) @@scale = val end
  
  def draw_objects
    @@instances.each(&:draw)
  end
end

class Box < TDO
  def initialize(*, edges)
    super
    @edges = edges    # edges=>[l, w, h]
  end
  
  def l() @edges[0] end
  def w() @edges[1] end
  def h() @edges[2] end
  
  def l=(val) @edges[0] = val end
  def w=(val) @edges[1] = val end
  def h=(val) @edges[2] = val end
  
  def draw
    super do
      ##########drawing proc##########
      
    end
  end
end

class Sphere < TDO
  def initialize(*, r)
    super
    @r = r
  end
  
  def r() @r end
  
  def r=(val) @r = val end
  
  def draw
    super do
      ##########drawing proc##########
      
    end
  end
end
$PROGRAM_NAME = "3D"
</script>

</body>
</html>