forked from bartvdbraak/blender
Cycles Standalone: The camera now gets properly updated, when changing window size or using --width --height overwrites.
This commit is contained in:
parent
2bf591762a
commit
8cc925a216
@ -114,15 +114,25 @@ static void session_init()
|
|||||||
options.scene = NULL;
|
options.scene = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void scene_init(int width, int height)
|
static void scene_init()
|
||||||
{
|
{
|
||||||
options.scene = new Scene(options.scene_params, options.session_params.device);
|
options.scene = new Scene(options.scene_params, options.session_params.device);
|
||||||
|
|
||||||
|
/* Read XML */
|
||||||
xml_read_file(options.scene, options.filepath.c_str());
|
xml_read_file(options.scene, options.filepath.c_str());
|
||||||
|
|
||||||
if (width == 0 || height == 0) {
|
/* Camera width/height override? */
|
||||||
|
if (!(options.width == 0 || options.height == 0)) {
|
||||||
|
options.scene->camera->width = options.width;
|
||||||
|
options.scene->camera->height = options.height;
|
||||||
|
}
|
||||||
|
else {
|
||||||
options.width = options.scene->camera->width;
|
options.width = options.scene->camera->width;
|
||||||
options.height = options.scene->camera->height;
|
options.height = options.scene->camera->height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Calculate Viewplane */
|
||||||
|
options.scene->camera->compute_auto_viewplane();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void session_exit()
|
static void session_exit()
|
||||||
@ -216,8 +226,16 @@ static void resize(int width, int height)
|
|||||||
options.width = width;
|
options.width = width;
|
||||||
options.height = height;
|
options.height = height;
|
||||||
|
|
||||||
if(options.session)
|
if(options.session) {
|
||||||
|
/* Update camera */
|
||||||
|
options.session->scene->camera->width = width;
|
||||||
|
options.session->scene->camera->height = height;
|
||||||
|
options.session->scene->camera->compute_auto_viewplane();
|
||||||
|
options.session->scene->camera->need_update = true;
|
||||||
|
options.session->scene->camera->need_device_update = true;
|
||||||
|
|
||||||
options.session->reset(session_buffer_params(), options.session_params.samples);
|
options.session->reset(session_buffer_params(), options.session_params.samples);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void keyboard(unsigned char key)
|
static void keyboard(unsigned char key)
|
||||||
@ -360,12 +378,12 @@ static void options_parse(int argc, const char **argv)
|
|||||||
fprintf(stderr, "No file path specified\n");
|
fprintf(stderr, "No file path specified\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For smoother Viewport */
|
/* For smoother Viewport */
|
||||||
options.session_params.start_resolution = 64;
|
options.session_params.start_resolution = 64;
|
||||||
|
|
||||||
/* load scene */
|
/* load scene */
|
||||||
scene_init(options.width, options.height);
|
scene_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
CCL_NAMESPACE_END
|
CCL_NAMESPACE_END
|
||||||
|
@ -289,21 +289,6 @@ static void xml_read_camera(const XMLReadState& state, pugi::xml_node node)
|
|||||||
xml_read_int(&cam->width, node, "width");
|
xml_read_int(&cam->width, node, "width");
|
||||||
xml_read_int(&cam->height, node, "height");
|
xml_read_int(&cam->height, node, "height");
|
||||||
|
|
||||||
float aspect = (float)cam->width/(float)cam->height;
|
|
||||||
|
|
||||||
if(cam->width >= cam->height) {
|
|
||||||
cam->viewplane.left = -aspect;
|
|
||||||
cam->viewplane.right = aspect;
|
|
||||||
cam->viewplane.bottom = -1.0f;
|
|
||||||
cam->viewplane.top = 1.0f;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
cam->viewplane.left = -1.0f;
|
|
||||||
cam->viewplane.right = 1.0f;
|
|
||||||
cam->viewplane.bottom = -1.0f/aspect;
|
|
||||||
cam->viewplane.top = 1.0f/aspect;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(xml_read_float(&cam->fov, node, "fov"))
|
if(xml_read_float(&cam->fov, node, "fov"))
|
||||||
cam->fov *= M_PI/180.0f;
|
cam->fov *= M_PI/180.0f;
|
||||||
|
|
||||||
@ -333,7 +318,6 @@ static void xml_read_camera(const XMLReadState& state, pugi::xml_node node)
|
|||||||
xml_read_float(&cam->sensorwidth, node, "sensorwidth");
|
xml_read_float(&cam->sensorwidth, node, "sensorwidth");
|
||||||
xml_read_float(&cam->sensorheight, node, "sensorheight");
|
xml_read_float(&cam->sensorheight, node, "sensorheight");
|
||||||
|
|
||||||
|
|
||||||
cam->matrix = state.tfm;
|
cam->matrix = state.tfm;
|
||||||
|
|
||||||
cam->need_update = true;
|
cam->need_update = true;
|
||||||
|
@ -78,6 +78,24 @@ Camera::~Camera()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Camera::compute_auto_viewplane()
|
||||||
|
{
|
||||||
|
float aspect = (float)width/(float)height;
|
||||||
|
|
||||||
|
if(width >= height) {
|
||||||
|
viewplane.left = -aspect;
|
||||||
|
viewplane.right = aspect;
|
||||||
|
viewplane.bottom = -1.0f;
|
||||||
|
viewplane.top = 1.0f;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
viewplane.left = -1.0f;
|
||||||
|
viewplane.right = 1.0f;
|
||||||
|
viewplane.bottom = -1.0f/aspect;
|
||||||
|
viewplane.top = 1.0f/aspect;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Camera::update()
|
void Camera::update()
|
||||||
{
|
{
|
||||||
if(!need_update)
|
if(!need_update)
|
||||||
|
@ -102,6 +102,8 @@ public:
|
|||||||
/* functions */
|
/* functions */
|
||||||
Camera();
|
Camera();
|
||||||
~Camera();
|
~Camera();
|
||||||
|
|
||||||
|
void compute_auto_viewplane();
|
||||||
|
|
||||||
void update();
|
void update();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user