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

Revision 925, 4.2 KB checked in by dave, 9 years ago (diff)

first pass emotional animation, inline optimisations, move to most significant emotional object

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        }
35
36    function GetClosest(pos:Vec2, bones:List<Bone>) : Bone
37    {
38        var dist=99999.0;
39        var closest:Bone=null;
40        for (b in bones)
41        {
42            var d=pos.Sub(b.Pos).Mag();
43            if (d>0.00001 && d<dist)
44            {
45                dist=d;
46                closest=b;
47            }
48        }
49        return closest;
50    }
51   
52    function FindTop(desc:Array<Dynamic>)
53    {
54        var highest=9999;
55        var top=0;
56        var c=0;
57        for (d in desc)
58        {
59            if (d.position.y<highest)
60            {
61                highest=d.position.y;
62                top=c;
63            }
64            c++;
65        }
66        return top;
67    }
68   
69    function BuildBones(desc:Array<Dynamic>)
70    {
71        var bones=new Array<Bone>();
72        for (d in desc)
73        {
74            var b=new Bone(new Vec2(-Std.parseInt(d.position.x),
75                                    -Std.parseInt(d.position.y)),
76                                    Resources.Get("test"));
77            b.LoadFromURL(d.name);
78            bones.push(b);
79        }
80        return bones;
81    }
82
83    function CalculateMST(bones:Array<Bone>,root:Int)
84    {
85        var g=new Graph(new List<Edge>());
86        var x=0;
87        var y=0;
88        for (xb in bones)
89        {
90            for (yb in bones)
91            {
92                g.AddEdge(new Edge(x,y,xb.Pos.Sub(yb.Pos).Mag()));
93                y++;
94            }
95            y=0;
96            x++;
97        }
98        return g.MST(root);
99    }
100
101    public function Build(world:World,desc:Array<Dynamic>)
102    {
103        bones=BuildBones(desc);
104        var top=FindTop(desc);
105        g=CalculateMST(bones,top);
106        Root=bones[top];
107        world.AddSprite(Root);
108        var relative = new Array<Vec2>();
109        for (i in 0...bones.length) relative.push(new Vec2(0,0));
110
111        for (edge in g.Edges)
112        {
113            bones[edge.From].AddChild(world,bones[edge.To]);
114            relative[edge.To]=bones[edge.From].Pos.Sub(bones[edge.To].Pos);
115        }
116
117        for (b in 0...bones.length)
118        {
119            bones[b].Pos=relative[b].Mul(0.5);
120        }
121    }
122
123    override function OnSortScene(order:Int) : Void
124    {
125        Root.SetDepth(order+10);
126        Root.Recurse(function(b:Bone,depth:Int)
127        {
128            b.SetDepth(order+1);
129        });       
130    }
131
132        override public function Update(frame:Int, world:World)
133        {
134        super.Update(frame,world);
135        Root.SetPos(new Vec2(Pos.x,Pos.y));
136        Root.Update(frame,null);
137        }
138 
139        public function Draw(world:World)
140        {
141        world.graphics.clear();
142                world.graphics.lineStyle(1, 0x00aa00, 1);       
143
144        for (e in g.Edges)
145        {
146            var start=bones[e.From].GetGlobalPos();
147            var end=bones[e.To].GetGlobalPos();
148            world.graphics.moveTo(start.x,start.y);
149            world.graphics.lineTo(end.x,end.y);
150            world.graphics.beginFill( 0x99ff33 , 1 );
151            // drawing circle
152            world.graphics.drawCircle( start.x , start.y , 4 );
153            world.graphics.drawCircle( end.x , end.y , 4 );
154        }
155    }
156
157    override public function GetRoot() : Dynamic
158    {
159        return Root;
160    }
161}
Note: See TracBrowser for help on using the repository browser.