1 /*
2  *  BSD 3-Clause License
3  *  
4  *  Copyright (c) 2016, Mango-Engine Team
5  *  All rights reserved.
6  *  
7  *  Redistribution and use in source and binary forms, with or without
8  *  modification, are permitted provided that the following conditions are met:
9  *  
10  *  * Redistributions of source code must retain the above copyright notice, this
11  *    list of conditions and the following disclaimer.
12  *  
13  *  * Redistributions in binary form must reproduce the above copyright notice,
14  *    this list of conditions and the following disclaimer in the documentation
15  *    and/or other materials provided with the distribution.
16  *  
17  *  * Neither the name of the copyright holder nor the names of its
18  *    contributors may be used to endorse or promote products derived from
19  *    this software without specific prior written permission.
20  *  
21  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24  *  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
25  *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  *  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27  *  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28  *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29  *  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32 module mango_engine.world;
33 
34 import mango_engine.game;
35 import mango_engine.event.core;
36 import mango_engine.graphics.model;
37 
38 //import std.math;
39 
40 /// Represents an object in the world.
41 class WorldObject {
42     private shared GameManager _game;
43 
44     private shared Model _model;
45 
46     private shared float _velocityX = 0f;
47     private shared float _velocityY = 0f;
48 
49     @property GameManager game() @trusted nothrow { return cast(GameManager) this._game; }
50 
51     @property Model model() @trusted nothrow { return cast(Model) this._model; }
52 
53     /// Get this object's X velocity.
54     @property float velocityX() @safe nothrow { return this._velocityX; }
55     /// Set this object's X velocity.
56     @property void velocityX(float vx) @safe nothrow { this._velocityX = vx; }
57     /// Get this object's Y velocity.
58     @property float velocityY() @safe nothrow { return this._velocityY; }
59     /// Set this object's Y velocity.
60     @property void velocityY(float vy) @safe nothrow { this._velocityY = vy; }
61 
62     this(GameManager game, Model model) @trusted {
63         this._game = cast(shared) game;
64         this._model = cast(shared) model;
65         this.game.eventManager.registerEventHook(TickEvent.classinfo.name, EventHook(&this.update, false));
66     }
67 
68     private void update(Event e) @system {
69         debug {
70             import std.stdio;
71             //writeln("ive been called 2");
72         }
73         Vertex[] newVerticies = new Vertex[this.model.getVertices().length];
74         for(size_t i = 0; i < this.model.getVertices().length; i++) {
75             newVerticies[i] = this.model.getVertex(i); // getVertex duplicates the vertex
76 
77             newVerticies[i].x += velocityX;
78             newVerticies[i].y += velocityY;
79         }
80 
81         this.model.replaceVertices(newVerticies);
82     }
83 
84     bool checkCollision(WorldObject otherObject) @safe {
85         if(otherObject.model.getVertices().length != 4 || model.getVertices().length != 4) {
86             throw new Exception("Object is not a rectangle, collision not implemented.");
87         }
88 
89         float d1x = otherObject.model.getVertex(2).x - model.getVertex(1).x;
90         float d1y = otherObject.model.getVertex(2).y - model.getVertex(1).y;
91         float d2x = model.getVertex(2).x - otherObject.model.getVertex(1).x;
92         float d2y = model.getVertex(2).y - otherObject.model.getVertex(1).y;
93 
94         if (d1x > 0.0f || d1y > 0.0f)
95             return false;
96 
97         if (d2x > 0.0f || d2y > 0.0f)
98             return false;
99 
100         return true;
101     }
102 }