source: scenarios/GerminationX/fungi/src/truffle/SkeletonEntity.hx @ 999

Revision 999, 4.3 KB checked in by dave, 9 years ago (diff)

remote update of characters, auto polling

Line 
1// t r u f f l e Copyright (C) 2010 FoAM vzw   \_\ __     /\
2//                                          /\    /_/    / / 
3// This program is free software: you can redistribute it and/or modify
4// it under the terms of the GNU Affero General Public License as
5// published by the Free Software Foundation, either version 3 of the
6// License, or (at your option) any later version.
7//
8// This program is distributed in the hope that it will be useful,
9// but WITHOUT ANY WARRANTY; without even the implied warranty of
10// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11// GNU Affero General Public License for more details.
12//
13// You should have received a copy of the GNU Affero General Public License
14// along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16package truffle;
17
18import truffle.Truffle;
19import truffle.Graph;
20
21class SkeletonEntity extends truffle.Entity
22{
23    public var Root:Bone;
24        var g:Graph;
25    var bones:Array<Bone>;
26    public var Id:Int;
27
28        public function new(world:World,pos:Vec3)
29        {
30                super(world,pos);
31        Root = null;
32        // hack for the animation
33        Id=cast(pos.y,Int);
34        bones=[];
35        }
36
37    function GetClosest(pos:Vec2, bones:List<Bone>) : Bone
38    {
39        var dist=99999.0;
40        var closest:Bone=null;
41        for (b in bones)
42        {
43            var d=pos.Sub(b.Pos).Mag();
44            if (d>0.00001 && d<dist)
45            {
46                dist=d;
47                closest=b;
48            }
49        }
50        return closest;
51    }
52   
53    function FindTop(desc:Array<Dynamic>)
54    {
55        var highest=9999;
56        var top=0;
57        var c=0;
58        for (d in desc)
59        {
60            if (d.position.y<highest)
61            {
62                highest=d.position.y;
63                top=c;
64            }
65            c++;
66        }
67        return top;
68    }
69   
70    function BuildBones(desc:Array<Dynamic>)
71    {
72        var bones=new Array<Bone>();
73        for (d in desc)
74        {
75            var b=new Bone(new Vec2(-Std.parseInt(d.position.x),
76                                    -Std.parseInt(d.position.y)),
77                                    Resources.Get("test"));
78            b.LoadFromURL(d.name);
79            bones.push(b);
80        }
81        return bones;
82    }
83
84    function CalculateMST(bones:Array<Bone>,root:Int)
85    {
86        var g=new Graph(new List<Edge>());
87        var x=0;
88        var y=0;
89        for (xb in bones)
90        {
91            for (yb in bones)
92            {
93                g.AddEdge(new Edge(x,y,xb.Pos.Sub(yb.Pos).Mag()));
94                y++;
95            }
96            y=0;
97            x++;
98        }
99        return g.MST(root);
100    }
101
102    public function Build(world:World,desc:Array<Dynamic>)
103    {
104        for (b in bones)
105        {
106            world.RemoveSprite(b);
107        }
108
109        bones=BuildBones(desc);
110        var top=FindTop(desc);
111        g=CalculateMST(bones,top);
112        Root=bones[top];
113        world.AddSprite(Root);
114        var relative = new Array<Vec2>();
115        for (i in 0...bones.length) relative.push(new Vec2(0,0));
116
117        for (edge in g.Edges)
118        {
119            bones[edge.From].AddChild(world,bones[edge.To]);
120            relative[edge.To]=bones[edge.From].Pos.Sub(bones[edge.To].Pos);
121        }
122
123        for (b in 0...bones.length)
124        {
125            bones[b].Pos=relative[b].Mul(0.5);
126        }
127    }
128
129    override function OnSortScene(order:Int) : Void
130    {
131        Root.SetDepth(order+10);
132        Root.Recurse(function(b:Bone,depth:Int)
133        {
134            b.SetDepth(order+1);
135        });       
136    }
137
138        override public function Update(frame:Int, world:World)
139        {
140        super.Update(frame,world);
141        Root.SetPos(new Vec2(Pos.x,Pos.y));
142        Root.Update(frame,null);
143        }
144 
145        public function Draw(world:World)
146        {
147        world.graphics.clear();
148                world.graphics.lineStyle(1, 0x00aa00, 1);       
149
150        for (e in g.Edges)
151        {
152            var start=bones[e.From].GetGlobalPos();
153            var end=bones[e.To].GetGlobalPos();
154            world.graphics.moveTo(start.x,start.y);
155            world.graphics.lineTo(end.x,end.y);
156            world.graphics.beginFill( 0x99ff33 , 1 );
157            // drawing circle
158            world.graphics.drawCircle( start.x , start.y , 4 );
159            world.graphics.drawCircle( end.x , end.y , 4 );
160        }
161    }
162
163    override public function GetRoot() : Dynamic
164    {
165        return Root;
166    }
167}
Note: See TracBrowser for help on using the repository browser.