iterating all objects and applying force

This commit is contained in:
Torsten Ruger 2015-07-13 23:11:00 +03:00
parent 99ccf51507
commit 2e4d083094
4 changed files with 103 additions and 25 deletions

View File

@ -1,9 +1,11 @@
require 'opal/pixi'
require 'native'
require "main/lib/registers_view"
require "main/lib/space_view"
require "salama"
require_relative "registers_view"
require_relative "object_view"
require_relative "space_view"
class MainView
def initialize
@ -26,13 +28,13 @@ class MainView
end.fail do |error|
raise "Error: #{error}"
end
space = SpaceView.new
space = SpaceView.new
@container.add_child space
animate = Proc.new do
`requestAnimationFrame(animate)`
registers.update
space.update
registers.draw_me
space.draw_me
renderer.render @container
end
animate.call

View File

@ -0,0 +1,29 @@
class ObjectView
attr_accessor :text , :object , :attributes
def initialize o
super()
self.text = PIXI::Text.new("no")
puts "NO O " unless o
self.object = o
self.text.text = o.object_id.to_s
@attributes = {}
end
def set name , val
@attributes[name] = val
end
def get(name)
@attributes[name]
end
def position
#raise "NONAME" unless self.text
self.text.position
end
def distance to
self.position - to.position
end
end

View File

@ -14,7 +14,7 @@ class RegisterView < PIXI::Container
@registers[name] = reg
self.add_child reg
end
def update
def draw_me
end
end

View File

@ -1,4 +1,19 @@
PIXI::Point.class_eval do
alias_native :y=
def add point
self.x += point.x
self.y += point.y
end
def scale_by num
min = 0.001
num = min if num <= min
self.x = self.x / num
self.y = self.y / num
end
end
class SpaceView < PIXI::Graphics
include Sof::Util
@ -13,64 +28,96 @@ class SpaceView < PIXI::Graphics
@view_objects = {}
@objects.each do |i , o|
view = Volt::Model.new
view._object = o
next unless o.object
view = ObjectView.new o.object
@view_objects[i] = view
at = PIXI::Point.new 100 , 100
name = PIXI::Text.new i.to_s
view._name = name
add_child name
add_child view.text
end
fill_attributes
end
# should almost be called draw by now
def update
def draw_me
update_positions
self.clear
prev = nil
@view_objects.each do |i , view|
if prev
self.lineStyle(4, 0xffd900, 2)
self.moveTo( prev._name.position.x , prev._name.position.y )
self.lineTo( view._name.position.x , view._name.position.y )
puts "p" if prev.nil?
puts "v" if view.nil?
self.moveTo( prev.position.x , prev.position.y )
self.lineTo( view.position.x , view.position.y )
end
prev = view
end
end
def force from , to
puts "force"
dir_x = from.x - to.x
dir_x2 = dir_x * dir_x
dir_y = from.y - to.y
dir_y2 = dir_y * dir_y
if( dir_x2 < 0.1 and dir_y2 < 0.1 )
puts "Were close"
dir_x = rand(10)
dir_y = rand(10)
end
f = dir_x * dir_x + dir_y * dir_y
f = 0.1 if f < 0.1
PIXI::Point.new( dir_x / f , dir_y / f)
end
def update_positions
@view_objects.each do |i , view|
view._name.position.x += 1
view.each do |n , v |
next if n == :id
next unless o = @view_objects[v]
puts "v2" if view.nil?
puts "0" if o.nil?
view.position.add force( view.position , o.position )
end
end
end
def fill_attributes
@view_objects.each do |i , view|
object = view._object
case object.class.name
ob = view._object
next if is_value?(ob)
case ob.class.name
when "Array" , "Parfait::List"
fill_array view
when "Hash" , "Parfait::Dictionary"
fill_hash view
else
# and recursively add attributes
attributes = attributes_for(object)
next if ob.class.name.include?("::") and !ob.class.name.include?("Parfait")
next if ob.class.name == "Proc"
next if ob.class.name == "String"
next if ob.class.name == "Numeric"
next if ob.class.name == "Class"
#puts "object #{ob.class.name}"
attributes = attributes_for(ob)
attributes.each do |a|
val = get_value( object , a)
if( @view_objects[vol.object_id])
next if a == "html_safe"
next if a == "constructor"
next if a == "toString"
next if a == "position"
val = get_value( ob , a)
if( @view_objects[val.object_id])
#ref
end
#puts "set #{a}"
view.set(a , val )
end
superclasses = [object.class.superclass.name]
superclasses = [ob.class.superclass.name]
if superclasses.include?( "Array") or superclasses.include?( "Parfait::List")
fill_array view
end
if superclasses.include?( "Hash") or superclasses.include?( "Parfait::Dictionary")
fill_hash view
end
view._object = nil
end
end
end