WIP example02, simple ray tracing
This commit is contained in:
parent
ca8ca5928c
commit
d8ce741d76
7 changed files with 241 additions and 0 deletions
3
example02/.gitignore
vendored
Normal file
3
example02/.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
build*/
|
||||||
|
compile_commands.json
|
||||||
|
.cache/
|
22
example02/CMakeLists.txt
Normal file
22
example02/CMakeLists.txt
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
cmake_minimum_required(VERSION 3.9)
|
||||||
|
project(Example02)
|
||||||
|
|
||||||
|
set(Example02_SOURCES
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/argParse.cpp"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/rayTracer.cpp")
|
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS "-Wall -Wextra -Wpedantic")
|
||||||
|
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
|
||||||
|
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
|
||||||
|
|
||||||
|
if(NOT CMAKE_BUILD_TYPE OR "${CMAKE_BUILD_TYPE}" MATCHES ^$)
|
||||||
|
set(CMAKE_BUILD_TYPE "Debug")
|
||||||
|
message("CMAKE_BUILD_TYPE is set to Debug by default")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_executable(Example02
|
||||||
|
${Example02_SOURCES})
|
||||||
|
|
||||||
|
target_link_libraries(Example02 PUBLIC pthread)
|
||||||
|
target_compile_features(Example02 PUBLIC cxx_std_17)
|
35
example02/src/argParse.cpp
Normal file
35
example02/src/argParse.cpp
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
#include "argParse.hpp"
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
Ex02::ArgParse::ParseResult Ex02::ArgParse::parseArgs(
|
||||||
|
int argc,
|
||||||
|
char **argv,
|
||||||
|
const Ex02::ArgParse::ArgsType &singleArgs,
|
||||||
|
const Ex02::ArgParse::ArgsType &doubleArgs) {
|
||||||
|
ParseResult result;
|
||||||
|
bool found;
|
||||||
|
--argc; ++argv;
|
||||||
|
while(argc > 0) {
|
||||||
|
found = false;
|
||||||
|
for(const std::string &singleArg : singleArgs) {
|
||||||
|
if(std::strcmp(argv[0], singleArg.c_str()) == 0) {
|
||||||
|
result.insert({singleArg, EX02_ARG_PARSE_SINGLE_ARG_PLACEHOLDER});
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!found && argc > 1) {
|
||||||
|
for(const std::string &doubleArg: doubleArgs) {
|
||||||
|
if(std::strcmp(argv[0], doubleArg.c_str()) == 0) {
|
||||||
|
result.insert({doubleArg, argv[1]});
|
||||||
|
--argc; ++argv;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
--argc; ++argv;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
21
example02/src/argParse.hpp
Normal file
21
example02/src/argParse.hpp
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
#ifndef EXAMPLE_02_ARG_PARSE_HPP
|
||||||
|
#define EXAMPLE_02_ARG_PARSE_HPP
|
||||||
|
|
||||||
|
#define EX02_ARG_PARSE_SINGLE_ARG_PLACEHOLDER "SINGLE_ARG_PLACEHOLDER"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <unordered_set>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
namespace Ex02 {
|
||||||
|
namespace ArgParse {
|
||||||
|
|
||||||
|
typedef std::unordered_set<std::string> ArgsType;
|
||||||
|
typedef std::unordered_map<std::string, std::string> ParseResult;
|
||||||
|
|
||||||
|
ParseResult parseArgs(int argc, char **argv, const ArgsType &singleArgs, const ArgsType &doubleArgs);
|
||||||
|
|
||||||
|
} // namespace ArgParse
|
||||||
|
} // namespace Ex02
|
||||||
|
|
||||||
|
#endif
|
72
example02/src/main.cpp
Normal file
72
example02/src/main.cpp
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "argParse.hpp"
|
||||||
|
|
||||||
|
void printHelp() {
|
||||||
|
std::cout << "Usage:\n"
|
||||||
|
"-h | --help Display this help message\n"
|
||||||
|
"-t <integer>\n"
|
||||||
|
" | --threads <integer> Set the number of threads to use (default 1)"
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
int threadCount = 1;
|
||||||
|
|
||||||
|
{
|
||||||
|
auto results = Ex02::ArgParse::parseArgs(
|
||||||
|
argc,
|
||||||
|
argv,
|
||||||
|
{ // single args
|
||||||
|
"-h",
|
||||||
|
"--help",
|
||||||
|
},
|
||||||
|
{ // double args
|
||||||
|
"-t",
|
||||||
|
"--threads",
|
||||||
|
});
|
||||||
|
|
||||||
|
if(auto iter = results.find("-h"); iter != results.end()) {
|
||||||
|
printHelp();
|
||||||
|
return 0;
|
||||||
|
} else if(auto iter = results.find("--help"); iter != results.end()) {
|
||||||
|
printHelp();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto setThreadCount = [&threadCount] (auto iter) {
|
||||||
|
try {
|
||||||
|
threadCount = std::stoi(iter->second);
|
||||||
|
} catch (const std::invalid_argument &e) {
|
||||||
|
std::cout << "ERROR: Failed to parse thread count (invalid)"
|
||||||
|
<< std::endl;
|
||||||
|
return 1;
|
||||||
|
} catch (const std::out_of_range &e) {
|
||||||
|
std::cout << "ERROR: Failed to parse thread count (out of range)"
|
||||||
|
<< std::endl;
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
if(auto iter = results.find("-t"); iter != results.end()) {
|
||||||
|
if(int result = setThreadCount(iter); result != 0) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
} else if(auto iter = results.find("--threads"); iter != results.end()) {
|
||||||
|
if(int result = setThreadCount(iter); result != 0) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(threadCount <= 0) {
|
||||||
|
std::cout << "ERROR: Thread count set to invalid value ("
|
||||||
|
<< threadCount
|
||||||
|
<< ')'
|
||||||
|
<< std::endl;
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
52
example02/src/rayTracer.cpp
Normal file
52
example02/src/rayTracer.cpp
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
#include "rayTracer.hpp"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
#include <glm/matrix.hpp>
|
||||||
|
#include <glm/gtc/matrix_transform.hpp>
|
||||||
|
#include <glm/ext/matrix_transform.hpp>
|
||||||
|
|
||||||
|
const float PI = std::acos(-1.0f);
|
||||||
|
|
||||||
|
glm::vec3 Ex02::RT::Internal::defaultSpherePos() {
|
||||||
|
// the default model matrix pushes everything back 2 units,
|
||||||
|
// so it should be ok to define the sphere at location 0
|
||||||
|
return glm::vec3{0.0f, 0.0f, 0.0f};
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::vec3 Ex02::RT::Internal::defaultLightPos() {
|
||||||
|
return glm::vec3{1.0f, 1.0f, 1.0f};
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::mat4x4 Ex02::RT::Internal::defaultMVP() {
|
||||||
|
glm::mat4x4 mvp = glm::perspective(
|
||||||
|
PI / 2.0f,
|
||||||
|
1.0f,
|
||||||
|
EX02_RAY_TRACER_DEFAULT_NEAR_PLANE,
|
||||||
|
EX02_RAY_TRACER_DEFAULT_FAR_PLANE);
|
||||||
|
|
||||||
|
mvp *= glm::lookAt(
|
||||||
|
glm::vec3{0.0f, 0.0f, 0.0f},
|
||||||
|
glm::vec3{0.0f, 0.0f, -1.0f},
|
||||||
|
glm::vec3{0.0f, 1.0f, 0.0f});
|
||||||
|
|
||||||
|
// model pushes back by 2 units
|
||||||
|
mvp *= glm::translate(
|
||||||
|
glm::identity<glm::mat4x4>(),
|
||||||
|
glm::vec3{0.0f, 0.0f, -2.0f});
|
||||||
|
|
||||||
|
return mvp;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<unsigned char> Ex02::RT::renderGraySphere(
|
||||||
|
unsigned int outputWidth,
|
||||||
|
unsigned int outputHeight,
|
||||||
|
float sphereRadius,
|
||||||
|
int threadCount,
|
||||||
|
glm::vec3 spherePos,
|
||||||
|
glm::vec3 lightPos,
|
||||||
|
glm::mat4x4 mvp) {
|
||||||
|
std::vector<unsigned char> grayscalePixels;
|
||||||
|
|
||||||
|
return grayscalePixels;
|
||||||
|
}
|
36
example02/src/rayTracer.hpp
Normal file
36
example02/src/rayTracer.hpp
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
#ifndef EX02_RAY_TRACER_HPP
|
||||||
|
#define EX02_RAY_TRACER_HPP
|
||||||
|
|
||||||
|
#define EX02_RAY_TRACER_DEFAULT_NEAR_PLANE 0.2f
|
||||||
|
#define EX02_RAY_TRACER_DEFAULT_FAR_PLANE 4.0f
|
||||||
|
#define EX02_RAY_TRACER_COLL_INCREMENT 2.0f
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <glm/vec3.hpp>
|
||||||
|
#include <glm/mat4x4.hpp>
|
||||||
|
#include <glm/matrix.hpp>
|
||||||
|
|
||||||
|
namespace Ex02 {
|
||||||
|
namespace RT {
|
||||||
|
|
||||||
|
namespace Internal {
|
||||||
|
glm::vec3 defaultSpherePos();
|
||||||
|
glm::vec3 defaultLightPos();
|
||||||
|
glm::mat4x4 defaultMVP();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<unsigned char> renderGraySphere(
|
||||||
|
unsigned int outputWidth,
|
||||||
|
unsigned int outputHeight,
|
||||||
|
float sphereRadius,
|
||||||
|
int threadCount = 1,
|
||||||
|
glm::vec3 spherePos = Internal::defaultSpherePos(),
|
||||||
|
glm::vec3 lightPos = Internal::defaultLightPos(),
|
||||||
|
glm::mat4x4 mvp = Internal::defaultMVP()
|
||||||
|
);
|
||||||
|
|
||||||
|
} // namespace RT
|
||||||
|
} // namespace Ex02
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue