Skip to content

Commit 2f482cf

Browse files
committed
Environment map is only loaded from file once. Further decreased copying of environment texture.
1 parent 7458bc7 commit 2f482cf

File tree

7 files changed

+75
-88
lines changed

7 files changed

+75
-88
lines changed

FEBioStudio/DlgEditMaterial.cpp

Lines changed: 2 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -172,28 +172,6 @@ class CSceneWidget : public QFrame
172172
GLContext rc;
173173
rc.m_cam = &scene.GetCamera();
174174

175-
CMainWindow* wnd = CMainWindow::GetInstance();
176-
bool useEnvMap = wnd->IsEnvironmentMapEnabled();
177-
if (useEnvMap)
178-
{
179-
if (envMap.isNull())
180-
{
181-
QString file = wnd->GetEnvironmentMap();
182-
if (!file.isEmpty())
183-
{
184-
QImage img(file);
185-
if (!img.isNull())
186-
{
187-
QImage::Format format = img.format();
188-
envMap = CRGBAImage(img.width(), img.height(), img.constBits());
189-
}
190-
}
191-
}
192-
193-
if (!envMap.isNull())
194-
scene.SetEnvironmentMap(envMap);
195-
}
196-
197175
rt.start();
198176
scene.Render(rt, rc);
199177
rt.finish();
@@ -288,16 +266,9 @@ CDlgEditMaterial::CDlgEditMaterial(QWidget* parent) : QDialog(parent), ui(new UI
288266
if (wnd)
289267
{
290268
bool useEnvMap = wnd->IsEnvironmentMapEnabled();
291-
QString file = wnd->GetEnvironmentMap();
292-
if (useEnvMap && !file.isEmpty())
269+
if (useEnvMap)
293270
{
294-
QImage img(file);
295-
if (!img.isNull())
296-
{
297-
QImage::Format format = img.format();
298-
CRGBAImage rgba(img.width(), img.height(), img.constBits());
299-
ui->view->scene.SetEnvironmentMap(rgba);
300-
}
271+
ui->view->scene.SetEnvironmentMap(wnd->GetEnvironmentMapImage());
301272
}
302273
else
303274
{

FEBioStudio/MainWindow.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3479,6 +3479,24 @@ bool CMainWindow::IsEnvironmentMapEnabled()
34793479
else return false;
34803480
}
34813481

3482+
CRGBAImage CMainWindow::GetEnvironmentMapImage()
3483+
{
3484+
if (ui->m_settings.m_envImg.isNull())
3485+
{
3486+
QString file = GetEnvironmentMap();
3487+
if (!file.isEmpty())
3488+
{
3489+
QImage img(file);
3490+
if (!img.isNull())
3491+
{
3492+
QImage::Format format = img.format();
3493+
ui->m_settings.m_envImg = CRGBAImage(img.width(), img.height(), img.constBits());
3494+
}
3495+
}
3496+
}
3497+
return ui->m_settings.m_envImg;
3498+
}
3499+
34823500
QStringList CMainWindow::GetRecentProjectsList()
34833501
{
34843502
return ui->m_settings.m_recentProjects;

FEBioStudio/MainWindow.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ SOFTWARE.*/
3232
#include <FEMLib/GMaterial.h>
3333
#include <FSCore/math3d.h>
3434
#include <FSCore/color.h>
35+
#include <ImageLib/RGBAImage.h>
3536
class FSObject;
3637
class CDocument;
3738
class CGLDocument;
@@ -397,6 +398,7 @@ class CMainWindow : public QMainWindow
397398
QString GetEnvironmentMap() const;
398399
void SetEnvironmentMap(const QString& filename);
399400
bool IsEnvironmentMapEnabled();
401+
CRGBAImage GetEnvironmentMapImage();
400402

401403
void AddRecentPlugin(const QString& fileName);
402404

FEBioStudio/MatEditButton.cpp

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,24 @@ class CMatEditButton::Imp
8383
QImage img;
8484
RayTracer rt;
8585
MatEditButtonScene scene;
86-
CRGBAImage envMap;
86+
bool initEnvMap = false;
8787

8888
Imp()
8989
{
9090
scene.addItem(new SphereItem(rt, vec3d(0, 0, 0), 1));
9191
}
92+
93+
void InitEnvMap()
94+
{
95+
if (initEnvMap) return;
96+
CMainWindow* wnd = CMainWindow::GetInstance();
97+
bool useEnvMap = wnd->IsEnvironmentMapEnabled();
98+
if (useEnvMap)
99+
{
100+
scene.SetEnvironmentMap(wnd->GetEnvironmentMapImage());
101+
}
102+
initEnvMap = true;
103+
}
92104
};
93105

94106
CMatEditButton::CMatEditButton(QWidget* parent) : QFrame(parent), m(*(new Imp))
@@ -140,31 +152,10 @@ void CMatEditButton::updateImage()
140152

141153
m.rt.setRenderShadows(false);
142154

155+
if (m.initEnvMap == false) m.InitEnvMap();
156+
143157
GLContext rc;
144158
rc.m_cam = &m.scene.GetCamera();
145-
146-
CMainWindow* wnd = CMainWindow::GetInstance();
147-
bool useEnvMap = wnd->IsEnvironmentMapEnabled();
148-
if (useEnvMap)
149-
{
150-
if (m.envMap.isNull())
151-
{
152-
QString file = wnd->GetEnvironmentMap();
153-
if (!file.isEmpty())
154-
{
155-
QImage img(file);
156-
if (!img.isNull())
157-
{
158-
QImage::Format format = img.format();
159-
m.envMap = CRGBAImage(img.width(), img.height(), img.constBits());
160-
}
161-
}
162-
}
163-
164-
if (!m.envMap.isNull())
165-
m.scene.SetEnvironmentMap(m.envMap);
166-
}
167-
168159
m.rt.start();
169160
m.scene.Render(m.rt, rc);
170161
m.rt.finish();

FEBioStudio/ui_mainwindow.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ SOFTWARE.*/
9494
#include <PyLib/PythonRunner.h>
9595
#include "FEBioBatchView.h"
9696
#include "DocPropsPanel.h"
97+
#include <ImageLib/RGBAImage.h>
9798

9899
class QProcess;
99100

@@ -248,6 +249,7 @@ struct FBS_SETTINGS
248249
QStringList m_recentImages;
249250

250251
QString m_envMapFile;
252+
CRGBAImage m_envImg;
251253

252254
vector<CLaunchConfig*> m_launch_configs;
253255
};

RTLib/RTBTree.cpp

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -140,49 +140,51 @@ void rt::Btree::Build(Mesh& mesh, int levels)
140140
if (output) FSLogger::Write(" Splitting levels : %d\n", levels);
141141
int m = 0;
142142
std::vector<rt::Btree::Block*> leaves;
143-
#pragma omp parallel shared(leaves)
143+
if (ntriangles > 0)
144144
{
145-
// the the number of threads in this parallel region
146-
int numThreads = omp_get_num_threads();
147-
148-
// only execute in parallel if it's worth it
149-
if ((levels < 2) || (numThreads < 2))
150-
{
151-
// let's do it in serial
152-
#pragma omp master
153-
for (int i = 0; i < ntriangles; ++i)
154-
{
155-
rt::Tri& tri = mesh.triangle(i);
156-
root->add(&tri, levels);
157-
}
158-
}
159-
else
145+
#pragma omp parallel shared(leaves)
160146
{
161-
// create initial split
162-
#pragma omp single
163-
{
164-
m = (int)log2(numThreads);
165-
if (m > levels - 1) m = levels - 1;
166-
int actualThreads = (int)pow(2, m);
167-
if (output) FSLogger::Write(" Using %d threads.\n", actualThreads);
168-
root->split(m);
169-
leaves = rt::Btree::leaves();
170-
}
147+
// the the number of threads in this parallel region
148+
int numThreads = omp_get_num_threads();
171149

172-
// loop over all the triangles and sort them in the blocks
173-
int threadId = omp_get_thread_num();
174-
if ((threadId >= 0) && (threadId < (int)leaves.size()))
150+
// only execute in parallel if it's worth it
151+
if ((levels < 2) || (numThreads < 2))
175152
{
153+
// let's do it in serial
154+
#pragma omp master
176155
for (int i = 0; i < ntriangles; ++i)
177156
{
178157
rt::Tri& tri = mesh.triangle(i);
179-
if (intersectBox(leaves[threadId]->box, tri))
180-
leaves[threadId]->add(&tri, levels - m);
158+
root->add(&tri, levels);
159+
}
160+
}
161+
else
162+
{
163+
// create initial split
164+
#pragma omp single
165+
{
166+
m = (int)log2(numThreads);
167+
if (m > levels - 1) m = levels - 1;
168+
int actualThreads = (int)pow(2, m);
169+
if (output) FSLogger::Write(" Using %d threads.\n", actualThreads);
170+
root->split(m);
171+
leaves = rt::Btree::leaves();
172+
}
173+
174+
// loop over all the triangles and sort them in the blocks
175+
int threadId = omp_get_thread_num();
176+
if ((threadId >= 0) && (threadId < (int)leaves.size()))
177+
{
178+
for (int i = 0; i < ntriangles; ++i)
179+
{
180+
rt::Tri& tri = mesh.triangle(i);
181+
if (intersectBox(leaves[threadId]->box, tri))
182+
leaves[threadId]->add(&tri, levels - m);
183+
}
181184
}
182185
}
183186
}
184187
}
185-
186188
int nrblocks = (int)blocks();
187189
if (output) FSLogger::Write(" Nr. of blocks : %d\n", nrblocks);
188190
if (output) FSLogger::Write(" Nr. of triangles in BTree : %d\n", (int)root->size());

RTLib/RayTracer.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1072,7 +1072,8 @@ bool RayTracer::castRay(const Ray& ray, rt::Point& q)
10721072

10731073
unsigned int RayTracer::SetEnvironmentMap(const CRGBAImage& img)
10741074
{
1075-
envTex.setImageData(img);
1075+
if (envTex.isNull())
1076+
envTex.setImageData(img);
10761077
return 1;
10771078
}
10781079

0 commit comments

Comments
 (0)