1cfd74d65d832137e20e193c960802afba73b5d38sm/*
23c1e67e433728684b5f228c5d4f3e5b1457bb271sm * Copyright (C) 2010 The Android Open Source Project
3cfd74d65d832137e20e193c960802afba73b5d38sm *
4cfd74d65d832137e20e193c960802afba73b5d38sm * Licensed under the Apache License, Version 2.0 (the "License");
5cfd74d65d832137e20e193c960802afba73b5d38sm * you may not use this file except in compliance with the License.
6cfd74d65d832137e20e193c960802afba73b5d38sm * You may obtain a copy of the License at
7cfd74d65d832137e20e193c960802afba73b5d38sm *
8cfd74d65d832137e20e193c960802afba73b5d38sm *      http://www.apache.org/licenses/LICENSE-2.0
9cfd74d65d832137e20e193c960802afba73b5d38sm *
10cfd74d65d832137e20e193c960802afba73b5d38sm * Unless required by applicable law or agreed to in writing, software
11cfd74d65d832137e20e193c960802afba73b5d38sm * distributed under the License is distributed on an "AS IS" BASIS,
12cfd74d65d832137e20e193c960802afba73b5d38sm * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cfd74d65d832137e20e193c960802afba73b5d38sm * See the License for the specific language governing permissions and
14cfd74d65d832137e20e193c960802afba73b5d38sm * limitations under the License.
15cfd74d65d832137e20e193c960802afba73b5d38sm */
16cfd74d65d832137e20e193c960802afba73b5d38sm
17cfd74d65d832137e20e193c960802afba73b5d38smpackage com.replica.replicaisland;
18cfd74d65d832137e20e193c960802afba73b5d38sm
19cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.CollisionParameters.HitType;
20cfd74d65d832137e20e193c960802afba73b5d38sm
21cfd74d65d832137e20e193c960802afba73b5d38sm/**
22cfd74d65d832137e20e193c960802afba73b5d38sm * CollisionVolume describes a volume (rectangle, sphere, etc) used for dynamic collision detection.
23cfd74d65d832137e20e193c960802afba73b5d38sm * Volumes can be tested for intersection against other volumes, and can be grown to contain a set
24cfd74d65d832137e20e193c960802afba73b5d38sm * of other volumes.  The volume itself is stored in object-relative space (in terms of offsets from
25cfd74d65d832137e20e193c960802afba73b5d38sm * some origin); when used with game objects the position of the parent object must be passed to
26cfd74d65d832137e20e193c960802afba73b5d38sm * a parameter of the intersection test.  This means that a single instance of a CollisionVolume and
27cfd74d65d832137e20e193c960802afba73b5d38sm * its derivatives is safe to share amongst many game object instances.
28cfd74d65d832137e20e193c960802afba73b5d38sm */
29cfd74d65d832137e20e193c960802afba73b5d38smpublic abstract class CollisionVolume extends AllocationGuard {
30cfd74d65d832137e20e193c960802afba73b5d38sm    // TODO: does this really belong here?
31cfd74d65d832137e20e193c960802afba73b5d38sm    // When used as an attack volume, mHitType specifies the type of hit that the volume deals.
32cfd74d65d832137e20e193c960802afba73b5d38sm    // When used as a vulnerability volume, it specifies which type the volume is vulernable to
33cfd74d65d832137e20e193c960802afba73b5d38sm    // (invalid = all types).
34cfd74d65d832137e20e193c960802afba73b5d38sm    public int mHitType;
35cfd74d65d832137e20e193c960802afba73b5d38sm
36cfd74d65d832137e20e193c960802afba73b5d38sm    public CollisionVolume() {
37cfd74d65d832137e20e193c960802afba73b5d38sm        super();
38cfd74d65d832137e20e193c960802afba73b5d38sm        mHitType = HitType.INVALID;
39cfd74d65d832137e20e193c960802afba73b5d38sm    }
40cfd74d65d832137e20e193c960802afba73b5d38sm
41cfd74d65d832137e20e193c960802afba73b5d38sm    public CollisionVolume(int type) {
42cfd74d65d832137e20e193c960802afba73b5d38sm        super();
43cfd74d65d832137e20e193c960802afba73b5d38sm        mHitType = type;
44cfd74d65d832137e20e193c960802afba73b5d38sm    }
45cfd74d65d832137e20e193c960802afba73b5d38sm
46cfd74d65d832137e20e193c960802afba73b5d38sm    public void setHitType(int type) {
47cfd74d65d832137e20e193c960802afba73b5d38sm        mHitType = type;
48cfd74d65d832137e20e193c960802afba73b5d38sm    }
49cfd74d65d832137e20e193c960802afba73b5d38sm
50cfd74d65d832137e20e193c960802afba73b5d38sm    public int getHitType() {
51cfd74d65d832137e20e193c960802afba73b5d38sm        return mHitType;
52cfd74d65d832137e20e193c960802afba73b5d38sm    }
53cfd74d65d832137e20e193c960802afba73b5d38sm
54cfd74d65d832137e20e193c960802afba73b5d38sm
55cfd74d65d832137e20e193c960802afba73b5d38sm    public abstract boolean intersects(Vector2 position, FlipInfo flip, CollisionVolume other,
56cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 otherPosition, FlipInfo otherFlip);
57cfd74d65d832137e20e193c960802afba73b5d38sm
58cfd74d65d832137e20e193c960802afba73b5d38sm    public float getMinXPosition(FlipInfo flip) {
59cfd74d65d832137e20e193c960802afba73b5d38sm        float value = 0;
60cfd74d65d832137e20e193c960802afba73b5d38sm        if (flip != null && flip.flipX) {
61cfd74d65d832137e20e193c960802afba73b5d38sm            final float maxX = getMaxX();
62cfd74d65d832137e20e193c960802afba73b5d38sm            value = flip.parentWidth - maxX;
63cfd74d65d832137e20e193c960802afba73b5d38sm        } else {
64cfd74d65d832137e20e193c960802afba73b5d38sm            value = getMinX();
65cfd74d65d832137e20e193c960802afba73b5d38sm        }
66cfd74d65d832137e20e193c960802afba73b5d38sm        return value;
67cfd74d65d832137e20e193c960802afba73b5d38sm    }
68cfd74d65d832137e20e193c960802afba73b5d38sm
69cfd74d65d832137e20e193c960802afba73b5d38sm    public float getMaxXPosition(FlipInfo flip) {
70cfd74d65d832137e20e193c960802afba73b5d38sm        float value = 0;
71cfd74d65d832137e20e193c960802afba73b5d38sm        if (flip != null && flip.flipX) {
72cfd74d65d832137e20e193c960802afba73b5d38sm            final float minX = getMinX();
73cfd74d65d832137e20e193c960802afba73b5d38sm            value = flip.parentWidth - minX;
74cfd74d65d832137e20e193c960802afba73b5d38sm        } else {
75cfd74d65d832137e20e193c960802afba73b5d38sm            value = getMaxX();
76cfd74d65d832137e20e193c960802afba73b5d38sm        }
77cfd74d65d832137e20e193c960802afba73b5d38sm        return value;
78cfd74d65d832137e20e193c960802afba73b5d38sm    }
79cfd74d65d832137e20e193c960802afba73b5d38sm
80cfd74d65d832137e20e193c960802afba73b5d38sm    public float getMinYPosition(FlipInfo flip) {
81cfd74d65d832137e20e193c960802afba73b5d38sm        float value = 0;
82cfd74d65d832137e20e193c960802afba73b5d38sm        if (flip != null && flip.flipY) {
83cfd74d65d832137e20e193c960802afba73b5d38sm            final float maxY = getMaxY();
84cfd74d65d832137e20e193c960802afba73b5d38sm            value = flip.parentHeight - maxY;
85cfd74d65d832137e20e193c960802afba73b5d38sm        } else {
86cfd74d65d832137e20e193c960802afba73b5d38sm            value = getMinY();
87cfd74d65d832137e20e193c960802afba73b5d38sm        }
88cfd74d65d832137e20e193c960802afba73b5d38sm        return value;
89cfd74d65d832137e20e193c960802afba73b5d38sm    }
90cfd74d65d832137e20e193c960802afba73b5d38sm
91cfd74d65d832137e20e193c960802afba73b5d38sm    public float getMaxYPosition(FlipInfo flip) {
92cfd74d65d832137e20e193c960802afba73b5d38sm        float value = 0;
93cfd74d65d832137e20e193c960802afba73b5d38sm        if (flip != null && flip.flipY) {
94cfd74d65d832137e20e193c960802afba73b5d38sm            final float minY = getMinY();
95cfd74d65d832137e20e193c960802afba73b5d38sm            value = flip.parentHeight - minY;
96cfd74d65d832137e20e193c960802afba73b5d38sm        } else {
97cfd74d65d832137e20e193c960802afba73b5d38sm            value = getMaxY();
98cfd74d65d832137e20e193c960802afba73b5d38sm        }
99cfd74d65d832137e20e193c960802afba73b5d38sm        return value;
100cfd74d65d832137e20e193c960802afba73b5d38sm    }
101cfd74d65d832137e20e193c960802afba73b5d38sm
102cfd74d65d832137e20e193c960802afba73b5d38sm    protected abstract float getMinX();
103cfd74d65d832137e20e193c960802afba73b5d38sm    protected abstract float getMaxX();
104cfd74d65d832137e20e193c960802afba73b5d38sm    protected abstract float getMinY();
105cfd74d65d832137e20e193c960802afba73b5d38sm    protected abstract float getMaxY();
106cfd74d65d832137e20e193c960802afba73b5d38sm
107cfd74d65d832137e20e193c960802afba73b5d38sm
108cfd74d65d832137e20e193c960802afba73b5d38sm    public static class FlipInfo {
109cfd74d65d832137e20e193c960802afba73b5d38sm        public boolean flipX;
110cfd74d65d832137e20e193c960802afba73b5d38sm        public boolean flipY;
111cfd74d65d832137e20e193c960802afba73b5d38sm        public float parentWidth;
112cfd74d65d832137e20e193c960802afba73b5d38sm        public float parentHeight;
113cfd74d65d832137e20e193c960802afba73b5d38sm    }
114cfd74d65d832137e20e193c960802afba73b5d38sm}
115