Merging from trunk r59488 into soc-2013-motion_track
This commit is contained in:
@@ -416,6 +416,10 @@ if(WITH_PYTHON_MODULE)
|
||||
set(WITH_HEADLESS ON)
|
||||
endif()
|
||||
|
||||
if(NOT WITH_PYTHON)
|
||||
set(WITH_CYCLES OFF)
|
||||
endif()
|
||||
|
||||
# enable boost for cycles, booleans, audaspace or i18n
|
||||
# otherwise if the user disabled
|
||||
if(NOT WITH_BOOST)
|
||||
|
@@ -212,6 +212,7 @@ ILMBASE_SOURCE="http://download.savannah.nongnu.org/releases/openexr/ilmbase-$IL
|
||||
OPENEXR_FORCE_REBUILD=false
|
||||
OPENEXR_SKIP=false
|
||||
_with_built_openexr=false
|
||||
_need_openexr_ldconfig=false
|
||||
|
||||
OIIO_VERSION="1.1.10"
|
||||
OIIO_SOURCE="https://github.com/OpenImageIO/oiio/archive/Release-$OIIO_VERSION.tar.gz"
|
||||
@@ -230,6 +231,7 @@ LLVM_SKIP=false
|
||||
|
||||
# OSL needs to be compiled for now!
|
||||
OSL_VERSION="1.3.2"
|
||||
OSL_VERSION_MIN=$OSL_VERSION
|
||||
OSL_SOURCE="https://github.com/imageworks/OpenShadingLanguage/archive/Release-$OSL_VERSION.tar.gz"
|
||||
OSL_FORCE_REBUILD=false
|
||||
OSL_SKIP=false
|
||||
@@ -237,6 +239,7 @@ OSL_SKIP=false
|
||||
# Version??
|
||||
OPENCOLLADA_VERSION="1.3"
|
||||
OPENCOLLADA_SOURCE="https://github.com/KhronosGroup/OpenCOLLADA.git"
|
||||
OPENCOLLADA_REPO_UID="828b60384552b83e55d2af7055f07d2c40b4d3f4"
|
||||
OPENCOLLADA_FORCE_REBUILD=false
|
||||
OPENCOLLADA_SKIP=false
|
||||
|
||||
@@ -1632,7 +1635,7 @@ clean_OpenCOLLADA() {
|
||||
|
||||
compile_OpenCOLLADA() {
|
||||
# To be changed each time we make edits that would modify the compiled results!
|
||||
opencollada_magic=6
|
||||
opencollada_magic=7
|
||||
_init_opencollada
|
||||
|
||||
# Clean install if needed!
|
||||
@@ -1657,7 +1660,7 @@ compile_OpenCOLLADA() {
|
||||
git pull origin master
|
||||
|
||||
# Stick to same rev as windows' libs...
|
||||
git checkout e886e196673222f2f4bc32b936dc96419fff815f
|
||||
git checkout $OPENCOLLADA_REPO_UID
|
||||
git reset --hard
|
||||
|
||||
# Always refresh the whole build!
|
||||
@@ -2775,7 +2778,7 @@ install_ARCH() {
|
||||
if [ $? -eq 0 ]; then
|
||||
install_packages_ARCH llvm clang
|
||||
have_llvm=true
|
||||
LLVM_VERSION=`check_package_version_ge_ARCH llvm`
|
||||
LLVM_VERSION=`check_package_version_ge_ARCH llvm $LLVM_VERSION_MIN`
|
||||
LLVM_VERSION_FOUND=$LLVM_VERSION
|
||||
clean_LLVM
|
||||
else
|
||||
|
@@ -52,6 +52,7 @@ if USE_QUIET:
|
||||
|
||||
def main():
|
||||
source_info = project_source_info.build_info(ignore_prefix_list=CHECKER_IGNORE_PREFIX)
|
||||
source_defines = project_source_info.build_defines_as_args()
|
||||
|
||||
check_commands = []
|
||||
for c, inc_dirs, defs in source_info:
|
||||
@@ -59,7 +60,8 @@ def main():
|
||||
CHECKER_ARGS +
|
||||
[c] +
|
||||
[("-I%s" % i) for i in inc_dirs] +
|
||||
[("-D%s" % d) for d in defs]
|
||||
[("-D%s" % d) for d in defs] +
|
||||
source_defines
|
||||
)
|
||||
|
||||
check_commands.append((c, cmd))
|
||||
|
@@ -44,6 +44,7 @@ USE_QUIET = (os.environ.get("QUIET", None) is not None)
|
||||
|
||||
def main():
|
||||
source_info = project_source_info.build_info(use_cxx=False, ignore_prefix_list=CHECKER_IGNORE_PREFIX)
|
||||
source_defines = project_source_info.build_defines_as_args()
|
||||
|
||||
check_commands = []
|
||||
for c, inc_dirs, defs in source_info:
|
||||
@@ -52,7 +53,8 @@ def main():
|
||||
CHECKER_ARGS +
|
||||
[c] +
|
||||
[("-I%s" % i) for i in inc_dirs] +
|
||||
[("-D%s" % d) for d in defs]
|
||||
[("-D%s" % d) for d in defs] +
|
||||
source_defines
|
||||
)
|
||||
|
||||
check_commands.append((c, cmd))
|
||||
|
@@ -42,6 +42,7 @@ USE_QUIET = (os.environ.get("QUIET", None) is not None)
|
||||
|
||||
def main():
|
||||
source_info = project_source_info.build_info(use_cxx=False, ignore_prefix_list=CHECKER_IGNORE_PREFIX)
|
||||
source_defines = project_source_info.build_defines_as_args()
|
||||
|
||||
check_commands = []
|
||||
for c, inc_dirs, defs in source_info:
|
||||
@@ -50,7 +51,8 @@ def main():
|
||||
CHECKER_ARGS +
|
||||
[c] +
|
||||
[("-I%s" % i) for i in inc_dirs] +
|
||||
[("-D%s" % d) for d in defs]
|
||||
[("-D%s" % d) for d in defs] +
|
||||
source_defines
|
||||
)
|
||||
|
||||
check_commands.append((c, cmd))
|
||||
|
@@ -799,4 +799,35 @@ macro(data_to_c_simple
|
||||
unset(_file_from)
|
||||
unset(_file_to)
|
||||
unset(_file_to_path)
|
||||
|
||||
endmacro()
|
||||
|
||||
macro(svg_to_png
|
||||
file_from
|
||||
file_to
|
||||
dpi
|
||||
list_to_add)
|
||||
|
||||
# remove ../'s
|
||||
get_filename_component(_file_from ${CMAKE_CURRENT_SOURCE_DIR}/${file_from} REALPATH)
|
||||
get_filename_component(_file_to ${CMAKE_CURRENT_SOURCE_DIR}/${file_to} REALPATH)
|
||||
|
||||
list(APPEND ${list_to_add} ${_file_to})
|
||||
|
||||
find_program(INKSCAPE_EXE inkscape)
|
||||
mark_as_advanced(INKSCAPE_EXE)
|
||||
|
||||
if(INKSCAPE_EXE)
|
||||
add_custom_command(
|
||||
OUTPUT ${_file_to}
|
||||
COMMAND ${INKSCAPE_EXE} ${_file_from} --export-dpi=${dpi} --without-gui --export-png=${_file_to}
|
||||
DEPENDS ${_file_from} ${INKSCAPE_EXE}
|
||||
)
|
||||
else()
|
||||
message(WARNING "Inkscape not found, could not re-generate ${_file_to} from ${_file_from}!")
|
||||
endif()
|
||||
|
||||
unset(_file_from)
|
||||
unset(_file_to)
|
||||
|
||||
endmacro()
|
@@ -171,6 +171,26 @@ def build_info(use_c=True, use_cxx=True, ignore_prefix_list=None):
|
||||
return source
|
||||
|
||||
|
||||
def build_defines_as_source():
|
||||
"""
|
||||
Returns a string formatted as an include:
|
||||
'#defines A=B\n#define....'
|
||||
"""
|
||||
import subprocess
|
||||
# works for both gcc and clang
|
||||
cmd = (cmake_cache_var("CMAKE_C_COMPILER"), "-dM", "-E", "-")
|
||||
return subprocess.Popen(cmd,
|
||||
stdout=subprocess.PIPE,
|
||||
stdin=subprocess.DEVNULL,
|
||||
).stdout.read().strip().decode('ascii')
|
||||
|
||||
|
||||
def build_defines_as_args():
|
||||
return [("-D" + "=".join(l.split(maxsplit=2)[1:]))
|
||||
for l in build_defines_as_source().split("\n")
|
||||
if l.startswith('#define')]
|
||||
|
||||
|
||||
# could be moved elsewhere!, this just happens to be used by scripts that also
|
||||
# use this module.
|
||||
def queue_processes(process_funcs, job_total=-1):
|
||||
|
@@ -151,12 +151,6 @@ def setup_staticlibs(lenv):
|
||||
libincs += Split(lenv['BF_JACK_LIBPATH'])
|
||||
if lenv['WITH_BF_SNDFILE']:
|
||||
libincs += Split(lenv['BF_SNDFILE_LIBPATH'])
|
||||
if lenv['WITH_BF_OPENEXR']:
|
||||
libincs += Split(lenv['BF_OPENEXR_LIBPATH'])
|
||||
if lenv['WITH_BF_STATICOPENEXR']:
|
||||
statlibs += Split(lenv['BF_OPENEXR_LIB_STATIC'])
|
||||
if lenv['WITH_BF_ZLIB'] and lenv['WITH_BF_STATICZLIB']:
|
||||
statlibs += Split(lenv['BF_ZLIB_LIB_STATIC'])
|
||||
if lenv['WITH_BF_TIFF']:
|
||||
libincs += Split(lenv['BF_TIFF_LIBPATH'])
|
||||
if lenv['WITH_BF_STATICTIFF']:
|
||||
@@ -212,6 +206,12 @@ def setup_staticlibs(lenv):
|
||||
libincs += Split(lenv['BF_OIIO_LIBPATH'])
|
||||
if lenv['WITH_BF_STATICOIIO']:
|
||||
statlibs += Split(lenv['BF_OIIO_LIB_STATIC'])
|
||||
if lenv['WITH_BF_OPENEXR']:
|
||||
libincs += Split(lenv['BF_OPENEXR_LIBPATH'])
|
||||
if lenv['WITH_BF_STATICOPENEXR']:
|
||||
statlibs += Split(lenv['BF_OPENEXR_LIB_STATIC'])
|
||||
if lenv['WITH_BF_ZLIB'] and lenv['WITH_BF_STATICZLIB']:
|
||||
statlibs += Split(lenv['BF_ZLIB_LIB_STATIC'])
|
||||
|
||||
if lenv['WITH_BF_OCIO']:
|
||||
libincs += Split(lenv['BF_OCIO_LIBPATH'])
|
||||
|
@@ -362,9 +362,9 @@ Utility functions
|
||||
|
||||
Use / as directory separator in path
|
||||
You can use '//' at the start of the string to define a relative path;
|
||||
Blender replaces that string by the directory of the startup .blend or runtime file
|
||||
to make a full path name (doesn't change during the game, even if you load other .blend).
|
||||
The function also converts the directory separator to the local file system format.
|
||||
Blender replaces that string by the directory of the current .blend or runtime file
|
||||
to make a full path name. The function also converts the directory separator to
|
||||
the local file system format.
|
||||
|
||||
:arg path: The path string to be converted/expanded.
|
||||
:type path: string
|
||||
@@ -1114,6 +1114,19 @@ See :class:`bge.types.KX_GameObject.playAction`
|
||||
|
||||
:value: 2
|
||||
|
||||
.. _gameobject-playaction-blend:
|
||||
|
||||
.. data:: KX_ACTION_BLEND_BLEND
|
||||
|
||||
Blend layers using linear interpolation
|
||||
|
||||
:value: 0
|
||||
|
||||
.. data:: KX_ACTION_BLEND_ADD
|
||||
|
||||
Adds the layers together
|
||||
|
||||
:value: 1
|
||||
|
||||
-------------
|
||||
Mouse Buttons
|
||||
|
@@ -27,6 +27,12 @@ base class --- :class:`KX_GameObject`
|
||||
|
||||
:type: float
|
||||
|
||||
.. attribute:: fov
|
||||
|
||||
The camera's field of view value.
|
||||
|
||||
:type: float
|
||||
|
||||
.. attribute:: ortho_scale
|
||||
|
||||
The camera's view scale when in orthographic mode.
|
||||
|
@@ -776,7 +776,7 @@ base class --- :class:`SCA_IObject`
|
||||
Return the value matching key, or the default value if its not found.
|
||||
:return: The key value or a default.
|
||||
|
||||
.. method:: playAction(name, start_frame, end_frame, layer=0, priority=0, blendin=0, play_mode=ACT_MODE_PLAY, layer_weight=0.0, ipo_flags=0, speed=1.0)
|
||||
.. method:: playAction(name, start_frame, end_frame, layer=0, priority=0, blendin=0, play_mode=KX_ACTION_MODE_PLAY, layer_weight=0.0, ipo_flags=0, speed=1.0, blend_mode=KX_ACTION_BLEND_BLEND)
|
||||
|
||||
Plays an action.
|
||||
|
||||
@@ -794,12 +794,14 @@ base class --- :class:`SCA_IObject`
|
||||
:type blendin: float
|
||||
:arg play_mode: the play mode
|
||||
:type play_mode: one of :ref:`these constants <gameobject-playaction-mode>`
|
||||
:arg layer_weight: how much of the previous layer to use for blending (0 = add)
|
||||
:arg layer_weight: how much of the previous layer to use for blending
|
||||
:type layer_weight: float
|
||||
:arg ipo_flags: flags for the old IPO behaviors (force, etc)
|
||||
:type ipo_flags: int bitfield
|
||||
:arg speed: the playback speed of the action as a factor (1.0 = normal speed, 2.0 = 2x speed, etc)
|
||||
:type speed: float
|
||||
:arg blend_mode: how to blend this layer with previous layers
|
||||
:type blend_mode: one of :ref:`these constants <gameobject-playaction-blend>`
|
||||
|
||||
.. method:: stopAction(layer=0)
|
||||
|
||||
|
27
extern/libmv/libmv-capi.cc
vendored
27
extern/libmv/libmv-capi.cc
vendored
@@ -60,6 +60,8 @@
|
||||
#include "libmv/simple_pipeline/reconstruction_scale.h"
|
||||
#include "libmv/simple_pipeline/keyframe_selection.h"
|
||||
|
||||
#include "libmv/multiview/homography.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
# define snprintf _snprintf
|
||||
#endif
|
||||
@@ -1012,6 +1014,7 @@ void libmv_cameraIntrinsicsExtract(const struct libmv_CameraIntrinsics *libmv_in
|
||||
*principal_y = camera_intrinsics->principal_point_y();
|
||||
*k1 = camera_intrinsics->k1();
|
||||
*k2 = camera_intrinsics->k2();
|
||||
*k3 = camera_intrinsics->k3();
|
||||
}
|
||||
|
||||
void libmv_cameraIntrinsicsUndistortByte(const struct libmv_CameraIntrinsics *libmv_intrinsics,
|
||||
@@ -1077,4 +1080,28 @@ void libmv_cameraIntrinsicsInvert(const libmv_CameraIntrinsicsOptions *libmv_cam
|
||||
}
|
||||
}
|
||||
|
||||
void libmv_homography2DFromCorrespondencesLinear(double (*x1)[2], double (*x2)[2], int num_points,
|
||||
double H[3][3], double expected_precision)
|
||||
{
|
||||
libmv::Mat x1_mat, x2_mat;
|
||||
libmv::Mat3 H_mat;
|
||||
|
||||
x1_mat.resize(2, num_points);
|
||||
x2_mat.resize(2, num_points);
|
||||
|
||||
for (int i = 0; i < num_points; i++) {
|
||||
x1_mat.col(i) = libmv::Vec2(x1[i][0], x1[i][1]);
|
||||
x2_mat.col(i) = libmv::Vec2(x2[i][0], x2[i][1]);
|
||||
}
|
||||
|
||||
LG << "x1: " << x1_mat;
|
||||
LG << "x2: " << x2_mat;
|
||||
|
||||
libmv::Homography2DFromCorrespondencesLinear(x1_mat, x2_mat, &H_mat, expected_precision);
|
||||
|
||||
LG << "H: " << H_mat;
|
||||
|
||||
memcpy(H, H_mat.data(), 9 * sizeof(double));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
3
extern/libmv/libmv-capi.h
vendored
3
extern/libmv/libmv-capi.h
vendored
@@ -163,6 +163,9 @@ void libmv_cameraIntrinsicsApply(const libmv_CameraIntrinsicsOptions *libmv_came
|
||||
void libmv_cameraIntrinsicsInvert(const libmv_CameraIntrinsicsOptions *libmv_camera_intrinsics_options,
|
||||
double x, double y, double *x1, double *y1);
|
||||
|
||||
void libmv_homography2DFromCorrespondencesLinear(double (*x1)[2], double (*x2)[2], int num_points,
|
||||
double H[3][3], double expected_precision);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
9
extern/libmv/libmv-capi_stub.cc
vendored
9
extern/libmv/libmv-capi_stub.cc
vendored
@@ -271,4 +271,13 @@ void libmv_cameraIntrinsicsInvert(const libmv_CameraIntrinsicsOptions *libmv_cam
|
||||
*y1 = (y - principal_y) / focal_length;
|
||||
}
|
||||
|
||||
void libmv_homography2DFromCorrespondencesLinear(double (* /* x1 */)[2], double (* /* x2 */)[2], int /* num_points */,
|
||||
double H[3][3], double /* expected_precision */)
|
||||
{
|
||||
memset(H, 0, sizeof(H));
|
||||
H[0][0] = 1.0f;
|
||||
H[1][1] = 1.0f;
|
||||
H[2][2] = 1.0f;
|
||||
}
|
||||
|
||||
#endif // ifndef WITH_LIBMV
|
||||
|
109
extern/libmv/libmv/multiview/euclidean_resection.cc
vendored
109
extern/libmv/libmv/multiview/euclidean_resection.cc
vendored
@@ -34,6 +34,11 @@ namespace libmv {
|
||||
namespace euclidean_resection {
|
||||
|
||||
typedef unsigned int uint;
|
||||
|
||||
bool EuclideanResectionPPnP(const Mat2X &x_camera,
|
||||
const Mat3X &X_world,
|
||||
Mat3 *R, Vec3 *t,
|
||||
double tolerance);
|
||||
|
||||
bool EuclideanResection(const Mat2X &x_camera,
|
||||
const Mat3X &X_world,
|
||||
@@ -47,6 +52,9 @@ bool EuclideanResection(const Mat2X &x_camera,
|
||||
case RESECTION_EPNP:
|
||||
return EuclideanResectionEPnP(x_camera, X_world, R, t, success_threshold);
|
||||
break;
|
||||
case RESECTION_PPNP:
|
||||
return EuclideanResectionPPnP(x_camera, X_world, R, t, success_threshold);
|
||||
break;
|
||||
default:
|
||||
LOG(FATAL) << "Unknown resection method.";
|
||||
}
|
||||
@@ -674,6 +682,107 @@ bool EuclideanResectionEPnP(const Mat2X &x_camera,
|
||||
// TODO(julien): Improve the solutions with non-linear refinement.
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Straight from the paper:
|
||||
http://www.diegm.uniud.it/fusiello/papers/3dimpvt12-b.pdf
|
||||
|
||||
function [R T] = ppnp(P,S,tol)
|
||||
% input
|
||||
% P : matrix (nx3) image coordinates in camera reference [u v 1]
|
||||
% S : matrix (nx3) coordinates in world reference [X Y Z]
|
||||
% tol: exit threshold
|
||||
%
|
||||
% output
|
||||
% R : matrix (3x3) rotation (world-to-camera)
|
||||
% T : vector (3x1) translation (world-to-camera)
|
||||
%
|
||||
n = size(P,1);
|
||||
Z = zeros(n);
|
||||
e = ones(n,1);
|
||||
A = eye(n)-((e*e’)./n);
|
||||
II = e./n;
|
||||
err = +Inf;
|
||||
E_old = 1000*ones(n,3);
|
||||
while err>tol
|
||||
[U,˜,V] = svd(P’*Z*A*S);
|
||||
VT = V’;
|
||||
R=U*[1 0 0; 0 1 0; 0 0 det(U*VT)]*VT;
|
||||
PR = P*R;
|
||||
c = (S-Z*PR)’*II;
|
||||
Y = S-e*c’;
|
||||
Zmindiag = diag(PR*Y’)./(sum(P.*P,2));
|
||||
Zmindiag(Zmindiag<0)=0;
|
||||
Z = diag(Zmindiag);
|
||||
E = Y-Z*PR;
|
||||
err = norm(E-E_old,’fro’);
|
||||
E_old = E;
|
||||
end
|
||||
T = -R*c;
|
||||
end
|
||||
|
||||
*/
|
||||
// TODO(keir): Re-do all the variable names and add comments matching the paper.
|
||||
// This implementation has too much of the terseness of the original. On the
|
||||
// other hand, it did work on the first try.
|
||||
bool EuclideanResectionPPnP(const Mat2X &x_camera,
|
||||
const Mat3X &X_world,
|
||||
Mat3 *R, Vec3 *t,
|
||||
double tolerance) {
|
||||
int n = x_camera.cols();
|
||||
Mat Z = Mat::Zero(n, n);
|
||||
Vec e = Vec::Ones(n);
|
||||
Mat A = Mat::Identity(n, n) - (e * e.transpose() / n);
|
||||
Vec II = e / n;
|
||||
|
||||
Mat P(n, 3);
|
||||
P.col(0) = x_camera.row(0);
|
||||
P.col(1) = x_camera.row(1);
|
||||
P.col(2).setConstant(1.0);
|
||||
|
||||
Mat S = X_world.transpose();
|
||||
|
||||
double error = std::numeric_limits<double>::infinity();
|
||||
Mat E_old = 1000 * Mat::Ones(n, 3);
|
||||
|
||||
Vec3 c;
|
||||
Mat E(n, 3);
|
||||
|
||||
int iteration = 0;
|
||||
tolerance = 1e-5;
|
||||
// TODO(keir): The limit of 100 can probably be reduced, but this will require
|
||||
// some investigation.
|
||||
while (error > tolerance && iteration < 100) {
|
||||
Mat3 tmp = P.transpose() * Z * A * S;
|
||||
Eigen::JacobiSVD<Mat3> svd(tmp, Eigen::ComputeFullU | Eigen::ComputeFullV);
|
||||
Mat3 U = svd.matrixU();
|
||||
Mat3 VT = svd.matrixV().transpose();
|
||||
Vec3 s;
|
||||
s << 1, 1, (U * VT).determinant();
|
||||
*R = U * s.asDiagonal() * VT;
|
||||
Mat PR = P * *R; // n x 3
|
||||
c = (S - Z*PR).transpose() * II;
|
||||
Mat Y = S - e*c.transpose(); // n x 3
|
||||
Vec Zmindiag = (PR * Y.transpose()).diagonal()
|
||||
.cwiseQuotient(P.rowwise().squaredNorm());
|
||||
for (int i = 0; i < n; ++i) {
|
||||
Zmindiag[i] = std::max(Zmindiag[i], 0.0);
|
||||
}
|
||||
Z = Zmindiag.asDiagonal();
|
||||
E = Y - Z*PR;
|
||||
error = (E - E_old).norm();
|
||||
LOG(INFO) << "PPnP error(" << (iteration++) << "): " << error;
|
||||
E_old = E;
|
||||
}
|
||||
*t = -*R*c;
|
||||
|
||||
// TODO(keir): Figure out what the failure cases are. Is it too many
|
||||
// iterations? Spend some time going through the math figuring out if there
|
||||
// is some way to detect that the algorithm is going crazy, and return false.
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
} // namespace resection
|
||||
} // namespace libmv
|
||||
|
@@ -33,6 +33,10 @@ enum ResectionMethod {
|
||||
// The "EPnP" algorithm by Lepetit et al.
|
||||
// http://cvlab.epfl.ch/~lepetit/papers/lepetit_ijcv08.pdf
|
||||
RESECTION_EPNP,
|
||||
|
||||
// The Procrustes PNP algorithm ("PPnP")
|
||||
// http://www.diegm.uniud.it/fusiello/papers/3dimpvt12-b.pdf
|
||||
RESECTION_PPNP
|
||||
};
|
||||
|
||||
/**
|
||||
|
4
extern/libmv/libmv/tracking/track_region.cc
vendored
4
extern/libmv/libmv/tracking/track_region.cc
vendored
@@ -796,7 +796,7 @@ struct TranslationRotationWarp {
|
||||
parameters[1] = t[1];
|
||||
|
||||
// Obtain the rotation via orthorgonal procrustes.
|
||||
Mat2 correlation_matrix;
|
||||
Mat2 correlation_matrix = Mat2::Zero();
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
correlation_matrix += q1.CornerRelativeToCentroid(i) *
|
||||
q2.CornerRelativeToCentroid(i).transpose();
|
||||
@@ -864,7 +864,7 @@ struct TranslationRotationScaleWarp {
|
||||
parameters[2] = 1.0 - q2.Scale() / q1.Scale();
|
||||
|
||||
// Obtain the rotation via orthorgonal procrustes.
|
||||
Mat2 correlation_matrix;
|
||||
Mat2 correlation_matrix = Mat2::Zero();
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
correlation_matrix += q1.CornerRelativeToCentroid(i) *
|
||||
q2.CornerRelativeToCentroid(i).transpose();
|
||||
|
126
extern/recastnavigation/recast-capi.cpp
vendored
126
extern/recastnavigation/recast-capi.cpp
vendored
@@ -270,129 +270,3 @@ unsigned int *recast_polyMeshDetailGetMeshes(struct recast_polyMeshDetail *mesh,
|
||||
return dmesh->meshes;
|
||||
}
|
||||
|
||||
// qsort based on FreeBSD source (libkern\qsort.c)
|
||||
typedef int cmp_t(void *, const void *, const void *);
|
||||
static inline char *med3(char *, char *, char *, cmp_t *, void *);
|
||||
static inline void swapfunc(char *, char *, int, int);
|
||||
|
||||
#define min(a, b) (a) < (b) ? a : b
|
||||
#define swapcode(TYPE, parmi, parmj, n) \
|
||||
{ \
|
||||
long i = (n) / sizeof(TYPE); \
|
||||
TYPE *pi = (TYPE *) (parmi); \
|
||||
TYPE *pj = (TYPE *) (parmj); \
|
||||
do { \
|
||||
TYPE t = *pi; \
|
||||
*pi++ = *pj; \
|
||||
*pj++ = t; \
|
||||
} while (--i > 0); \
|
||||
}
|
||||
#define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \
|
||||
es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1;
|
||||
|
||||
static inline void swapfunc(char* a, char* b, int n, int swaptype)
|
||||
{
|
||||
if(swaptype <= 1)
|
||||
swapcode(long, a, b, n)
|
||||
else
|
||||
swapcode(char, a, b, n)
|
||||
}
|
||||
|
||||
#define swap(a, b) \
|
||||
if (swaptype == 0) { \
|
||||
long t = *(long *)(a); \
|
||||
*(long *)(a) = *(long *)(b);\
|
||||
*(long *)(b) = t; \
|
||||
} else \
|
||||
swapfunc(a, b, es, swaptype)
|
||||
|
||||
#define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype)
|
||||
#define CMP(t, x, y) (cmp((t), (x), (y)))
|
||||
|
||||
static inline char *med3(char *a, char *b, char *c, cmp_t *cmp, void *thunk)
|
||||
{
|
||||
return CMP(thunk, a, b) < 0 ?
|
||||
(CMP(thunk, b, c) < 0 ? b : (CMP(thunk, a, c) < 0 ? c : a ))
|
||||
:(CMP(thunk, b, c) > 0 ? b : (CMP(thunk, a, c) < 0 ? a : c ));
|
||||
}
|
||||
|
||||
void recast_qsort(void *a, size_t n, size_t es, void *thunk, cmp_t *cmp)
|
||||
{
|
||||
char *pa, *pb, *pc, *pd, *pl, *pm, *pn;
|
||||
int d, r, swaptype, swap_cnt;
|
||||
|
||||
loop:
|
||||
SWAPINIT(a, es);
|
||||
swap_cnt = 0;
|
||||
if (n < 7) {
|
||||
for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es)
|
||||
for (pl = pm;
|
||||
pl > (char *)a && CMP(thunk, pl - es, pl) > 0;
|
||||
pl -= es)
|
||||
swap(pl, pl - es);
|
||||
return;
|
||||
}
|
||||
pm = (char *)a + (n / 2) * es;
|
||||
if (n > 7) {
|
||||
pl = (char *)a;
|
||||
pn = (char *)a + (n - 1) * es;
|
||||
if (n > 40) {
|
||||
d = (n / 8) * es;
|
||||
pl = med3(pl, pl + d, pl + 2 * d, cmp, thunk);
|
||||
pm = med3(pm - d, pm, pm + d, cmp, thunk);
|
||||
pn = med3(pn - 2 * d, pn - d, pn, cmp, thunk);
|
||||
}
|
||||
pm = med3(pl, pm, pn, cmp, thunk);
|
||||
}
|
||||
swap((char *)a, pm);
|
||||
pa = pb = (char *)a + es;
|
||||
|
||||
pc = pd = (char *)a + (n - 1) * es;
|
||||
for (;;) {
|
||||
while (pb <= pc && (r = CMP(thunk, pb, a)) <= 0) {
|
||||
if (r == 0) {
|
||||
swap_cnt = 1;
|
||||
swap(pa, pb);
|
||||
pa += es;
|
||||
}
|
||||
pb += es;
|
||||
}
|
||||
while (pb <= pc && (r = CMP(thunk, pc, a)) >= 0) {
|
||||
if (r == 0) {
|
||||
swap_cnt = 1;
|
||||
swap(pc, pd);
|
||||
pd -= es;
|
||||
}
|
||||
pc -= es;
|
||||
}
|
||||
if (pb > pc)
|
||||
break;
|
||||
swap(pb, pc);
|
||||
swap_cnt = 1;
|
||||
pb += es;
|
||||
pc -= es;
|
||||
}
|
||||
if (swap_cnt == 0) { /* Switch to insertion sort */
|
||||
for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es)
|
||||
for (pl = pm;
|
||||
pl > (char *)a && CMP(thunk, pl - es, pl) > 0;
|
||||
pl -= es)
|
||||
swap(pl, pl - es);
|
||||
return;
|
||||
}
|
||||
|
||||
pn = (char *)a + n * es;
|
||||
r = min(pa - (char *)a, pb - pa);
|
||||
vecswap((char *)a, pb - r, r);
|
||||
r = min(pd - pc, pn - pd - es);
|
||||
vecswap(pb, pn - r, r);
|
||||
if ((r = pb - pa) > es)
|
||||
recast_qsort(a, r / es, es, thunk, cmp);
|
||||
if ((r = pd - pc) > es) {
|
||||
/* Iterate rather than recurse to save stack space */
|
||||
a = pn - r;
|
||||
n = r / es;
|
||||
goto loop;
|
||||
}
|
||||
}
|
||||
|
||||
|
5
extern/recastnavigation/recast-capi.h
vendored
5
extern/recastnavigation/recast-capi.h
vendored
@@ -127,11 +127,6 @@ unsigned char *recast_polyMeshDetailGetTris(struct recast_polyMeshDetail *mesh,
|
||||
|
||||
unsigned int *recast_polyMeshDetailGetMeshes(struct recast_polyMeshDetail *mesh, int *nmeshes);
|
||||
|
||||
/* utility function: quick sort reentrant */
|
||||
typedef int recast_cmp_t(void *ctx, const void *a, const void *b);
|
||||
|
||||
void recast_qsort(void *a, size_t n, size_t es, void *thunk, recast_cmp_t *cmp);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@@ -23,10 +23,10 @@
|
||||
#
|
||||
# ***** END GPL LICENSE BLOCK *****
|
||||
|
||||
# add_subdirectory(atomic) # header only
|
||||
add_subdirectory(string)
|
||||
add_subdirectory(ghost)
|
||||
add_subdirectory(guardedalloc)
|
||||
add_subdirectory(moto)
|
||||
add_subdirectory(memutil)
|
||||
add_subdirectory(opencolorio)
|
||||
add_subdirectory(opennl)
|
||||
@@ -61,6 +61,10 @@ if(WITH_IK_ITASC)
|
||||
add_subdirectory(itasc)
|
||||
endif()
|
||||
|
||||
if(WITH_IK_SOLVER OR WITH_GAMEENGINE)
|
||||
add_subdirectory(moto)
|
||||
endif()
|
||||
|
||||
if(WITH_CYCLES)
|
||||
add_subdirectory(cycles)
|
||||
endif()
|
||||
|
307
intern/atomic/atomic_ops.h
Normal file
307
intern/atomic/atomic_ops.h
Normal file
@@ -0,0 +1,307 @@
|
||||
/*
|
||||
* Adopted from jemalloc with this license:
|
||||
*
|
||||
* Copyright (C) 2002-2013 Jason Evans <jasone@canonware.com>.
|
||||
* All rights reserved.
|
||||
* Copyright (C) 2007-2012 Mozilla Foundation. All rights reserved.
|
||||
* Copyright (C) 2009-2013 Facebook, Inc. All rights reserved.
|
||||
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef __ATOMIC_OPS_H__
|
||||
#define __ATOMIC_OPS_H__
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#if defined (__APPLE__)
|
||||
# include <libkern/OSAtomic.h>
|
||||
#elif defined(_MSC_VER)
|
||||
# include <windows.h>
|
||||
#endif
|
||||
|
||||
/* needed for int types */
|
||||
#include "../../source/blender/blenlib/BLI_sys_types.h"
|
||||
|
||||
/* little macro so inline keyword works */
|
||||
#if defined(_MSC_VER)
|
||||
# define ATOMIC_INLINE static __forceinline
|
||||
#else
|
||||
# if (defined(__APPLE__) && defined(__ppc__))
|
||||
/* static inline __attribute__ here breaks osx ppc gcc42 build */
|
||||
# define ATOMIC_INLINE static __attribute__((always_inline))
|
||||
# else
|
||||
# define ATOMIC_INLINE static inline __attribute__((always_inline))
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(_M_X64) || defined(__amd64__) || defined(__x86_64__)
|
||||
# define LG_SIZEOF_PTR 3
|
||||
# define LG_SIZEOF_INT 2
|
||||
#else
|
||||
# define LG_SIZEOF_PTR 2
|
||||
# define LG_SIZEOF_INT 2
|
||||
#endif
|
||||
|
||||
/******************************************************************************/
|
||||
/* 64-bit operations. */
|
||||
#if (LG_SIZEOF_PTR == 3 || LG_SIZEOF_INT == 3)
|
||||
# ifdef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8
|
||||
ATOMIC_INLINE uint64_t
|
||||
atomic_add_uint64(uint64_t *p, uint64_t x)
|
||||
{
|
||||
return (__sync_add_and_fetch(p, x));
|
||||
}
|
||||
|
||||
ATOMIC_INLINE uint64_t
|
||||
atomic_sub_uint64(uint64_t *p, uint64_t x)
|
||||
{
|
||||
return (__sync_sub_and_fetch(p, x));
|
||||
}
|
||||
#elif (defined(_MSC_VER))
|
||||
ATOMIC_INLINE uint64_t
|
||||
atomic_add_uint64(uint64_t *p, uint64_t x)
|
||||
{
|
||||
return (InterlockedExchangeAdd64(p, x));
|
||||
}
|
||||
|
||||
ATOMIC_INLINE uint64_t
|
||||
atomic_sub_uint64(uint64_t *p, uint64_t x)
|
||||
{
|
||||
return (InterlockedExchangeAdd64(p, -((int64_t)x)));
|
||||
}
|
||||
#elif (defined(__APPLE__))
|
||||
ATOMIC_INLINE uint64_t
|
||||
atomic_add_uint64(uint64_t *p, uint64_t x)
|
||||
{
|
||||
return (OSAtomicAdd64((int64_t)x, (int64_t *)p));
|
||||
}
|
||||
|
||||
ATOMIC_INLINE uint64_t
|
||||
atomic_sub_uint64(uint64_t *p, uint64_t x)
|
||||
{
|
||||
return (OSAtomicAdd64(-((int64_t)x), (int64_t *)p));
|
||||
}
|
||||
# elif (defined(__amd64__) || defined(__x86_64__))
|
||||
ATOMIC_INLINE uint64_t
|
||||
atomic_add_uint64(uint64_t *p, uint64_t x)
|
||||
{
|
||||
asm volatile (
|
||||
"lock; xaddq %0, %1;"
|
||||
: "+r" (x), "=m" (*p) /* Outputs. */
|
||||
: "m" (*p) /* Inputs. */
|
||||
);
|
||||
return (x);
|
||||
}
|
||||
|
||||
ATOMIC_INLINE uint64_t
|
||||
atomic_sub_uint64(uint64_t *p, uint64_t x)
|
||||
{
|
||||
x = (uint64_t)(-(int64_t)x);
|
||||
asm volatile (
|
||||
"lock; xaddq %0, %1;"
|
||||
: "+r" (x), "=m" (*p) /* Outputs. */
|
||||
: "m" (*p) /* Inputs. */
|
||||
);
|
||||
return (x);
|
||||
}
|
||||
# elif (defined(JEMALLOC_ATOMIC9))
|
||||
ATOMIC_INLINE uint64_t
|
||||
atomic_add_uint64(uint64_t *p, uint64_t x)
|
||||
{
|
||||
/*
|
||||
* atomic_fetchadd_64() doesn't exist, but we only ever use this
|
||||
* function on LP64 systems, so atomic_fetchadd_long() will do.
|
||||
*/
|
||||
assert(sizeof(uint64_t) == sizeof(unsigned long));
|
||||
|
||||
return (atomic_fetchadd_long(p, (unsigned long)x) + x);
|
||||
}
|
||||
|
||||
ATOMIC_INLINE uint64_t
|
||||
atomic_sub_uint64(uint64_t *p, uint64_t x)
|
||||
{
|
||||
assert(sizeof(uint64_t) == sizeof(unsigned long));
|
||||
|
||||
return (atomic_fetchadd_long(p, (unsigned long)(-(long)x)) - x);
|
||||
}
|
||||
# elif (defined(JE_FORCE_SYNC_COMPARE_AND_SWAP_8))
|
||||
ATOMIC_INLINE uint64_t
|
||||
atomic_add_uint64(uint64_t *p, uint64_t x)
|
||||
{
|
||||
return (__sync_add_and_fetch(p, x));
|
||||
}
|
||||
|
||||
ATOMIC_INLINE uint64_t
|
||||
atomic_sub_uint64(uint64_t *p, uint64_t x)
|
||||
{
|
||||
return (__sync_sub_and_fetch(p, x));
|
||||
}
|
||||
# else
|
||||
# error "Missing implementation for 64-bit atomic operations"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/******************************************************************************/
|
||||
/* 32-bit operations. */
|
||||
#ifdef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
|
||||
ATOMIC_INLINE uint32_t
|
||||
atomic_add_uint32(uint32_t *p, uint32_t x)
|
||||
{
|
||||
return (__sync_add_and_fetch(p, x));
|
||||
}
|
||||
|
||||
ATOMIC_INLINE uint32_t
|
||||
atomic_sub_uint32(uint32_t *p, uint32_t x)
|
||||
{
|
||||
return (__sync_sub_and_fetch(p, x));
|
||||
}
|
||||
#elif (defined(_MSC_VER))
|
||||
ATOMIC_INLINE uint32_t
|
||||
atomic_add_uint32(uint32_t *p, uint32_t x)
|
||||
{
|
||||
return (InterlockedExchangeAdd(p, x));
|
||||
}
|
||||
|
||||
ATOMIC_INLINE uint32_t
|
||||
atomic_sub_uint32(uint32_t *p, uint32_t x)
|
||||
{
|
||||
return (InterlockedExchangeAdd(p, -((int32_t)x)));
|
||||
}
|
||||
#elif (defined(__APPLE__))
|
||||
ATOMIC_INLINE uint32_t
|
||||
atomic_add_uint32(uint32_t *p, uint32_t x)
|
||||
{
|
||||
return (OSAtomicAdd32((int32_t)x, (int32_t *)p));
|
||||
}
|
||||
|
||||
ATOMIC_INLINE uint32_t
|
||||
atomic_sub_uint32(uint32_t *p, uint32_t x)
|
||||
{
|
||||
return (OSAtomicAdd32(-((int32_t)x), (int32_t *)p));
|
||||
}
|
||||
#elif (defined(__i386__) || defined(__amd64__) || defined(__x86_64__))
|
||||
ATOMIC_INLINE uint32_t
|
||||
atomic_add_uint32(uint32_t *p, uint32_t x)
|
||||
{
|
||||
asm volatile (
|
||||
"lock; xaddl %0, %1;"
|
||||
: "+r" (x), "=m" (*p) /* Outputs. */
|
||||
: "m" (*p) /* Inputs. */
|
||||
);
|
||||
return (x);
|
||||
}
|
||||
|
||||
ATOMIC_INLINE uint32_t
|
||||
atomic_sub_uint32(uint32_t *p, uint32_t x)
|
||||
{
|
||||
x = (uint32_t)(-(int32_t)x);
|
||||
asm volatile (
|
||||
"lock; xaddl %0, %1;"
|
||||
: "+r" (x), "=m" (*p) /* Outputs. */
|
||||
: "m" (*p) /* Inputs. */
|
||||
);
|
||||
return (x);
|
||||
}
|
||||
#elif (defined(JEMALLOC_ATOMIC9))
|
||||
ATOMIC_INLINE uint32_t
|
||||
atomic_add_uint32(uint32_t *p, uint32_t x)
|
||||
{
|
||||
return (atomic_fetchadd_32(p, x) + x);
|
||||
}
|
||||
|
||||
ATOMIC_INLINE uint32_t
|
||||
atomic_sub_uint32(uint32_t *p, uint32_t x)
|
||||
{
|
||||
return (atomic_fetchadd_32(p, (uint32_t)(-(int32_t)x)) - x);
|
||||
}
|
||||
#elif (defined(JE_FORCE_SYNC_COMPARE_AND_SWAP_4))
|
||||
ATOMIC_INLINE uint32_t
|
||||
atomic_add_uint32(uint32_t *p, uint32_t x)
|
||||
{
|
||||
return (__sync_add_and_fetch(p, x));
|
||||
}
|
||||
|
||||
ATOMIC_INLINE uint32_t
|
||||
atomic_sub_uint32(uint32_t *p, uint32_t x)
|
||||
{
|
||||
return (__sync_sub_and_fetch(p, x));
|
||||
}
|
||||
#else
|
||||
# error "Missing implementation for 32-bit atomic operations"
|
||||
#endif
|
||||
|
||||
/******************************************************************************/
|
||||
/* size_t operations. */
|
||||
ATOMIC_INLINE size_t
|
||||
atomic_add_z(size_t *p, size_t x)
|
||||
{
|
||||
assert(sizeof(size_t) == 1 << LG_SIZEOF_PTR);
|
||||
|
||||
#if (LG_SIZEOF_PTR == 3)
|
||||
return ((size_t)atomic_add_uint64((uint64_t *)p, (uint64_t)x));
|
||||
#elif (LG_SIZEOF_PTR == 2)
|
||||
return ((size_t)atomic_add_uint32((uint32_t *)p, (uint32_t)x));
|
||||
#endif
|
||||
}
|
||||
|
||||
ATOMIC_INLINE size_t
|
||||
atomic_sub_z(size_t *p, size_t x)
|
||||
{
|
||||
assert(sizeof(size_t) == 1 << LG_SIZEOF_PTR);
|
||||
|
||||
#if (LG_SIZEOF_PTR == 3)
|
||||
return ((size_t)atomic_add_uint64((uint64_t *)p,
|
||||
(uint64_t)-((int64_t)x)));
|
||||
#elif (LG_SIZEOF_PTR == 2)
|
||||
return ((size_t)atomic_add_uint32((uint32_t *)p,
|
||||
(uint32_t)-((int32_t)x)));
|
||||
#endif
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* unsigned operations. */
|
||||
ATOMIC_INLINE unsigned
|
||||
atomic_add_u(unsigned *p, unsigned x)
|
||||
{
|
||||
assert(sizeof(unsigned) == 1 << LG_SIZEOF_INT);
|
||||
|
||||
#if (LG_SIZEOF_INT == 3)
|
||||
return ((unsigned)atomic_add_uint64((uint64_t *)p, (uint64_t)x));
|
||||
#elif (LG_SIZEOF_INT == 2)
|
||||
return ((unsigned)atomic_add_uint32((uint32_t *)p, (uint32_t)x));
|
||||
#endif
|
||||
}
|
||||
|
||||
ATOMIC_INLINE unsigned
|
||||
atomic_sub_u(unsigned *p, unsigned x)
|
||||
{
|
||||
assert(sizeof(unsigned) == 1 << LG_SIZEOF_INT);
|
||||
|
||||
#if (LG_SIZEOF_INT == 3)
|
||||
return ((unsigned)atomic_add_uint64((uint64_t *)p,
|
||||
(uint64_t)-((int64_t)x)));
|
||||
#elif (LG_SIZEOF_INT == 2)
|
||||
return ((unsigned)atomic_add_uint32((uint32_t *)p,
|
||||
(uint32_t)-((int32_t)x)));
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* __ATOMIC_OPS_H__ */
|
@@ -67,6 +67,35 @@ static const char* queue_error = "AUD_OpenALDevice: Buffer couldn't be "
|
||||
static const char* bufferdata_error = "AUD_OpenALDevice: Buffer couldn't be "
|
||||
"filled with data.";
|
||||
|
||||
bool AUD_OpenALDevice::AUD_OpenALHandle::pause(bool keep)
|
||||
{
|
||||
if(m_status)
|
||||
{
|
||||
AUD_MutexLock lock(*m_device);
|
||||
|
||||
if(m_status == AUD_STATUS_PLAYING)
|
||||
{
|
||||
for(AUD_HandleIterator it = m_device->m_playingSounds.begin(); it != m_device->m_playingSounds.end(); it++)
|
||||
{
|
||||
if(it->get() == this)
|
||||
{
|
||||
boost::shared_ptr<AUD_OpenALHandle> This = *it;
|
||||
|
||||
m_device->m_playingSounds.erase(it);
|
||||
m_device->m_pausedSounds.push_back(This);
|
||||
|
||||
alSourcePause(m_source);
|
||||
|
||||
m_status = keep ? AUD_STATUS_STOPPED : AUD_STATUS_PAUSED;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;}
|
||||
|
||||
AUD_OpenALDevice::AUD_OpenALHandle::AUD_OpenALHandle(AUD_OpenALDevice* device, ALenum format, boost::shared_ptr<AUD_IReader> reader, bool keep) :
|
||||
m_isBuffered(false), m_reader(reader), m_keep(keep), m_format(format), m_current(0),
|
||||
m_eos(false), m_loopcount(0), m_stop(NULL), m_stop_data(NULL), m_status(AUD_STATUS_PLAYING),
|
||||
@@ -124,32 +153,7 @@ AUD_OpenALDevice::AUD_OpenALHandle::AUD_OpenALHandle(AUD_OpenALDevice* device, A
|
||||
|
||||
bool AUD_OpenALDevice::AUD_OpenALHandle::pause()
|
||||
{
|
||||
if(m_status)
|
||||
{
|
||||
AUD_MutexLock lock(*m_device);
|
||||
|
||||
if(m_status == AUD_STATUS_PLAYING)
|
||||
{
|
||||
for(AUD_HandleIterator it = m_device->m_playingSounds.begin(); it != m_device->m_playingSounds.end(); it++)
|
||||
{
|
||||
if(it->get() == this)
|
||||
{
|
||||
boost::shared_ptr<AUD_OpenALHandle> This = *it;
|
||||
|
||||
m_device->m_playingSounds.erase(it);
|
||||
m_device->m_pausedSounds.push_back(This);
|
||||
|
||||
alSourcePause(m_source);
|
||||
|
||||
m_status = AUD_STATUS_PAUSED;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
return pause(false);
|
||||
}
|
||||
|
||||
bool AUD_OpenALDevice::AUD_OpenALHandle::resume()
|
||||
@@ -302,6 +306,9 @@ bool AUD_OpenALDevice::AUD_OpenALHandle::seek(float position)
|
||||
}
|
||||
}
|
||||
|
||||
if(m_status == AUD_STATUS_STOPPED)
|
||||
m_status = AUD_STATUS_PAUSED;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -409,7 +416,12 @@ bool AUD_OpenALDevice::AUD_OpenALHandle::setLoopCount(int count)
|
||||
{
|
||||
if(!m_status)
|
||||
return false;
|
||||
|
||||
if(m_status == AUD_STATUS_STOPPED && (count > m_loopcount || count < 0))
|
||||
m_status = AUD_STATUS_PAUSED;
|
||||
|
||||
m_loopcount = count;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -987,7 +999,7 @@ void AUD_OpenALDevice::updateStreams()
|
||||
}
|
||||
|
||||
for(it = pauseSounds.begin(); it != pauseSounds.end(); it++)
|
||||
(*it)->pause();
|
||||
(*it)->pause(true);
|
||||
|
||||
for(it = stopSounds.begin(); it != stopSounds.end(); it++)
|
||||
(*it)->stop();
|
||||
|
@@ -96,6 +96,8 @@ private:
|
||||
/// Own device.
|
||||
AUD_OpenALDevice* m_device;
|
||||
|
||||
bool pause(bool keep);
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
|
@@ -2908,6 +2908,7 @@ PyInit_aud(void)
|
||||
PY_MODULE_ADD_CONSTANT(m, AUD_STATUS_INVALID);
|
||||
PY_MODULE_ADD_CONSTANT(m, AUD_STATUS_PAUSED);
|
||||
PY_MODULE_ADD_CONSTANT(m, AUD_STATUS_PLAYING);
|
||||
PY_MODULE_ADD_CONSTANT(m, AUD_STATUS_STOPPED);
|
||||
// distance model constants
|
||||
PY_MODULE_ADD_CONSTANT(m, AUD_DISTANCE_MODEL_EXPONENT);
|
||||
PY_MODULE_ADD_CONSTANT(m, AUD_DISTANCE_MODEL_EXPONENT_CLAMPED);
|
||||
|
@@ -113,6 +113,8 @@ public:
|
||||
*. invalid
|
||||
* - AUD_STATUS_PLAYING if the sound is currently played back.
|
||||
* - AUD_STATUS_PAUSED if the sound is currently paused.
|
||||
* - AUD_STATUS_STOPPED if the sound finished playing and is still
|
||||
* kept in the device.
|
||||
* \see AUD_Status
|
||||
*/
|
||||
virtual AUD_Status getStatus()=0;
|
||||
|
@@ -57,6 +57,37 @@ typedef enum
|
||||
/********************** AUD_SoftwareHandle Handle Code ************************/
|
||||
/******************************************************************************/
|
||||
|
||||
bool AUD_SoftwareDevice::AUD_SoftwareHandle::pause(bool keep)
|
||||
{
|
||||
if(m_status)
|
||||
{
|
||||
AUD_MutexLock lock(*m_device);
|
||||
|
||||
if(m_status == AUD_STATUS_PLAYING)
|
||||
{
|
||||
for(AUD_HandleIterator it = m_device->m_playingSounds.begin(); it != m_device->m_playingSounds.end(); it++)
|
||||
{
|
||||
if(it->get() == this)
|
||||
{
|
||||
boost::shared_ptr<AUD_SoftwareHandle> This = *it;
|
||||
|
||||
m_device->m_playingSounds.erase(it);
|
||||
m_device->m_pausedSounds.push_back(This);
|
||||
|
||||
if(m_device->m_playingSounds.empty())
|
||||
m_device->playing(m_device->m_playback = false);
|
||||
|
||||
m_status = keep ? AUD_STATUS_STOPPED : AUD_STATUS_PAUSED;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
AUD_SoftwareDevice::AUD_SoftwareHandle::AUD_SoftwareHandle(AUD_SoftwareDevice* device, boost::shared_ptr<AUD_IReader> reader, boost::shared_ptr<AUD_PitchReader> pitch, boost::shared_ptr<AUD_ResampleReader> resampler, boost::shared_ptr<AUD_ChannelMapperReader> mapper, bool keep) :
|
||||
m_reader(reader), m_pitch(pitch), m_resampler(resampler), m_mapper(mapper), m_keep(keep), m_user_pitch(1.0f), m_user_volume(1.0f), m_user_pan(0.0f), m_volume(1.0f), m_loopcount(0),
|
||||
m_relative(true), m_volume_max(1.0f), m_volume_min(0), m_distance_max(std::numeric_limits<float>::max()),
|
||||
@@ -225,33 +256,7 @@ void AUD_SoftwareDevice::AUD_SoftwareHandle::setSpecs(AUD_Specs specs)
|
||||
|
||||
bool AUD_SoftwareDevice::AUD_SoftwareHandle::pause()
|
||||
{
|
||||
if(m_status)
|
||||
{
|
||||
AUD_MutexLock lock(*m_device);
|
||||
|
||||
if(m_status == AUD_STATUS_PLAYING)
|
||||
{
|
||||
for(AUD_HandleIterator it = m_device->m_playingSounds.begin(); it != m_device->m_playingSounds.end(); it++)
|
||||
{
|
||||
if(it->get() == this)
|
||||
{
|
||||
boost::shared_ptr<AUD_SoftwareHandle> This = *it;
|
||||
|
||||
m_device->m_playingSounds.erase(it);
|
||||
m_device->m_pausedSounds.push_back(This);
|
||||
|
||||
if(m_device->m_playingSounds.empty())
|
||||
m_device->playing(m_device->m_playback = false);
|
||||
|
||||
m_status = AUD_STATUS_PAUSED;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
return pause(false);
|
||||
}
|
||||
|
||||
bool AUD_SoftwareDevice::AUD_SoftwareHandle::resume()
|
||||
@@ -360,6 +365,9 @@ bool AUD_SoftwareDevice::AUD_SoftwareHandle::seek(float position)
|
||||
|
||||
m_reader->seek((int)(position * m_reader->getSpecs().rate));
|
||||
|
||||
if(m_status == AUD_STATUS_STOPPED)
|
||||
m_status = AUD_STATUS_PAUSED;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -429,7 +437,12 @@ bool AUD_SoftwareDevice::AUD_SoftwareHandle::setLoopCount(int count)
|
||||
{
|
||||
if(!m_status)
|
||||
return false;
|
||||
|
||||
if(m_status == AUD_STATUS_STOPPED && (count > m_loopcount || count < 0))
|
||||
m_status = AUD_STATUS_PAUSED;
|
||||
|
||||
m_loopcount = count;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -793,19 +806,14 @@ void AUD_SoftwareDevice::mix(data_t* buffer, int length)
|
||||
m_mixer->read(buffer, m_volume);
|
||||
|
||||
// cleanup
|
||||
while(!stopSounds.empty())
|
||||
{
|
||||
sound = stopSounds.front();
|
||||
stopSounds.pop_front();
|
||||
sound->stop();
|
||||
}
|
||||
for(it = pauseSounds.begin(); it != pauseSounds.end(); it++)
|
||||
(*it)->pause(true);
|
||||
|
||||
while(!pauseSounds.empty())
|
||||
{
|
||||
sound = pauseSounds.front();
|
||||
pauseSounds.pop_front();
|
||||
sound->pause();
|
||||
}
|
||||
for(it = stopSounds.begin(); it != stopSounds.end(); it++)
|
||||
(*it)->stop();
|
||||
|
||||
pauseSounds.clear();
|
||||
stopSounds.clear();
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -139,6 +139,8 @@ protected:
|
||||
/// Own device.
|
||||
AUD_SoftwareDevice* m_device;
|
||||
|
||||
bool pause(bool keep);
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
|
@@ -125,7 +125,8 @@ typedef enum
|
||||
{
|
||||
AUD_STATUS_INVALID = 0, /// Invalid handle. Maybe due to stopping.
|
||||
AUD_STATUS_PLAYING, /// Sound is playing.
|
||||
AUD_STATUS_PAUSED /// Sound is being paused.
|
||||
AUD_STATUS_PAUSED, /// Sound is being paused.
|
||||
AUD_STATUS_STOPPED /// Sound is stopped but kept in the device.
|
||||
} AUD_Status;
|
||||
|
||||
/// Error codes for exceptions (C++ library) or for return values (C API).
|
||||
|
@@ -19,8 +19,8 @@ if(WIN32 AND MSVC)
|
||||
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fp:fast -D_CRT_SECURE_NO_WARNINGS /Gs-")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Ox")
|
||||
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE} /Ox")
|
||||
set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_RELEASE} /Ox")
|
||||
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Ox")
|
||||
set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /Ox")
|
||||
elseif(CMAKE_COMPILER_IS_GNUCC)
|
||||
set(CYCLES_SSE2_KERNEL_FLAGS "-ffast-math -msse -msse2 -mfpmath=sse")
|
||||
set(CYCLES_SSE3_KERNEL_FLAGS "-ffast-math -msse -msse2 -msse3 -mssse3 -mfpmath=sse")
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -254,10 +252,14 @@ static void xml_read_film(const XMLReadState& state, pugi::xml_node node)
|
||||
static void xml_read_integrator(const XMLReadState& state, pugi::xml_node node)
|
||||
{
|
||||
Integrator *integrator = state.scene->integrator;
|
||||
bool branched = false;
|
||||
|
||||
xml_read_bool(&integrator->progressive, node, "progressive");
|
||||
xml_read_bool(&branched, node, "branched");
|
||||
|
||||
if(branched)
|
||||
integrator->method == Integrator::BRANCHED_PATH;
|
||||
|
||||
if(!integrator->progressive) {
|
||||
if(integrator->method == Integrator::BRANCHED_PATH) {
|
||||
xml_read_int(&integrator->diffuse_samples, node, "diffuse_samples");
|
||||
xml_read_int(&integrator->glossy_samples, node, "glossy_samples");
|
||||
xml_read_int(&integrator->transmission_samples, node, "transmission_samples");
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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 __CYCLES_XML__
|
||||
|
@@ -1,19 +1,17 @@
|
||||
#
|
||||
# Copyright 2011, Blender Foundation.
|
||||
# Copyright 2011-2013 Blender Foundation
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
# 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
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
# 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
|
||||
#
|
||||
|
||||
# XML exporter for generating test files, not intended for end users
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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 CCL_API_H
|
||||
|
@@ -1,19 +1,17 @@
|
||||
#
|
||||
# Copyright 2011, Blender Foundation.
|
||||
# Copyright 2011-2013 Blender Foundation
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
# 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
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
# 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
|
||||
#
|
||||
|
||||
# <pep8 compliant>
|
||||
|
@@ -1,19 +1,17 @@
|
||||
#
|
||||
# Copyright 2011, Blender Foundation.
|
||||
# Copyright 2011-2013 Blender Foundation
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
# 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
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
# 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
|
||||
#
|
||||
|
||||
# <pep8 compliant>
|
||||
|
@@ -1,19 +1,17 @@
|
||||
#
|
||||
# Copyright 2011, Blender Foundation.
|
||||
# Copyright 2011-2013 Blender Foundation
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
# 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
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
# 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
|
||||
#
|
||||
|
||||
# <pep8 compliant>
|
||||
|
@@ -1,19 +1,17 @@
|
||||
#
|
||||
# Copyright 2011, Blender Foundation.
|
||||
# Copyright 2011-2013 Blender Foundation
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
# 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
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
# 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
|
||||
#
|
||||
|
||||
# <pep8 compliant>
|
||||
@@ -69,7 +67,7 @@ class AddPresetSampling(AddPresetBase, Operator):
|
||||
"cycles.subsurface_samples",
|
||||
"cycles.no_caustics",
|
||||
"cycles.blur_glossy",
|
||||
"cycles.squared_samples",
|
||||
"cycles.use_square_samples",
|
||||
"cycles.progressive"
|
||||
]
|
||||
|
||||
|
@@ -1,19 +1,17 @@
|
||||
#
|
||||
# Copyright 2011, Blender Foundation.
|
||||
# Copyright 2011-2013 Blender Foundation
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
# 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
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
# 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
|
||||
#
|
||||
|
||||
# <pep8 compliant>
|
||||
@@ -64,40 +62,20 @@ enum_panorama_types = (
|
||||
"Similar to most fisheye modern lens, takes sensor dimensions into consideration"),
|
||||
)
|
||||
|
||||
enum_curve_presets = (
|
||||
('CUSTOM', "Custom", "Set general parameters"),
|
||||
('FAST_PLANES', "Fast Planes", "Use camera facing triangles (fast but memory intensive)"),
|
||||
('TANGENT_SHADING', "Tangent Normal", "Use planar line segments and tangent normals"),
|
||||
('TRUE_NORMAL', "True Normal", "Use true normals with line segments(good for thin strands)"),
|
||||
('ACCURATE_PRESET', "Accurate", "Use best line segment settings (suitable for glass materials)"),
|
||||
('SMOOTH_CURVES', "Smooth Curves", "Use smooth cardinal curves (slowest)"),
|
||||
('SMOOTH_RIBBONS', "Ribbons", "Use smooth cardinal curves without thickness"),
|
||||
)
|
||||
|
||||
enum_curve_primitives = (
|
||||
('TRIANGLES', "Triangles", "Create triangle geometry around strands"),
|
||||
('LINE_SEGMENTS', "Line Segments", "Use line segment primitives"),
|
||||
('CURVE_SEGMENTS', "Curve Segments", "Use segmented cardinal curve primitives"),
|
||||
('CURVE_RIBBONS', "Curve Ribbons", "Use smooth cardinal curve ribbon primitives"),
|
||||
)
|
||||
|
||||
enum_triangle_curves = (
|
||||
('CAMERA_TRIANGLES', "Planes", "Create individual triangles forming planes that face camera"),
|
||||
('RIBBON_TRIANGLES', "Ribbons", "Create individual triangles forming ribbon"),
|
||||
('TESSELLATED_TRIANGLES', "Tessellated", "Create mesh surrounding each strand"),
|
||||
)
|
||||
|
||||
enum_line_curves = (
|
||||
('ACCURATE', "Accurate", "Always take into consideration strand width for intersections"),
|
||||
('QT_CORRECTED', "Corrected", "Ignore width for initial intersection and correct later"),
|
||||
('ENDCORRECTED', "Correct found", "Ignore width for all intersections and only correct closest"),
|
||||
('QT_UNCORRECTED', "Uncorrected", "Calculate intersections without considering width"),
|
||||
)
|
||||
|
||||
enum_curves_interpolation = (
|
||||
('LINEAR', "Linear interpolation", "Use Linear interpolation between segments"),
|
||||
('CARDINAL', "Cardinal interpolation", "Use cardinal interpolation between segments"),
|
||||
('BSPLINE', "B-spline interpolation", "Use b-spline interpolation between segments"),
|
||||
enum_curve_shape = (
|
||||
('RIBBONS', "Ribbons", "Ignore thickness of each strand"),
|
||||
('THICK', "Thick", "Use thickness of strand when rendering"),
|
||||
)
|
||||
|
||||
enum_tile_order = (
|
||||
@@ -119,6 +97,11 @@ enum_sampling_pattern = (
|
||||
('CORRELATED_MUTI_JITTER', "Correlated Multi-Jitter", "Use Correlated Multi-Jitter random sampling pattern"),
|
||||
)
|
||||
|
||||
enum_integrator = (
|
||||
('BRANCHED_PATH', "Branched Path Tracing", "Path tracing integrator that branches on the first bounce, giving more control over the number of light and material samples"),
|
||||
('PATH', "Path Tracing", "Pure path tracing integrator"),
|
||||
)
|
||||
|
||||
|
||||
class CyclesRenderSettings(bpy.types.PropertyGroup):
|
||||
@classmethod
|
||||
@@ -145,13 +128,15 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
|
||||
description="Use Open Shading Language (CPU rendering only)",
|
||||
)
|
||||
|
||||
cls.progressive = BoolProperty(
|
||||
name="Progressive",
|
||||
description="Use progressive sampling of lighting",
|
||||
default=True,
|
||||
cls.progressive = EnumProperty(
|
||||
name="Integrator",
|
||||
description="Method to sample lights and materials",
|
||||
items=enum_integrator,
|
||||
default='PATH',
|
||||
)
|
||||
cls.squared_samples = BoolProperty(
|
||||
name="Squared Samples",
|
||||
|
||||
cls.use_square_samples = BoolProperty(
|
||||
name="Square Samples",
|
||||
description="Square sampling values for easier artist control",
|
||||
default=False,
|
||||
)
|
||||
@@ -407,6 +392,7 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
|
||||
description="Tile order for rendering",
|
||||
items=enum_tile_order,
|
||||
default='CENTER',
|
||||
options=set(), # Not animatable!
|
||||
)
|
||||
cls.use_progressive_refine = BoolProperty(
|
||||
name="Progressive Refine",
|
||||
@@ -689,105 +675,34 @@ class CyclesCurveRenderSettings(bpy.types.PropertyGroup):
|
||||
description="Cycles hair rendering settings",
|
||||
type=cls,
|
||||
)
|
||||
cls.preset = EnumProperty(
|
||||
name="Mode",
|
||||
description="Hair rendering mode",
|
||||
items=enum_curve_presets,
|
||||
default='TRUE_NORMAL',
|
||||
)
|
||||
cls.primitive = EnumProperty(
|
||||
name="Primitive",
|
||||
description="Type of primitive used for hair rendering",
|
||||
items=enum_curve_primitives,
|
||||
default='LINE_SEGMENTS',
|
||||
)
|
||||
cls.triangle_method = EnumProperty(
|
||||
name="Mesh Geometry",
|
||||
description="Method for creating triangle geometry",
|
||||
items=enum_triangle_curves,
|
||||
default='CAMERA_TRIANGLES',
|
||||
cls.shape = EnumProperty(
|
||||
name="Shape",
|
||||
description="Form of hair",
|
||||
items=enum_curve_shape,
|
||||
default='THICK',
|
||||
)
|
||||
cls.line_method = EnumProperty(
|
||||
name="Intersection Method",
|
||||
description="Method for line segment intersection",
|
||||
items=enum_line_curves,
|
||||
default='ACCURATE',
|
||||
)
|
||||
cls.interpolation = EnumProperty(
|
||||
name="Interpolation",
|
||||
description="Interpolation method",
|
||||
items=enum_curves_interpolation,
|
||||
default='BSPLINE',
|
||||
)
|
||||
cls.use_backfacing = BoolProperty(
|
||||
name="Check back-faces",
|
||||
description="Test back-faces of strands",
|
||||
default=False,
|
||||
)
|
||||
cls.use_encasing = BoolProperty(
|
||||
name="Exclude encasing",
|
||||
description="Ignore strands encasing a ray's initial location",
|
||||
cls.cull_backfacing = BoolProperty(
|
||||
name="Cull back-faces",
|
||||
description="Do not test the back-face of each strand",
|
||||
default=True,
|
||||
)
|
||||
cls.use_tangent_normal_geometry = BoolProperty(
|
||||
name="Tangent normal geometry",
|
||||
description="Use the tangent normal for actual normal",
|
||||
default=False,
|
||||
)
|
||||
cls.use_tangent_normal = BoolProperty(
|
||||
name="Tangent normal default",
|
||||
description="Use the tangent normal for all normals",
|
||||
default=False,
|
||||
)
|
||||
cls.use_tangent_normal_correction = BoolProperty(
|
||||
name="Strand slope correction",
|
||||
description="Correct the tangent normal for the strand's slope",
|
||||
default=False,
|
||||
)
|
||||
cls.use_parents = BoolProperty(
|
||||
name="Use parent strands",
|
||||
description="Use parents with children",
|
||||
default=False,
|
||||
)
|
||||
cls.use_smooth = BoolProperty(
|
||||
name="Smooth Strands",
|
||||
description="Use vertex normals",
|
||||
default=True,
|
||||
)
|
||||
cls.use_joined = BoolProperty(
|
||||
name="Join",
|
||||
description="Fill gaps between segments (requires more memory)",
|
||||
default=False,
|
||||
)
|
||||
cls.use_curves = BoolProperty(
|
||||
name="Use Cycles Hair Rendering",
|
||||
description="Activate Cycles hair rendering for particle system",
|
||||
default=True,
|
||||
)
|
||||
cls.segments = IntProperty(
|
||||
name="Segments",
|
||||
description="Number of segments between path keys (note that this combines with the 'draw step' value)",
|
||||
min=1, max=64,
|
||||
default=1,
|
||||
)
|
||||
cls.resolution = IntProperty(
|
||||
name="Resolution",
|
||||
description="Resolution of generated mesh",
|
||||
min=3, max=64,
|
||||
default=3,
|
||||
)
|
||||
cls.normalmix = FloatProperty(
|
||||
name="Normal mix",
|
||||
description="Scale factor for tangent normal removal (zero gives ray normal)",
|
||||
min=0, max=2.0,
|
||||
default=1,
|
||||
)
|
||||
cls.encasing_ratio = FloatProperty(
|
||||
name="Encasing ratio",
|
||||
description="Scale factor for encasing strand width",
|
||||
min=0.0, max=100.0,
|
||||
default=1.01,
|
||||
)
|
||||
cls.minimum_width = FloatProperty(
|
||||
name="Minimal width",
|
||||
description="Minimal pixel width for strands (0 - deactivated)",
|
||||
|
@@ -1,19 +1,17 @@
|
||||
#
|
||||
# Copyright 2011, Blender Foundation.
|
||||
# Copyright 2011-2013 Blender Foundation
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
# 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
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
# 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
|
||||
#
|
||||
|
||||
# <pep8 compliant>
|
||||
@@ -50,6 +48,49 @@ class CyclesButtonsPanel():
|
||||
return rd.engine == 'CYCLES'
|
||||
|
||||
|
||||
def draw_samples_info(layout, cscene):
|
||||
integrator = cscene.progressive
|
||||
|
||||
# Calculate sample values
|
||||
if integrator == 'PATH':
|
||||
aa = cscene.samples
|
||||
if cscene.use_square_samples:
|
||||
aa = aa * aa
|
||||
else:
|
||||
aa = cscene.aa_samples
|
||||
d = cscene.diffuse_samples
|
||||
g = cscene.glossy_samples
|
||||
t = cscene.transmission_samples
|
||||
ao = cscene.ao_samples
|
||||
ml = cscene.mesh_light_samples
|
||||
sss = cscene.subsurface_samples
|
||||
|
||||
if cscene.use_square_samples:
|
||||
aa = aa * aa
|
||||
d = d * d
|
||||
g = g * g
|
||||
t = t * t
|
||||
ao = ao * ao
|
||||
ml = ml * ml
|
||||
sss = sss * sss
|
||||
|
||||
# Draw interface
|
||||
# Do not draw for progressive, when Square Samples are disabled
|
||||
if (integrator == 'BRANCHED_PATH') or (cscene.use_square_samples and integrator == 'PATH'):
|
||||
col = layout.column(align=True)
|
||||
col.scale_y = 0.6
|
||||
col.label("Total Samples:")
|
||||
col.separator()
|
||||
if integrator == 'PATH':
|
||||
col.label("%s AA" % aa)
|
||||
else:
|
||||
col.label("%s AA, %s Diffuse, %s Glossy, %s Transmission" %
|
||||
(aa, d * aa, g * aa, t * aa))
|
||||
col.separator()
|
||||
col.label("%s AO, %s Mesh Light, %s Subsurface" %
|
||||
(ao * aa, ml * aa, sss * aa))
|
||||
|
||||
|
||||
class CyclesRender_PT_sampling(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Sampling"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
@@ -60,27 +101,25 @@ class CyclesRender_PT_sampling(CyclesButtonsPanel, Panel):
|
||||
scene = context.scene
|
||||
cscene = scene.cycles
|
||||
device_type = context.user_preferences.system.compute_device_type
|
||||
|
||||
|
||||
row = layout.row(align=True)
|
||||
row.menu("CYCLES_MT_sampling_presets", text=bpy.types.CYCLES_MT_sampling_presets.bl_label)
|
||||
row.operator("render.cycles_sampling_preset_add", text="", icon="ZOOMIN")
|
||||
row.operator("render.cycles_sampling_preset_add", text="", icon="ZOOMOUT").remove_active = True
|
||||
|
||||
row = layout.row()
|
||||
sub = row.row()
|
||||
sub.active = (device_type == 'NONE' or cscene.device == 'CPU')
|
||||
sub.prop(cscene, "progressive")
|
||||
row.prop(cscene, "squared_samples")
|
||||
|
||||
row.prop(cscene, "progressive", text="")
|
||||
row.prop(cscene, "use_square_samples")
|
||||
|
||||
split = layout.split()
|
||||
|
||||
|
||||
col = split.column()
|
||||
sub = col.column(align=True)
|
||||
sub.label("Settings:")
|
||||
sub.prop(cscene, "seed")
|
||||
sub.prop(cscene, "sample_clamp")
|
||||
|
||||
if cscene.progressive or (device_type != 'NONE' and cscene.device == 'GPU'):
|
||||
if cscene.progressive == 'PATH':
|
||||
col = split.column()
|
||||
sub = col.column(align=True)
|
||||
sub.label(text="Samples:")
|
||||
@@ -110,6 +149,8 @@ class CyclesRender_PT_sampling(CyclesButtonsPanel, Panel):
|
||||
layout.row().prop(cscene, "use_layer_samples")
|
||||
break
|
||||
|
||||
draw_samples_info(layout, cscene)
|
||||
|
||||
|
||||
class CyclesRender_PT_light_paths(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Light Paths"
|
||||
@@ -211,8 +252,8 @@ class CyclesRender_PT_performance(CyclesButtonsPanel, Panel):
|
||||
col = split.column(align=True)
|
||||
|
||||
col.label(text="Threads:")
|
||||
col.row().prop(rd, "threads_mode", expand=True)
|
||||
sub = col.column()
|
||||
col.row(align=True).prop(rd, "threads_mode", expand=True)
|
||||
sub = col.column(align=True)
|
||||
sub.enabled = rd.threads_mode == 'FIXED'
|
||||
sub.prop(rd, "threads")
|
||||
|
||||
@@ -225,7 +266,7 @@ class CyclesRender_PT_performance(CyclesButtonsPanel, Panel):
|
||||
|
||||
sub.prop(cscene, "use_progressive_refine")
|
||||
|
||||
subsub = sub.column()
|
||||
subsub = sub.column(align=True)
|
||||
subsub.enabled = not rd.use_border
|
||||
subsub.prop(rd, "use_save_buffers")
|
||||
|
||||
@@ -244,7 +285,7 @@ class CyclesRender_PT_performance(CyclesButtonsPanel, Panel):
|
||||
|
||||
col.separator()
|
||||
|
||||
col.label(text="Acceleration structure:")
|
||||
col.label(text="Acceleration structure:")
|
||||
col.prop(cscene, "debug_use_spatial_splits")
|
||||
|
||||
|
||||
@@ -353,7 +394,9 @@ class CyclesRender_PT_layer_passes(CyclesButtonsPanel, Panel):
|
||||
col.prop(rl, "use_pass_uv")
|
||||
col.prop(rl, "use_pass_object_index")
|
||||
col.prop(rl, "use_pass_material_index")
|
||||
col.separator()
|
||||
col.prop(rl, "use_pass_shadow")
|
||||
col.prop(rl, "use_pass_ambient_occlusion")
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Diffuse:")
|
||||
@@ -371,10 +414,15 @@ class CyclesRender_PT_layer_passes(CyclesButtonsPanel, Panel):
|
||||
row.prop(rl, "use_pass_transmission_direct", text="Direct", toggle=True)
|
||||
row.prop(rl, "use_pass_transmission_indirect", text="Indirect", toggle=True)
|
||||
row.prop(rl, "use_pass_transmission_color", text="Color", toggle=True)
|
||||
col.label(text="Subsurface:")
|
||||
row = col.row(align=True)
|
||||
row.prop(rl, "use_pass_subsurface_direct", text="Direct", toggle=True)
|
||||
row.prop(rl, "use_pass_subsurface_indirect", text="Indirect", toggle=True)
|
||||
row.prop(rl, "use_pass_subsurface_color", text="Color", toggle=True)
|
||||
|
||||
col.separator()
|
||||
col.prop(rl, "use_pass_emit", text="Emission")
|
||||
col.prop(rl, "use_pass_environment")
|
||||
col.prop(rl, "use_pass_ambient_occlusion")
|
||||
|
||||
|
||||
class Cycles_PT_post_processing(CyclesButtonsPanel, Panel):
|
||||
@@ -546,7 +594,8 @@ class CyclesObject_PT_ray_visibility(CyclesButtonsPanel, Panel):
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
ob = context.object
|
||||
return CyclesButtonsPanel.poll(context) and ob and ob.type in {'MESH', 'CURVE', 'CURVE', 'SURFACE', 'FONT', 'META', 'LAMP'}
|
||||
return (CyclesButtonsPanel.poll(context) and
|
||||
ob and ob.type in {'MESH', 'CURVE', 'CURVE', 'SURFACE', 'FONT', 'META', 'LAMP'})
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
@@ -648,7 +697,6 @@ class CyclesLamp_PT_lamp(CyclesButtonsPanel, Panel):
|
||||
lamp = context.lamp
|
||||
clamp = lamp.cycles
|
||||
cscene = context.scene.cycles
|
||||
device_type = context.user_preferences.system.compute_device_type
|
||||
|
||||
layout.prop(lamp, "type", expand=True)
|
||||
|
||||
@@ -667,7 +715,7 @@ class CyclesLamp_PT_lamp(CyclesButtonsPanel, Panel):
|
||||
sub.prop(lamp, "size", text="Size X")
|
||||
sub.prop(lamp, "size_y", text="Size Y")
|
||||
|
||||
if not cscene.progressive and (device_type == 'NONE' or cscene.device == 'CPU'):
|
||||
if cscene.progressive == 'BRANCHED_PATH':
|
||||
col.prop(clamp, "samples")
|
||||
|
||||
col = split.column()
|
||||
@@ -856,7 +904,6 @@ class CyclesWorld_PT_settings(CyclesButtonsPanel, Panel):
|
||||
world = context.world
|
||||
cworld = world.cycles
|
||||
cscene = context.scene.cycles
|
||||
device_type = context.user_preferences.system.compute_device_type
|
||||
|
||||
col = layout.column()
|
||||
|
||||
@@ -864,7 +911,7 @@ class CyclesWorld_PT_settings(CyclesButtonsPanel, Panel):
|
||||
sub = col.row(align=True)
|
||||
sub.active = cworld.sample_as_light
|
||||
sub.prop(cworld, "sample_map_resolution")
|
||||
if not cscene.progressive and (device_type == 'NONE' or cscene.device == 'CPU'):
|
||||
if not cscene.progressive:
|
||||
sub.prop(cworld, "samples")
|
||||
|
||||
|
||||
@@ -1147,44 +1194,17 @@ class CyclesRender_PT_CurveRendering(CyclesButtonsPanel, Panel):
|
||||
|
||||
layout.active = ccscene.use_curves
|
||||
|
||||
layout.prop(ccscene, "preset", text="Mode")
|
||||
layout.prop(ccscene, "primitive", text="Primitive")
|
||||
layout.prop(ccscene, "shape", text="Shape")
|
||||
|
||||
if ccscene.preset == 'CUSTOM':
|
||||
layout.prop(ccscene, "primitive", text="Primitive")
|
||||
|
||||
if ccscene.primitive == 'TRIANGLES':
|
||||
layout.prop(ccscene, "triangle_method", text="Method")
|
||||
if ccscene.triangle_method == 'TESSELLATED_TRIANGLES':
|
||||
layout.prop(ccscene, "resolution", text="Resolution")
|
||||
layout.prop(ccscene, "use_smooth", text="Smooth")
|
||||
elif ccscene.primitive == 'LINE_SEGMENTS':
|
||||
layout.prop(ccscene, "use_backfacing", text="Check back-faces")
|
||||
|
||||
row = layout.row()
|
||||
row.prop(ccscene, "use_encasing", text="Exclude encasing")
|
||||
sub = row.row()
|
||||
sub.active = ccscene.use_encasing
|
||||
sub.prop(ccscene, "encasing_ratio", text="Ratio for encasing")
|
||||
|
||||
layout.prop(ccscene, "line_method", text="Method")
|
||||
layout.prop(ccscene, "use_tangent_normal", text="Use tangent normal as default")
|
||||
layout.prop(ccscene, "use_tangent_normal_geometry", text="Use tangent normal geometry")
|
||||
layout.prop(ccscene, "use_tangent_normal_correction", text="Correct tangent normal for slope")
|
||||
layout.prop(ccscene, "interpolation", text="Interpolation")
|
||||
|
||||
row = layout.row()
|
||||
row.prop(ccscene, "segments", text="Segments")
|
||||
row.prop(ccscene, "normalmix", text="Ray Mix")
|
||||
elif ccscene.primitive in {'CURVE_SEGMENTS', 'CURVE_RIBBONS'}:
|
||||
layout.prop(ccscene, "subdivisions", text="Curve subdivisions")
|
||||
layout.prop(ccscene, "use_backfacing", text="Check back-faces")
|
||||
|
||||
layout.prop(ccscene, "interpolation", text="Interpolation")
|
||||
row = layout.row()
|
||||
row.prop(ccscene, "segments", text="Segments")
|
||||
|
||||
row = layout.row()
|
||||
row.prop(ccscene, "use_parents", text="Include parents")
|
||||
if ccscene.primitive == 'TRIANGLES':
|
||||
if ccscene.shape == 'THICK':
|
||||
layout.prop(ccscene, "resolution", text="Resolution")
|
||||
elif ccscene.primitive == 'LINE_SEGMENTS':
|
||||
layout.prop(ccscene, "cull_backfacing", text="Cull back-faces")
|
||||
elif ccscene.primitive in {'CURVE_SEGMENTS', 'CURVE_RIBBONS'}:
|
||||
layout.prop(ccscene, "cull_backfacing", text="Cull back-faces")
|
||||
layout.prop(ccscene, "subdivisions", text="Curve subdivisions")
|
||||
|
||||
row = layout.row()
|
||||
row.prop(ccscene, "minimum_width", text="Min Pixels")
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include "camera.h"
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include "attribute.h"
|
||||
@@ -37,15 +35,14 @@ void curveinterp_v3_v3v3v3v3(float3 *p, float3 *v1, float3 *v2, float3 *v3, floa
|
||||
void interp_weights(float t, float data[4], int type);
|
||||
float shaperadius(float shape, float root, float tip, float time);
|
||||
void InterpolateKeySegments(int seg, int segno, int key, int curve, float3 *keyloc, float *time, ParticleCurveData *CData, int interpolation);
|
||||
bool ObtainCacheParticleUV(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, bool background, int uv_num);
|
||||
bool ObtainCacheParticleVcol(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, bool background, int vcol_num);
|
||||
bool ObtainCacheParticleData(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, bool background);
|
||||
void ExportCurveSegments(Mesh *mesh, ParticleCurveData *CData, int interpolation, int segments);
|
||||
void ExportCurveTrianglePlanes(Mesh *mesh, ParticleCurveData *CData, int interpolation, bool use_smooth, int segments, float3 RotCam);
|
||||
void ExportCurveTriangleRibbons(Mesh *mesh, ParticleCurveData *CData, int interpolation, bool use_smooth, int segments);
|
||||
void ExportCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int interpolation, bool use_smooth, int resolution, int segments);
|
||||
void ExportCurveTriangleUV(Mesh *mesh, ParticleCurveData *CData, int interpolation, int segments, int vert_offset, int resol, float3 *uvdata);
|
||||
void ExportCurveTriangleVcol(Mesh *mesh, ParticleCurveData *CData, int interpolation, int segments, int vert_offset, int resol, float3 *fdata);
|
||||
bool ObtainCacheParticleUV(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool background, int uv_num);
|
||||
bool ObtainCacheParticleVcol(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool background, int vcol_num);
|
||||
bool ObtainCacheParticleData(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool background);
|
||||
void ExportCurveSegments(Scene *scene, Mesh *mesh, ParticleCurveData *CData);
|
||||
void ExportCurveTrianglePlanes(Mesh *mesh, ParticleCurveData *CData, float3 RotCam);
|
||||
void ExportCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int resolution);
|
||||
void ExportCurveTriangleUV(Mesh *mesh, ParticleCurveData *CData, int vert_offset, int resol, float3 *uvdata);
|
||||
void ExportCurveTriangleVcol(Mesh *mesh, ParticleCurveData *CData, int vert_offset, int resol, float3 *fdata);
|
||||
|
||||
ParticleCurveData::ParticleCurveData()
|
||||
{
|
||||
@@ -157,7 +154,7 @@ void InterpolateKeySegments(int seg, int segno, int key, int curve, float3 *keyl
|
||||
curveinterp_v3_v3v3v3v3(keyloc, &ckey_loc1, &ckey_loc2, &ckey_loc3, &ckey_loc4, t);
|
||||
}
|
||||
|
||||
bool ObtainCacheParticleData(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, bool background)
|
||||
bool ObtainCacheParticleData(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool background)
|
||||
{
|
||||
|
||||
int curvenum = 0;
|
||||
@@ -188,7 +185,7 @@ bool ObtainCacheParticleData(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, Par
|
||||
int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_psys.settings().draw_percentage() / 100.0f);
|
||||
int totcurves = totchild;
|
||||
|
||||
if(use_parents || b_psys.settings().child_type() == 0)
|
||||
if(b_psys.settings().child_type() == 0)
|
||||
totcurves += totparts;
|
||||
|
||||
if(totcurves == 0)
|
||||
@@ -208,7 +205,7 @@ bool ObtainCacheParticleData(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, Par
|
||||
CData->psys_closetip.push_back(get_boolean(cpsys, "use_closetip"));
|
||||
|
||||
int pa_no = 0;
|
||||
if(!use_parents && !(b_psys.settings().child_type() == 0))
|
||||
if(!(b_psys.settings().child_type() == 0))
|
||||
pa_no = totparts;
|
||||
|
||||
for(; pa_no < totparts+totchild; pa_no++) {
|
||||
@@ -244,7 +241,7 @@ bool ObtainCacheParticleData(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, Par
|
||||
|
||||
}
|
||||
|
||||
bool ObtainCacheParticleUV(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, bool background, int uv_num)
|
||||
bool ObtainCacheParticleUV(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool background, int uv_num)
|
||||
{
|
||||
#if 0
|
||||
int keyno = 0;
|
||||
@@ -279,14 +276,14 @@ bool ObtainCacheParticleUV(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, Parti
|
||||
int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_psys.settings().draw_percentage() / 100.0f);
|
||||
int totcurves = totchild;
|
||||
|
||||
if (use_parents || b_psys.settings().child_type() == 0)
|
||||
if (b_psys.settings().child_type() == 0)
|
||||
totcurves += totparts;
|
||||
|
||||
if (totcurves == 0)
|
||||
continue;
|
||||
|
||||
int pa_no = 0;
|
||||
if(!use_parents && !(b_psys.settings().child_type() == 0))
|
||||
if(!(b_psys.settings().child_type() == 0))
|
||||
pa_no = totparts;
|
||||
|
||||
BL::ParticleSystem::particles_iterator b_pa;
|
||||
@@ -315,7 +312,7 @@ bool ObtainCacheParticleUV(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, Parti
|
||||
|
||||
}
|
||||
|
||||
bool ObtainCacheParticleVcol(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool use_parents, bool background, int vcol_num)
|
||||
bool ObtainCacheParticleVcol(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool background, int vcol_num)
|
||||
{
|
||||
#if 0
|
||||
int keyno = 0;
|
||||
@@ -348,14 +345,14 @@ bool ObtainCacheParticleVcol(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, Par
|
||||
int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_psys.settings().draw_percentage() / 100.0f);
|
||||
int totcurves = totchild;
|
||||
|
||||
if (use_parents || b_psys.settings().child_type() == 0)
|
||||
if (b_psys.settings().child_type() == 0)
|
||||
totcurves += totparts;
|
||||
|
||||
if (totcurves == 0)
|
||||
continue;
|
||||
|
||||
int pa_no = 0;
|
||||
if(!use_parents && !(b_psys.settings().child_type() == 0))
|
||||
if(!(b_psys.settings().child_type() == 0))
|
||||
pa_no = totparts;
|
||||
|
||||
BL::ParticleSystem::particles_iterator b_pa;
|
||||
@@ -396,7 +393,7 @@ static void set_resolution(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, BL::S
|
||||
}
|
||||
}
|
||||
|
||||
void ExportCurveTrianglePlanes(Mesh *mesh, ParticleCurveData *CData, int interpolation, bool use_smooth, int segments, float3 RotCam)
|
||||
void ExportCurveTrianglePlanes(Mesh *mesh, ParticleCurveData *CData, float3 RotCam)
|
||||
{
|
||||
int vertexno = mesh->verts.size();
|
||||
int vertexindex = vertexno;
|
||||
@@ -404,52 +401,44 @@ void ExportCurveTrianglePlanes(Mesh *mesh, ParticleCurveData *CData, int interpo
|
||||
for( int sys = 0; sys < CData->psys_firstcurve.size() ; sys++) {
|
||||
for( int curve = CData->psys_firstcurve[sys]; curve < CData->psys_firstcurve[sys] + CData->psys_curvenum[sys] ; curve++) {
|
||||
|
||||
for( int curvekey = CData->curve_firstkey[curve]; curvekey < CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1; curvekey++) {
|
||||
float3 xbasis;
|
||||
float3 v1;
|
||||
float time = 0.0f;
|
||||
float3 ickey_loc = CData->curvekey_co[CData->curve_firstkey[curve]];
|
||||
float radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], 0.0f);
|
||||
v1 = CData->curvekey_co[CData->curve_firstkey[curve] + 1] - CData->curvekey_co[CData->curve_firstkey[curve]];
|
||||
xbasis = normalize(cross(RotCam - ickey_loc,v1));
|
||||
float3 ickey_loc_shfl = ickey_loc - radius * xbasis;
|
||||
float3 ickey_loc_shfr = ickey_loc + radius * xbasis;
|
||||
mesh->verts.push_back(ickey_loc_shfl);
|
||||
mesh->verts.push_back(ickey_loc_shfr);
|
||||
vertexindex += 2;
|
||||
|
||||
int subv = 1;
|
||||
float3 xbasis;
|
||||
for( int curvekey = CData->curve_firstkey[curve] + 1; curvekey < CData->curve_firstkey[curve] + CData->curve_keynum[curve]; curvekey++) {
|
||||
ickey_loc = CData->curvekey_co[curvekey];
|
||||
|
||||
float3 v1;
|
||||
|
||||
if(curvekey == CData->curve_firstkey[curve]) {
|
||||
subv = 0;
|
||||
v1 = CData->curvekey_co[min(curvekey+2,CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1)] - CData->curvekey_co[curvekey];
|
||||
}
|
||||
else if(curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1)
|
||||
v1 = CData->curvekey_co[curvekey] - CData->curvekey_co[max(curvekey - 2, CData->curve_firstkey[curve])];
|
||||
if(curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1)
|
||||
v1 = CData->curvekey_co[curvekey] - CData->curvekey_co[max(curvekey - 1, CData->curve_firstkey[curve])];
|
||||
else
|
||||
v1 = CData->curvekey_co[curvekey + 1] - CData->curvekey_co[curvekey - 1];
|
||||
|
||||
time = CData->curvekey_time[curvekey]/CData->curve_length[curve];
|
||||
radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], time);
|
||||
|
||||
for (; subv <= segments; subv++) {
|
||||
if(curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1)
|
||||
radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], 0.95f);
|
||||
|
||||
float3 ickey_loc = make_float3(0.0f,0.0f,0.0f);
|
||||
float time = 0.0f;
|
||||
if(CData->psys_closetip[sys] && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1))
|
||||
radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], 0.0f, 0.95f);
|
||||
|
||||
if ((interpolation == CURVE_BSPLINE) && (curvekey == CData->curve_firstkey[curve]) && (subv == 0))
|
||||
ickey_loc = CData->curvekey_co[curvekey];
|
||||
else
|
||||
InterpolateKeySegments(subv, segments, curvekey, curve, &ickey_loc, &time, CData , interpolation);
|
||||
|
||||
float radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], time);
|
||||
|
||||
if((curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) && (subv == segments))
|
||||
radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], 0.95f);
|
||||
|
||||
if(CData->psys_closetip[sys] && (subv == segments) && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2))
|
||||
radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], 0.0f, 0.95f);
|
||||
|
||||
xbasis = normalize(cross(RotCam - ickey_loc,v1));
|
||||
float3 ickey_loc_shfl = ickey_loc - radius * xbasis;
|
||||
float3 ickey_loc_shfr = ickey_loc + radius * xbasis;
|
||||
mesh->verts.push_back(ickey_loc_shfl);
|
||||
mesh->verts.push_back(ickey_loc_shfr);
|
||||
if(subv!=0) {
|
||||
mesh->add_triangle(vertexindex-2, vertexindex, vertexindex-1, CData->psys_shader[sys], use_smooth);
|
||||
mesh->add_triangle(vertexindex+1, vertexindex-1, vertexindex, CData->psys_shader[sys], use_smooth);
|
||||
}
|
||||
vertexindex += 2;
|
||||
}
|
||||
xbasis = normalize(cross(RotCam - ickey_loc,v1));
|
||||
float3 ickey_loc_shfl = ickey_loc - radius * xbasis;
|
||||
float3 ickey_loc_shfr = ickey_loc + radius * xbasis;
|
||||
mesh->verts.push_back(ickey_loc_shfl);
|
||||
mesh->verts.push_back(ickey_loc_shfr);
|
||||
mesh->add_triangle(vertexindex-2, vertexindex, vertexindex-1, CData->psys_shader[sys], true);
|
||||
mesh->add_triangle(vertexindex+1, vertexindex-1, vertexindex, CData->psys_shader[sys], true);
|
||||
vertexindex += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -464,120 +453,7 @@ void ExportCurveTrianglePlanes(Mesh *mesh, ParticleCurveData *CData, int interpo
|
||||
/* texture coords still needed */
|
||||
}
|
||||
|
||||
void ExportCurveTriangleRibbons(Mesh *mesh, ParticleCurveData *CData, int interpolation, bool use_smooth, int segments)
|
||||
{
|
||||
int vertexno = mesh->verts.size();
|
||||
int vertexindex = vertexno;
|
||||
|
||||
for( int sys = 0; sys < CData->psys_firstcurve.size() ; sys++) {
|
||||
for( int curve = CData->psys_firstcurve[sys]; curve < CData->psys_firstcurve[sys] + CData->psys_curvenum[sys] ; curve++) {
|
||||
|
||||
float3 firstxbasis = cross(make_float3(1.0f,0.0f,0.0f),CData->curvekey_co[CData->curve_firstkey[curve]+1] - CData->curvekey_co[CData->curve_firstkey[curve]]);
|
||||
if(len_squared(firstxbasis)!= 0.0f)
|
||||
firstxbasis = normalize(firstxbasis);
|
||||
else
|
||||
firstxbasis = normalize(cross(make_float3(0.0f,1.0f,0.0f),CData->curvekey_co[CData->curve_firstkey[curve]+1] - CData->curvekey_co[CData->curve_firstkey[curve]]));
|
||||
|
||||
for( int curvekey = CData->curve_firstkey[curve]; curvekey < CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1; curvekey++) {
|
||||
|
||||
float3 xbasis = firstxbasis;
|
||||
float3 v1;
|
||||
float3 v2;
|
||||
|
||||
if(curvekey == CData->curve_firstkey[curve]) {
|
||||
v1 = CData->curvekey_co[min(curvekey+2,CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1)] - CData->curvekey_co[curvekey+1];
|
||||
v2 = CData->curvekey_co[curvekey+1] - CData->curvekey_co[curvekey];
|
||||
}
|
||||
else if(curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1) {
|
||||
v1 = CData->curvekey_co[curvekey] - CData->curvekey_co[curvekey-1];
|
||||
v2 = CData->curvekey_co[curvekey-1] - CData->curvekey_co[max(curvekey-2,CData->curve_firstkey[curve])];
|
||||
}
|
||||
else {
|
||||
v1 = CData->curvekey_co[curvekey+1] - CData->curvekey_co[curvekey];
|
||||
v2 = CData->curvekey_co[curvekey] - CData->curvekey_co[curvekey-1];
|
||||
}
|
||||
|
||||
xbasis = cross(v1,v2);
|
||||
|
||||
if(len_squared(xbasis) >= 0.05f * len_squared(v1) * len_squared(v2)) {
|
||||
firstxbasis = normalize(xbasis);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for( int curvekey = CData->curve_firstkey[curve]; curvekey < CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1; curvekey++) {
|
||||
|
||||
int subv = 1;
|
||||
float3 v1;
|
||||
float3 v2;
|
||||
float3 xbasis;
|
||||
|
||||
if(curvekey == CData->curve_firstkey[curve]) {
|
||||
subv = 0;
|
||||
v1 = CData->curvekey_co[min(curvekey+2,CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1)] - CData->curvekey_co[curvekey+1];
|
||||
v2 = CData->curvekey_co[curvekey+1] - CData->curvekey_co[curvekey];
|
||||
}
|
||||
else if(curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1) {
|
||||
v1 = CData->curvekey_co[curvekey] - CData->curvekey_co[curvekey-1];
|
||||
v2 = CData->curvekey_co[curvekey-1] - CData->curvekey_co[max(curvekey-2,CData->curve_firstkey[curve])];
|
||||
}
|
||||
else {
|
||||
v1 = CData->curvekey_co[curvekey+1] - CData->curvekey_co[curvekey];
|
||||
v2 = CData->curvekey_co[curvekey] - CData->curvekey_co[curvekey-1];
|
||||
}
|
||||
|
||||
xbasis = cross(v1,v2);
|
||||
|
||||
if(len_squared(xbasis) >= 0.05f * len_squared(v1) * len_squared(v2)) {
|
||||
xbasis = normalize(xbasis);
|
||||
firstxbasis = xbasis;
|
||||
}
|
||||
else
|
||||
xbasis = firstxbasis;
|
||||
|
||||
for (; subv <= segments; subv++) {
|
||||
|
||||
float3 ickey_loc = make_float3(0.0f,0.0f,0.0f);
|
||||
float time = 0.0f;
|
||||
|
||||
if ((interpolation == CURVE_BSPLINE) && (curvekey == CData->curve_firstkey[curve]) && (subv == 0))
|
||||
ickey_loc = CData->curvekey_co[curvekey];
|
||||
else
|
||||
InterpolateKeySegments(subv, segments, curvekey, curve, &ickey_loc, &time, CData , interpolation);
|
||||
|
||||
float radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], time);
|
||||
|
||||
if((curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) && (subv == segments))
|
||||
radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], 0.95f);
|
||||
|
||||
if(CData->psys_closetip[sys] && (subv == segments) && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2))
|
||||
radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], 0.0f, 0.95f);
|
||||
|
||||
float3 ickey_loc_shfl = ickey_loc - radius * xbasis;
|
||||
float3 ickey_loc_shfr = ickey_loc + radius * xbasis;
|
||||
mesh->verts.push_back(ickey_loc_shfl);
|
||||
mesh->verts.push_back(ickey_loc_shfr);
|
||||
if(subv!=0) {
|
||||
mesh->add_triangle(vertexindex-2, vertexindex, vertexindex-1, CData->psys_shader[sys], use_smooth);
|
||||
mesh->add_triangle(vertexindex+1, vertexindex-1, vertexindex, CData->psys_shader[sys], use_smooth);
|
||||
}
|
||||
vertexindex += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mesh->reserve(mesh->verts.size(), mesh->triangles.size(), 0, 0);
|
||||
mesh->attributes.remove(ATTR_STD_VERTEX_NORMAL);
|
||||
mesh->attributes.remove(ATTR_STD_FACE_NORMAL);
|
||||
mesh->add_face_normals();
|
||||
mesh->add_vertex_normals();
|
||||
mesh->attributes.remove(ATTR_STD_FACE_NORMAL);
|
||||
/* texture coords still needed */
|
||||
|
||||
}
|
||||
|
||||
void ExportCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int interpolation, bool use_smooth, int resolution, int segments)
|
||||
void ExportCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int resolution)
|
||||
{
|
||||
int vertexno = mesh->verts.size();
|
||||
int vertexindex = vertexno;
|
||||
@@ -652,22 +528,19 @@ void ExportCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int inter
|
||||
|
||||
ybasis = normalize(cross(xbasis,v2));
|
||||
|
||||
for (; subv <= segments; subv++) {
|
||||
for (; subv <= 1; subv++) {
|
||||
|
||||
float3 ickey_loc = make_float3(0.0f,0.0f,0.0f);
|
||||
float time = 0.0f;
|
||||
|
||||
if ((interpolation == CURVE_BSPLINE) && (curvekey == CData->curve_firstkey[curve]) && (subv == 0))
|
||||
ickey_loc = CData->curvekey_co[curvekey];
|
||||
else
|
||||
InterpolateKeySegments(subv, segments, curvekey, curve, &ickey_loc, &time, CData , interpolation);
|
||||
InterpolateKeySegments(subv, 1, curvekey, curve, &ickey_loc, &time, CData , 1);
|
||||
|
||||
float radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], time);
|
||||
|
||||
if((curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) && (subv == segments))
|
||||
if((curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) && (subv == 1))
|
||||
radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], 0.95f);
|
||||
|
||||
if(CData->psys_closetip[sys] && (subv == segments) && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2))
|
||||
if(CData->psys_closetip[sys] && (subv == 1) && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2))
|
||||
radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], 0.0f, 0.95f);
|
||||
|
||||
float angle = M_2PI_F / (float)resolution;
|
||||
@@ -678,11 +551,11 @@ void ExportCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int inter
|
||||
|
||||
if(subv!=0) {
|
||||
for(int section = 0 ; section < resolution - 1; section++) {
|
||||
mesh->add_triangle(vertexindex - resolution + section, vertexindex + section, vertexindex - resolution + section + 1, CData->psys_shader[sys], use_smooth);
|
||||
mesh->add_triangle(vertexindex + section + 1, vertexindex - resolution + section + 1, vertexindex + section, CData->psys_shader[sys], use_smooth);
|
||||
mesh->add_triangle(vertexindex - resolution + section, vertexindex + section, vertexindex - resolution + section + 1, CData->psys_shader[sys], true);
|
||||
mesh->add_triangle(vertexindex + section + 1, vertexindex - resolution + section + 1, vertexindex + section, CData->psys_shader[sys], true);
|
||||
}
|
||||
mesh->add_triangle(vertexindex-1, vertexindex + resolution - 1, vertexindex - resolution, CData->psys_shader[sys], use_smooth);
|
||||
mesh->add_triangle(vertexindex, vertexindex - resolution , vertexindex + resolution - 1, CData->psys_shader[sys], use_smooth);
|
||||
mesh->add_triangle(vertexindex-1, vertexindex + resolution - 1, vertexindex - resolution, CData->psys_shader[sys], true);
|
||||
mesh->add_triangle(vertexindex, vertexindex - resolution , vertexindex + resolution - 1, CData->psys_shader[sys], true);
|
||||
}
|
||||
vertexindex += resolution;
|
||||
}
|
||||
@@ -700,7 +573,7 @@ void ExportCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int inter
|
||||
/* texture coords still needed */
|
||||
}
|
||||
|
||||
static void ExportCurveSegments(Scene *scene, Mesh *mesh, ParticleCurveData *CData, int interpolation, int segments)
|
||||
void ExportCurveSegments(Scene *scene, Mesh *mesh, ParticleCurveData *CData)
|
||||
{
|
||||
int num_keys = 0;
|
||||
int num_curves = 0;
|
||||
@@ -725,33 +598,19 @@ static void ExportCurveSegments(Scene *scene, Mesh *mesh, ParticleCurveData *CDa
|
||||
|
||||
size_t num_curve_keys = 0;
|
||||
|
||||
for( int curvekey = CData->curve_firstkey[curve]; curvekey < CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1; curvekey++) {
|
||||
for( int curvekey = CData->curve_firstkey[curve]; curvekey < CData->curve_firstkey[curve] + CData->curve_keynum[curve]; curvekey++) {
|
||||
float3 ickey_loc = CData->curvekey_co[curvekey];
|
||||
float time = CData->curvekey_time[curvekey]/CData->curve_length[curve];
|
||||
float radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], time);
|
||||
|
||||
int subv = 1;
|
||||
if(curvekey == CData->curve_firstkey[curve])
|
||||
subv = 0;
|
||||
if(CData->psys_closetip[sys] && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1))
|
||||
radius =0.0f;
|
||||
|
||||
for (; subv <= segments; subv++) {
|
||||
mesh->add_curve_key(ickey_loc, radius);
|
||||
if(attr_intercept)
|
||||
attr_intercept->add(time);
|
||||
|
||||
float3 ickey_loc = make_float3(0.0f,0.0f,0.0f);
|
||||
float time = 0.0f;
|
||||
|
||||
if((interpolation == CURVE_BSPLINE) && (curvekey == CData->curve_firstkey[curve]) && (subv == 0))
|
||||
ickey_loc = CData->curvekey_co[curvekey];
|
||||
else
|
||||
InterpolateKeySegments(subv, segments, curvekey, curve, &ickey_loc, &time, CData , interpolation);
|
||||
|
||||
float radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], time);
|
||||
|
||||
if(CData->psys_closetip[sys] && (subv == segments) && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2))
|
||||
radius =0.0f;
|
||||
|
||||
mesh->add_curve_key(ickey_loc, radius);
|
||||
if(attr_intercept)
|
||||
attr_intercept->add(time);
|
||||
|
||||
num_curve_keys++;
|
||||
}
|
||||
num_curve_keys++;
|
||||
}
|
||||
|
||||
mesh->add_curve(num_keys, num_curve_keys, CData->psys_shader[sys]);
|
||||
@@ -769,7 +628,7 @@ static void ExportCurveSegments(Scene *scene, Mesh *mesh, ParticleCurveData *CDa
|
||||
}
|
||||
}
|
||||
|
||||
void ExportCurveTriangleUV(Mesh *mesh, ParticleCurveData *CData, int interpolation, int segments, int vert_offset, int resol, float3 *uvdata)
|
||||
void ExportCurveTriangleUV(Mesh *mesh, ParticleCurveData *CData, int vert_offset, int resol, float3 *uvdata)
|
||||
{
|
||||
if(uvdata == NULL)
|
||||
return;
|
||||
@@ -784,56 +643,42 @@ void ExportCurveTriangleUV(Mesh *mesh, ParticleCurveData *CData, int interpolati
|
||||
|
||||
for( int curvekey = CData->curve_firstkey[curve]; curvekey < CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1; curvekey++) {
|
||||
|
||||
int subv = 1;
|
||||
time = CData->curvekey_time[curvekey]/CData->curve_length[curve];
|
||||
|
||||
if (curvekey == CData->curve_firstkey[curve])
|
||||
subv = 0;
|
||||
|
||||
for (; subv <= segments; subv++) {
|
||||
|
||||
float3 ickey_loc = make_float3(0.0f,0.0f,0.0f);
|
||||
|
||||
InterpolateKeySegments(subv, segments, curvekey, curve, &ickey_loc, &time, CData , interpolation);
|
||||
|
||||
if(subv!=0) {
|
||||
for(int section = 0 ; section < resol; section++) {
|
||||
uvdata[vertexindex] = CData->curve_uv[curve];
|
||||
uvdata[vertexindex].z = prevtime;
|
||||
vertexindex++;
|
||||
uvdata[vertexindex] = CData->curve_uv[curve];
|
||||
uvdata[vertexindex].z = time;
|
||||
vertexindex++;
|
||||
uvdata[vertexindex] = CData->curve_uv[curve];
|
||||
uvdata[vertexindex].z = prevtime;
|
||||
vertexindex++;
|
||||
uvdata[vertexindex] = CData->curve_uv[curve];
|
||||
uvdata[vertexindex].z = time;
|
||||
vertexindex++;
|
||||
uvdata[vertexindex] = CData->curve_uv[curve];
|
||||
uvdata[vertexindex].z = prevtime;
|
||||
vertexindex++;
|
||||
uvdata[vertexindex] = CData->curve_uv[curve];
|
||||
uvdata[vertexindex].z = time;
|
||||
vertexindex++;
|
||||
}
|
||||
}
|
||||
|
||||
prevtime = time;
|
||||
for(int section = 0 ; section < resol; section++) {
|
||||
uvdata[vertexindex] = CData->curve_uv[curve];
|
||||
uvdata[vertexindex].z = prevtime;
|
||||
vertexindex++;
|
||||
uvdata[vertexindex] = CData->curve_uv[curve];
|
||||
uvdata[vertexindex].z = time;
|
||||
vertexindex++;
|
||||
uvdata[vertexindex] = CData->curve_uv[curve];
|
||||
uvdata[vertexindex].z = prevtime;
|
||||
vertexindex++;
|
||||
uvdata[vertexindex] = CData->curve_uv[curve];
|
||||
uvdata[vertexindex].z = time;
|
||||
vertexindex++;
|
||||
uvdata[vertexindex] = CData->curve_uv[curve];
|
||||
uvdata[vertexindex].z = prevtime;
|
||||
vertexindex++;
|
||||
uvdata[vertexindex] = CData->curve_uv[curve];
|
||||
uvdata[vertexindex].z = time;
|
||||
vertexindex++;
|
||||
}
|
||||
|
||||
prevtime = time;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void ExportCurveTriangleVcol(Mesh *mesh, ParticleCurveData *CData, int interpolation, int segments, int vert_offset, int resol, float3 *fdata)
|
||||
void ExportCurveTriangleVcol(Mesh *mesh, ParticleCurveData *CData, int vert_offset, int resol, float3 *fdata)
|
||||
{
|
||||
if(fdata == NULL)
|
||||
return;
|
||||
|
||||
float time = 0.0f;
|
||||
// float prevtime = 0.0f; // UNUSED
|
||||
|
||||
int vertexindex = vert_offset;
|
||||
|
||||
for( int sys = 0; sys < CData->psys_firstcurve.size() ; sys++) {
|
||||
@@ -841,35 +686,19 @@ void ExportCurveTriangleVcol(Mesh *mesh, ParticleCurveData *CData, int interpola
|
||||
|
||||
for( int curvekey = CData->curve_firstkey[curve]; curvekey < CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 1; curvekey++) {
|
||||
|
||||
int subv = 1;
|
||||
|
||||
if (curvekey == CData->curve_firstkey[curve])
|
||||
subv = 0;
|
||||
|
||||
for (; subv <= segments; subv++) {
|
||||
|
||||
float3 ickey_loc = make_float3(0.0f,0.0f,0.0f);
|
||||
|
||||
InterpolateKeySegments(subv, segments, curvekey, curve, &ickey_loc, &time, CData , interpolation);
|
||||
|
||||
if(subv!=0) {
|
||||
for(int section = 0 ; section < resol; section++) {
|
||||
fdata[vertexindex] = color_srgb_to_scene_linear(CData->curve_vcol[curve]);
|
||||
vertexindex++;
|
||||
fdata[vertexindex] = color_srgb_to_scene_linear(CData->curve_vcol[curve]);
|
||||
vertexindex++;
|
||||
fdata[vertexindex] = color_srgb_to_scene_linear(CData->curve_vcol[curve]);
|
||||
vertexindex++;
|
||||
fdata[vertexindex] = color_srgb_to_scene_linear(CData->curve_vcol[curve]);
|
||||
vertexindex++;
|
||||
fdata[vertexindex] = color_srgb_to_scene_linear(CData->curve_vcol[curve]);
|
||||
vertexindex++;
|
||||
fdata[vertexindex] = color_srgb_to_scene_linear(CData->curve_vcol[curve]);
|
||||
vertexindex++;
|
||||
}
|
||||
}
|
||||
|
||||
// prevtime = time; // UNUSED
|
||||
for(int section = 0 ; section < resol; section++) {
|
||||
fdata[vertexindex] = color_srgb_to_scene_linear(CData->curve_vcol[curve]);
|
||||
vertexindex++;
|
||||
fdata[vertexindex] = color_srgb_to_scene_linear(CData->curve_vcol[curve]);
|
||||
vertexindex++;
|
||||
fdata[vertexindex] = color_srgb_to_scene_linear(CData->curve_vcol[curve]);
|
||||
vertexindex++;
|
||||
fdata[vertexindex] = color_srgb_to_scene_linear(CData->curve_vcol[curve]);
|
||||
vertexindex++;
|
||||
fdata[vertexindex] = color_srgb_to_scene_linear(CData->curve_vcol[curve]);
|
||||
vertexindex++;
|
||||
fdata[vertexindex] = color_srgb_to_scene_linear(CData->curve_vcol[curve]);
|
||||
vertexindex++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -882,8 +711,6 @@ void ExportCurveTriangleVcol(Mesh *mesh, ParticleCurveData *CData, int interpola
|
||||
void BlenderSync::sync_curve_settings()
|
||||
{
|
||||
PointerRNA csscene = RNA_pointer_get(&b_scene.ptr, "cycles_curves");
|
||||
|
||||
int preset = get_enum(csscene, "preset");
|
||||
|
||||
CurveSystemManager *curve_system_manager = scene->curve_system_manager;
|
||||
CurveSystemManager prev_curve_system_manager = *curve_system_manager;
|
||||
@@ -892,86 +719,40 @@ void BlenderSync::sync_curve_settings()
|
||||
curve_system_manager->minimum_width = get_float(csscene, "minimum_width");
|
||||
curve_system_manager->maximum_width = get_float(csscene, "maximum_width");
|
||||
|
||||
if(preset == CURVE_CUSTOM) {
|
||||
/*custom properties*/
|
||||
curve_system_manager->primitive = get_enum(csscene, "primitive");
|
||||
curve_system_manager->line_method = get_enum(csscene, "line_method");
|
||||
curve_system_manager->interpolation = get_enum(csscene, "interpolation");
|
||||
curve_system_manager->triangle_method = get_enum(csscene, "triangle_method");
|
||||
curve_system_manager->resolution = get_int(csscene, "resolution");
|
||||
curve_system_manager->segments = get_int(csscene, "segments");
|
||||
curve_system_manager->use_smooth = get_boolean(csscene, "use_smooth");
|
||||
curve_system_manager->subdivisions = get_int(csscene, "subdivisions");
|
||||
curve_system_manager->primitive = get_enum(csscene, "primitive");
|
||||
curve_system_manager->curve_shape = get_enum(csscene, "shape");
|
||||
curve_system_manager->resolution = get_int(csscene, "resolution");
|
||||
curve_system_manager->subdivisions = get_int(csscene, "subdivisions");
|
||||
curve_system_manager->use_backfacing = !get_boolean(csscene, "cull_backfacing");
|
||||
|
||||
curve_system_manager->normalmix = get_float(csscene, "normalmix");
|
||||
curve_system_manager->encasing_ratio = get_float(csscene, "encasing_ratio");
|
||||
curve_system_manager->encasing_ratio = 1.01f;
|
||||
|
||||
curve_system_manager->use_parents = get_boolean(csscene, "use_parents");
|
||||
curve_system_manager->use_encasing = get_boolean(csscene, "use_encasing");
|
||||
curve_system_manager->use_backfacing = get_boolean(csscene, "use_backfacing");
|
||||
curve_system_manager->use_joined = get_boolean(csscene, "use_joined");
|
||||
curve_system_manager->use_tangent_normal = get_boolean(csscene, "use_tangent_normal");
|
||||
curve_system_manager->use_tangent_normal_geometry = get_boolean(csscene, "use_tangent_normal_geometry");
|
||||
curve_system_manager->use_tangent_normal_correction = get_boolean(csscene, "use_tangent_normal_correction");
|
||||
if(curve_system_manager->primitive == CURVE_TRIANGLES && curve_system_manager->curve_shape == CURVE_RIBBON) {
|
||||
/*camera facing planes*/
|
||||
curve_system_manager->triangle_method = CURVE_CAMERA_TRIANGLES;
|
||||
curve_system_manager->resolution = 1;
|
||||
}
|
||||
else {
|
||||
curve_system_manager->primitive = CURVE_LINE_SEGMENTS;
|
||||
curve_system_manager->interpolation = CURVE_CARDINAL;
|
||||
curve_system_manager->normalmix = 1.0f;
|
||||
curve_system_manager->encasing_ratio = 1.01f;
|
||||
curve_system_manager->use_parents = false;
|
||||
curve_system_manager->segments = 1;
|
||||
curve_system_manager->use_joined = false;
|
||||
|
||||
switch(preset) {
|
||||
case CURVE_FAST_PLANES:
|
||||
/*camera facing planes*/
|
||||
curve_system_manager->primitive = CURVE_TRIANGLES;
|
||||
curve_system_manager->triangle_method = CURVE_CAMERA_TRIANGLES;
|
||||
curve_system_manager->use_smooth = true;
|
||||
curve_system_manager->resolution = 1;
|
||||
break;
|
||||
case CURVE_TANGENT_SHADING:
|
||||
/*tangent shading*/
|
||||
curve_system_manager->line_method = CURVE_UNCORRECTED;
|
||||
curve_system_manager->use_encasing = true;
|
||||
curve_system_manager->use_backfacing = false;
|
||||
curve_system_manager->use_tangent_normal = true;
|
||||
curve_system_manager->use_tangent_normal_geometry = true;
|
||||
curve_system_manager->use_tangent_normal_correction = false;
|
||||
break;
|
||||
case CURVE_TRUE_NORMAL:
|
||||
/*True Normal*/
|
||||
curve_system_manager->line_method = CURVE_CORRECTED;
|
||||
curve_system_manager->use_encasing = true;
|
||||
curve_system_manager->use_backfacing = false;
|
||||
curve_system_manager->use_tangent_normal = false;
|
||||
curve_system_manager->use_tangent_normal_geometry = false;
|
||||
curve_system_manager->use_tangent_normal_correction = false;
|
||||
break;
|
||||
case CURVE_ACCURATE_PRESET:
|
||||
/*Accurate*/
|
||||
curve_system_manager->line_method = CURVE_ACCURATE;
|
||||
curve_system_manager->use_encasing = false;
|
||||
curve_system_manager->use_backfacing = true;
|
||||
curve_system_manager->use_tangent_normal = false;
|
||||
curve_system_manager->use_tangent_normal_geometry = false;
|
||||
curve_system_manager->use_tangent_normal_correction = false;
|
||||
break;
|
||||
case CURVE_SMOOTH_CURVES:
|
||||
/*Cardinal curves preset*/
|
||||
curve_system_manager->primitive = CURVE_SEGMENTS;
|
||||
curve_system_manager->use_backfacing = true;
|
||||
curve_system_manager->subdivisions = 4;
|
||||
break;
|
||||
case CURVE_SMOOTH_RIBBONS:
|
||||
/*Cardinal ribbons preset*/
|
||||
curve_system_manager->primitive = CURVE_RIBBONS;
|
||||
curve_system_manager->use_backfacing = false;
|
||||
curve_system_manager->subdivisions = 4;
|
||||
break;
|
||||
}
|
||||
|
||||
if(curve_system_manager->primitive == CURVE_TRIANGLES && curve_system_manager->curve_shape == CURVE_THICK) {
|
||||
/*camera facing planes*/
|
||||
curve_system_manager->triangle_method = CURVE_TESSELATED_TRIANGLES;
|
||||
}
|
||||
if(curve_system_manager->primitive == CURVE_LINE_SEGMENTS && curve_system_manager->curve_shape == CURVE_RIBBON) {
|
||||
/*tangent shading*/
|
||||
curve_system_manager->line_method = CURVE_UNCORRECTED;
|
||||
curve_system_manager->use_encasing = true;
|
||||
curve_system_manager->use_backfacing = false;
|
||||
curve_system_manager->use_tangent_normal = true;
|
||||
curve_system_manager->use_tangent_normal_geometry = true;
|
||||
}
|
||||
if(curve_system_manager->primitive == CURVE_LINE_SEGMENTS && curve_system_manager->curve_shape == CURVE_THICK) {
|
||||
curve_system_manager->line_method = CURVE_ACCURATE;
|
||||
curve_system_manager->use_encasing = false;
|
||||
curve_system_manager->use_tangent_normal = false;
|
||||
curve_system_manager->use_tangent_normal_geometry = false;
|
||||
}
|
||||
if(curve_system_manager->primitive == CURVE_SEGMENTS && curve_system_manager->curve_shape == CURVE_RIBBON) {
|
||||
curve_system_manager->primitive = CURVE_RIBBONS;
|
||||
curve_system_manager->use_backfacing = false;
|
||||
}
|
||||
|
||||
if(curve_system_manager->modified_mesh(prev_curve_system_manager))
|
||||
@@ -1013,13 +794,8 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool
|
||||
}
|
||||
|
||||
int primitive = scene->curve_system_manager->primitive;
|
||||
int interpolation = scene->curve_system_manager->interpolation;
|
||||
int triangle_method = scene->curve_system_manager->triangle_method;
|
||||
int resolution = scene->curve_system_manager->resolution;
|
||||
int segments = scene->curve_system_manager->segments;
|
||||
bool use_smooth = scene->curve_system_manager->use_smooth;
|
||||
bool use_parents = scene->curve_system_manager->use_parents;
|
||||
bool export_tgs = scene->curve_system_manager->use_joined;
|
||||
size_t vert_num = mesh->verts.size();
|
||||
size_t tri_num = mesh->triangles.size();
|
||||
int used_res = 1;
|
||||
@@ -1031,7 +807,7 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool
|
||||
if(!preview)
|
||||
set_resolution(mesh, &b_mesh, &b_ob, &b_scene, true);
|
||||
|
||||
ObtainCacheParticleData(mesh, &b_mesh, &b_ob, &CData, use_parents, !preview);
|
||||
ObtainCacheParticleData(mesh, &b_mesh, &b_ob, &CData, !preview);
|
||||
|
||||
/* obtain camera parameters */
|
||||
BL::Object b_CamOb = b_scene.camera();
|
||||
@@ -1046,30 +822,14 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool
|
||||
/* add hair geometry to mesh */
|
||||
if(primitive == CURVE_TRIANGLES){
|
||||
if(triangle_method == CURVE_CAMERA_TRIANGLES)
|
||||
ExportCurveTrianglePlanes(mesh, &CData, interpolation, use_smooth, segments, RotCam);
|
||||
else if(triangle_method == CURVE_RIBBON_TRIANGLES)
|
||||
ExportCurveTriangleRibbons(mesh, &CData, interpolation, use_smooth, segments);
|
||||
ExportCurveTrianglePlanes(mesh, &CData, RotCam);
|
||||
else {
|
||||
ExportCurveTriangleGeometry(mesh, &CData, interpolation, use_smooth, resolution, segments);
|
||||
ExportCurveTriangleGeometry(mesh, &CData, resolution);
|
||||
used_res = resolution;
|
||||
}
|
||||
}
|
||||
else {
|
||||
ExportCurveSegments(scene, mesh, &CData, interpolation, segments);
|
||||
int ckey_num = mesh->curve_keys.size();
|
||||
|
||||
/*export tangents or curve data? - not functional yet*/
|
||||
if(export_tgs && ckey_num > 1) {
|
||||
Attribute *attr_tangent = mesh->curve_attributes.add(ATTR_STD_CURVE_TANGENT);
|
||||
float3 *data_tangent = attr_tangent->data_float3();
|
||||
|
||||
for(int ck = 0; ck < ckey_num; ck++) {
|
||||
float3 tg = normalize(normalize(mesh->curve_keys[min(ck + 1, ckey_num - 1)].co - mesh->curve_keys[ck].co) -
|
||||
normalize(mesh->curve_keys[max(ck - 1, 0)].co - mesh->curve_keys[ck].co));
|
||||
|
||||
data_tangent[ck] = tg;
|
||||
}
|
||||
}
|
||||
ExportCurveSegments(scene, mesh, &CData);
|
||||
}
|
||||
|
||||
|
||||
@@ -1109,7 +869,7 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool
|
||||
if(!mesh->need_attribute(scene, ustring(l->name().c_str())))
|
||||
continue;
|
||||
|
||||
ObtainCacheParticleVcol(mesh, &b_mesh, &b_ob, &CData, use_parents, !preview, vcol_num);
|
||||
ObtainCacheParticleVcol(mesh, &b_mesh, &b_ob, &CData, !preview, vcol_num);
|
||||
|
||||
if(primitive == CURVE_TRIANGLES) {
|
||||
|
||||
@@ -1118,7 +878,7 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool
|
||||
|
||||
float3 *fdata = attr_vcol->data_float3();
|
||||
|
||||
ExportCurveTriangleVcol(mesh, &CData, interpolation, segments, tri_num * 3, used_res, fdata);
|
||||
ExportCurveTriangleVcol(mesh, &CData, tri_num * 3, used_res, fdata);
|
||||
}
|
||||
else {
|
||||
Attribute *attr_vcol = mesh->curve_attributes.add(
|
||||
@@ -1148,7 +908,7 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool
|
||||
if(mesh->need_attribute(scene, name) || mesh->need_attribute(scene, std)) {
|
||||
Attribute *attr_uv;
|
||||
|
||||
ObtainCacheParticleUV(mesh, &b_mesh, &b_ob, &CData, use_parents, !preview, uv_num);
|
||||
ObtainCacheParticleUV(mesh, &b_mesh, &b_ob, &CData, !preview, uv_num);
|
||||
|
||||
if(primitive == CURVE_TRIANGLES) {
|
||||
if(active_render)
|
||||
@@ -1158,7 +918,7 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool
|
||||
|
||||
float3 *uv = attr_uv->data_float3();
|
||||
|
||||
ExportCurveTriangleUV(mesh, &CData, interpolation, segments, tri_num * 3, used_res, uv);
|
||||
ExportCurveTriangleUV(mesh, &CData, tri_num * 3, used_res, uv);
|
||||
}
|
||||
else {
|
||||
if(active_render)
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include "camera.h"
|
||||
@@ -160,7 +158,7 @@ void BlenderSync::sync_light(BL::Object b_parent, int persistent_id[OBJECT_PERSI
|
||||
light->use_mis = get_boolean(clamp, "use_multiple_importance_sampling");
|
||||
|
||||
int samples = get_int(clamp, "samples");
|
||||
if(get_boolean(cscene, "squared_samples"))
|
||||
if(get_boolean(cscene, "use_square_samples"))
|
||||
light->samples = samples * samples;
|
||||
else
|
||||
light->samples = samples;
|
||||
@@ -198,7 +196,7 @@ void BlenderSync::sync_background_light()
|
||||
light->shader = scene->default_background;
|
||||
|
||||
int samples = get_int(cworld, "samples");
|
||||
if(get_boolean(cscene, "squared_samples"))
|
||||
if(get_boolean(cscene, "use_square_samples"))
|
||||
light->samples = samples * samples;
|
||||
else
|
||||
light->samples = samples;
|
||||
@@ -298,7 +296,7 @@ Object *BlenderSync::sync_object(BL::Object b_parent, int persistent_id[OBJECT_P
|
||||
object->random_id = hash_int_2d(object->random_id, 0);
|
||||
|
||||
/* visibility flags for both parent */
|
||||
object->visibility = object_ray_visibility(b_ob) & PATH_RAY_ALL;
|
||||
object->visibility = object_ray_visibility(b_ob) & PATH_RAY_ALL_VISIBILITY;
|
||||
if(b_parent.ptr.data != b_ob.ptr.data) {
|
||||
object->visibility &= object_ray_visibility(b_parent);
|
||||
object->random_id ^= hash_int(hash_string(b_parent.name().c_str()));
|
||||
@@ -306,7 +304,7 @@ Object *BlenderSync::sync_object(BL::Object b_parent, int persistent_id[OBJECT_P
|
||||
|
||||
/* make holdout objects on excluded layer invisible for non-camera rays */
|
||||
if(use_holdout && (layer_flag & render_layer.exclude_layer))
|
||||
object->visibility &= ~(PATH_RAY_ALL - PATH_RAY_CAMERA);
|
||||
object->visibility &= ~(PATH_RAY_ALL_VISIBILITY - PATH_RAY_CAMERA);
|
||||
|
||||
/* camera flag is not actually used, instead is tested
|
||||
* against render layer flags */
|
||||
@@ -348,32 +346,41 @@ static bool object_render_hide(BL::Object b_ob, bool top_level, bool parent_hide
|
||||
|
||||
bool hair_present = false;
|
||||
bool show_emitter = false;
|
||||
bool hide = false;
|
||||
bool hide_as_dupli_parent = false;
|
||||
bool hide_as_dupli_child_original = false;
|
||||
|
||||
for(b_ob.particle_systems.begin(b_psys); b_psys != b_ob.particle_systems.end(); ++b_psys) {
|
||||
if((b_psys->settings().render_type() == BL::ParticleSettings::render_type_PATH) &&
|
||||
(b_psys->settings().type()==BL::ParticleSettings::type_HAIR))
|
||||
hair_present = true;
|
||||
|
||||
if(b_psys->settings().use_render_emitter()) {
|
||||
hide = false;
|
||||
if(b_psys->settings().use_render_emitter())
|
||||
show_emitter = true;
|
||||
}
|
||||
}
|
||||
|
||||
/* duplicators hidden by default, except dupliframes which duplicate self */
|
||||
if(b_ob.is_duplicator())
|
||||
if(top_level || b_ob.dupli_type() != BL::Object::dupli_type_FRAMES)
|
||||
hide = true;
|
||||
hide_as_dupli_parent = true;
|
||||
|
||||
/* hide original object for duplis */
|
||||
BL::Object parent = b_ob.parent();
|
||||
if(parent && object_render_hide_original(b_ob.type(), parent.dupli_type()))
|
||||
if(parent_hide)
|
||||
hide = true;
|
||||
|
||||
hide_triangles = (hair_present && !show_emitter);
|
||||
return hide && !show_emitter;
|
||||
hide_as_dupli_child_original = true;
|
||||
|
||||
if(show_emitter) {
|
||||
hide_triangles = false;
|
||||
return false;
|
||||
}
|
||||
else if(hair_present) {
|
||||
hide_triangles = true;
|
||||
return hide_as_dupli_child_original;
|
||||
}
|
||||
else {
|
||||
hide_triangles = false;
|
||||
return (hide_as_dupli_parent || hide_as_dupli_child_original);
|
||||
}
|
||||
}
|
||||
|
||||
static bool object_render_hide_duplis(BL::Object b_ob)
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include "mesh.h"
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include <Python.h>
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include "background.h"
|
||||
@@ -216,6 +214,8 @@ static PassType get_pass_type(BL::RenderPass b_pass)
|
||||
return PASS_GLOSSY_DIRECT;
|
||||
case BL::RenderPass::type_TRANSMISSION_DIRECT:
|
||||
return PASS_TRANSMISSION_DIRECT;
|
||||
case BL::RenderPass::type_SUBSURFACE_DIRECT:
|
||||
return PASS_SUBSURFACE_DIRECT;
|
||||
|
||||
case BL::RenderPass::type_DIFFUSE_INDIRECT:
|
||||
return PASS_DIFFUSE_INDIRECT;
|
||||
@@ -223,6 +223,8 @@ static PassType get_pass_type(BL::RenderPass b_pass)
|
||||
return PASS_GLOSSY_INDIRECT;
|
||||
case BL::RenderPass::type_TRANSMISSION_INDIRECT:
|
||||
return PASS_TRANSMISSION_INDIRECT;
|
||||
case BL::RenderPass::type_SUBSURFACE_INDIRECT:
|
||||
return PASS_SUBSURFACE_INDIRECT;
|
||||
|
||||
case BL::RenderPass::type_DIFFUSE_COLOR:
|
||||
return PASS_DIFFUSE_COLOR;
|
||||
@@ -230,6 +232,8 @@ static PassType get_pass_type(BL::RenderPass b_pass)
|
||||
return PASS_GLOSSY_COLOR;
|
||||
case BL::RenderPass::type_TRANSMISSION_COLOR:
|
||||
return PASS_TRANSMISSION_COLOR;
|
||||
case BL::RenderPass::type_SUBSURFACE_COLOR:
|
||||
return PASS_SUBSURFACE_COLOR;
|
||||
|
||||
case BL::RenderPass::type_EMIT:
|
||||
return PASS_EMISSION;
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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 __BLENDER_SESSION_H__
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include "background.h"
|
||||
@@ -231,6 +229,12 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
else if (b_node.is_a(&RNA_ShaderNodeCombineRGB)) {
|
||||
node = new CombineRGBNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeSeparateHSV)) {
|
||||
node = new SeparateHSVNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeCombineHSV)) {
|
||||
node = new CombineHSVNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeHueSaturation)) {
|
||||
node = new HSVNode();
|
||||
}
|
||||
@@ -250,6 +254,14 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
vmath->type = VectorMathNode::type_enum[b_vector_math_node.operation()];
|
||||
node = vmath;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeVectorTransform)) {
|
||||
BL::ShaderNodeVectorTransform b_vector_transform_node(b_node);
|
||||
VectorTransformNode *vtransform = new VectorTransformNode();
|
||||
vtransform->type = VectorTransformNode::type_enum[b_vector_transform_node.type()];
|
||||
vtransform->convert_from = VectorTransformNode::convert_space_enum[b_vector_transform_node.convert_from()];
|
||||
vtransform->convert_to = VectorTransformNode::convert_space_enum[b_vector_transform_node.convert_to()];
|
||||
node = vtransform;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeNormal)) {
|
||||
BL::Node::outputs_iterator out_it;
|
||||
b_node.outputs.begin(out_it);
|
||||
@@ -303,7 +315,23 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
node = new DiffuseBsdfNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeSubsurfaceScattering)) {
|
||||
node = new SubsurfaceScatteringNode();
|
||||
BL::ShaderNodeSubsurfaceScattering b_subsurface_node(b_node);
|
||||
|
||||
SubsurfaceScatteringNode *subsurface = new SubsurfaceScatteringNode();
|
||||
|
||||
switch(b_subsurface_node.falloff()) {
|
||||
case BL::ShaderNodeSubsurfaceScattering::falloff_COMPATIBLE:
|
||||
subsurface->closure = CLOSURE_BSSRDF_COMPATIBLE_ID;
|
||||
break;
|
||||
case BL::ShaderNodeSubsurfaceScattering::falloff_CUBIC:
|
||||
subsurface->closure = CLOSURE_BSSRDF_CUBIC_ID;
|
||||
break;
|
||||
case BL::ShaderNodeSubsurfaceScattering::falloff_GAUSSIAN:
|
||||
subsurface->closure = CLOSURE_BSSRDF_GAUSSIAN_ID;
|
||||
break;
|
||||
}
|
||||
|
||||
node = subsurface;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeBsdfGlossy)) {
|
||||
BL::ShaderNodeBsdfGlossy b_glossy_node(b_node);
|
||||
@@ -400,6 +428,9 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
else if (b_node.is_a(&RNA_ShaderNodeWavelength)) {
|
||||
node = new WavelengthNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeBlackbody)) {
|
||||
node = new BlackbodyNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeLightPath)) {
|
||||
node = new LightPathNode();
|
||||
}
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include "background.h"
|
||||
@@ -191,7 +189,7 @@ void BlenderSync::sync_integrator()
|
||||
}
|
||||
#endif
|
||||
|
||||
integrator->progressive = get_boolean(cscene, "progressive");
|
||||
integrator->method = (Integrator::Method)get_enum(cscene, "progressive");
|
||||
|
||||
int diffuse_samples = get_int(cscene, "diffuse_samples");
|
||||
int glossy_samples = get_int(cscene, "glossy_samples");
|
||||
@@ -200,7 +198,7 @@ void BlenderSync::sync_integrator()
|
||||
int mesh_light_samples = get_int(cscene, "mesh_light_samples");
|
||||
int subsurface_samples = get_int(cscene, "subsurface_samples");
|
||||
|
||||
if(get_boolean(cscene, "squared_samples")) {
|
||||
if(get_boolean(cscene, "use_square_samples")) {
|
||||
integrator->diffuse_samples = diffuse_samples * diffuse_samples;
|
||||
integrator->glossy_samples = glossy_samples * glossy_samples;
|
||||
integrator->transmission_samples = transmission_samples * transmission_samples;
|
||||
@@ -321,7 +319,7 @@ void BlenderSync::sync_render_layers(BL::SpaceView3D b_v3d, const char *layer)
|
||||
render_layer.bound_samples = (use_layer_samples == 1);
|
||||
if(use_layer_samples != 2) {
|
||||
int samples = b_rlay->samples();
|
||||
if(get_boolean(cscene, "squared_samples"))
|
||||
if(get_boolean(cscene, "use_square_samples"))
|
||||
render_layer.samples = samples * samples;
|
||||
else
|
||||
render_layer.samples = samples;
|
||||
@@ -414,14 +412,15 @@ SessionParams BlenderSync::get_session_params(BL::RenderEngine b_engine, BL::Use
|
||||
int preview_samples = get_int(cscene, "preview_samples");
|
||||
int preview_aa_samples = get_int(cscene, "preview_aa_samples");
|
||||
|
||||
if(get_boolean(cscene, "squared_samples")) {
|
||||
samples = samples * samples;
|
||||
if(get_boolean(cscene, "use_square_samples")) {
|
||||
aa_samples = aa_samples * aa_samples;
|
||||
preview_samples = preview_samples * preview_samples;
|
||||
preview_aa_samples = preview_aa_samples * preview_aa_samples;
|
||||
|
||||
samples = samples * samples;
|
||||
preview_samples = preview_samples * preview_samples;
|
||||
}
|
||||
|
||||
if(get_boolean(cscene, "progressive") == 0 && params.device.type == DEVICE_CPU) {
|
||||
if(get_enum(cscene, "progressive") == 0) {
|
||||
if(background) {
|
||||
params.samples = aa_samples;
|
||||
}
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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 __BLENDER_SYNC_H__
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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 __BLENDER_UTIL_H__
|
||||
|
@@ -295,16 +295,8 @@ void BVH::pack_curve_segment(int idx, float4 woop[3])
|
||||
* extra curve data <3> , StrID,
|
||||
* nextkey, flags/tip?, 0, 0);
|
||||
*/
|
||||
Attribute *attr_tangent = mesh->curve_attributes.find(ATTR_STD_CURVE_TANGENT);
|
||||
float3 tg0 = make_float3(1.0f, 0.0f, 0.0f);
|
||||
float3 tg1 = make_float3(1.0f, 0.0f, 0.0f);
|
||||
|
||||
if(attr_tangent) {
|
||||
const float3 *data_tangent = attr_tangent->data_float3();
|
||||
|
||||
tg0 = data_tangent[k0];
|
||||
tg1 = data_tangent[k1];
|
||||
}
|
||||
|
||||
Transform tfm = make_transform(
|
||||
tg0.x, tg0.y, tg0.z, l,
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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 __DEVICE_H__
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -558,7 +556,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void path_trace(RenderTile& rtile, int sample)
|
||||
void path_trace(RenderTile& rtile, int sample, bool branched)
|
||||
{
|
||||
if(have_error())
|
||||
return;
|
||||
@@ -570,8 +568,14 @@ public:
|
||||
CUdeviceptr d_rng_state = cuda_device_ptr(rtile.rng_state);
|
||||
|
||||
/* get kernel function */
|
||||
cuda_assert(cuModuleGetFunction(&cuPathTrace, cuModule, "kernel_cuda_path_trace"))
|
||||
|
||||
if(branched)
|
||||
cuda_assert(cuModuleGetFunction(&cuPathTrace, cuModule, "kernel_cuda_branched_path_trace"))
|
||||
else
|
||||
cuda_assert(cuModuleGetFunction(&cuPathTrace, cuModule, "kernel_cuda_path_trace"))
|
||||
|
||||
if(have_error())
|
||||
return;
|
||||
|
||||
/* pass in parameters */
|
||||
int offset = 0;
|
||||
|
||||
@@ -914,6 +918,8 @@ public:
|
||||
if(task->type == DeviceTask::PATH_TRACE) {
|
||||
RenderTile tile;
|
||||
|
||||
bool branched = task->integrator_branched;
|
||||
|
||||
/* keep rendering tiles until done */
|
||||
while(task->acquire_tile(this, tile)) {
|
||||
int start_sample = tile.start_sample;
|
||||
@@ -925,7 +931,7 @@ public:
|
||||
break;
|
||||
}
|
||||
|
||||
path_trace(tile, sample);
|
||||
path_trace(tile, sample, branched);
|
||||
|
||||
tile.sample = sample + 1;
|
||||
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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 __DEVICE_INTERN_H__
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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 __DEVICE_MEMORY_H__
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include "device.h"
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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 __DEVICE_NETWORK_H__
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifdef WITH_OPENCL
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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 __DEVICE_TASK_H__
|
||||
@@ -65,6 +63,7 @@ public:
|
||||
boost::function<bool(void)> get_cancel;
|
||||
|
||||
bool need_finish_queue;
|
||||
bool integrator_branched;
|
||||
protected:
|
||||
double last_update_time;
|
||||
};
|
||||
|
@@ -1,17 +0,0 @@
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
Contributor(s): Alfredo de Greef, Blender Foundation
|
||||
|
@@ -1,8 +1,6 @@
|
||||
|
||||
set(LICENSES
|
||||
Apache_2.0.txt
|
||||
Blender.txt
|
||||
GPL.txt
|
||||
ILM.txt
|
||||
NVidia.txt
|
||||
OSL.txt
|
||||
|
@@ -1,342 +0,0 @@
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
Public License instead of this License.
|
||||
|
@@ -1,12 +1,16 @@
|
||||
|
||||
This program uses code from various sources. These are the licenses:
|
||||
This program uses code from various sources, the default license is Apache 2.0
|
||||
for all code, with the following exceptions.
|
||||
|
||||
* New code is licensed under the GPL license v2 or later.
|
||||
* BVH building and traversal code is licensed under Apache License v2.
|
||||
* Approximate Catmull Clark subdivision code is licensed under the MIT license.
|
||||
* Open Shading Language code on GPU is licensed under the Modified BSD license.
|
||||
* Sobol direction vectors are licensed under the Modified BSD license.
|
||||
* Matrix code adapted from OpenEXR under the Modified BSD license.
|
||||
* Procedural texture functions from Blender are licensed under GPL v2 or later.
|
||||
* Boost and OpenCL dynamic loading under Boost License.
|
||||
Modified BSD License
|
||||
* Code adapated from Open Shading Language
|
||||
* Sobol direction vectors
|
||||
* Matrix inversion code from OpenEXR
|
||||
* MD5 Hash code
|
||||
|
||||
MIT license
|
||||
* Approximate Catmull Clark subdivision code
|
||||
|
||||
Boost License
|
||||
* Boost and OpenCL dynamic loading
|
||||
|
||||
|
@@ -22,6 +22,7 @@ set(SRC_HEADERS
|
||||
kernel.h
|
||||
kernel_accumulate.h
|
||||
kernel_bvh.h
|
||||
kernel_bvh_subsurface.h
|
||||
kernel_bvh_traversal.h
|
||||
kernel_camera.h
|
||||
kernel_compat_cpu.h
|
||||
@@ -72,6 +73,7 @@ set(SRC_CLOSURE_HEADERS
|
||||
set(SRC_SVM_HEADERS
|
||||
svm/svm.h
|
||||
svm/svm_attribute.h
|
||||
svm/svm_blackbody.h
|
||||
svm/svm_camera.h
|
||||
svm/svm_closure.h
|
||||
svm/svm_convert.h
|
||||
@@ -99,11 +101,13 @@ set(SRC_SVM_HEADERS
|
||||
svm/svm_normal.h
|
||||
svm/svm_ramp.h
|
||||
svm/svm_sepcomb_rgb.h
|
||||
svm/svm_sepcomb_hsv.h
|
||||
svm/svm_sky.h
|
||||
svm/svm_tex_coord.h
|
||||
svm/svm_texture.h
|
||||
svm/svm_types.h
|
||||
svm/svm_value.h
|
||||
svm/svm_vector_transform.h
|
||||
svm/svm_voronoi.h
|
||||
svm/svm_wave.h
|
||||
)
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include "../closure/bsdf_ashikhmin_velvet.h"
|
||||
@@ -45,6 +43,7 @@ __device int bsdf_sample(KernelGlobals *kg, const ShaderData *sd, const ShaderCl
|
||||
|
||||
switch(sc->type) {
|
||||
case CLOSURE_BSDF_DIFFUSE_ID:
|
||||
case CLOSURE_BSDF_BSSRDF_ID:
|
||||
label = bsdf_diffuse_sample(sc, sd->Ng, sd->I, sd->dI.dx, sd->dI.dy, randu, randv,
|
||||
eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
|
||||
break;
|
||||
@@ -134,6 +133,7 @@ __device float3 bsdf_eval(KernelGlobals *kg, const ShaderData *sd, const ShaderC
|
||||
if(dot(sd->Ng, omega_in) >= 0.0f) {
|
||||
switch(sc->type) {
|
||||
case CLOSURE_BSDF_DIFFUSE_ID:
|
||||
case CLOSURE_BSDF_BSSRDF_ID:
|
||||
eval = bsdf_diffuse_eval_reflect(sc, sd->I, omega_in, pdf);
|
||||
break;
|
||||
#ifdef __SVM__
|
||||
@@ -195,6 +195,7 @@ __device float3 bsdf_eval(KernelGlobals *kg, const ShaderData *sd, const ShaderC
|
||||
else {
|
||||
switch(sc->type) {
|
||||
case CLOSURE_BSDF_DIFFUSE_ID:
|
||||
case CLOSURE_BSDF_BSSRDF_ID:
|
||||
eval = bsdf_diffuse_eval_transmit(sc, sd->I, omega_in, pdf);
|
||||
break;
|
||||
#ifdef __SVM__
|
||||
@@ -262,6 +263,7 @@ __device void bsdf_blur(KernelGlobals *kg, ShaderClosure *sc, float roughness)
|
||||
|
||||
switch(sc->type) {
|
||||
case CLOSURE_BSDF_DIFFUSE_ID:
|
||||
case CLOSURE_BSDF_BSSRDF_ID:
|
||||
bsdf_diffuse_blur(sc, roughness);
|
||||
break;
|
||||
#ifdef __SVM__
|
||||
|
@@ -37,11 +37,6 @@ CCL_NAMESPACE_BEGIN
|
||||
|
||||
/* GGX */
|
||||
|
||||
__device_inline float safe_sqrtf(float f)
|
||||
{
|
||||
return sqrtf(max(f, 0.0f));
|
||||
}
|
||||
|
||||
__device int bsdf_microfacet_ggx_setup(ShaderClosure *sc)
|
||||
{
|
||||
sc->data0 = clamp(sc->data0, 0.0f, 1.0f); /* m_ag */
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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 __BSDF_OREN_NAYAR_H__
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2013, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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 __KERNEL_BSSRDF_H__
|
||||
@@ -21,130 +19,187 @@
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
__device int bssrdf_setup(ShaderClosure *sc)
|
||||
__device int bssrdf_setup(ShaderClosure *sc, ClosureType type)
|
||||
{
|
||||
if(sc->data0 < BSSRDF_MIN_RADIUS) {
|
||||
/* revert to diffuse BSDF if radius too small */
|
||||
sc->data0 = 0.0f;
|
||||
sc->data1 = 0.0f;
|
||||
return bsdf_diffuse_setup(sc);
|
||||
int flag = bsdf_diffuse_setup(sc);
|
||||
sc->type = CLOSURE_BSDF_BSSRDF_ID;
|
||||
return flag;
|
||||
}
|
||||
else {
|
||||
/* IOR param */
|
||||
sc->data1 = max(sc->data1, 1.0f);
|
||||
sc->type = CLOSURE_BSSRDF_ID;
|
||||
sc->data1 = clamp(sc->data1, 0.0f, 1.0f); /* texture blur */
|
||||
sc->type = type;
|
||||
|
||||
return SD_BSDF|SD_BSDF_HAS_EVAL|SD_BSSRDF;
|
||||
}
|
||||
}
|
||||
|
||||
/* Simple Cubic BSSRDF falloff */
|
||||
/* Planar Truncated Gaussian
|
||||
*
|
||||
* Note how this is different from the typical gaussian, this one integrates
|
||||
* to 1 over the plane (where you get an extra 2*pi*x factor). We are lucky
|
||||
* that integrating x*exp(-x) gives a nice closed form solution. */
|
||||
|
||||
__device float bssrdf_cubic(float ld, float r)
|
||||
/* paper suggests 1/12.46 which is much too small, suspect it's *12.46 */
|
||||
#define GAUSS_TRUNCATE 12.46f
|
||||
|
||||
__device float bssrdf_gaussian_eval(ShaderClosure *sc, float r)
|
||||
{
|
||||
if(ld == 0.0f)
|
||||
return (r == 0.0f)? 1.0f: 0.0f;
|
||||
/* integrate (2*pi*r * exp(-r*r/(2*v)))/(2*pi*v)) from 0 to Rm
|
||||
* = 1 - exp(-Rm*Rm/(2*v)) */
|
||||
const float v = sc->data0;
|
||||
const float Rm = sqrtf(v*GAUSS_TRUNCATE);
|
||||
|
||||
return powf(ld - min(r, ld), 3.0f) * 4.0f/powf(ld, 4.0f);
|
||||
if(r >= Rm)
|
||||
return 0.0f;
|
||||
|
||||
return expf(-r*r/(2.0f*v))/(2.0f*M_PI_F*v);
|
||||
}
|
||||
|
||||
/* Original BSSRDF fallof function */
|
||||
|
||||
typedef struct BSSRDFParams {
|
||||
float eta; /* index of refraction */
|
||||
float sigma_t_; /* reduced extinction coefficient */
|
||||
float sigma_tr; /* effective extinction coefficient */
|
||||
float Fdr; /* diffuse fresnel reflectance */
|
||||
float D; /* diffusion constant */
|
||||
float A;
|
||||
float alpha_; /* reduced albedo */
|
||||
float zr; /* distance of virtual lightsource above surface */
|
||||
float zv; /* distance of virtual lightsource below surface */
|
||||
float ld; /* mean free path */
|
||||
float ro; /* diffuse reflectance */
|
||||
} BSSRDFParams;
|
||||
|
||||
__device float bssrdf_reduced_albedo_Rd(float alpha_, float A, float ro)
|
||||
__device float bssrdf_gaussian_pdf(ShaderClosure *sc, float r)
|
||||
{
|
||||
float sq;
|
||||
/* 1.0 - expf(-Rm*Rm/(2*v)) simplified */
|
||||
const float area_truncated = 1.0f - expf(-0.5f*GAUSS_TRUNCATE);
|
||||
|
||||
sq = sqrtf(3.0f*(1.0f - alpha_));
|
||||
return (alpha_/2.0f)*(1.0f + expf((-4.0f/3.0f)*A*sq))*expf(-sq) - ro;
|
||||
return bssrdf_gaussian_eval(sc, r) * (1.0f/(area_truncated));
|
||||
}
|
||||
|
||||
__device float bssrdf_compute_reduced_albedo(float A, float ro)
|
||||
__device void bssrdf_gaussian_sample(ShaderClosure *sc, float xi, float *r, float *h)
|
||||
{
|
||||
const float tolerance = 1e-8f;
|
||||
const int max_iteration_count = 20;
|
||||
float d, fsub, xn_1 = 0.0f, xn = 1.0f, fxn, fxn_1;
|
||||
/* xi = integrate (2*pi*r * exp(-r*r/(2*v)))/(2*pi*v)) = -exp(-r^2/(2*v))
|
||||
* r = sqrt(-2*v*logf(xi)) */
|
||||
|
||||
const float v = sc->data0;
|
||||
const float Rm = sqrtf(v*GAUSS_TRUNCATE);
|
||||
|
||||
/* 1.0 - expf(-Rm*Rm/(2*v)) simplified */
|
||||
const float area_truncated = 1.0f - expf(-0.5f*GAUSS_TRUNCATE);
|
||||
|
||||
/* r(xi) */
|
||||
const float r_squared = -2.0f*v*logf(1.0f - xi*area_truncated);
|
||||
*r = sqrtf(r_squared);
|
||||
|
||||
/* h^2 + r^2 = Rm^2 */
|
||||
*h = sqrtf(Rm*Rm - r_squared);
|
||||
}
|
||||
|
||||
/* Planar Cubic BSSRDF falloff
|
||||
*
|
||||
* This is basically (Rm - x)^3, with some factors to normalize it. For sampling
|
||||
* we integrate 2*pi*x * (Rm - x)^3, which gives us a quintic equation that as
|
||||
* far as I can tell has no closed form solution. So we get an iterative solution
|
||||
* instead with newton-raphson. */
|
||||
|
||||
__device float bssrdf_cubic_eval(ShaderClosure *sc, float r)
|
||||
{
|
||||
const float Rm = sc->data0;
|
||||
|
||||
if(r >= Rm)
|
||||
return 0.0f;
|
||||
|
||||
/* integrate (2*pi*r * 10*(R - r)^3)/(pi * R^5) from 0 to R = 1 */
|
||||
const float Rm5 = (Rm*Rm) * (Rm*Rm) * Rm;
|
||||
const float f = Rm - min(r, Rm);
|
||||
const float f3 = f*f*f;
|
||||
|
||||
return (f3 * 10.0f) / (Rm5 * M_PI_F);
|
||||
}
|
||||
|
||||
__device float bssrdf_cubic_pdf(ShaderClosure *sc, float r)
|
||||
{
|
||||
return bssrdf_cubic_eval(sc, r);
|
||||
}
|
||||
|
||||
/* solve 10x^2 - 20x^3 + 15x^4 - 4x^5 - xi == 0 */
|
||||
__device float bssrdf_cubic_quintic_root_find(float xi)
|
||||
{
|
||||
/* newton-raphson iteration, usually succeeds in 2-4 iterations, except
|
||||
* outside 0.02 ... 0.98 where it can go up to 10, so overall performance
|
||||
* should not be too bad */
|
||||
const float tolerance = 1e-6f;
|
||||
const int max_iteration_count = 10;
|
||||
float x = 0.25f;
|
||||
int i;
|
||||
|
||||
/* use secant method to compute reduced albedo using Rd function inverse
|
||||
* with a given reflectance */
|
||||
fxn = bssrdf_reduced_albedo_Rd(xn, A, ro);
|
||||
fxn_1 = bssrdf_reduced_albedo_Rd(xn_1, A, ro);
|
||||
for (i = 0; i < max_iteration_count; i++) {
|
||||
float x2 = x*x;
|
||||
float x3 = x2*x;
|
||||
float nx = (1.0f - x);
|
||||
|
||||
for (i= 0; i < max_iteration_count; i++) {
|
||||
fsub = (fxn - fxn_1);
|
||||
if (fabsf(fsub) < tolerance)
|
||||
break;
|
||||
d = ((xn - xn_1)/fsub)*fxn;
|
||||
if (fabsf(d) < tolerance)
|
||||
float f = 10.0f*x2 - 20.0f*x3 + 15.0f*x2*x2 - 4.0f*x2*x3 - xi;
|
||||
float f_ = 20.0f*(x*nx)*(nx*nx);
|
||||
|
||||
if(fabsf(f) < tolerance || f_ == 0.0f)
|
||||
break;
|
||||
|
||||
xn_1 = xn;
|
||||
fxn_1 = fxn;
|
||||
xn = xn - d;
|
||||
|
||||
if (xn > 1.0f) xn = 1.0f;
|
||||
if (xn_1 > 1.0f) xn_1 = 1.0f;
|
||||
|
||||
fxn = bssrdf_reduced_albedo_Rd(xn, A, ro);
|
||||
x = clamp(x - f/f_, 0.0f, 1.0f);
|
||||
}
|
||||
|
||||
/* avoid division by zero later */
|
||||
if (xn <= 0.0f)
|
||||
xn = 0.00001f;
|
||||
|
||||
return xn;
|
||||
return x;
|
||||
}
|
||||
|
||||
__device void bssrdf_setup_params(BSSRDFParams *ss, float refl, float radius, float ior)
|
||||
__device void bssrdf_cubic_sample(ShaderClosure *sc, float xi, float *r, float *h)
|
||||
{
|
||||
ss->eta = ior;
|
||||
ss->Fdr = -1.440f/ior*ior + 0.710f/ior + 0.668f + 0.0636f*ior;
|
||||
ss->A = (1.0f + ss->Fdr)/(1.0f - ss->Fdr);
|
||||
ss->ld = radius;
|
||||
ss->ro = min(refl, 0.999f);
|
||||
const float Rm = sc->data0;
|
||||
const float r_ = bssrdf_cubic_quintic_root_find(xi) * Rm;
|
||||
|
||||
ss->alpha_ = bssrdf_compute_reduced_albedo(ss->A, ss->ro);
|
||||
*r = r_;
|
||||
|
||||
ss->sigma_tr = 1.0f/ss->ld;
|
||||
ss->sigma_t_ = ss->sigma_tr/sqrtf(3.0f*(1.0f - ss->alpha_));
|
||||
|
||||
ss->D = 1.0f/(3.0f*ss->sigma_t_);
|
||||
|
||||
ss->zr = 1.0f/ss->sigma_t_;
|
||||
ss->zv = ss->zr + 4.0f*ss->A*ss->D;
|
||||
/* h^2 + r^2 = Rm^2 */
|
||||
*h = sqrtf(Rm*Rm - r_*r_);
|
||||
}
|
||||
|
||||
/* exponential falloff function */
|
||||
/* None BSSRDF falloff
|
||||
*
|
||||
* Samples distributed over disk with no falloff, for reference. */
|
||||
|
||||
__device float bssrdf_original(const BSSRDFParams *ss, float r)
|
||||
__device float bssrdf_none_eval(ShaderClosure *sc, float r)
|
||||
{
|
||||
if(ss->ld == 0.0f)
|
||||
return (r == 0.0f)? 1.0f: 0.0f;
|
||||
const float Rm = sc->data0;
|
||||
return (r < Rm)? 1.0f: 0.0f;
|
||||
}
|
||||
|
||||
float rr = r*r;
|
||||
float sr, sv, Rdr, Rdv;
|
||||
__device float bssrdf_none_pdf(ShaderClosure *sc, float r)
|
||||
{
|
||||
/* integrate (2*pi*r)/(pi*Rm*Rm) from 0 to Rm = 1 */
|
||||
const float Rm = sc->data0;
|
||||
const float area = (M_PI_F*Rm*Rm);
|
||||
|
||||
sr = sqrtf(rr + ss->zr*ss->zr);
|
||||
sv = sqrtf(rr + ss->zv*ss->zv);
|
||||
return bssrdf_none_eval(sc, r) / area;
|
||||
}
|
||||
|
||||
Rdr = ss->zr*(1.0f + ss->sigma_tr*sr)*expf(-ss->sigma_tr*sr)/(sr*sr*sr);
|
||||
Rdv = ss->zv*(1.0f + ss->sigma_tr*sv)*expf(-ss->sigma_tr*sv)/(sv*sv*sv);
|
||||
__device void bssrdf_none_sample(ShaderClosure *sc, float xi, float *r, float *h)
|
||||
{
|
||||
/* xi = integrate (2*pi*r)/(pi*Rm*Rm) = r^2/Rm^2
|
||||
* r = sqrt(xi)*Rm */
|
||||
const float Rm = sc->data0;
|
||||
const float r_ = sqrtf(xi)*Rm;
|
||||
|
||||
return ss->alpha_*(1.0f/M_4PI_F)*(Rdr + Rdv);
|
||||
*r = r_;
|
||||
|
||||
/* h^2 + r^2 = Rm^2 */
|
||||
*h = sqrtf(Rm*Rm - r_*r_);
|
||||
}
|
||||
|
||||
/* Generic */
|
||||
|
||||
__device void bssrdf_sample(ShaderClosure *sc, float xi, float *r, float *h)
|
||||
{
|
||||
if(sc->type == CLOSURE_BSSRDF_CUBIC_ID)
|
||||
bssrdf_cubic_sample(sc, xi, r, h);
|
||||
else
|
||||
bssrdf_gaussian_sample(sc, xi, r, h);
|
||||
}
|
||||
|
||||
__device float bssrdf_pdf(ShaderClosure *sc, float r)
|
||||
{
|
||||
if(sc->type == CLOSURE_BSSRDF_CUBIC_ID)
|
||||
return bssrdf_cubic_pdf(sc, r);
|
||||
else
|
||||
return bssrdf_gaussian_pdf(sc, r);
|
||||
}
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
/* OpenCL kernel entry points - unfinished */
|
||||
@@ -51,7 +49,7 @@ __kernel void kernel_ocl_path_trace(
|
||||
int y = sy + get_global_id(1);
|
||||
|
||||
if(x < sx + sw && y < sy + sh)
|
||||
kernel_path_trace(kg, buffer, rng_state, sample, x, y, offset, stride);
|
||||
kernel_path_trace_progressive(kg, buffer, rng_state, sample, x, y, offset, stride);
|
||||
}
|
||||
|
||||
__kernel void kernel_ocl_tonemap(
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
/* CPU kernel entry points */
|
||||
@@ -90,7 +88,12 @@ void kernel_tex_copy(KernelGlobals *kg, const char *name, device_ptr mem, size_t
|
||||
|
||||
void kernel_cpu_path_trace(KernelGlobals *kg, float *buffer, unsigned int *rng_state, int sample, int x, int y, int offset, int stride)
|
||||
{
|
||||
kernel_path_trace(kg, buffer, rng_state, sample, x, y, offset, stride);
|
||||
#ifdef __BRANCHED_PATH__
|
||||
if(kernel_data.integrator.branched)
|
||||
kernel_branched_path_trace(kg, buffer, rng_state, sample, x, y, offset, stride);
|
||||
else
|
||||
#endif
|
||||
kernel_path_trace(kg, buffer, rng_state, sample, x, y, offset, stride);
|
||||
}
|
||||
|
||||
/* Tonemapping */
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
/* CUDA kernel entry points */
|
||||
@@ -35,6 +33,17 @@ extern "C" __global__ void kernel_cuda_path_trace(float *buffer, uint *rng_state
|
||||
kernel_path_trace(NULL, buffer, rng_state, sample, x, y, offset, stride);
|
||||
}
|
||||
|
||||
#ifdef __BRANCHED_PATH__
|
||||
extern "C" __global__ void kernel_cuda_branched_path_trace(float *buffer, uint *rng_state, int sample, int sx, int sy, int sw, int sh, int offset, int stride)
|
||||
{
|
||||
int x = sx + blockDim.x*blockIdx.x + threadIdx.x;
|
||||
int y = sy + blockDim.y*blockIdx.y + threadIdx.y;
|
||||
|
||||
if(x < sx + sw && y < sy + sh)
|
||||
kernel_branched_path_trace(NULL, buffer, rng_state, sample, x, y, offset, stride);
|
||||
}
|
||||
#endif
|
||||
|
||||
extern "C" __global__ void kernel_cuda_tonemap(uchar4 *rgba, float *buffer, int sample, int sx, int sy, int sw, int sh, int offset, int stride)
|
||||
{
|
||||
int x = sx + blockDim.x*blockIdx.x + threadIdx.x;
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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 __KERNEL_H__
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
@@ -33,6 +31,7 @@ __device_inline void bsdf_eval_init(BsdfEval *eval, ClosureType type, float3 val
|
||||
eval->glossy = make_float3(0.0f, 0.0f, 0.0f);
|
||||
eval->transmission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
eval->transparent = make_float3(0.0f, 0.0f, 0.0f);
|
||||
eval->subsurface = make_float3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
if(type == CLOSURE_BSDF_TRANSPARENT_ID)
|
||||
eval->transparent = value;
|
||||
@@ -40,8 +39,10 @@ __device_inline void bsdf_eval_init(BsdfEval *eval, ClosureType type, float3 val
|
||||
eval->diffuse = value;
|
||||
else if(CLOSURE_IS_BSDF_GLOSSY(type))
|
||||
eval->glossy = value;
|
||||
else
|
||||
else if(CLOSURE_IS_BSDF_TRANSMISSION(type))
|
||||
eval->transmission = value;
|
||||
else if(CLOSURE_IS_BSDF_BSSRDF(type))
|
||||
eval->subsurface = value;
|
||||
}
|
||||
else
|
||||
eval->diffuse = value;
|
||||
@@ -58,8 +59,10 @@ __device_inline void bsdf_eval_accum(BsdfEval *eval, ClosureType type, float3 va
|
||||
eval->diffuse += value;
|
||||
else if(CLOSURE_IS_BSDF_GLOSSY(type))
|
||||
eval->glossy += value;
|
||||
else
|
||||
else if(CLOSURE_IS_BSDF_TRANSMISSION(type))
|
||||
eval->transmission += value;
|
||||
else if(CLOSURE_IS_BSDF_BSSRDF(type))
|
||||
eval->subsurface += value;
|
||||
|
||||
/* skipping transparent, this function is used by for eval(), will be zero then */
|
||||
}
|
||||
@@ -77,7 +80,8 @@ __device_inline bool bsdf_eval_is_zero(BsdfEval *eval)
|
||||
return is_zero(eval->diffuse)
|
||||
&& is_zero(eval->glossy)
|
||||
&& is_zero(eval->transmission)
|
||||
&& is_zero(eval->transparent);
|
||||
&& is_zero(eval->transparent)
|
||||
&& is_zero(eval->subsurface);
|
||||
}
|
||||
else
|
||||
return is_zero(eval->diffuse);
|
||||
@@ -93,6 +97,7 @@ __device_inline void bsdf_eval_mul(BsdfEval *eval, float3 value)
|
||||
eval->diffuse *= value;
|
||||
eval->glossy *= value;
|
||||
eval->transmission *= value;
|
||||
eval->subsurface *= value;
|
||||
|
||||
/* skipping transparent, this function is used by for eval(), will be zero then */
|
||||
}
|
||||
@@ -124,18 +129,22 @@ __device_inline void path_radiance_init(PathRadiance *L, int use_light_pass)
|
||||
L->color_diffuse = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->color_glossy = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->color_transmission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->color_subsurface = make_float3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
L->direct_diffuse = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->direct_glossy = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->direct_transmission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->direct_subsurface = make_float3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
L->indirect_diffuse = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->indirect_glossy = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->indirect_transmission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->indirect_subsurface = make_float3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
L->path_diffuse = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->path_glossy = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->path_transmission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->path_subsurface = make_float3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
L->emission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->background = make_float3(0.0f, 0.0f, 0.0f);
|
||||
@@ -164,14 +173,15 @@ __device_inline void path_radiance_bsdf_bounce(PathRadiance *L, float3 *throughp
|
||||
L->path_diffuse = bsdf_eval->diffuse*value;
|
||||
L->path_glossy = bsdf_eval->glossy*value;
|
||||
L->path_transmission = bsdf_eval->transmission*value;
|
||||
L->path_subsurface = bsdf_eval->subsurface*value;
|
||||
|
||||
*throughput = L->path_diffuse + L->path_glossy + L->path_transmission;
|
||||
*throughput = L->path_diffuse + L->path_glossy + L->path_transmission + L->path_subsurface;
|
||||
|
||||
L->direct_throughput = *throughput;
|
||||
}
|
||||
else {
|
||||
/* transparent bounce before first hit, or indirectly visible through BSDF */
|
||||
float3 sum = (bsdf_eval->diffuse + bsdf_eval->glossy + bsdf_eval->transmission + bsdf_eval->transparent)*inverse_pdf;
|
||||
float3 sum = (bsdf_eval->diffuse + bsdf_eval->glossy + bsdf_eval->transmission + bsdf_eval->transparent + bsdf_eval->subsurface)*inverse_pdf;
|
||||
*throughput *= sum;
|
||||
}
|
||||
}
|
||||
@@ -230,6 +240,7 @@ __device_inline void path_radiance_accum_light(PathRadiance *L, float3 throughpu
|
||||
L->direct_diffuse += throughput*bsdf_eval->diffuse*shadow;
|
||||
L->direct_glossy += throughput*bsdf_eval->glossy*shadow;
|
||||
L->direct_transmission += throughput*bsdf_eval->transmission*shadow;
|
||||
L->direct_subsurface += throughput*bsdf_eval->subsurface*shadow;
|
||||
|
||||
if(is_lamp) {
|
||||
L->shadow.x += shadow.x*shadow_fac;
|
||||
@@ -239,7 +250,7 @@ __device_inline void path_radiance_accum_light(PathRadiance *L, float3 throughpu
|
||||
}
|
||||
else {
|
||||
/* indirectly visible lighting after BSDF bounce */
|
||||
float3 sum = bsdf_eval->diffuse + bsdf_eval->glossy + bsdf_eval->transmission;
|
||||
float3 sum = bsdf_eval->diffuse + bsdf_eval->glossy + bsdf_eval->transmission + bsdf_eval->subsurface;
|
||||
L->indirect += throughput*sum*shadow;
|
||||
}
|
||||
}
|
||||
@@ -273,17 +284,19 @@ __device_inline void path_radiance_sum_indirect(PathRadiance *L)
|
||||
#ifdef __PASSES__
|
||||
/* this division is a bit ugly, but means we only have to keep track of
|
||||
* only a single throughput further along the path, here we recover just
|
||||
* the indirect parth that is not influenced by any particular BSDF type */
|
||||
* the indirect path that is not influenced by any particular BSDF type */
|
||||
if(L->use_light_pass) {
|
||||
L->direct_emission = safe_divide_color(L->direct_emission, L->direct_throughput);
|
||||
L->direct_diffuse += L->path_diffuse*L->direct_emission;
|
||||
L->direct_glossy += L->path_glossy*L->direct_emission;
|
||||
L->direct_transmission += L->path_transmission*L->direct_emission;
|
||||
L->direct_subsurface += L->path_subsurface*L->direct_emission;
|
||||
|
||||
L->indirect = safe_divide_color(L->indirect, L->direct_throughput);
|
||||
L->indirect_diffuse += L->path_diffuse*L->indirect;
|
||||
L->indirect_glossy += L->path_glossy*L->indirect;
|
||||
L->indirect_transmission += L->path_transmission*L->indirect;
|
||||
L->indirect_subsurface += L->path_subsurface*L->indirect;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -295,6 +308,7 @@ __device_inline void path_radiance_reset_indirect(PathRadiance *L)
|
||||
L->path_diffuse = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->path_glossy = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->path_transmission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->path_subsurface = make_float3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
L->direct_emission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->indirect = make_float3(0.0f, 0.0f, 0.0f);
|
||||
@@ -309,8 +323,8 @@ __device_inline float3 path_radiance_sum(KernelGlobals *kg, PathRadiance *L)
|
||||
path_radiance_sum_indirect(L);
|
||||
|
||||
float3 L_sum = L->emission
|
||||
+ L->direct_diffuse + L->direct_glossy + L->direct_transmission
|
||||
+ L->indirect_diffuse + L->indirect_glossy + L->indirect_transmission;
|
||||
+ L->direct_diffuse + L->direct_glossy + L->direct_transmission + L->direct_subsurface
|
||||
+ L->indirect_diffuse + L->indirect_glossy + L->indirect_transmission + L->indirect_subsurface;
|
||||
|
||||
if(!kernel_data.background.transparent)
|
||||
L_sum += L->background;
|
||||
@@ -337,10 +351,12 @@ __device_inline void path_radiance_clamp(PathRadiance *L, float3 *L_sum, float c
|
||||
L->direct_diffuse = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->direct_glossy = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->direct_transmission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->direct_subsurface = make_float3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
L->indirect_diffuse = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->indirect_glossy = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->indirect_transmission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
L->indirect_subsurface = make_float3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
L->emission = make_float3(0.0f, 0.0f, 0.0f);
|
||||
}
|
||||
@@ -357,10 +373,12 @@ __device_inline void path_radiance_clamp(PathRadiance *L, float3 *L_sum, float c
|
||||
L->direct_diffuse *= scale;
|
||||
L->direct_glossy *= scale;
|
||||
L->direct_transmission *= scale;
|
||||
L->direct_subsurface *= scale;
|
||||
|
||||
L->indirect_diffuse *= scale;
|
||||
L->indirect_glossy *= scale;
|
||||
L->indirect_transmission *= scale;
|
||||
L->indirect_subsurface *= scale;
|
||||
|
||||
L->emission *= scale;
|
||||
}
|
||||
|
@@ -26,8 +26,8 @@ CCL_NAMESPACE_BEGIN
|
||||
*/
|
||||
|
||||
/* bottom-most stack entry, indicating the end of traversal */
|
||||
|
||||
#define ENTRYPOINT_SENTINEL 0x76543210
|
||||
|
||||
/* 64 object BVH + 64 mesh BVH + 64 object node splitting */
|
||||
#define BVH_STACK_SIZE 192
|
||||
#define BVH_NODE_SIZE 4
|
||||
@@ -215,21 +215,20 @@ __device_inline bool bvh_cardinal_curve_intersect(KernelGlobals *kg, Intersectio
|
||||
float3 P, float3 idir, uint visibility, int object, int curveAddr, int segment, uint *lcg_state, float difl, float extmax)
|
||||
{
|
||||
float epsilon = 0.0f;
|
||||
int depth = kernel_data.curve_kernel_data.subdivisions;
|
||||
float r_st, r_en;
|
||||
|
||||
int depth = kernel_data.curve.subdivisions;
|
||||
int flags = kernel_data.curve.curveflags;
|
||||
int prim = kernel_tex_fetch(__prim_index, curveAddr);
|
||||
|
||||
float3 curve_coef[4];
|
||||
|
||||
/* curve Intersection check */
|
||||
float3 dir = 1.0f/idir;
|
||||
|
||||
int flags = kernel_data.curve_kernel_data.curveflags;
|
||||
|
||||
int prim = kernel_tex_fetch(__prim_index, curveAddr);
|
||||
|
||||
float3 curve_coef[4];
|
||||
float r_st,r_en;
|
||||
|
||||
/*obtain curve parameters*/
|
||||
/* obtain curve parameters */
|
||||
{
|
||||
/*ray transform created - this should be created at beginning of intersection loop*/
|
||||
/* ray transform created - this should be created at beginning of intersection loop */
|
||||
Transform htfm;
|
||||
float d = sqrtf(dir.x * dir.x + dir.z * dir.z);
|
||||
htfm = make_transform(
|
||||
@@ -271,15 +270,15 @@ __device_inline bool bvh_cardinal_curve_intersect(KernelGlobals *kg, Intersectio
|
||||
if((flags & CURVE_KN_RIBBONS) || !(flags & CURVE_KN_BACKFACING))
|
||||
epsilon = 2 * r_curr;
|
||||
|
||||
/*find bounds - this is slow for cubic curves*/
|
||||
float upper,lower;
|
||||
/* find bounds - this is slow for cubic curves */
|
||||
float upper, lower;
|
||||
|
||||
float zextrem[4];
|
||||
curvebounds(&lower, &upper, &zextrem[0], &zextrem[1], &zextrem[2], &zextrem[3], curve_coef[0].z, curve_coef[1].z, curve_coef[2].z, curve_coef[3].z);
|
||||
if(lower - r_curr > isect->t || upper + r_curr < epsilon)
|
||||
return false;
|
||||
|
||||
/*minimum width extension*/
|
||||
/* minimum width extension */
|
||||
float mw_extension = min(difl * fabsf(upper), extmax);
|
||||
float r_ext = mw_extension + r_curr;
|
||||
|
||||
@@ -293,13 +292,13 @@ __device_inline bool bvh_cardinal_curve_intersect(KernelGlobals *kg, Intersectio
|
||||
if(lower > r_ext || upper < -r_ext)
|
||||
return false;
|
||||
|
||||
/*setup recurrent loop*/
|
||||
/* setup recurrent loop */
|
||||
int level = 1 << depth;
|
||||
int tree = 0;
|
||||
float resol = 1.0f / (float)level;
|
||||
bool hit = false;
|
||||
|
||||
/*begin loop*/
|
||||
/* begin loop */
|
||||
while(!(tree >> (depth))) {
|
||||
float i_st = tree * resol;
|
||||
float i_en = i_st + (level * resol);
|
||||
@@ -347,7 +346,7 @@ __device_inline bool bvh_cardinal_curve_intersect(KernelGlobals *kg, Intersectio
|
||||
float coverage = 1.0f;
|
||||
|
||||
if (bminz - r_curr > isect->t || bmaxz + r_curr < epsilon || bminx > r_ext|| bmaxx < -r_ext|| bminy > r_ext|| bmaxy < -r_ext) {
|
||||
/* the bounding box does not overlap the square centered at O.*/
|
||||
/* the bounding box does not overlap the square centered at O */
|
||||
tree += level;
|
||||
level = tree & -tree;
|
||||
}
|
||||
@@ -369,10 +368,10 @@ __device_inline bool bvh_cardinal_curve_intersect(KernelGlobals *kg, Intersectio
|
||||
w = -(p_st.x * tg.x + p_st.y * tg.y) / w;
|
||||
w = clamp((float)w, 0.0f, 1.0f);
|
||||
|
||||
/* compute u on the curve segment.*/
|
||||
/* compute u on the curve segment */
|
||||
u = i_st * (1 - w) + i_en * w;
|
||||
r_curr = r_st + (r_en - r_st) * u;
|
||||
/* compare x-y distances.*/
|
||||
/* compare x-y distances */
|
||||
float3 p_curr = ((curve_coef[3] * u + curve_coef[2]) * u + curve_coef[1]) * u + curve_coef[0];
|
||||
|
||||
float3 dp_st = (3 * curve_coef[3] * i_st + 2 * curve_coef[2]) * i_st + curve_coef[1];
|
||||
@@ -412,7 +411,7 @@ __device_inline bool bvh_cardinal_curve_intersect(KernelGlobals *kg, Intersectio
|
||||
level = tree & -tree;
|
||||
continue;
|
||||
}
|
||||
/* compare z distances.*/
|
||||
/* compare z distances */
|
||||
if (isect->t < p_curr.z) {
|
||||
tree++;
|
||||
level = tree & -tree;
|
||||
@@ -422,7 +421,7 @@ __device_inline bool bvh_cardinal_curve_intersect(KernelGlobals *kg, Intersectio
|
||||
}
|
||||
else {
|
||||
float l = len(p_en - p_st);
|
||||
/*minimum width extension*/
|
||||
/* minimum width extension */
|
||||
float or1 = r1;
|
||||
float or2 = r2;
|
||||
if(difl != 0.0f) {
|
||||
@@ -477,18 +476,18 @@ __device_inline bool bvh_cardinal_curve_intersect(KernelGlobals *kg, Intersectio
|
||||
}
|
||||
|
||||
w = clamp((float)w, 0.0f, 1.0f);
|
||||
/* compute u on the curve segment.*/
|
||||
/* compute u on the curve segment */
|
||||
u = i_st * (1 - w) + i_en * w;
|
||||
r_curr = r1 + (r2 - r1) * w;
|
||||
r_ext = or1 + (or2 - or1) * w;
|
||||
coverage = r_curr/r_ext;
|
||||
|
||||
}
|
||||
/* we found a new intersection.*/
|
||||
/* we found a new intersection */
|
||||
|
||||
/*stochastic fade from minimum width*/
|
||||
/* stochastic fade from minimum width */
|
||||
if(lcg_state && coverage != 1.0f) {
|
||||
if(lcg_step(lcg_state) > coverage)
|
||||
if(lcg_step_float(lcg_state) > coverage)
|
||||
return hit;
|
||||
}
|
||||
|
||||
@@ -525,7 +524,7 @@ __device_inline bool bvh_curve_intersect(KernelGlobals *kg, Intersection *isect,
|
||||
float3 P, float3 idir, uint visibility, int object, int curveAddr, int segment, uint *lcg_state, float difl, float extmax)
|
||||
{
|
||||
/* curve Intersection check */
|
||||
int flags = kernel_data.curve_kernel_data.curveflags;
|
||||
int flags = kernel_data.curve.curveflags;
|
||||
|
||||
int prim = kernel_tex_fetch(__prim_index, curveAddr);
|
||||
float4 v00 = kernel_tex_fetch(__curves, prim);
|
||||
@@ -542,7 +541,7 @@ __device_inline bool bvh_curve_intersect(KernelGlobals *kg, Intersection *isect,
|
||||
float3 p1 = float4_to_float3(P1);
|
||||
float3 p2 = float4_to_float3(P2);
|
||||
|
||||
/*minimum width extension*/
|
||||
/* minimum width extension */
|
||||
float r1 = or1;
|
||||
float r2 = or2;
|
||||
if(difl != 0.0f) {
|
||||
@@ -567,7 +566,7 @@ __device_inline bool bvh_curve_intersect(KernelGlobals *kg, Intersection *isect,
|
||||
if(sdisc < 0.0f)
|
||||
return false;
|
||||
|
||||
/* obtain parameters and test midpoint distance for suitable modes*/
|
||||
/* obtain parameters and test midpoint distance for suitable modes */
|
||||
float3 tg = (p2 - p1) / l;
|
||||
float gd = (r2 - r1) / l;
|
||||
float dirz = dot(dir,tg);
|
||||
@@ -584,7 +583,7 @@ __device_inline bool bvh_curve_intersect(KernelGlobals *kg, Intersection *isect,
|
||||
if((zcentre < 0 || zcentre > l) && !(flags & CURVE_KN_ACCURATE) && !(flags & CURVE_KN_INTERSECTCORRECTION))
|
||||
return false;
|
||||
|
||||
/* test minimum separation*/
|
||||
/* test minimum separation */
|
||||
float3 cprod = cross(tg, dir);
|
||||
float3 cprod2 = cross(tg, dif);
|
||||
float cprodsq = len_squared(cprod);
|
||||
@@ -599,7 +598,7 @@ __device_inline bool bvh_curve_intersect(KernelGlobals *kg, Intersection *isect,
|
||||
if(distscaled > mr*mr)
|
||||
return false;
|
||||
|
||||
/* calculate true intersection*/
|
||||
/* calculate true intersection */
|
||||
float3 tdif = P - p1 + tcentre * dir;
|
||||
float tdifz = dot(tdif,tg);
|
||||
float tb = 2*(dot(dir,tdif) - dirz*(tdifz + gd*(tdifz*gd + r1)));
|
||||
@@ -636,11 +635,11 @@ __device_inline bool bvh_curve_intersect(KernelGlobals *kg, Intersection *isect,
|
||||
z = zcentre + (dirz * correction);
|
||||
}
|
||||
|
||||
/*stochastic fade from minimum width*/
|
||||
/* stochastic fade from minimum width */
|
||||
float adjradius = or1 + z * (or2 - or1) / l;
|
||||
adjradius = adjradius / (r1 + z * gd);
|
||||
if(lcg_state && adjradius != 1.0f) {
|
||||
if(lcg_step(lcg_state) > adjradius)
|
||||
if(lcg_step_float(lcg_state) > adjradius)
|
||||
return false;
|
||||
}
|
||||
/* --- */
|
||||
@@ -649,7 +648,7 @@ __device_inline bool bvh_curve_intersect(KernelGlobals *kg, Intersection *isect,
|
||||
|
||||
if (flags & CURVE_KN_ENCLOSEFILTER) {
|
||||
|
||||
float enc_ratio = kernel_data.curve_kernel_data.encasing_ratio;
|
||||
float enc_ratio = kernel_data.curve.encasing_ratio;
|
||||
if((dot(P - p1, tg) > -r1 * enc_ratio) && (dot(P - p2, tg) < r2 * enc_ratio)) {
|
||||
float a2 = 1.0f - (dirz*dirz*(1 + gd*gd*enc_ratio*enc_ratio));
|
||||
float c2 = dot(dif,dif) - difz * difz * (1 + gd*gd*enc_ratio*enc_ratio) - r1*r1*enc_ratio*enc_ratio - 2*r1*difz*gd*enc_ratio;
|
||||
@@ -690,8 +689,8 @@ __device_inline bool bvh_curve_intersect(KernelGlobals *kg, Intersection *isect,
|
||||
* only want to intersect with primitives in the same object, and if case of
|
||||
* multiple hits we pick a single random primitive as the intersection point. */
|
||||
|
||||
__device_inline bool bvh_triangle_intersect_subsurface(KernelGlobals *kg, Intersection *isect,
|
||||
float3 P, float3 idir, int object, int triAddr, float tmax, int *num_hits, float subsurface_random)
|
||||
__device_inline void bvh_triangle_intersect_subsurface(KernelGlobals *kg, Intersection *isect_array,
|
||||
float3 P, float3 idir, int object, int triAddr, float tmax, uint *num_hits, uint *lcg_state, int max_hits)
|
||||
{
|
||||
/* compute and check intersection t-value */
|
||||
float4 v00 = kernel_tex_fetch(__tri_woop, triAddr*TRI_NODE_SIZE+0);
|
||||
@@ -718,20 +717,30 @@ __device_inline bool bvh_triangle_intersect_subsurface(KernelGlobals *kg, Inters
|
||||
if(v >= 0.0f && u + v <= 1.0f) {
|
||||
(*num_hits)++;
|
||||
|
||||
if(subsurface_random * (*num_hits) <= 1.0f) {
|
||||
/* record intersection */
|
||||
isect->prim = triAddr;
|
||||
isect->object = object;
|
||||
isect->u = u;
|
||||
isect->v = v;
|
||||
isect->t = t;
|
||||
return true;
|
||||
int hit;
|
||||
|
||||
if(*num_hits <= max_hits) {
|
||||
hit = *num_hits - 1;
|
||||
}
|
||||
else {
|
||||
/* reservoir sampling: if we are at the maximum number of
|
||||
* hits, randomly replace element or skip it */
|
||||
hit = lcg_step_uint(lcg_state) % *num_hits;
|
||||
|
||||
if(hit >= max_hits)
|
||||
return;
|
||||
}
|
||||
|
||||
/* record intersection */
|
||||
Intersection *isect = &isect_array[hit];
|
||||
isect->prim = triAddr;
|
||||
isect->object = object;
|
||||
isect->u = u;
|
||||
isect->v = v;
|
||||
isect->t = t;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -741,7 +750,6 @@ __device_inline bool bvh_triangle_intersect_subsurface(KernelGlobals *kg, Inters
|
||||
#define BVH_MOTION 2
|
||||
#define BVH_HAIR 4
|
||||
#define BVH_HAIR_MINIMUM_WIDTH 8
|
||||
#define BVH_SUBSURFACE 16
|
||||
|
||||
#define BVH_FUNCTION_NAME bvh_intersect
|
||||
#define BVH_FUNCTION_FEATURES 0
|
||||
@@ -773,32 +781,32 @@ __device_inline bool bvh_triangle_intersect_subsurface(KernelGlobals *kg, Inters
|
||||
|
||||
#if defined(__SUBSURFACE__)
|
||||
#define BVH_FUNCTION_NAME bvh_intersect_subsurface
|
||||
#define BVH_FUNCTION_FEATURES BVH_SUBSURFACE
|
||||
#include "kernel_bvh_traversal.h"
|
||||
#define BVH_FUNCTION_FEATURES 0
|
||||
#include "kernel_bvh_subsurface.h"
|
||||
#endif
|
||||
|
||||
#if defined(__SUBSURFACE__) && defined(__INSTANCING__)
|
||||
#define BVH_FUNCTION_NAME bvh_intersect_subsurface_instancing
|
||||
#define BVH_FUNCTION_FEATURES BVH_INSTANCING|BVH_SUBSURFACE
|
||||
#include "kernel_bvh_traversal.h"
|
||||
#define BVH_FUNCTION_FEATURES BVH_INSTANCING
|
||||
#include "kernel_bvh_subsurface.h"
|
||||
#endif
|
||||
|
||||
#if defined(__SUBSURFACE__) && defined(__HAIR__)
|
||||
#define BVH_FUNCTION_NAME bvh_intersect_subsurface_hair
|
||||
#define BVH_FUNCTION_FEATURES BVH_INSTANCING|BVH_SUBSURFACE|BVH_HAIR|BVH_HAIR_MINIMUM_WIDTH
|
||||
#include "kernel_bvh_traversal.h"
|
||||
#define BVH_FUNCTION_FEATURES BVH_INSTANCING|BVH_HAIR
|
||||
#include "kernel_bvh_subsurface.h"
|
||||
#endif
|
||||
|
||||
#if defined(__SUBSURFACE__) && defined(__OBJECT_MOTION__)
|
||||
#define BVH_FUNCTION_NAME bvh_intersect_subsurface_motion
|
||||
#define BVH_FUNCTION_FEATURES BVH_INSTANCING|BVH_SUBSURFACE|BVH_MOTION
|
||||
#include "kernel_bvh_traversal.h"
|
||||
#define BVH_FUNCTION_FEATURES BVH_INSTANCING|BVH_MOTION
|
||||
#include "kernel_bvh_subsurface.h"
|
||||
#endif
|
||||
|
||||
#if defined(__SUBSURFACE__) && defined(__HAIR__) && defined(__OBJECT_MOTION__)
|
||||
#define BVH_FUNCTION_NAME bvh_intersect_subsurface_hair_motion
|
||||
#define BVH_FUNCTION_FEATURES BVH_INSTANCING|BVH_SUBSURFACE|BVH_HAIR|BVH_HAIR_MINIMUM_WIDTH|BVH_MOTION
|
||||
#include "kernel_bvh_traversal.h"
|
||||
#define BVH_FUNCTION_FEATURES BVH_INSTANCING|BVH_HAIR|BVH_MOTION
|
||||
#include "kernel_bvh_subsurface.h"
|
||||
#endif
|
||||
|
||||
|
||||
@@ -844,38 +852,38 @@ __device_inline bool scene_intersect(KernelGlobals *kg, const Ray *ray, const ui
|
||||
}
|
||||
|
||||
#ifdef __SUBSURFACE__
|
||||
__device_inline int scene_intersect_subsurface(KernelGlobals *kg, const Ray *ray, Intersection *isect, int subsurface_object, float subsurface_random)
|
||||
__device_inline uint scene_intersect_subsurface(KernelGlobals *kg, const Ray *ray, Intersection *isect, int subsurface_object, uint *lcg_state, int max_hits)
|
||||
{
|
||||
#ifdef __OBJECT_MOTION__
|
||||
if(kernel_data.bvh.have_motion) {
|
||||
#ifdef __HAIR__
|
||||
if(kernel_data.bvh.have_curves)
|
||||
return bvh_intersect_subsurface_hair_motion(kg, ray, isect, subsurface_object, subsurface_random);
|
||||
return bvh_intersect_subsurface_hair_motion(kg, ray, isect, subsurface_object, lcg_state, max_hits);
|
||||
#endif /* __HAIR__ */
|
||||
|
||||
return bvh_intersect_subsurface_motion(kg, ray, isect, subsurface_object, subsurface_random);
|
||||
return bvh_intersect_subsurface_motion(kg, ray, isect, subsurface_object, lcg_state, max_hits);
|
||||
}
|
||||
#endif /* __OBJECT_MOTION__ */
|
||||
|
||||
#ifdef __HAIR__
|
||||
if(kernel_data.bvh.have_curves)
|
||||
return bvh_intersect_subsurface_hair(kg, ray, isect, subsurface_object, subsurface_random);
|
||||
return bvh_intersect_subsurface_hair(kg, ray, isect, subsurface_object, lcg_state, max_hits);
|
||||
#endif /* __HAIR__ */
|
||||
|
||||
#ifdef __KERNEL_CPU__
|
||||
|
||||
#ifdef __INSTANCING__
|
||||
if(kernel_data.bvh.have_instancing)
|
||||
return bvh_intersect_subsurface_instancing(kg, ray, isect, subsurface_object, subsurface_random);
|
||||
return bvh_intersect_subsurface_instancing(kg, ray, isect, subsurface_object, lcg_state, max_hits);
|
||||
#endif /* __INSTANCING__ */
|
||||
|
||||
return bvh_intersect_subsurface(kg, ray, isect, subsurface_object, subsurface_random);
|
||||
return bvh_intersect_subsurface(kg, ray, isect, subsurface_object, lcg_state, max_hits);
|
||||
#else /* __KERNEL_CPU__ */
|
||||
|
||||
#ifdef __INSTANCING__
|
||||
return bvh_intersect_subsurface_instancing(kg, ray, isect, subsurface_object, subsurface_random);
|
||||
return bvh_intersect_subsurface_instancing(kg, ray, isect, subsurface_object, lcg_state, max_hits);
|
||||
#else
|
||||
return bvh_intersect_subsurface(kg, ray, isect, subsurface_object, subsurface_random);
|
||||
return bvh_intersect_subsurface(kg, ray, isect, subsurface_object, lcg_state, max_hits);
|
||||
#endif /* __INSTANCING__ */
|
||||
|
||||
#endif /* __KERNEL_CPU__ */
|
||||
@@ -980,6 +988,51 @@ __device_inline float3 bvh_triangle_refine(KernelGlobals *kg, ShaderData *sd, co
|
||||
#endif
|
||||
}
|
||||
|
||||
/* same as above, except that isect->t is assumed to be in object space for instancing */
|
||||
__device_inline float3 bvh_triangle_refine_subsurface(KernelGlobals *kg, ShaderData *sd, const Intersection *isect, const Ray *ray)
|
||||
{
|
||||
float3 P = ray->P;
|
||||
float3 D = ray->D;
|
||||
float t = isect->t;
|
||||
|
||||
#ifdef __INTERSECTION_REFINE__
|
||||
if(isect->object != ~0) {
|
||||
#ifdef __OBJECT_MOTION__
|
||||
Transform tfm = sd->ob_itfm;
|
||||
#else
|
||||
Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_INVERSE_TRANSFORM);
|
||||
#endif
|
||||
|
||||
P = transform_point(&tfm, P);
|
||||
D = transform_direction(&tfm, D);
|
||||
D = normalize(D);
|
||||
}
|
||||
|
||||
P = P + D*t;
|
||||
|
||||
float4 v00 = kernel_tex_fetch(__tri_woop, isect->prim*TRI_NODE_SIZE+0);
|
||||
float Oz = v00.w - P.x*v00.x - P.y*v00.y - P.z*v00.z;
|
||||
float invDz = 1.0f/(D.x*v00.x + D.y*v00.y + D.z*v00.z);
|
||||
float rt = Oz * invDz;
|
||||
|
||||
P = P + D*rt;
|
||||
|
||||
if(isect->object != ~0) {
|
||||
#ifdef __OBJECT_MOTION__
|
||||
Transform tfm = sd->ob_tfm;
|
||||
#else
|
||||
Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_TRANSFORM);
|
||||
#endif
|
||||
|
||||
P = transform_point(&tfm, P);
|
||||
}
|
||||
|
||||
return P;
|
||||
#else
|
||||
return P + D*t;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef __HAIR__
|
||||
|
||||
__device_inline float3 curvetangent(float t, float3 p0, float3 p1, float3 p2, float3 p3)
|
||||
@@ -1009,7 +1062,7 @@ __device_inline float3 curvepoint(float t, float3 p0, float3 p1, float3 p2, floa
|
||||
|
||||
__device_inline float3 bvh_curve_refine(KernelGlobals *kg, ShaderData *sd, const Intersection *isect, const Ray *ray, float t)
|
||||
{
|
||||
int flag = kernel_data.curve_kernel_data.curveflags;
|
||||
int flag = kernel_data.curve.curveflags;
|
||||
float3 P = ray->P;
|
||||
float3 D = ray->D;
|
||||
|
||||
@@ -1062,7 +1115,7 @@ __device_inline float3 bvh_curve_refine(KernelGlobals *kg, ShaderData *sd, const
|
||||
sd->v = 0.0f;
|
||||
#endif
|
||||
|
||||
if(kernel_data.curve_kernel_data.curveflags & CURVE_KN_RIBBONS)
|
||||
if(kernel_data.curve.curveflags & CURVE_KN_RIBBONS)
|
||||
sd->Ng = normalize(-(D - tg * (dot(tg,D))));
|
||||
else {
|
||||
sd->Ng = normalize(P - p_curr);
|
||||
@@ -1080,12 +1133,8 @@ __device_inline float3 bvh_curve_refine(KernelGlobals *kg, ShaderData *sd, const
|
||||
#endif
|
||||
|
||||
if (flag & CURVE_KN_TRUETANGENTGNORMAL) {
|
||||
sd->Ng = -(D - tg * (dot(tg,D) * kernel_data.curve_kernel_data.normalmix));
|
||||
sd->Ng = -(D - tg * dot(tg,D));
|
||||
sd->Ng = normalize(sd->Ng);
|
||||
if (flag & CURVE_KN_NORMALCORRECTION) {
|
||||
sd->Ng = sd->Ng - gd * tg;
|
||||
sd->Ng = normalize(sd->Ng);
|
||||
}
|
||||
}
|
||||
else {
|
||||
sd->Ng = (dif - tg * sd->u * l) / (P1.w + sd->u * l * gd);
|
||||
@@ -1098,12 +1147,8 @@ __device_inline float3 bvh_curve_refine(KernelGlobals *kg, ShaderData *sd, const
|
||||
sd->N = sd->Ng;
|
||||
|
||||
if (flag & CURVE_KN_TANGENTGNORMAL && !(flag & CURVE_KN_TRUETANGENTGNORMAL)) {
|
||||
sd->N = -(D - tg * (dot(tg,D) * kernel_data.curve_kernel_data.normalmix));
|
||||
sd->N = -(D - tg * dot(tg,D));
|
||||
sd->N = normalize(sd->N);
|
||||
if (flag & CURVE_KN_NORMALCORRECTION) {
|
||||
sd->N = sd->N - gd * tg;
|
||||
sd->N = normalize(sd->N);
|
||||
}
|
||||
}
|
||||
if (!(flag & CURVE_KN_TANGENTGNORMAL) && flag & CURVE_KN_TRUETANGENTGNORMAL) {
|
||||
sd->N = (dif - tg * sd->u * l) / (P1.w + sd->u * l * gd);
|
||||
|
312
intern/cycles/kernel/kernel_bvh_subsurface.h
Normal file
312
intern/cycles/kernel/kernel_bvh_subsurface.h
Normal file
@@ -0,0 +1,312 @@
|
||||
/*
|
||||
* Adapted from code Copyright 2009-2010 NVIDIA Corporation,
|
||||
* and code copyright 2009-2012 Intel Corporation
|
||||
*
|
||||
* Modifications 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.
|
||||
*/
|
||||
|
||||
/* This is a template BVH traversal function for subsurface scattering, where
|
||||
* various features can be enabled/disabled. This way we can compile optimized
|
||||
* versions for each case without new features slowing things down.
|
||||
*
|
||||
* BVH_INSTANCING: object instancing
|
||||
* BVH_MOTION: motion blur rendering
|
||||
*
|
||||
*/
|
||||
|
||||
#define FEATURE(f) (((BVH_FUNCTION_FEATURES) & (f)) != 0)
|
||||
|
||||
__device uint BVH_FUNCTION_NAME(KernelGlobals *kg, const Ray *ray, Intersection *isect_array,
|
||||
int subsurface_object, uint *lcg_state, int max_hits)
|
||||
{
|
||||
/* todo:
|
||||
* - test if pushing distance on the stack helps (for non shadow rays)
|
||||
* - separate version for shadow rays
|
||||
* - likely and unlikely for if() statements
|
||||
* - SSE for hair
|
||||
* - test restrict attribute for pointers
|
||||
*/
|
||||
|
||||
/* traversal stack in CUDA thread-local memory */
|
||||
int traversalStack[BVH_STACK_SIZE];
|
||||
traversalStack[0] = ENTRYPOINT_SENTINEL;
|
||||
|
||||
/* traversal variables in registers */
|
||||
int stackPtr = 0;
|
||||
int nodeAddr = kernel_data.bvh.root;
|
||||
|
||||
/* ray parameters in registers */
|
||||
const float tmax = ray->t;
|
||||
float3 P = ray->P;
|
||||
float3 idir = bvh_inverse_direction(ray->D);
|
||||
int object = ~0;
|
||||
|
||||
const uint visibility = ~0;
|
||||
uint num_hits = 0;
|
||||
|
||||
#if FEATURE(BVH_MOTION)
|
||||
Transform ob_tfm;
|
||||
#endif
|
||||
|
||||
#if defined(__KERNEL_SSE2__)
|
||||
const shuffle_swap_t shuf_identity = shuffle_swap_identity();
|
||||
const shuffle_swap_t shuf_swap = shuffle_swap_swap();
|
||||
|
||||
const __m128i pn = _mm_set_epi32(0x80000000, 0x80000000, 0x00000000, 0x00000000);
|
||||
__m128 Psplat[3], idirsplat[3];
|
||||
|
||||
Psplat[0] = _mm_set_ps1(P.x);
|
||||
Psplat[1] = _mm_set_ps1(P.y);
|
||||
Psplat[2] = _mm_set_ps1(P.z);
|
||||
|
||||
idirsplat[0] = _mm_xor_ps(_mm_set_ps1(idir.x), _mm_castsi128_ps(pn));
|
||||
idirsplat[1] = _mm_xor_ps(_mm_set_ps1(idir.y), _mm_castsi128_ps(pn));
|
||||
idirsplat[2] = _mm_xor_ps(_mm_set_ps1(idir.z), _mm_castsi128_ps(pn));
|
||||
|
||||
__m128 tsplat = _mm_set_ps(-tmax, -tmax, 0.0f, 0.0f);
|
||||
|
||||
shuffle_swap_t shufflex = (idir.x >= 0)? shuf_identity: shuf_swap;
|
||||
shuffle_swap_t shuffley = (idir.y >= 0)? shuf_identity: shuf_swap;
|
||||
shuffle_swap_t shufflez = (idir.z >= 0)? shuf_identity: shuf_swap;
|
||||
#endif
|
||||
|
||||
/* traversal loop */
|
||||
do {
|
||||
do
|
||||
{
|
||||
/* traverse internal nodes */
|
||||
while(nodeAddr >= 0 && nodeAddr != ENTRYPOINT_SENTINEL)
|
||||
{
|
||||
bool traverseChild0, traverseChild1;
|
||||
int nodeAddrChild1;
|
||||
|
||||
#if !defined(__KERNEL_SSE2__)
|
||||
/* Intersect two child bounding boxes, non-SSE version */
|
||||
float t = tmax;
|
||||
|
||||
/* fetch node data */
|
||||
float4 node0 = kernel_tex_fetch(__bvh_nodes, nodeAddr*BVH_NODE_SIZE+0);
|
||||
float4 node1 = kernel_tex_fetch(__bvh_nodes, nodeAddr*BVH_NODE_SIZE+1);
|
||||
float4 node2 = kernel_tex_fetch(__bvh_nodes, nodeAddr*BVH_NODE_SIZE+2);
|
||||
float4 cnodes = kernel_tex_fetch(__bvh_nodes, nodeAddr*BVH_NODE_SIZE+3);
|
||||
|
||||
/* intersect ray against child nodes */
|
||||
NO_EXTENDED_PRECISION float c0lox = (node0.x - P.x) * idir.x;
|
||||
NO_EXTENDED_PRECISION float c0hix = (node0.z - P.x) * idir.x;
|
||||
NO_EXTENDED_PRECISION float c0loy = (node1.x - P.y) * idir.y;
|
||||
NO_EXTENDED_PRECISION float c0hiy = (node1.z - P.y) * idir.y;
|
||||
NO_EXTENDED_PRECISION float c0loz = (node2.x - P.z) * idir.z;
|
||||
NO_EXTENDED_PRECISION float c0hiz = (node2.z - P.z) * idir.z;
|
||||
NO_EXTENDED_PRECISION float c0min = max4(min(c0lox, c0hix), min(c0loy, c0hiy), min(c0loz, c0hiz), 0.0f);
|
||||
NO_EXTENDED_PRECISION float c0max = min4(max(c0lox, c0hix), max(c0loy, c0hiy), max(c0loz, c0hiz), t);
|
||||
|
||||
NO_EXTENDED_PRECISION float c1lox = (node0.y - P.x) * idir.x;
|
||||
NO_EXTENDED_PRECISION float c1hix = (node0.w - P.x) * idir.x;
|
||||
NO_EXTENDED_PRECISION float c1loy = (node1.y - P.y) * idir.y;
|
||||
NO_EXTENDED_PRECISION float c1hiy = (node1.w - P.y) * idir.y;
|
||||
NO_EXTENDED_PRECISION float c1loz = (node2.y - P.z) * idir.z;
|
||||
NO_EXTENDED_PRECISION float c1hiz = (node2.w - P.z) * idir.z;
|
||||
NO_EXTENDED_PRECISION float c1min = max4(min(c1lox, c1hix), min(c1loy, c1hiy), min(c1loz, c1hiz), 0.0f);
|
||||
NO_EXTENDED_PRECISION float c1max = min4(max(c1lox, c1hix), max(c1loy, c1hiy), max(c1loz, c1hiz), t);
|
||||
|
||||
/* decide which nodes to traverse next */
|
||||
#ifdef __VISIBILITY_FLAG__
|
||||
/* this visibility test gives a 5% performance hit, how to solve? */
|
||||
traverseChild0 = (c0max >= c0min) && (__float_as_uint(cnodes.z) & visibility);
|
||||
traverseChild1 = (c1max >= c1min) && (__float_as_uint(cnodes.w) & visibility);
|
||||
#else
|
||||
traverseChild0 = (c0max >= c0min);
|
||||
traverseChild1 = (c1max >= c1min);
|
||||
#endif
|
||||
|
||||
#else // __KERNEL_SSE2__
|
||||
/* Intersect two child bounding boxes, SSE3 version adapted from Embree */
|
||||
|
||||
/* fetch node data */
|
||||
__m128 *bvh_nodes = (__m128*)kg->__bvh_nodes.data + nodeAddr*BVH_NODE_SIZE;
|
||||
float4 cnodes = ((float4*)bvh_nodes)[3];
|
||||
|
||||
/* intersect ray against child nodes */
|
||||
const __m128 tminmaxx = _mm_mul_ps(_mm_sub_ps(shuffle_swap(bvh_nodes[0], shufflex), Psplat[0]), idirsplat[0]);
|
||||
const __m128 tminmaxy = _mm_mul_ps(_mm_sub_ps(shuffle_swap(bvh_nodes[1], shuffley), Psplat[1]), idirsplat[1]);
|
||||
const __m128 tminmaxz = _mm_mul_ps(_mm_sub_ps(shuffle_swap(bvh_nodes[2], shufflez), Psplat[2]), idirsplat[2]);
|
||||
|
||||
const __m128 tminmax = _mm_xor_ps(_mm_max_ps(_mm_max_ps(tminmaxx, tminmaxy), _mm_max_ps(tminmaxz, tsplat)), _mm_castsi128_ps(pn));
|
||||
const __m128 lrhit = _mm_cmple_ps(tminmax, shuffle_swap(tminmax, shuf_swap));
|
||||
|
||||
/* decide which nodes to traverse next */
|
||||
#ifdef __VISIBILITY_FLAG__
|
||||
/* this visibility test gives a 5% performance hit, how to solve? */
|
||||
traverseChild0 = (_mm_movemask_ps(lrhit) & 1) && (__float_as_uint(cnodes.z) & visibility);
|
||||
traverseChild1 = (_mm_movemask_ps(lrhit) & 2) && (__float_as_uint(cnodes.w) & visibility);
|
||||
#else
|
||||
traverseChild0 = (_mm_movemask_ps(lrhit) & 1);
|
||||
traverseChild1 = (_mm_movemask_ps(lrhit) & 2);
|
||||
#endif
|
||||
#endif // __KERNEL_SSE2__
|
||||
|
||||
nodeAddr = __float_as_int(cnodes.x);
|
||||
nodeAddrChild1 = __float_as_int(cnodes.y);
|
||||
|
||||
if(traverseChild0 && traverseChild1) {
|
||||
/* both children were intersected, push the farther one */
|
||||
#if !defined(__KERNEL_SSE2__)
|
||||
bool closestChild1 = (c1min < c0min);
|
||||
#else
|
||||
union { __m128 m128; float v[4]; } uminmax;
|
||||
uminmax.m128 = tminmax;
|
||||
bool closestChild1 = uminmax.v[1] < uminmax.v[0];
|
||||
#endif
|
||||
|
||||
if(closestChild1) {
|
||||
int tmp = nodeAddr;
|
||||
nodeAddr = nodeAddrChild1;
|
||||
nodeAddrChild1 = tmp;
|
||||
}
|
||||
|
||||
++stackPtr;
|
||||
traversalStack[stackPtr] = nodeAddrChild1;
|
||||
}
|
||||
else {
|
||||
/* one child was intersected */
|
||||
if(traverseChild1) {
|
||||
nodeAddr = nodeAddrChild1;
|
||||
}
|
||||
else if(!traverseChild0) {
|
||||
/* neither child was intersected */
|
||||
nodeAddr = traversalStack[stackPtr];
|
||||
--stackPtr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* if node is leaf, fetch triangle list */
|
||||
if(nodeAddr < 0) {
|
||||
float4 leaf = kernel_tex_fetch(__bvh_nodes, (-nodeAddr-1)*BVH_NODE_SIZE+(BVH_NODE_SIZE-1));
|
||||
int primAddr = __float_as_int(leaf.x);
|
||||
|
||||
#if FEATURE(BVH_INSTANCING)
|
||||
if(primAddr >= 0) {
|
||||
#endif
|
||||
int primAddr2 = __float_as_int(leaf.y);
|
||||
|
||||
/* pop */
|
||||
nodeAddr = traversalStack[stackPtr];
|
||||
--stackPtr;
|
||||
|
||||
/* primitive intersection */
|
||||
for(; primAddr < primAddr2; primAddr++) {
|
||||
#if FEATURE(BVH_HAIR)
|
||||
uint segment = kernel_tex_fetch(__prim_segment, primAddr);
|
||||
if(segment != ~0)
|
||||
continue;
|
||||
#endif
|
||||
|
||||
/* only primitives from the same object */
|
||||
uint tri_object = (object == ~0)? kernel_tex_fetch(__prim_object, primAddr): object;
|
||||
|
||||
if(tri_object == subsurface_object) {
|
||||
|
||||
/* intersect ray against primitive */
|
||||
bvh_triangle_intersect_subsurface(kg, isect_array, P, idir, object, primAddr, tmax, &num_hits, lcg_state, max_hits);
|
||||
}
|
||||
}
|
||||
}
|
||||
#if FEATURE(BVH_INSTANCING)
|
||||
else {
|
||||
/* instance push */
|
||||
if(subsurface_object == kernel_tex_fetch(__prim_object, -primAddr-1)) {
|
||||
object = subsurface_object;
|
||||
|
||||
float t_ignore = FLT_MAX;
|
||||
#if FEATURE(BVH_MOTION)
|
||||
bvh_instance_motion_push(kg, object, ray, &P, &idir, &t_ignore, &ob_tfm, tmax);
|
||||
#else
|
||||
bvh_instance_push(kg, object, ray, &P, &idir, &t_ignore, tmax);
|
||||
#endif
|
||||
|
||||
#if defined(__KERNEL_SSE2__)
|
||||
Psplat[0] = _mm_set_ps1(P.x);
|
||||
Psplat[1] = _mm_set_ps1(P.y);
|
||||
Psplat[2] = _mm_set_ps1(P.z);
|
||||
|
||||
idirsplat[0] = _mm_xor_ps(_mm_set_ps1(idir.x), _mm_castsi128_ps(pn));
|
||||
idirsplat[1] = _mm_xor_ps(_mm_set_ps1(idir.y), _mm_castsi128_ps(pn));
|
||||
idirsplat[2] = _mm_xor_ps(_mm_set_ps1(idir.z), _mm_castsi128_ps(pn));
|
||||
|
||||
tsplat = _mm_set_ps(-tmax, -tmax, 0.0f, 0.0f);
|
||||
|
||||
shufflex = (idir.x >= 0)? shuf_identity: shuf_swap;
|
||||
shuffley = (idir.y >= 0)? shuf_identity: shuf_swap;
|
||||
shufflez = (idir.z >= 0)? shuf_identity: shuf_swap;
|
||||
#endif
|
||||
|
||||
++stackPtr;
|
||||
traversalStack[stackPtr] = ENTRYPOINT_SENTINEL;
|
||||
|
||||
nodeAddr = kernel_tex_fetch(__object_node, object);
|
||||
}
|
||||
else {
|
||||
/* pop */
|
||||
nodeAddr = traversalStack[stackPtr];
|
||||
--stackPtr;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
} while(nodeAddr != ENTRYPOINT_SENTINEL);
|
||||
|
||||
#if FEATURE(BVH_INSTANCING)
|
||||
if(stackPtr >= 0) {
|
||||
kernel_assert(object != ~0);
|
||||
|
||||
/* instance pop */
|
||||
float t_ignore = FLT_MAX;
|
||||
#if FEATURE(BVH_MOTION)
|
||||
bvh_instance_motion_pop(kg, object, ray, &P, &idir, &t_ignore, &ob_tfm, tmax);
|
||||
#else
|
||||
bvh_instance_pop(kg, object, ray, &P, &idir, &t_ignore, tmax);
|
||||
#endif
|
||||
|
||||
#if defined(__KERNEL_SSE2__)
|
||||
Psplat[0] = _mm_set_ps1(P.x);
|
||||
Psplat[1] = _mm_set_ps1(P.y);
|
||||
Psplat[2] = _mm_set_ps1(P.z);
|
||||
|
||||
idirsplat[0] = _mm_xor_ps(_mm_set_ps1(idir.x), _mm_castsi128_ps(pn));
|
||||
idirsplat[1] = _mm_xor_ps(_mm_set_ps1(idir.y), _mm_castsi128_ps(pn));
|
||||
idirsplat[2] = _mm_xor_ps(_mm_set_ps1(idir.z), _mm_castsi128_ps(pn));
|
||||
|
||||
tsplat = _mm_set_ps(-tmax, -tmax, 0.0f, 0.0f);
|
||||
|
||||
shufflex = (idir.x >= 0)? shuf_identity: shuf_swap;
|
||||
shuffley = (idir.y >= 0)? shuf_identity: shuf_swap;
|
||||
shufflez = (idir.z >= 0)? shuf_identity: shuf_swap;
|
||||
#endif
|
||||
|
||||
object = ~0;
|
||||
nodeAddr = traversalStack[stackPtr];
|
||||
--stackPtr;
|
||||
}
|
||||
#endif
|
||||
} while(nodeAddr != ENTRYPOINT_SENTINEL);
|
||||
|
||||
return num_hits;
|
||||
}
|
||||
|
||||
#undef FEATURE
|
||||
#undef BVH_FUNCTION_NAME
|
||||
#undef BVH_FUNCTION_FEATURES
|
||||
|
@@ -24,7 +24,6 @@
|
||||
* BVH_INSTANCING: object instancing
|
||||
* BVH_HAIR: hair curve rendering
|
||||
* BVH_HAIR_MINIMUM_WIDTH: hair curve rendering with minimum width
|
||||
* BVH_SUBSURFACE: subsurface same object, random triangle intersection
|
||||
* BVH_MOTION: motion blur rendering
|
||||
*
|
||||
*/
|
||||
@@ -32,13 +31,8 @@
|
||||
#define FEATURE(f) (((BVH_FUNCTION_FEATURES) & (f)) != 0)
|
||||
|
||||
__device bool BVH_FUNCTION_NAME
|
||||
(KernelGlobals *kg, const Ray *ray, Intersection *isect
|
||||
#if FEATURE(BVH_SUBSURFACE)
|
||||
, int subsurface_object, float subsurface_random
|
||||
#else
|
||||
, const uint visibility
|
||||
#endif
|
||||
#if FEATURE(BVH_HAIR_MINIMUM_WIDTH) && !FEATURE(BVH_SUBSURFACE)
|
||||
(KernelGlobals *kg, const Ray *ray, Intersection *isect, const uint visibility
|
||||
#if FEATURE(BVH_HAIR_MINIMUM_WIDTH)
|
||||
, uint *lcg_state, float difl, float extmax
|
||||
#endif
|
||||
)
|
||||
@@ -65,11 +59,6 @@ __device bool BVH_FUNCTION_NAME
|
||||
float3 idir = bvh_inverse_direction(ray->D);
|
||||
int object = ~0;
|
||||
|
||||
#if FEATURE(BVH_SUBSURFACE)
|
||||
const uint visibility = ~0;
|
||||
int num_hits = 0;
|
||||
#endif
|
||||
|
||||
#if FEATURE(BVH_MOTION)
|
||||
Transform ob_tfm;
|
||||
#endif
|
||||
@@ -141,7 +130,7 @@ __device bool BVH_FUNCTION_NAME
|
||||
NO_EXTENDED_PRECISION float c1min = max4(min(c1lox, c1hix), min(c1loy, c1hiy), min(c1loz, c1hiz), 0.0f);
|
||||
NO_EXTENDED_PRECISION float c1max = min4(max(c1lox, c1hix), max(c1loy, c1hiy), max(c1loz, c1hiz), t);
|
||||
|
||||
#if FEATURE(BVH_HAIR_MINIMUM_WIDTH) && !FEATURE(BVH_SUBSURFACE)
|
||||
#if FEATURE(BVH_HAIR_MINIMUM_WIDTH)
|
||||
if(difl != 0.0f) {
|
||||
float hdiff = 1.0f + difl;
|
||||
float ldiff = 1.0f - difl;
|
||||
@@ -245,59 +234,37 @@ __device bool BVH_FUNCTION_NAME
|
||||
while(primAddr < primAddr2) {
|
||||
bool hit;
|
||||
|
||||
#if FEATURE(BVH_SUBSURFACE)
|
||||
/* only primitives from the same object */
|
||||
uint tri_object = (object == ~0)? kernel_tex_fetch(__prim_object, primAddr): object;
|
||||
|
||||
if(tri_object == subsurface_object) {
|
||||
#endif
|
||||
|
||||
/* intersect ray against primitive */
|
||||
/* intersect ray against primitive */
|
||||
#if FEATURE(BVH_HAIR)
|
||||
uint segment = kernel_tex_fetch(__prim_segment, primAddr);
|
||||
#if !FEATURE(BVH_SUBSURFACE)
|
||||
if(segment != ~0) {
|
||||
uint segment = kernel_tex_fetch(__prim_segment, primAddr);
|
||||
if(segment != ~0) {
|
||||
|
||||
if(kernel_data.curve_kernel_data.curveflags & CURVE_KN_INTERPOLATE)
|
||||
if(kernel_data.curve.curveflags & CURVE_KN_INTERPOLATE)
|
||||
#if FEATURE(BVH_HAIR_MINIMUM_WIDTH)
|
||||
hit = bvh_cardinal_curve_intersect(kg, isect, P, idir, visibility, object, primAddr, segment, lcg_state, difl, extmax);
|
||||
else
|
||||
hit = bvh_curve_intersect(kg, isect, P, idir, visibility, object, primAddr, segment, lcg_state, difl, extmax);
|
||||
#else
|
||||
hit = bvh_cardinal_curve_intersect(kg, isect, P, idir, visibility, object, primAddr, segment);
|
||||
else
|
||||
hit = bvh_curve_intersect(kg, isect, P, idir, visibility, object, primAddr, segment);
|
||||
#endif
|
||||
}
|
||||
hit = bvh_cardinal_curve_intersect(kg, isect, P, idir, visibility, object, primAddr, segment, lcg_state, difl, extmax);
|
||||
else
|
||||
hit = bvh_curve_intersect(kg, isect, P, idir, visibility, object, primAddr, segment, lcg_state, difl, extmax);
|
||||
#else
|
||||
hit = bvh_cardinal_curve_intersect(kg, isect, P, idir, visibility, object, primAddr, segment);
|
||||
else
|
||||
hit = bvh_curve_intersect(kg, isect, P, idir, visibility, object, primAddr, segment);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
#endif
|
||||
#if FEATURE(BVH_SUBSURFACE)
|
||||
#if FEATURE(BVH_HAIR)
|
||||
if(segment == ~0)
|
||||
#endif
|
||||
{
|
||||
hit = bvh_triangle_intersect_subsurface(kg, isect, P, idir, object, primAddr, tmax, &num_hits, subsurface_random);
|
||||
(void)hit;
|
||||
}
|
||||
hit = bvh_triangle_intersect(kg, isect, P, idir, visibility, object, primAddr);
|
||||
|
||||
/* shadow ray early termination */
|
||||
#if defined(__KERNEL_SSE2__) && !FEATURE(BVH_HAIR_MINIMUM_WIDTH)
|
||||
if(hit) {
|
||||
if(visibility == PATH_RAY_SHADOW_OPAQUE)
|
||||
return true;
|
||||
|
||||
tsplat = _mm_set_ps(-isect->t, -isect->t, 0.0f, 0.0f);
|
||||
}
|
||||
#else
|
||||
hit = bvh_triangle_intersect(kg, isect, P, idir, visibility, object, primAddr);
|
||||
|
||||
/* shadow ray early termination */
|
||||
#if defined(__KERNEL_SSE2__) && !FEATURE(BVH_HAIR_MINIMUM_WIDTH)
|
||||
if(hit) {
|
||||
if(visibility == PATH_RAY_SHADOW_OPAQUE)
|
||||
return true;
|
||||
|
||||
tsplat = _mm_set_ps(-isect->t, -isect->t, 0.0f, 0.0f);
|
||||
}
|
||||
#else
|
||||
if(hit && visibility == PATH_RAY_SHADOW_OPAQUE)
|
||||
return true;
|
||||
#endif
|
||||
|
||||
if(hit && visibility == PATH_RAY_SHADOW_OPAQUE)
|
||||
return true;
|
||||
#endif
|
||||
|
||||
primAddr++;
|
||||
@@ -306,47 +273,34 @@ __device bool BVH_FUNCTION_NAME
|
||||
#if FEATURE(BVH_INSTANCING)
|
||||
else {
|
||||
/* instance push */
|
||||
#if FEATURE(BVH_SUBSURFACE)
|
||||
if(subsurface_object == kernel_tex_fetch(__prim_object, -primAddr-1)) {
|
||||
object = subsurface_object;
|
||||
#else
|
||||
object = kernel_tex_fetch(__prim_object, -primAddr-1);
|
||||
#endif
|
||||
object = kernel_tex_fetch(__prim_object, -primAddr-1);
|
||||
|
||||
#if FEATURE(BVH_MOTION)
|
||||
bvh_instance_motion_push(kg, object, ray, &P, &idir, &isect->t, &ob_tfm, tmax);
|
||||
bvh_instance_motion_push(kg, object, ray, &P, &idir, &isect->t, &ob_tfm, tmax);
|
||||
#else
|
||||
bvh_instance_push(kg, object, ray, &P, &idir, &isect->t, tmax);
|
||||
bvh_instance_push(kg, object, ray, &P, &idir, &isect->t, tmax);
|
||||
#endif
|
||||
|
||||
#if defined(__KERNEL_SSE2__) && !FEATURE(BVH_HAIR_MINIMUM_WIDTH)
|
||||
Psplat[0] = _mm_set_ps1(P.x);
|
||||
Psplat[1] = _mm_set_ps1(P.y);
|
||||
Psplat[2] = _mm_set_ps1(P.z);
|
||||
Psplat[0] = _mm_set_ps1(P.x);
|
||||
Psplat[1] = _mm_set_ps1(P.y);
|
||||
Psplat[2] = _mm_set_ps1(P.z);
|
||||
|
||||
idirsplat[0] = _mm_xor_ps(_mm_set_ps1(idir.x), _mm_castsi128_ps(pn));
|
||||
idirsplat[1] = _mm_xor_ps(_mm_set_ps1(idir.y), _mm_castsi128_ps(pn));
|
||||
idirsplat[2] = _mm_xor_ps(_mm_set_ps1(idir.z), _mm_castsi128_ps(pn));
|
||||
idirsplat[0] = _mm_xor_ps(_mm_set_ps1(idir.x), _mm_castsi128_ps(pn));
|
||||
idirsplat[1] = _mm_xor_ps(_mm_set_ps1(idir.y), _mm_castsi128_ps(pn));
|
||||
idirsplat[2] = _mm_xor_ps(_mm_set_ps1(idir.z), _mm_castsi128_ps(pn));
|
||||
|
||||
tsplat = _mm_set_ps(-isect->t, -isect->t, 0.0f, 0.0f);
|
||||
tsplat = _mm_set_ps(-isect->t, -isect->t, 0.0f, 0.0f);
|
||||
|
||||
shufflex = (idir.x >= 0)? shuf_identity: shuf_swap;
|
||||
shuffley = (idir.y >= 0)? shuf_identity: shuf_swap;
|
||||
shufflez = (idir.z >= 0)? shuf_identity: shuf_swap;
|
||||
shufflex = (idir.x >= 0)? shuf_identity: shuf_swap;
|
||||
shuffley = (idir.y >= 0)? shuf_identity: shuf_swap;
|
||||
shufflez = (idir.z >= 0)? shuf_identity: shuf_swap;
|
||||
#endif
|
||||
|
||||
++stackPtr;
|
||||
traversalStack[stackPtr] = ENTRYPOINT_SENTINEL;
|
||||
++stackPtr;
|
||||
traversalStack[stackPtr] = ENTRYPOINT_SENTINEL;
|
||||
|
||||
nodeAddr = kernel_tex_fetch(__object_node, object);
|
||||
#if FEATURE(BVH_SUBSURFACE)
|
||||
}
|
||||
else {
|
||||
/* pop */
|
||||
nodeAddr = traversalStack[stackPtr];
|
||||
--stackPtr;
|
||||
}
|
||||
#endif
|
||||
nodeAddr = kernel_tex_fetch(__object_node, object);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -386,11 +340,7 @@ __device bool BVH_FUNCTION_NAME
|
||||
#endif
|
||||
} while(nodeAddr != ENTRYPOINT_SENTINEL);
|
||||
|
||||
#if FEATURE(BVH_SUBSURFACE)
|
||||
return (num_hits != 0);
|
||||
#else
|
||||
return (isect->prim != ~0);
|
||||
#endif
|
||||
}
|
||||
|
||||
#undef FEATURE
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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 __KERNEL_COMPAT_CPU_H__
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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 __KERNEL_COMPAT_CUDA_H__
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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 __KERNEL_COMPAT_OPENCL_H__
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
@@ -120,15 +118,13 @@ __device float3 curve_tangent_normal(KernelGlobals *kg, ShaderData *sd)
|
||||
float3 tgN = make_float3(0.0f,0.0f,0.0f);
|
||||
|
||||
if(sd->segment != ~0) {
|
||||
float normalmix = kernel_data.curve_kernel_data.normalmix;
|
||||
|
||||
tgN = -(-sd->I - sd->dPdu * (dot(sd->dPdu,-sd->I) * normalmix / len_squared(sd->dPdu)));
|
||||
tgN = -(-sd->I - sd->dPdu * (dot(sd->dPdu,-sd->I) / len_squared(sd->dPdu)));
|
||||
tgN = normalize(tgN);
|
||||
|
||||
/* need to find suitable scaled gd for corrected normal */
|
||||
#if 0
|
||||
if (kernel_data.curve_kernel_data.use_tangent_normal_correction)
|
||||
tgN = normalize(tgN - gd * sd->dPdu);
|
||||
tgN = normalize(tgN - gd * sd->dPdu);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
@@ -57,7 +55,7 @@ __device void kernel_shader_evaluate(KernelGlobals *kg, __global uint4 *input, _
|
||||
#endif
|
||||
|
||||
/* setup shader data */
|
||||
shader_setup_from_background(kg, &sd, &ray);
|
||||
shader_setup_from_background(kg, &sd, &ray, 0);
|
||||
|
||||
/* evaluate */
|
||||
int flag = 0; /* we can't know which type of BSDF this is for */
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
@@ -21,7 +19,7 @@ CCL_NAMESPACE_BEGIN
|
||||
/* Direction Emission */
|
||||
|
||||
__device_noinline float3 direct_emissive_eval(KernelGlobals *kg, float rando,
|
||||
LightSample *ls, float u, float v, float3 I, differential3 dI, float t, float time)
|
||||
LightSample *ls, float u, float v, float3 I, differential3 dI, float t, float time, int bounce)
|
||||
{
|
||||
/* setup shading at emitter */
|
||||
ShaderData sd;
|
||||
@@ -41,7 +39,7 @@ __device_noinline float3 direct_emissive_eval(KernelGlobals *kg, float rando,
|
||||
#ifdef __CAMERA_MOTION__
|
||||
ray.time = time;
|
||||
#endif
|
||||
shader_setup_from_background(kg, &sd, &ray);
|
||||
shader_setup_from_background(kg, &sd, &ray, bounce+1);
|
||||
eval = shader_eval_background(kg, &sd, 0, SHADER_CONTEXT_EMISSION);
|
||||
}
|
||||
else
|
||||
@@ -49,10 +47,10 @@ __device_noinline float3 direct_emissive_eval(KernelGlobals *kg, float rando,
|
||||
{
|
||||
#ifdef __HAIR__
|
||||
if(ls->type == LIGHT_STRAND)
|
||||
shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, ls->shader, ls->object, ls->prim, u, v, t, time, ls->prim);
|
||||
shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, ls->shader, ls->object, ls->prim, u, v, t, time, bounce+1, ls->prim);
|
||||
else
|
||||
#endif
|
||||
shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, ls->shader, ls->object, ls->prim, u, v, t, time, ~0);
|
||||
shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, ls->shader, ls->object, ls->prim, u, v, t, time, bounce+1, ~0);
|
||||
|
||||
ls->Ng = sd.Ng;
|
||||
|
||||
@@ -74,11 +72,11 @@ __device_noinline float3 direct_emissive_eval(KernelGlobals *kg, float rando,
|
||||
|
||||
__device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex,
|
||||
float randt, float rando, float randu, float randv, Ray *ray, BsdfEval *eval,
|
||||
bool *is_lamp)
|
||||
bool *is_lamp, int bounce)
|
||||
{
|
||||
LightSample ls;
|
||||
|
||||
#ifdef __NON_PROGRESSIVE__
|
||||
#ifdef __BRANCHED_PATH__
|
||||
if(lindex != -1) {
|
||||
/* sample position on a specified light */
|
||||
light_select(kg, lindex, randu, randv, sd->P, &ls);
|
||||
@@ -97,7 +95,7 @@ __device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, int li
|
||||
differential3 dD = differential3_zero();
|
||||
|
||||
/* evaluate closure */
|
||||
float3 light_eval = direct_emissive_eval(kg, rando, &ls, randu, randv, -ls.D, dD, ls.t, sd->time);
|
||||
float3 light_eval = direct_emissive_eval(kg, rando, &ls, randu, randv, -ls.D, dD, ls.t, sd->time, bounce);
|
||||
|
||||
if(is_zero(light_eval))
|
||||
return false;
|
||||
@@ -185,7 +183,7 @@ __device_noinline float3 indirect_primitive_emission(KernelGlobals *kg, ShaderDa
|
||||
|
||||
/* Indirect Lamp Emission */
|
||||
|
||||
__device_noinline bool indirect_lamp_emission(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf, float randt, float3 *emission)
|
||||
__device_noinline bool indirect_lamp_emission(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf, float randt, float3 *emission, int bounce)
|
||||
{
|
||||
LightSample ls;
|
||||
int lamp = lamp_light_eval_sample(kg, randt);
|
||||
@@ -209,7 +207,7 @@ __device_noinline bool indirect_lamp_emission(KernelGlobals *kg, Ray *ray, int p
|
||||
/* todo: missing texture coordinates */
|
||||
float u = 0.0f;
|
||||
float v = 0.0f;
|
||||
float3 L = direct_emissive_eval(kg, 0.0f, &ls, u, v, -ray->D, ray->dD, ls.t, ray->time);
|
||||
float3 L = direct_emissive_eval(kg, 0.0f, &ls, u, v, -ray->D, ray->dD, ls.t, ray->time, bounce);
|
||||
|
||||
if(!(path_flag & PATH_RAY_MIS_SKIP)) {
|
||||
/* multiple importance sampling, get regular light pdf,
|
||||
@@ -224,7 +222,7 @@ __device_noinline bool indirect_lamp_emission(KernelGlobals *kg, Ray *ray, int p
|
||||
|
||||
/* Indirect Background */
|
||||
|
||||
__device_noinline float3 indirect_background(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf)
|
||||
__device_noinline float3 indirect_background(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf, int bounce)
|
||||
{
|
||||
#ifdef __BACKGROUND__
|
||||
int shader = kernel_data.background.shader;
|
||||
@@ -240,7 +238,7 @@ __device_noinline float3 indirect_background(KernelGlobals *kg, Ray *ray, int pa
|
||||
|
||||
/* evaluate background closure */
|
||||
ShaderData sd;
|
||||
shader_setup_from_background(kg, &sd, ray);
|
||||
shader_setup_from_background(kg, &sd, ray, bounce+1);
|
||||
|
||||
float3 L = shader_eval_background(kg, &sd, path_flag, SHADER_CONTEXT_EMISSION);
|
||||
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
/* Constant Globals */
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2013, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
@@ -139,6 +137,8 @@ __device_inline float cmj_randfloat(uint i, uint p)
|
||||
#ifdef __CMJ__
|
||||
__device float cmj_sample_1D(int s, int N, int p)
|
||||
{
|
||||
kernel_assert(s < N);
|
||||
|
||||
uint x = cmj_permute(s, N, p * 0x68bc21eb);
|
||||
float jx = cmj_randfloat(s, p * 0x967a889b);
|
||||
|
||||
@@ -148,6 +148,8 @@ __device float cmj_sample_1D(int s, int N, int p)
|
||||
|
||||
__device void cmj_sample_2D(int s, int N, int p, float *fx, float *fy)
|
||||
{
|
||||
kernel_assert(s < N);
|
||||
|
||||
int m = float_to_int(sqrtf(N));
|
||||
int n = (N + m - 1)/m;
|
||||
float invN = 1.0f/N;
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
@@ -375,7 +373,7 @@ __device bool lamp_light_eval(KernelGlobals *kg, int lamp, float3 P, float3 D, f
|
||||
ls->pdf = invarea;
|
||||
|
||||
if(type == LIGHT_SPOT) {
|
||||
/* spot light attentuation */
|
||||
/* spot light attenuation */
|
||||
float4 data2 = kernel_tex_fetch(__light_data, lamp*LIGHT_SIZE + 2);
|
||||
ls->eval_fac *= spot_light_attenuation(data1, data2, ls);
|
||||
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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 __KERNEL_MATH_H__
|
||||
|
@@ -35,8 +35,7 @@
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
/// Given values x and y on [0,1], convert them in place to values on
|
||||
/// [-1,1] uniformly distributed over a unit sphere.
|
||||
/* distribute uniform xy on [0,1] over unit disk [-1,1] */
|
||||
__device void to_unit_disk(float *x, float *y)
|
||||
{
|
||||
float phi = M_2PI_F * (*x);
|
||||
@@ -46,17 +45,18 @@ __device void to_unit_disk(float *x, float *y)
|
||||
*y = r * sinf(phi);
|
||||
}
|
||||
|
||||
/* return an orthogonal tangent and bitangent given a normal and tangent that
|
||||
* may not be exactly orthogonal */
|
||||
__device void make_orthonormals_tangent(const float3 N, const float3 T, float3 *a, float3 *b)
|
||||
{
|
||||
*b = normalize(cross(N, T));
|
||||
*a = cross(*b, N);
|
||||
}
|
||||
|
||||
/* sample direction with cosine weighted distributed in hemisphere */
|
||||
__device_inline void sample_cos_hemisphere(const float3 N,
|
||||
float randu, float randv, float3 *omega_in, float *pdf)
|
||||
{
|
||||
// Default closure BSDF implementation: uniformly sample
|
||||
// cosine-weighted hemisphere above the point.
|
||||
to_unit_disk(&randu, &randv);
|
||||
float costheta = sqrtf(max(1.0f - randu * randu - randv * randv, 0.0f));
|
||||
float3 T, B;
|
||||
@@ -65,6 +65,7 @@ __device_inline void sample_cos_hemisphere(const float3 N,
|
||||
*pdf = costheta *M_1_PI_F;
|
||||
}
|
||||
|
||||
/* sample direction uniformly distributed in hemisphere */
|
||||
__device_inline void sample_uniform_hemisphere(const float3 N,
|
||||
float randu, float randv,
|
||||
float3 *omega_in, float *pdf)
|
||||
@@ -81,6 +82,7 @@ __device_inline void sample_uniform_hemisphere(const float3 N,
|
||||
*pdf = 0.5f * M_1_PI_F;
|
||||
}
|
||||
|
||||
/* sample direction uniformly distributed in cone */
|
||||
__device_inline void sample_uniform_cone(const float3 N, float angle,
|
||||
float randu, float randv,
|
||||
float3 *omega_in, float *pdf)
|
||||
@@ -97,6 +99,7 @@ __device_inline void sample_uniform_cone(const float3 N, float angle,
|
||||
*pdf = 0.5f * M_1_PI_F / (1.0f - cosf(angle));
|
||||
}
|
||||
|
||||
/* sample uniform point on the surface of a sphere */
|
||||
__device float3 sample_uniform_sphere(float u1, float u2)
|
||||
{
|
||||
float z = 1.0f - 2.0f*u1;
|
||||
@@ -108,54 +111,50 @@ __device float3 sample_uniform_sphere(float u1, float u2)
|
||||
return make_float3(x, y, z);
|
||||
}
|
||||
|
||||
__device float balance_heuristic(float a, float b)
|
||||
{
|
||||
return (a)/(a + b);
|
||||
}
|
||||
|
||||
__device float balance_heuristic_3(float a, float b, float c)
|
||||
{
|
||||
return (a)/(a + b + c);
|
||||
}
|
||||
|
||||
__device float power_heuristic(float a, float b)
|
||||
{
|
||||
return (a*a)/(a*a + b*b);
|
||||
}
|
||||
|
||||
__device float2 concentric_sample_disk(float u1, float u2)
|
||||
__device float power_heuristic_3(float a, float b, float c)
|
||||
{
|
||||
float r, theta;
|
||||
// Map uniform random numbers to $[-1,1]^2$
|
||||
float sx = 2 * u1 - 1;
|
||||
float sy = 2 * u2 - 1;
|
||||
|
||||
// Map square to $(r,\theta)$
|
||||
|
||||
// Handle degeneracy at the origin
|
||||
if(sx == 0.0f && sy == 0.0f) {
|
||||
return make_float2(0.0f, 0.0f);
|
||||
}
|
||||
if(sx >= -sy) {
|
||||
if(sx > sy) {
|
||||
// Handle first region of disk
|
||||
r = sx;
|
||||
if(sy > 0.0f) theta = sy/r;
|
||||
else theta = 8.0f + sy/r;
|
||||
}
|
||||
else {
|
||||
// Handle second region of disk
|
||||
r = sy;
|
||||
theta = 2.0f - sx/r;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if(sx <= sy) {
|
||||
// Handle third region of disk
|
||||
r = -sx;
|
||||
theta = 4.0f - sy/r;
|
||||
}
|
||||
else {
|
||||
// Handle fourth region of disk
|
||||
r = -sy;
|
||||
theta = 6.0f + sx/r;
|
||||
}
|
||||
}
|
||||
|
||||
theta *= M_PI_4_F;
|
||||
return make_float2(r * cosf(theta), r * sinf(theta));
|
||||
return (a*a)/(a*a + b*b + c*c);
|
||||
}
|
||||
|
||||
/* distribute uniform xy on [0,1] over unit disk [-1,1], with concentric mapping
|
||||
* to better preserve stratification for some RNG sequences */
|
||||
__device float2 concentric_sample_disk(float u1, float u2)
|
||||
{
|
||||
float phi, r;
|
||||
float a = 2.0f*u1 - 1.0f;
|
||||
float b = 2.0f*u2 - 1.0f;
|
||||
|
||||
if(a == 0.0f && b == 0.0f) {
|
||||
return make_float2(0.0f, 0.0f);
|
||||
}
|
||||
else if(a*a > b*b) {
|
||||
r = a;
|
||||
phi = M_PI_4_F * (b/a);
|
||||
}
|
||||
else {
|
||||
r = b;
|
||||
phi = M_PI_2_F - M_PI_4_F * (a/b);
|
||||
}
|
||||
|
||||
return make_float2(r*cosf(phi), r*sinf(phi));
|
||||
}
|
||||
|
||||
/* sample point in unit polygon with given number of corners and rotation */
|
||||
__device float2 regular_polygon_sample(float corners, float rotation, float u, float v)
|
||||
{
|
||||
/* sample corner number and reuse u */
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
@@ -154,6 +152,16 @@ __device_inline void object_dir_transform(KernelGlobals *kg, ShaderData *sd, flo
|
||||
#endif
|
||||
}
|
||||
|
||||
__device_inline void object_inverse_dir_transform(KernelGlobals *kg, ShaderData *sd, float3 *D)
|
||||
{
|
||||
#ifdef __OBJECT_MOTION__
|
||||
*D = transform_direction(&sd->ob_itfm, *D);
|
||||
#else
|
||||
Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
|
||||
*D = transform_direction(&tfm, *D);
|
||||
#endif
|
||||
}
|
||||
|
||||
__device_inline float3 object_location(KernelGlobals *kg, ShaderData *sd)
|
||||
{
|
||||
if(sd->object == ~0)
|
||||
|
@@ -1,19 +1,17 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* 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
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* 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
|
||||
*/
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
@@ -48,7 +46,7 @@ __device_inline void kernel_write_data_passes(KernelGlobals *kg, __global float
|
||||
if(!(flag & PASS_ALL))
|
||||
return;
|
||||
|
||||
/* todo: add alpha treshold */
|
||||
/* todo: add alpha threshold */
|
||||
if(!(path_flag & PATH_RAY_TRANSPARENT)) {
|
||||
if(sample == 0) {
|
||||
if(flag & PASS_DEPTH) {
|
||||
@@ -86,6 +84,8 @@ __device_inline void kernel_write_data_passes(KernelGlobals *kg, __global float
|
||||
L->color_glossy += shader_bsdf_glossy(kg, sd)*throughput;
|
||||
if(flag & (PASS_TRANSMISSION_INDIRECT|PASS_TRANSMISSION_COLOR|PASS_TRANSMISSION_DIRECT))
|
||||
L->color_transmission += shader_bsdf_transmission(kg, sd)*throughput;
|
||||
if(flag & (PASS_SUBSURFACE_INDIRECT|PASS_SUBSURFACE_COLOR|PASS_SUBSURFACE_DIRECT))
|
||||
L->color_subsurface += shader_bsdf_subsurface(kg, sd)*throughput;
|
||||
|
||||
if(flag & PASS_MIST) {
|
||||
/* bring depth into 0..1 range */
|
||||
@@ -128,12 +128,16 @@ __device_inline void kernel_write_light_passes(KernelGlobals *kg, __global float
|
||||
kernel_write_pass_float3(buffer + kernel_data.film.pass_glossy_indirect, sample, L->indirect_glossy);
|
||||
if(flag & PASS_TRANSMISSION_INDIRECT)
|
||||
kernel_write_pass_float3(buffer + kernel_data.film.pass_transmission_indirect, sample, L->indirect_transmission);
|
||||
if(flag & PASS_SUBSURFACE_INDIRECT)
|
||||
kernel_write_pass_float3(buffer + kernel_data.film.pass_subsurface_indirect, sample, L->indirect_subsurface);
|
||||
if(flag & PASS_DIFFUSE_DIRECT)
|
||||
kernel_write_pass_float3(buffer + kernel_data.film.pass_diffuse_direct, sample, L->direct_diffuse);
|
||||
if(flag & PASS_GLOSSY_DIRECT)
|
||||
kernel_write_pass_float3(buffer + kernel_data.film.pass_glossy_direct, sample, L->direct_glossy);
|
||||
if(flag & PASS_TRANSMISSION_DIRECT)
|
||||
kernel_write_pass_float3(buffer + kernel_data.film.pass_transmission_direct, sample, L->direct_transmission);
|
||||
if(flag & PASS_SUBSURFACE_DIRECT)
|
||||
kernel_write_pass_float3(buffer + kernel_data.film.pass_subsurface_direct, sample, L->direct_subsurface);
|
||||
|
||||
if(flag & PASS_EMISSION)
|
||||
kernel_write_pass_float3(buffer + kernel_data.film.pass_emission, sample, L->emission);
|
||||
@@ -148,6 +152,8 @@ __device_inline void kernel_write_light_passes(KernelGlobals *kg, __global float
|
||||
kernel_write_pass_float3(buffer + kernel_data.film.pass_glossy_color, sample, L->color_glossy);
|
||||
if(flag & PASS_TRANSMISSION_COLOR)
|
||||
kernel_write_pass_float3(buffer + kernel_data.film.pass_transmission_color, sample, L->color_transmission);
|
||||
if(flag & PASS_SUBSURFACE_COLOR)
|
||||
kernel_write_pass_float3(buffer + kernel_data.film.pass_subsurface_color, sample, L->color_subsurface);
|
||||
if(flag & PASS_SHADOW) {
|
||||
float4 shadow = L->shadow;
|
||||
shadow.w = kernel_data.film.pass_shadow_scale;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user