fe731686fb
Basically the title says it all, volume stack initialization now is aware that camera might be inside of the volume. This gives quite noticeable render time regressions in cases camera is in the volume (didn't measure them yet) because this requires quite a few of ray-casting per camera ray in order to check which objects we're inside. Not quite sure if this might be optimized. But the good thing is that we can do quite a good job on detecting whether camera is outside of any of the volumes and in this case there should be no time penalty at all (apart from some extra checks during the sync state). For now we're only doing rather simple AABB checks between the viewplane and volume objects. This could give some false-positives, but this should be good starting point. Need to mention panoramic cameras here, for them it's only check for whether there are volumes in the scene, which would lead to speed regressions even if the camera is outside of the volumes. Would need to figure out proper check for such cameras. There are still quite a few of TODOs in the code, but the patch is good enough to start playing around with it checking whether there are some obvious mistakes somewhere. Currently the feature is only available in the Experimental feature sey, need to solve some of the TODOs and look into making things faster before considering the feature is ready for the official feature set. This would still likely happen in current release cycle. Reviewers: brecht, juicyfruit, dingto Differential Revision: https://developer.blender.org/D794
135 lines
2.6 KiB
C++
135 lines
2.6 KiB
C++
/*
|
|
* Copyright 2011-2013 Blender Foundation
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License
|
|
*/
|
|
|
|
#ifndef __CAMERA_H__
|
|
#define __CAMERA_H__
|
|
|
|
#include "kernel_types.h"
|
|
|
|
#include "util_boundbox.h"
|
|
#include "util_transform.h"
|
|
#include "util_types.h"
|
|
|
|
CCL_NAMESPACE_BEGIN
|
|
|
|
class Device;
|
|
class DeviceScene;
|
|
class Scene;
|
|
|
|
/* Camera
|
|
*
|
|
* The camera parameters are quite standard, tested to be both compatible with
|
|
* Renderman, and Blender after remapping. */
|
|
|
|
class Camera {
|
|
public:
|
|
/* motion blur */
|
|
float shuttertime;
|
|
|
|
/* depth of field */
|
|
float focaldistance;
|
|
float aperturesize;
|
|
uint blades;
|
|
float bladesrotation;
|
|
|
|
/* type */
|
|
CameraType type;
|
|
float fov;
|
|
|
|
/* panorama */
|
|
PanoramaType panorama_type;
|
|
float fisheye_fov;
|
|
float fisheye_lens;
|
|
|
|
/* anamorphic lens bokeh */
|
|
float aperture_ratio;
|
|
|
|
/* sensor */
|
|
float sensorwidth;
|
|
float sensorheight;
|
|
|
|
/* clipping */
|
|
float nearclip;
|
|
float farclip;
|
|
|
|
/* screen */
|
|
int width, height;
|
|
int resolution;
|
|
BoundBox2D viewplane;
|
|
|
|
/* border */
|
|
BoundBox2D border;
|
|
|
|
/* transformation */
|
|
Transform matrix;
|
|
|
|
/* motion */
|
|
MotionTransform motion;
|
|
bool use_motion;
|
|
|
|
/* computed camera parameters */
|
|
Transform screentoworld;
|
|
Transform rastertoworld;
|
|
Transform ndctoworld;
|
|
Transform cameratoworld;
|
|
|
|
Transform worldtoraster;
|
|
Transform worldtoscreen;
|
|
Transform worldtondc;
|
|
Transform worldtocamera;
|
|
|
|
Transform rastertocamera;
|
|
Transform cameratoraster;
|
|
|
|
float3 dx;
|
|
float3 dy;
|
|
|
|
/* update */
|
|
bool need_update;
|
|
bool need_device_update;
|
|
int previous_need_motion;
|
|
|
|
/* Camera in volume. */
|
|
/* TODO(sergey): Get rid of this argument once
|
|
* cameras in volume considered fast enough for
|
|
* the regular kernel.
|
|
*/
|
|
bool use_camera_in_volume;
|
|
|
|
/* functions */
|
|
Camera();
|
|
~Camera();
|
|
|
|
void compute_auto_viewplane();
|
|
|
|
void update();
|
|
|
|
void device_update(Device *device, DeviceScene *dscene, Scene *scene);
|
|
void device_free(Device *device, DeviceScene *dscene);
|
|
|
|
bool modified(const Camera& cam);
|
|
bool motion_modified(const Camera& cam);
|
|
void tag_update();
|
|
|
|
BoundBox viewplane_bounds_get();
|
|
float3 transform_raster_to_world(float raster_x, float raster_y);
|
|
};
|
|
|
|
CCL_NAMESPACE_END
|
|
|
|
#endif /* __CAMERA_H__ */
|
|
|