summaryrefslogtreecommitdiffhomepage
path: root/Stars45/RLoc.cpp
blob: 35e888af58adc591e7fd7f714da8a8484d6011ce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*  Starshatter: The Open Source Project
    Copyright (c) 2021-2022, Starshatter: The Open Source Project Contributors
    Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors
    Copyright (c) 1997-2006, Destroyer Studios LLC.

    AUTHOR:       John DiCamillo


    OVERVIEW
    ========
    Navigation Point class implementation
*/

#include "MemDebug.h"
#include "RLoc.h"
#include "Random.h"

// +----------------------------------------------------------------------+

RLoc::RLoc()
    : rloc(0), dex(0), dex_var(5.0e3f), az(0), az_var(3.1415f), el(0), el_var(0.1f)
{ }

RLoc::RLoc(const Point& l, double d, double dv)
    : loc(l), base_loc(l), rloc(0), dex((float) d), dex_var((float) dv),
      az(0), az_var(3.1415f), el(0), el_var(0.1f)
{ }

RLoc::RLoc(RLoc* l, double d, double dv)
    : rloc(l), dex((float) d), dex_var((float) dv),
      az(0), az_var(3.1415f), el(0), el_var(0.1f)
{ }

RLoc::RLoc(const RLoc& r)
    : loc(r.loc), base_loc(r.base_loc), rloc(r.rloc),
      dex(r.dex), dex_var(r.dex_var),
      az(r.az),   az_var(r.az_var),
      el(r.el),   el_var(r.el_var)
{ }

RLoc::~RLoc()
{ }

// +----------------------------------------------------------------------+

const Point&
RLoc::Location()
{
    if (rloc || dex > 0) Resolve();
    return loc;
}

// +----------------------------------------------------------------------+

void
RLoc::Resolve()
{
    if (rloc) {
        base_loc = rloc->Location();
        rloc = 0;
    }

    if (dex > 0) {
        double d = dex + Random(-dex_var, dex_var);
        double a = az  + Random(-az_var,  az_var);
        double e = el  + Random(-el_var,  el_var);

        Point  p = Point(d *  sin(a),
        d * -cos(a),
        d *  sin(e));

        loc = base_loc + p;
        dex = 0;
    }
    else {
        loc = base_loc;
    }
}

// +----------------------------------------------------------------------+

void
RLoc::SetBaseLocation(const Point& l)
{
    base_loc = l;
    loc      = l;
}