diff --git a/CMakeLists.txt b/CMakeLists.txt index 062abeb..1ee3f9f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,41 +5,52 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON) project(Moer-lite LANGUAGES CXX) +if(MSVC) + add_compile_options("/MP") + add_compile_options("$<$:/utf-8>") + add_compile_options("$<$:/utf-8>") +endif(MSVC) + +if(WIN32) + add_definitions(-DUNICODE -D_UNICODE) + add_definitions(-DNOMINMAX) +endif() + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/target/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/target/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/target/bin) add_subdirectory(./externals) -add_executable(Moer -src/main.cpp - -src/CoreLayer/Math/Transform.cpp - -src/FunctionLayer/Acceleration/EmbreeBVH.cpp -src/FunctionLayer/Integrator/NormalIntegrator.cpp -src/FunctionLayer/Integrator/DirectIntegrator.cpp -src/FunctionLayer/Camera/Camera.cpp -src/FunctionLayer/Camera/Pinhole.cpp -src/FunctionLayer/Scene/Scene.cpp -src/FunctionLayer/Light/SpotLight.cpp -src/FunctionLayer/Light/AreaLight.cpp -src/FunctionLayer/Light/EnvironmentLight.cpp -src/FunctionLayer/Shape/Shape.cpp -src/FunctionLayer/Shape/Triangle.cpp -src/FunctionLayer/Shape/Sphere.cpp -src/FunctionLayer/Shape/Parallelogram.cpp -src/FunctionLayer/Texture/NormalTexture.cpp -src/FunctionLayer/Texture/ImageTexture.cpp -src/FunctionLayer/Texture/Texture.cpp -src/FunctionLayer/Texture/Mipmap.cpp -src/FunctionLayer/Material/Matte.cpp -src/FunctionLayer/Material/Mirror.cpp -src/FunctionLayer/Material/Material.cpp -src/FunctionLayer/Sampler/IndependentSampler.cpp -src/ResourceLayer/Image.cpp -src/ResourceLayer/Mesh.cpp -src/ResourceLayer/FileUtil.cpp +add_executable(Moer + src/main.cpp + + src/CoreLayer/Math/Transform.cpp + + src/FunctionLayer/Acceleration/EmbreeBVH.cpp + src/FunctionLayer/Integrator/NormalIntegrator.cpp + src/FunctionLayer/Integrator/DirectIntegrator.cpp + src/FunctionLayer/Camera/Camera.cpp + src/FunctionLayer/Camera/Pinhole.cpp + src/FunctionLayer/Scene/Scene.cpp + src/FunctionLayer/Light/SpotLight.cpp + src/FunctionLayer/Light/AreaLight.cpp + src/FunctionLayer/Light/EnvironmentLight.cpp + src/FunctionLayer/Shape/Shape.cpp + src/FunctionLayer/Shape/Triangle.cpp + src/FunctionLayer/Shape/Sphere.cpp + src/FunctionLayer/Shape/Parallelogram.cpp + src/FunctionLayer/Texture/NormalTexture.cpp + src/FunctionLayer/Texture/ImageTexture.cpp + src/FunctionLayer/Texture/Texture.cpp + src/FunctionLayer/Texture/Mipmap.cpp + src/FunctionLayer/Material/Matte.cpp + src/FunctionLayer/Material/Mirror.cpp + src/FunctionLayer/Material/Material.cpp + src/FunctionLayer/Sampler/IndependentSampler.cpp + src/ResourceLayer/Image.cpp + src/ResourceLayer/Mesh.cpp + src/ResourceLayer/FileUtil.cpp ) target_include_directories(Moer PUBLIC ./externals) @@ -47,14 +58,28 @@ target_include_directories(Moer PUBLIC ./src) target_include_directories(Moer PUBLIC ./externals/json/include) target_include_directories(Moer PUBLIC ./externals/embree/include) -if (WIN32) - target_link_directories(Moer PUBLIC ${PROJECT_SOURCE_DIR}/libs/win) +if(WIN32) + set(LIBS_PATH ${PROJECT_SOURCE_DIR}/libs/win) + set(EMBREE_DLL ${LIBS_PATH}/embree3.dll ${LIBS_PATH}/tbb12.dll) endif() -if (UNIX AND NOT APPLE) - target_link_directories(Moer PUBLIC ${PROJECT_SOURCE_DIR}/libs/linux) + +if(UNIX AND NOT APPLE) + set(LIBS_PATH ${PROJECT_SOURCE_DIR}/libs/linux) + set(EMBREE_DLL ${LIBS_PATH}/libembree3.so.3 ${LIBS_PATH}/libtbb.so.12.2) endif() -if (APPLE) - target_link_directories(Moer PUBLIC ${PROJECT_SOURCE_DIR}/libs/macos) + +if(APPLE) + set(LIBS_PATH ${PROJECT_SOURCE_DIR}/libs/macos) + set(EMBREE_DLL ${LIBS_PATH}/libembree3.3.dylib ${LIBS_PATH}/libtbb.12.2.dylib) endif() + +target_link_directories(Moer PUBLIC ${LIBS_PATH}) target_link_directories(Moer PUBLIC ${PROJECT_SOURCE_DIR}/target/lib) -target_link_libraries(Moer embree3 tinyobjloader) \ No newline at end of file + +add_custom_command(TARGET Moer POST_BUILD + DEPENDS ${LIBS_PATH}/embree3.dll + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${EMBREE_DLL} $) + +target_link_libraries(Moer PUBLIC embree3) +target_link_libraries(Moer PUBLIC tinyobjloader) \ No newline at end of file diff --git a/examples/bunny/scene.json b/examples/bunny/scene.json index b668aa9..1585de7 100644 --- a/examples/bunny/scene.json +++ b/examples/bunny/scene.json @@ -1,6 +1,6 @@ { "output" : { - "filename" : "bunny-1.hdr" + "filename" : "bunny-2.hdr" }, "sampler" : { "type" : "independent", diff --git a/libs/win/embree3.dll b/libs/win/embree3.dll new file mode 100644 index 0000000..0b42735 Binary files /dev/null and b/libs/win/embree3.dll differ diff --git a/libs/win/tbb12.dll b/libs/win/tbb12.dll new file mode 100644 index 0000000..a27b0f0 Binary files /dev/null and b/libs/win/tbb12.dll differ diff --git a/src/CoreLayer/Math/Constant.h b/src/CoreLayer/Math/Constant.h index 8402fdf..357cb91 100644 --- a/src/CoreLayer/Math/Constant.h +++ b/src/CoreLayer/Math/Constant.h @@ -1,7 +1,12 @@ #pragma once +#define _USE_MATH_DEFINES #include #include +#ifdef FLT_MAX +#undef FLT_MAX +#endif // FLT_MAX + constexpr float PI = M_PI; constexpr float INV_PI = 1.f / M_PI; constexpr float FLT_MAX = std::numeric_limits::max(); diff --git a/src/CoreLayer/Math/Geometry.h b/src/CoreLayer/Math/Geometry.h index 68699d0..4ed2895 100644 --- a/src/CoreLayer/Math/Geometry.h +++ b/src/CoreLayer/Math/Geometry.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include //* 对于绝大部分图形应用来说,32位的浮点数足以满足计算精度需求且速度更快,故lite版仅支持float diff --git a/src/main.cpp b/src/main.cpp index 0b69070..f5fa0dc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,10 +8,22 @@ #include #include #include +#include #include #include #include +#define PBSTR "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||" +#define PBWIDTH 60 + +inline void printProgress(float percentage) { + int val = (int)(percentage * 100); + int lpad = (int)(percentage * PBWIDTH); + int rpad = PBWIDTH - lpad; + printf("\r%3d%% [%.*s%*s]", val, lpad, PBSTR, rpad, ""); + fflush(stdout); +} + int main(int argc, char **argv) { const std::string sceneDir = std::string(argv[1]); FileUtil::setWorkingDirectory(sceneDir); @@ -24,6 +36,9 @@ int main(int argc, char **argv) { auto sampler = Factory::construct_class(json["sampler"]); int spp = sampler->xSamples * sampler->ySamples; int width = camera->film->size[0], height = camera->film->size[1]; + + auto start = std::chrono::system_clock::now(); + for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { Vector2f NDC{(float)x / width, (float)y / height}; @@ -34,8 +49,21 @@ int main(int argc, char **argv) { li += integrator->li(ray, *scene, sampler); } camera->film->deposit({x, y}, li / spp); + + int finished = x + y * width; + if (finished % 5 == 0) { + printProgress((float)finished / (height * width)); + } } } + printProgress(1.f); + + auto end = std::chrono::system_clock::now(); + + printf("\nRendering costs %.2fs\n", + (std::chrono::duration_cast(end - start)) + .count() / + 1000.f); //* 目前支持输出为png/hdr两种格式 std::string outputName =