-
Notifications
You must be signed in to change notification settings - Fork 10
/
ldob.h
163 lines (124 loc) · 3.79 KB
/
ldob.h
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#pragma once
// Copyright (c) 2019 Lawnjelly
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
/**
@author lawnjelly <lawnjelly@gmail.com>
*/
#include "scene/3d/spatial.h"
class VisualInstance;
class GeometryInstance;
class Light;
class LHidable
{
public:
void Hidable_Create(Node * pNode);
void Show(bool bShow);
// new .. can be separated from the scene tree to cull
Node * m_pNode;
Node * m_pParent;
// separate flag so we don't have to touch the godot lookup
bool m_bShow;
// which method we are using to show and hide .. detaching from scene tree or just show / hide through godot
static bool m_bDetach;
};
// static object
class LSob : public LHidable
{
public:
Spatial * GetSpatial() const;
VisualInstance * GetVI() const;
GeometryInstance * GetGI() const;
//void Show(bool bShow);
bool IsShadowCaster() const;
ObjectID m_ID; // godot object
AABB m_aabb; // world space
};
// dynamic object
class LDob
{
public:
Spatial * GetSpatial() const;
VisualInstance * GetVI() const;
bool m_bSlotTaken;
bool m_bVisible;
float m_fRadius;
int m_iRoomID;
ObjectID m_ID_Spatial;
ObjectID m_ID_VI;
};
//class LCamera
// trace source can be camera or light
class LSource
{
public:
enum eSourceType
{
ST_CAMERA, // frustum planes will have been added
ST_DIRECTIONAL,
ST_SPOTLIGHT, // trace should add back plane and cone planes
ST_OMNI, // no planes, can go in any direction
};
enum eSourceClass
{
SC_STATIC, // non moving light
SC_ROOM, // only moves within the room
SC_DYNAMIC, // can move between rooms (register as a DOB)
};
void Source_SetDefaults();
String MakeDebugString() const;
// funcs
bool IsGlobal() const {return m_RoomID == -1;}
// all in world space, culling done in world space
Vector3 m_ptPos;
Vector3 m_ptDir;
eSourceType m_eType;
eSourceClass m_eClass;
float m_fSpread; // for spotlight
float m_fRange; // shadow distance not light distance
// source room
int m_RoomID; // or -1 for global lights
private:
static const char * m_szTypes[];
static const char * m_szClasses[];
};
class LLight : public LHidable
{
public:
enum {MAX_AFFECTED_ROOMS=64};
LSource m_Source;
ObjectID m_GodotID;
int m_DOB_id;
// shadow casters
int m_FirstCaster;
int m_NumCasters;
// funcs
// for dynamic lights
// move them light dobs across planes
// and update the rooms that are affected by the light
void Update();
String MakeDebugString() const;
void Light_SetDefaults();
Light * GetGodotLight();
bool AddAffectedRoom(int room_id);
void ClearAffectedRooms() {m_NumAffectedRooms = 0;}
// keep a list of the rooms affected by this light
uint16_t m_AffectedRooms[MAX_AFFECTED_ROOMS];
int m_NumAffectedRooms;
// for global lights, this is the area or -1 if unset
int m_iArea;
String m_szArea; // set to the area string in the case of area lights, else ""
};