Skip to content

Commit 5935880

Browse files
committed
Improve light source testing on sectors and portals
1 parent 91eabbd commit 5935880

File tree

7 files changed

+36
-34
lines changed

7 files changed

+36
-34
lines changed

src/Layers/xrRender/light.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ void light::set_rotation (const Fvector& D, const Fvector& R) {
196196
#if RENDER!=R_R1
197197
void light::get_sectors()
198198
{
199-
if(RImplementation.SectorsCount()<=1) return;
199+
if(RImplementation.SectorsCount()<=1 || SpatialComponent.get() == nullptr) return;
200200
xrCriticalSectionGuard guard(&sectors_lc);
201201
if(0== SpatialComponent->spatial.sector)
202202
SpatialComponent->spatial_updatesector();
@@ -206,14 +206,14 @@ void light::get_sectors()
206206

207207
if(flags.type == IRender_Light::SPOT || flags.type == IRender_Light::OMNIPART)
208208
{
209-
CFrustum temp = CFrustum();
210-
temp.CreateFromMatrix (X.S.combine, FRUSTUM_P_ALL);
209+
CFrustum temp;
210+
temp.CreateFromMatrix(X.S.combine, FRUSTUM_P_ALL);
211211

212-
m_sectors = std::move(RImplementation.detectSectors_frustum(sector, &temp));
212+
RImplementation.detectSectors_frustum(sector, m_sectors, &temp);
213213
}
214-
if(flags.type == IRender_Light::POINT)
214+
else if(flags.type == IRender_Light::POINT)
215215
{
216-
m_sectors = std::move(RImplementation.detectSectors_sphere(sector, position, Fvector().set(range, range, range)));
216+
RImplementation.detectSectors_sphere(sector, m_sectors, { position, range });
217217
}
218218
}
219219

@@ -223,6 +223,9 @@ bool light::has_light_visible_from_sectors()
223223
xrCriticalSectionGuard guard(&sectors_lc);
224224
for (IRender_Sector* IRsector : m_sectors)
225225
{
226+
if (IRsector == nullptr)
227+
continue;
228+
226229
CSector* sector_ = (CSector*)IRsector;
227230
if (sector_ != nullptr && PortalTraverser.i_marker == sector_->r_marker)
228231
{

src/Layers/xrRender/r__dsgraph_structure.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class R_dsgraph_structure : public IRender_interface, public pureFrame
2929
R_feedback* val_feedback; // feedback for geometry being rendered
3030
u32 val_feedback_breakp;// breakpoint
3131

32-
u32 phase;
32+
3333
u32 marker;
3434
bool pmask[3];
3535
public:
@@ -142,6 +142,9 @@ class R_dsgraph_structure : public IRender_interface, public pureFrame
142142
void r_dsgraph_render_R1_box (IRender_Sector* _sector, Fbox& _bb, int _element);
143143

144144

145+
void detectSectors_sphere(CSector* sector, xr_vector<IRender_Sector*>& m_sectors, const Fsphere& sphere);
146+
void detectSectors_frustum(CSector* sector, xr_vector<IRender_Sector*>& m_sectors, CFrustum* _frustum);
147+
145148
public:
146149
virtual u32 memory_usage ()
147150
{

src/Layers/xrRender/r__sector_detect.cpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -141,17 +141,19 @@ IRender_Sector* CRender::detectSector(const Fvector& P, Fvector& dir)
141141
}
142142
}
143143

144-
xr_vector<IRender_Sector*> CRender::detectSectors_sphere(CSector* sector, const Fvector& b_center, const Fvector& b_dim)
144+
void R_dsgraph_structure::detectSectors_sphere(CSector* sector, xr_vector<IRender_Sector*>& m_sectors, const Fsphere& sphere)
145145
{
146-
xr_vector<IRender_Sector*> m_sectors;
147-
m_sectors.push_back(sector);
148-
if (rmPortals)
146+
if(sector)
147+
m_sectors.push_back(sector);
148+
149+
if (CDB::MODEL* portals_cform = RImplementation.rmPortals)
149150
{
150151
sectors_detect_xrc.box_options(CDB::OPT_FULL_TEST);
151-
sectors_detect_xrc.box_query(rmPortals,b_center,b_dim);
152+
float sphere_r = sphere.R;
153+
sectors_detect_xrc.box_query(portals_cform, sphere.P, { sphere_r, sphere_r, sphere_r });
152154
for (int K=0; K< sectors_detect_xrc.r_count(); K++)
153155
{
154-
CPortal* pPortal = (CPortal*) Portals[rmPortals->get_tris()[sectors_detect_xrc.r_begin()[K].id].dummy];
156+
CPortal* pPortal = (CPortal*)RImplementation.Portals[portals_cform->get_tris()[sectors_detect_xrc.r_begin()[K].id].dummy];
155157

156158
if(!pPortal)
157159
continue;
@@ -166,20 +168,20 @@ xr_vector<IRender_Sector*> CRender::detectSectors_sphere(CSector* sector, const
166168
m_sectors.push_back(pBack);
167169
}
168170
}
169-
return m_sectors;
170171
}
171172

172-
xr_vector<IRender_Sector*> CRender::detectSectors_frustum(CSector* sector, CFrustum* _frustum)
173+
void R_dsgraph_structure::detectSectors_frustum(CSector* sector, xr_vector<IRender_Sector*>& m_sectors, CFrustum* _frustum)
173174
{
174-
xr_vector<IRender_Sector*> m_sectors;
175-
m_sectors.push_back(sector);
176-
if (rmPortals)
175+
if(sector)
176+
m_sectors.push_back(sector);
177+
178+
if (CDB::MODEL* portals_cform = RImplementation.rmPortals)
177179
{
178180
sectors_detect_xrc.frustum_options(CDB::OPT_FULL_TEST);
179-
sectors_detect_xrc.frustum_query(rmPortals,*_frustum);
181+
sectors_detect_xrc.frustum_query(portals_cform, *_frustum);
180182
for (int K=0; K< sectors_detect_xrc.r_count(); K++)
181183
{
182-
CPortal* pPortal = (CPortal*) Portals[rmPortals->get_tris()[sectors_detect_xrc.r_begin()[K].id].dummy];
184+
CPortal* pPortal = (CPortal*)RImplementation.Portals[portals_cform->get_tris()[sectors_detect_xrc.r_begin()[K].id].dummy];
183185

184186
if(!pPortal)
185187
continue;
@@ -194,5 +196,4 @@ xr_vector<IRender_Sector*> CRender::detectSectors_frustum(CSector* sector, CFrus
194196
m_sectors.push_back(pBack);
195197
}
196198
}
197-
return m_sectors;
198199
}

src/Layers/xrRenderPC_R1/FStaticRender.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,6 @@ class CRender : public R_dsgraph_structure
150150
virtual IRender_Sector* detectSector (const Fvector& P);
151151
IRender_Sector* detectLastSector (const Fvector& P);
152152
IRender_Sector* detectSector (const Fvector& P, Fvector& D);
153-
xr_vector<IRender_Sector*> detectSectors_sphere (CSector* sector, const Fvector& b_center, const Fvector& b_dim);
154-
xr_vector<IRender_Sector*> detectSectors_frustum (CSector* sector, CFrustum* _frustum);
155153
int translateSector (IRender_Sector* pSector);
156154
virtual IRender_Target* getTarget ();
157155
virtual SurfaceParams getSurface(const char* nameTexture) override;

src/Layers/xrRenderPC_R2/r2.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,6 @@ class CRender : public R_dsgraph_structure
163163
IRenderVisual* model_CreatePE (LPCSTR name);
164164
IRender_Sector* detectSector (const Fvector& P, Fvector& D);
165165
IRender_Sector* detectLastSector (const Fvector& P);
166-
xr_vector<IRender_Sector*> detectSectors_sphere (CSector* sector, const Fvector& b_center, const Fvector& b_dim);
167-
xr_vector<IRender_Sector*> detectSectors_frustum (CSector* sector, CFrustum* _frustum);
168166
int translateSector (IRender_Sector* pSector);
169167
virtual SurfaceParams getSurface(const char* nameTexture) override;
170168

src/Layers/xrRenderPC_R4/r4.h

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,7 @@ class dxRender_Visual;
2727
class CRender : public R_dsgraph_structure
2828
{
2929
public:
30-
enum
31-
{
32-
PHASE_NORMAL = 0, // E[0]
33-
PHASE_SMAP = 1, // E[1]
34-
PHASE_REFLECT = 2,
35-
};
36-
30+
3731
enum
3832
{
3933
MMSM_OFF = 0,
@@ -255,8 +249,6 @@ class CRender : public R_dsgraph_structure
255249
virtual IRender_Sector* getSector (int id);
256250
virtual IRenderVisual* getVisual (int id);
257251
virtual IRender_Sector* detectSector (const Fvector& P);
258-
xr_vector<IRender_Sector*> detectSectors_sphere (CSector* sector, const Fvector& b_center, const Fvector& b_dim);
259-
xr_vector<IRender_Sector*> detectSectors_frustum (CSector* sector, CFrustum* _frustum);
260252
virtual IRender_Target* getTarget ();
261253

262254
// Main

src/xrEngine/Render.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,11 +192,18 @@ class ENGINE_API IRender_interface
192192
SM_FOR_MPSENDING = 4,
193193
SM_forcedword = u32(-1)
194194
};
195+
enum
196+
{
197+
PHASE_NORMAL = 0, // E[0]
198+
PHASE_SMAP = 1, // E[1]
199+
PHASE_REFLECT = 2,
200+
};
195201
public:
196202

197203
// data
198204
CFrustum ViewBase;
199205
CFrustum* View;
206+
u32 phase;
200207
public:
201208
// feature level
202209
virtual GenerationLevel get_generation () = 0;

0 commit comments

Comments
 (0)