提交 480ec8e2 编写于 作者: M Matt Pharr

Update from book source.

SceneStateManager -> BasicSceneBuilder
Add various object creation methods to BasicScene
Remove redundant threadAllocators parameter from BasicScene::CreateMaterials()
上级 22115e72
...@@ -256,8 +256,8 @@ int main(int argc, char *argv[]) { ...@@ -256,8 +256,8 @@ int main(int argc, char *argv[]) {
} else { } else {
// Parse provided scene description files // Parse provided scene description files
BasicScene scene; BasicScene scene;
SceneStateManager manager(&scene); BasicSceneBuilder builder(&scene);
ParseFiles(&manager, filenames); ParseFiles(&builder, filenames);
// Render the scene // Render the scene
if (options.useGPU || options.wavefront) if (options.useGPU || options.wavefront)
......
...@@ -42,8 +42,7 @@ void RenderCPU(BasicScene &parsedScene) { ...@@ -42,8 +42,7 @@ void RenderCPU(BasicScene &parsedScene) {
}; };
// Filter // Filter
Filter filter = Filter::Create(parsedScene.filter.name, parsedScene.filter.parameters, Filter filter = parsedScene.CreateFilter();
&parsedScene.filter.loc, alloc);
// Film // Film
// It's a little ugly to poke into the camera's parameters here, but we // It's a little ugly to poke into the camera's parameters here, but we
...@@ -56,21 +55,14 @@ void RenderCPU(BasicScene &parsedScene) { ...@@ -56,21 +55,14 @@ void RenderCPU(BasicScene &parsedScene) {
ErrorExit(&parsedScene.camera.loc, ErrorExit(&parsedScene.camera.loc,
"The specified camera shutter times imply that the shutter " "The specified camera shutter times imply that the shutter "
"does not open. A black image will result."); "does not open. A black image will result.");
Film film = Film::Create(parsedScene.film.name, parsedScene.film.parameters, Film film = parsedScene.CreateFilm(exposureTime, filter);
exposureTime, parsedScene.camera.cameraTransform, filter,
&parsedScene.film.loc, alloc);
// Camera // Camera
Medium cameraMedium = findMedium(parsedScene.camera.medium, &parsedScene.camera.loc); Medium cameraMedium = findMedium(parsedScene.camera.medium, &parsedScene.camera.loc);
Camera camera = Camera::Create(parsedScene.camera.name, parsedScene.camera.parameters, Camera camera = parsedScene.CreateCamera(cameraMedium, film);
cameraMedium, parsedScene.camera.cameraTransform, film,
&parsedScene.camera.loc, alloc);
// Create _Sampler_ for rendering
Point2i fullImageResolution = camera.GetFilm().FullResolution(); Point2i fullImageResolution = camera.GetFilm().FullResolution();
Sampler sampler = Sampler sampler = parsedScene.CreateSampler(fullImageResolution);
Sampler::Create(parsedScene.sampler.name, parsedScene.sampler.parameters,
fullImageResolution, &parsedScene.sampler.loc, alloc);
// Textures // Textures
LOG_VERBOSE("Starting textures"); LOG_VERBOSE("Starting textures");
...@@ -85,17 +77,15 @@ void RenderCPU(BasicScene &parsedScene) { ...@@ -85,17 +77,15 @@ void RenderCPU(BasicScene &parsedScene) {
LOG_VERBOSE("Starting materials"); LOG_VERBOSE("Starting materials");
std::map<std::string, pbrt::Material> namedMaterials; std::map<std::string, pbrt::Material> namedMaterials;
std::vector<pbrt::Material> materials; std::vector<pbrt::Material> materials;
parsedScene.CreateMaterials(textures, threadAllocators, &namedMaterials, &materials); parsedScene.CreateMaterials(textures, &namedMaterials, &materials);
LOG_VERBOSE("Finished materials"); LOG_VERBOSE("Finished materials");
Primitive accel = parsedScene.CreateAggregate(textures, shapeIndexToAreaLights, media, Primitive accel = parsedScene.CreateAggregate(textures, shapeIndexToAreaLights, media,
namedMaterials, materials); namedMaterials, materials);
// Integrator // Integrator
const RGBColorSpace *integratorColorSpace = parsedScene.film.parameters.ColorSpace(); std::unique_ptr<Integrator> integrator(
std::unique_ptr<Integrator> integrator(Integrator::Create( parsedScene.CreateIntegrator(camera, sampler, accel, lights));
parsedScene.integrator.name, parsedScene.integrator.parameters, camera, sampler,
accel, lights, integratorColorSpace, &parsedScene.integrator.loc));
// Helpful warnings // Helpful warnings
for (const auto &sh : parsedScene.shapes) for (const auto &sh : parsedScene.shapes)
......
...@@ -67,7 +67,7 @@ enum class ParameterType { ...@@ -67,7 +67,7 @@ enum class ParameterType {
}; };
// SpectrumType Definition // SpectrumType Definition
enum class SpectrumType { Albedo, Unbounded, Illuminant }; enum class SpectrumType { Illuminant, Albedo, Unbounded };
inline std::string ToString(SpectrumType t) { inline std::string ToString(SpectrumType t) {
switch (t) { switch (t) {
......
...@@ -603,7 +603,7 @@ void parse(ParserTarget *target, std::unique_ptr<Tokenizer> t) { ...@@ -603,7 +603,7 @@ void parse(ParserTarget *target, std::unique_ptr<Tokenizer> t) {
static std::atomic<bool> warnedTransformBeginEndDeprecated{false}; static std::atomic<bool> warnedTransformBeginEndDeprecated{false};
std::vector<std::pair<Future<void>, SceneStateManager *>> imports; std::vector<std::pair<Future<void>, BasicSceneBuilder *>> imports;
LOG_VERBOSE("Started parsing %s", LOG_VERBOSE("Started parsing %s",
std::string(t->loc.filename.begin(), t->loc.filename.end())); std::string(t->loc.filename.begin(), t->loc.filename.end()));
...@@ -659,11 +659,9 @@ void parse(ParserTarget *target, std::unique_ptr<Tokenizer> t) { ...@@ -659,11 +659,9 @@ void parse(ParserTarget *target, std::unique_ptr<Tokenizer> t) {
// Helper function for pbrt API entrypoints that take a single string // Helper function for pbrt API entrypoints that take a single string
// parameter and a ParameterVector (e.g. pbrtShape()). // parameter and a ParameterVector (e.g. pbrtShape()).
// using BasicEntrypoint = void (SceneStateManager::*)(const std::string &,
// ParsedParameterVector, FileLoc);
auto basicParamListEntrypoint = auto basicParamListEntrypoint =
[&](void (ParserTarget::*apiFunc)(const std::string &, [&](void (ParserTarget::*apiFunc)(const std::string &,
ParsedParameterVector, FileLoc), ParsedParameterVector, FileLoc),
FileLoc loc) { FileLoc loc) {
Token t = *nextToken(TokenRequired); Token t = *nextToken(TokenRequired);
std::string_view dequoted = dequoteString(t); std::string_view dequoted = dequoteString(t);
...@@ -773,34 +771,34 @@ void parse(ParserTarget *target, std::unique_ptr<Tokenizer> t) { ...@@ -773,34 +771,34 @@ void parse(ParserTarget *target, std::unique_ptr<Tokenizer> t) {
Printf("%sImport \"%s\"\n", Printf("%sImport \"%s\"\n",
dynamic_cast<FormattingParserTarget *>(target)->indent(), filename); dynamic_cast<FormattingParserTarget *>(target)->indent(), filename);
else { else {
SceneStateManager *stateManager = dynamic_cast<SceneStateManager *>(target); BasicSceneBuilder *builder = dynamic_cast<BasicSceneBuilder *>(target);
CHECK(stateManager); CHECK(builder);
if (stateManager->currentBlock != SceneStateManager::BlockState::WorldBlock) if (builder->currentBlock != BasicSceneBuilder::BlockState::WorldBlock)
ErrorExit(&tok->loc, "Import statement only allowed inside world " ErrorExit(&tok->loc, "Import statement only allowed inside world "
"definition block."); "definition block.");
filename = ResolveFilename(filename); filename = ResolveFilename(filename);
SceneStateManager *importScene = stateManager->CopyForImport(); BasicSceneBuilder *importBuilder = builder->CopyForImport();
if (RunningThreads() == 1) { if (RunningThreads() == 1) {
std::unique_ptr<Tokenizer> timport = std::unique_ptr<Tokenizer> timport =
Tokenizer::CreateFromFile(filename, parseError); Tokenizer::CreateFromFile(filename, parseError);
if (timport) if (timport)
parse(importScene, std::move(timport)); parse(importBuilder, std::move(timport));
stateManager->MergeImported(importScene); builder->MergeImported(importBuilder);
} else { } else {
auto job = [=](std::string filename) { auto job = [=](std::string filename) {
Timer timer; Timer timer;
std::unique_ptr<Tokenizer> timport = std::unique_ptr<Tokenizer> timport =
Tokenizer::CreateFromFile(filename, parseError); Tokenizer::CreateFromFile(filename, parseError);
if (timport) if (timport)
parse(importScene, std::move(timport)); parse(importBuilder, std::move(timport));
LOG_VERBOSE("Elapsed time to parse \"%s\": %.2fs", filename, LOG_VERBOSE("Elapsed time to parse \"%s\": %.2fs", filename,
timer.ElapsedSeconds()); timer.ElapsedSeconds());
}; };
Future<void> jobFinished = RunAsync(job, filename); Future<void> jobFinished = RunAsync(job, filename);
imports.push_back(std::make_pair(std::move(jobFinished), importScene)); imports.push_back(std::make_pair(std::move(jobFinished), importBuilder));
} }
} }
} else if (tok->token == "Identity") } else if (tok->token == "Identity")
...@@ -984,9 +982,9 @@ void parse(ParserTarget *target, std::unique_ptr<Tokenizer> t) { ...@@ -984,9 +982,9 @@ void parse(ParserTarget *target, std::unique_ptr<Tokenizer> t) {
for (auto &import : imports) { for (auto &import : imports) {
import.first.Wait(); import.first.Wait();
SceneStateManager *stateManager = dynamic_cast<SceneStateManager *>(target); BasicSceneBuilder *builder = dynamic_cast<BasicSceneBuilder *>(target);
CHECK(stateManager); CHECK(builder);
stateManager->MergeImported(import.second); builder->MergeImported(import.second);
// HACK: let import.second leak so that its TransformCache isn't deallocated... // HACK: let import.second leak so that its TransformCache isn't deallocated...
} }
} }
......
此差异已折叠。
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <functional> #include <functional>
#include <map> #include <map>
#include <memory>
#include <set> #include <set>
#include <string> #include <string>
#include <unordered_set> #include <unordered_set>
...@@ -28,6 +29,8 @@ ...@@ -28,6 +29,8 @@
namespace pbrt { namespace pbrt {
class Integrator;
// SceneEntity Definition // SceneEntity Definition
struct SceneEntity { struct SceneEntity {
// SceneEntity Public Methods // SceneEntity Public Methods
...@@ -170,21 +173,7 @@ struct InstanceDefinitionSceneEntity { ...@@ -170,21 +173,7 @@ struct InstanceDefinitionSceneEntity {
std::vector<AnimatedShapeSceneEntity> animatedShapes; std::vector<AnimatedShapeSceneEntity> animatedShapes;
}; };
struct TextureSceneEntity : public TransformedSceneEntity { using TextureSceneEntity = TransformedSceneEntity;
TextureSceneEntity() = default;
TextureSceneEntity(const std::string &texName, ParameterDictionary parameters,
FileLoc loc, const AnimatedTransform &renderFromObject)
: TransformedSceneEntity("", std::move(parameters), loc, renderFromObject),
texName(texName) {}
std::string ToString() const {
return StringPrintf("[ TextureSeneEntity name: %s parameters: %s loc: %s "
"renderFromObject: %s texName: %s ]",
name, parameters, loc, renderFromObject, texName);
}
std::string texName;
};
struct LightSceneEntity : public TransformedSceneEntity { struct LightSceneEntity : public TransformedSceneEntity {
LightSceneEntity() = default; LightSceneEntity() = default;
...@@ -272,10 +261,12 @@ struct TransformSet { ...@@ -272,10 +261,12 @@ struct TransformSet {
// BasicScene Definition // BasicScene Definition
class BasicScene { class BasicScene {
public: public:
// BasicScene Public Methods
BasicScene(); BasicScene();
void SetFilm(SceneEntity film);
void SetSampler(SceneEntity sampler); void SetSampler(SceneEntity sampler);
void SetFilm(SceneEntity film);
void SetIntegrator(SceneEntity integrator); void SetIntegrator(SceneEntity integrator);
void SetFilter(SceneEntity filter); void SetFilter(SceneEntity filter);
void SetAccelerator(SceneEntity accelerator); void SetAccelerator(SceneEntity accelerator);
...@@ -295,19 +286,16 @@ class BasicScene { ...@@ -295,19 +286,16 @@ class BasicScene {
void Done(); void Done();
NamedTextures CreateTextures();
void CreateMaterials(const NamedTextures &sceneTextures, void CreateMaterials(const NamedTextures &sceneTextures,
ThreadLocal<Allocator> &threadAllocators,
std::map<std::string, Material> *namedMaterials, std::map<std::string, Material> *namedMaterials,
std::vector<Material> *materials); std::vector<Material> *materials);
std::map<std::string, Medium> CreateMedia();
std::vector<Light> CreateLights( std::vector<Light> CreateLights(
const NamedTextures &textures, const NamedTextures &textures,
std::map<int, pstd::vector<Light> *> *shapeIndexToAreaLights); std::map<int, pstd::vector<Light> *> *shapeIndexToAreaLights);
std::map<std::string, Medium> CreateMedia();
Primitive CreateAggregate( Primitive CreateAggregate(
const NamedTextures &textures, const NamedTextures &textures,
const std::map<int, pstd::vector<Light> *> &shapeIndexToAreaLights, const std::map<int, pstd::vector<Light> *> &shapeIndexToAreaLights,
...@@ -315,12 +303,20 @@ class BasicScene { ...@@ -315,12 +303,20 @@ class BasicScene {
const std::map<std::string, Material> &namedMaterials, const std::map<std::string, Material> &namedMaterials,
const std::vector<Material> &materials); const std::vector<Material> &materials);
// Public for now... Sampler CreateSampler(Point2i res) const;
public:
Filter CreateFilter() const;
Film CreateFilm(Float exposureTime, Filter filter) const;
Camera CreateCamera(Medium cameraMedium, Film film) const;
std::unique_ptr<Integrator> CreateIntegrator(Camera camera, Sampler sampler,
Primitive accel,
std::vector<Light> lights) const;
NamedTextures CreateTextures();
// BasicScene Public Members // BasicScene Public Members
SceneEntity film, sampler, integrator, filter, accelerator; SceneEntity film, sampler, integrator, filter, accelerator;
CameraSceneEntity camera; CameraSceneEntity camera;
std::vector<std::pair<std::string, SceneEntity>> namedMaterials; std::vector<std::pair<std::string, SceneEntity>> namedMaterials;
std::vector<SceneEntity> materials; std::vector<SceneEntity> materials;
std::vector<ShapeSceneEntity> shapes; std::vector<ShapeSceneEntity> shapes;
...@@ -329,14 +325,14 @@ class BasicScene { ...@@ -329,14 +325,14 @@ class BasicScene {
std::map<InternedString, InstanceDefinitionSceneEntity *> instanceDefinitions; std::map<InternedString, InstanceDefinitionSceneEntity *> instanceDefinitions;
private: private:
// BasicScene Private Methods
void startLoadingNormalMaps(const ParameterDictionary &parameters); void startLoadingNormalMaps(const ParameterDictionary &parameters);
ThreadLocal<Allocator> threadAllocators; // BasicScene Private Members
std::mutex mediaMutex; std::mutex mediaMutex;
std::map<std::string, Future<Medium>> mediaFutures; std::map<std::string, Future<Medium>> mediaFutures;
mutable ThreadLocal<Allocator> threadAllocators;
std::map<std::string, Medium> mediaMap; std::map<std::string, Medium> mediaMap;
std::mutex materialMutex; std::mutex materialMutex;
std::map<std::string, Future<Image *>> normalMapFutures; std::map<std::string, Future<Image *>> normalMapFutures;
std::map<std::string, Image *> normalMaps; std::map<std::string, Image *> normalMaps;
...@@ -361,11 +357,11 @@ class BasicScene { ...@@ -361,11 +357,11 @@ class BasicScene {
std::mutex instanceDefinitionMutex, instanceUseMutex; std::mutex instanceDefinitionMutex, instanceUseMutex;
}; };
// SceneStateManager Definition // BasicSceneBuilder Definition
class SceneStateManager : public ParserTarget { class BasicSceneBuilder : public ParserTarget {
public: public:
// SceneStateManager Public Methods // BasicSceneBuilder Public Methods
SceneStateManager(BasicScene *scene); BasicSceneBuilder(BasicScene *scene);
void Option(const std::string &name, const std::string &value, FileLoc loc); void Option(const std::string &name, const std::string &value, FileLoc loc);
void Identity(FileLoc loc); void Identity(FileLoc loc);
void Translate(Float dx, Float dy, Float dz, FileLoc loc); void Translate(Float dx, Float dy, Float dz, FileLoc loc);
...@@ -413,13 +409,13 @@ class SceneStateManager : public ParserTarget { ...@@ -413,13 +409,13 @@ class SceneStateManager : public ParserTarget {
void EndOfFiles(); void EndOfFiles();
SceneStateManager *CopyForImport(); BasicSceneBuilder *CopyForImport();
void MergeImported(SceneStateManager *); void MergeImported(BasicSceneBuilder *);
std::string ToString() const; std::string ToString() const;
private: private:
// SceneStateManager::GraphicsState Definition // BasicSceneBuilder::GraphicsState Definition
struct GraphicsState { struct GraphicsState {
// GraphicsState Public Methods // GraphicsState Public Methods
GraphicsState(); GraphicsState();
...@@ -447,7 +443,7 @@ class SceneStateManager : public ParserTarget { ...@@ -447,7 +443,7 @@ class SceneStateManager : public ParserTarget {
}; };
friend void parse(ParserTarget *scene, std::unique_ptr<Tokenizer> t); friend void parse(ParserTarget *scene, std::unique_ptr<Tokenizer> t);
// SceneStateManager Private Methods // BasicSceneBuilder Private Methods
class Transform RenderFromObject(int index) const { class Transform RenderFromObject(int index) const {
return pbrt::Transform((renderFromWorld * graphicsState.ctm[index]).GetMatrix()); return pbrt::Transform((renderFromWorld * graphicsState.ctm[index]).GetMatrix());
} }
...@@ -459,7 +455,7 @@ class SceneStateManager : public ParserTarget { ...@@ -459,7 +455,7 @@ class SceneStateManager : public ParserTarget {
bool CTMIsAnimated() const { return graphicsState.ctm.IsAnimated(); } bool CTMIsAnimated() const { return graphicsState.ctm.IsAnimated(); }
// SceneStateManager Private Members // BasicSceneBuilder Private Members
BasicScene *scene; BasicScene *scene;
GraphicsState graphicsState; GraphicsState graphicsState;
enum class BlockState { OptionsBlock, WorldBlock }; enum class BlockState { OptionsBlock, WorldBlock };
...@@ -490,9 +486,6 @@ class SceneStateManager : public ParserTarget { ...@@ -490,9 +486,6 @@ class SceneStateManager : public ParserTarget {
std::set<std::string> namedMaterialNames, mediumNames; std::set<std::string> namedMaterialNames, mediumNames;
std::set<std::string> floatTextureNames, spectrumTextureNames, instanceNames; std::set<std::string> floatTextureNames, spectrumTextureNames, instanceNames;
int currentMaterialIndex = 0, currentLightIndex = -1; int currentMaterialIndex = 0, currentLightIndex = -1;
// These have to wait until WorldBegin to be passed along since they
// may be updated until then.
SceneEntity film, sampler, integrator, filter, accelerator; SceneEntity film, sampler, integrator, filter, accelerator;
CameraSceneEntity camera; CameraSceneEntity camera;
}; };
......
...@@ -120,8 +120,7 @@ WavefrontPathIntegrator::WavefrontPathIntegrator( ...@@ -120,8 +120,7 @@ WavefrontPathIntegrator::WavefrontPathIntegrator(
return iter->second; return iter->second;
}; };
filter = Filter::Create(scene.filter.name, scene.filter.parameters, &scene.filter.loc, filter = scene.CreateFilter();
alloc);
Float exposureTime = scene.camera.parameters.GetOneFloat("shutterclose", 1.f) - Float exposureTime = scene.camera.parameters.GetOneFloat("shutterclose", 1.f) -
scene.camera.parameters.GetOneFloat("shutteropen", 0.f); scene.camera.parameters.GetOneFloat("shutteropen", 0.f);
...@@ -130,17 +129,14 @@ WavefrontPathIntegrator::WavefrontPathIntegrator( ...@@ -130,17 +129,14 @@ WavefrontPathIntegrator::WavefrontPathIntegrator(
"The specified camera shutter times imply that the shutter " "The specified camera shutter times imply that the shutter "
"does not open. A black image will result."); "does not open. A black image will result.");
film = Film::Create(scene.film.name, scene.film.parameters, exposureTime, film = scene.CreateFilm(exposureTime, filter);
scene.camera.cameraTransform, filter, &scene.film.loc, alloc);
initializeVisibleSurface = film.UsesVisibleSurface(); initializeVisibleSurface = film.UsesVisibleSurface();
sampler = Sampler::Create(scene.sampler.name, scene.sampler.parameters, sampler = scene.CreateSampler(film.FullResolution());
film.FullResolution(), &scene.sampler.loc, alloc);
samplesPerPixel = sampler.SamplesPerPixel(); samplesPerPixel = sampler.SamplesPerPixel();
Medium cameraMedium = findMedium(scene.camera.medium, &scene.camera.loc); Medium cameraMedium = findMedium(scene.camera.medium, &scene.camera.loc);
camera = Camera::Create(scene.camera.name, scene.camera.parameters, cameraMedium, camera = scene.CreateCamera(cameraMedium, film);
scene.camera.cameraTransform, film, &scene.camera.loc, alloc);
// Textures // Textures
LOG_VERBOSE("Starting to create textures"); LOG_VERBOSE("Starting to create textures");
...@@ -165,7 +161,7 @@ WavefrontPathIntegrator::WavefrontPathIntegrator( ...@@ -165,7 +161,7 @@ WavefrontPathIntegrator::WavefrontPathIntegrator(
LOG_VERBOSE("Starting to create materials"); LOG_VERBOSE("Starting to create materials");
std::map<std::string, pbrt::Material> namedMaterials; std::map<std::string, pbrt::Material> namedMaterials;
std::vector<pbrt::Material> materials; std::vector<pbrt::Material> materials;
scene.CreateMaterials(textures, threadAllocators, &namedMaterials, &materials); scene.CreateMaterials(textures, &namedMaterials, &materials);
haveBasicEvalMaterial.fill(false); haveBasicEvalMaterial.fill(false);
haveUniversalEvalMaterial.fill(false); haveUniversalEvalMaterial.fill(false);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册