Merged changes in the trunk up to revision 44561.
Conflicts resolved: source/blender/bmesh/bmesh.h source/blender/bmesh/bmesh_operators.h source/blenderplayer/bad_level_call_stubs/stubs.c
This commit is contained in:
@@ -1033,8 +1033,8 @@ elseif(WIN32)
|
|||||||
if(WITH_BOOST)
|
if(WITH_BOOST)
|
||||||
set(BOOST ${LIBDIR}/boost)
|
set(BOOST ${LIBDIR}/boost)
|
||||||
set(BOOST_INCLUDE_DIR ${BOOST}/include)
|
set(BOOST_INCLUDE_DIR ${BOOST}/include)
|
||||||
set(BOOST_POSTFIX "mgw45-mt-s-1_47")
|
set(BOOST_POSTFIX "mgw46-mt-s-1_47")
|
||||||
set(BOOST_DEBUG_POSTFIX "mgw45-mt-sd-1_47")
|
set(BOOST_DEBUG_POSTFIX "mgw46-mt-sd-1_47")
|
||||||
set(BOOST_LIBRARIES
|
set(BOOST_LIBRARIES
|
||||||
optimized boost_date_time-${BOOST_POSTFIX} boost_filesystem-${BOOST_POSTFIX}
|
optimized boost_date_time-${BOOST_POSTFIX} boost_filesystem-${BOOST_POSTFIX}
|
||||||
boost_regex-${BOOST_POSTFIX} boost_system-${BOOST_POSTFIX} boost_thread-${BOOST_POSTFIX}
|
boost_regex-${BOOST_POSTFIX} boost_system-${BOOST_POSTFIX} boost_thread-${BOOST_POSTFIX}
|
||||||
@@ -1497,9 +1497,9 @@ if(MSVC10)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||||
if(WITH_IK_ITASC)
|
if(WITH_LIBMV)
|
||||||
message(WARNING "Using Clang as CXX compiler: disabling WITH_IK_ITASC, this feature will be missing.")
|
message(WARNING "Using Clang as CXX compiler: disabling WITH_LIBMV, this feature will be missing.")
|
||||||
set(WITH_IK_ITASC OFF)
|
set(WITH_LIBMV OFF)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
@@ -258,7 +258,7 @@ doc_py:
|
|||||||
@echo "docs written into: '$(BLENDER_DIR)/doc/python_api/sphinx-out/contents.html'"
|
@echo "docs written into: '$(BLENDER_DIR)/doc/python_api/sphinx-out/contents.html'"
|
||||||
|
|
||||||
doc_doxy:
|
doc_doxy:
|
||||||
cd doc/doxygen; doxygen
|
cd doc/doxygen; doxygen Doxyfile
|
||||||
@echo "docs written into: '$(BLENDER_DIR)/doc/doxygen/html/index.html'"
|
@echo "docs written into: '$(BLENDER_DIR)/doc/doxygen/html/index.html'"
|
||||||
|
|
||||||
doc_dna:
|
doc_dna:
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ else:
|
|||||||
# scons
|
# scons
|
||||||
os.chdir(blender_dir)
|
os.chdir(blender_dir)
|
||||||
scons_cmd = ['python', 'scons/scons.py']
|
scons_cmd = ['python', 'scons/scons.py']
|
||||||
scons_options = []
|
scons_options = ['BF_FANCY=False']
|
||||||
|
|
||||||
if builder.find('linux') != -1:
|
if builder.find('linux') != -1:
|
||||||
import shutil
|
import shutil
|
||||||
@@ -65,7 +65,7 @@ else:
|
|||||||
build_dir = os.path.join('..', 'build', builder)
|
build_dir = os.path.join('..', 'build', builder)
|
||||||
install_dir = os.path.join('..', 'install', builder)
|
install_dir = os.path.join('..', 'install', builder)
|
||||||
|
|
||||||
common_options = ['BF_INSTALLDIR=' + install_dir]
|
common_options = ['BF_INSTALLDIR=' + install_dir] + scons_options
|
||||||
|
|
||||||
# Clean install directory so we'll be sure there's no
|
# Clean install directory so we'll be sure there's no
|
||||||
if os.path.isdir(install_dir):
|
if os.path.isdir(install_dir):
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ if len(sys.argv) >= 3:
|
|||||||
# scons does own packaging
|
# scons does own packaging
|
||||||
if builder.find('scons') != -1:
|
if builder.find('scons') != -1:
|
||||||
os.chdir('../blender')
|
os.chdir('../blender')
|
||||||
scons_options = ['BF_QUICK=slnt', 'BUILDBOT_BRANCH=' + branch, 'buildslave']
|
scons_options = ['BF_QUICK=slnt', 'BUILDBOT_BRANCH=' + branch, 'buildslave', 'BF_FANCY=False']
|
||||||
|
|
||||||
if builder.find('linux') != -1:
|
if builder.find('linux') != -1:
|
||||||
buildbot_dir = os.path.dirname(os.path.realpath(__file__))
|
buildbot_dir = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|||||||
@@ -163,7 +163,7 @@ BF_OIIO_LIBPATH = BF_OIIO + '/lib'
|
|||||||
WITH_BF_BOOST = True
|
WITH_BF_BOOST = True
|
||||||
BF_BOOST = LIBDIR + '/boost'
|
BF_BOOST = LIBDIR + '/boost'
|
||||||
BF_BOOST_INC = BF_BOOST + '/include'
|
BF_BOOST_INC = BF_BOOST + '/include'
|
||||||
BF_BOOST_LIB = 'boost_date_time-mgw45-mt-s-1_47 boost_filesystem-mgw45-mt-s-1_47 boost_regex-mgw45-mt-s-1_47 boost_system-mgw45-mt-s-1_47 boost_thread-mgw45-mt-s-1_47'
|
BF_BOOST_LIB = 'boost_date_time-mgw46-mt-s-1_47 boost_filesystem-mgw46-mt-s-1_47 boost_regex-mgw46-mt-s-1_47 boost_system-mgw46-mt-s-1_47 boost_thread-mgw46-mt-s-1_47'
|
||||||
BF_BOOST_LIBPATH = BF_BOOST + '/lib/gcc'
|
BF_BOOST_LIBPATH = BF_BOOST + '/lib/gcc'
|
||||||
|
|
||||||
#Ray trace optimization
|
#Ray trace optimization
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ PROJECT_NAME = Blender
|
|||||||
# This could be handy for archiving the generated documentation or
|
# This could be handy for archiving the generated documentation or
|
||||||
# if some version control system is used.
|
# if some version control system is used.
|
||||||
|
|
||||||
PROJECT_NUMBER = "V2.59"
|
PROJECT_NUMBER = "V2.6x"
|
||||||
|
|
||||||
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
||||||
# for a project that appears at the top of each page and should give viewer
|
# for a project that appears at the top of each page and should give viewer
|
||||||
@@ -648,7 +648,7 @@ RECURSIVE = YES
|
|||||||
# excluded from the INPUT source files. This way you can easily exclude a
|
# excluded from the INPUT source files. This way you can easily exclude a
|
||||||
# subdirectory from a directory tree whose root is specified with the INPUT tag.
|
# subdirectory from a directory tree whose root is specified with the INPUT tag.
|
||||||
|
|
||||||
EXCLUDE = ../../source/gameengine/PyDoc
|
EXCLUDE = ../../build_files, ../../release
|
||||||
|
|
||||||
# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
|
# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
|
||||||
# directories that are symbolic links (a Unix file system feature) are excluded
|
# directories that are symbolic links (a Unix file system feature) are excluded
|
||||||
@@ -662,7 +662,7 @@ EXCLUDE_SYMLINKS = NO
|
|||||||
# against the file with absolute path, so to exclude all test directories
|
# against the file with absolute path, so to exclude all test directories
|
||||||
# for example use the pattern */test/*
|
# for example use the pattern */test/*
|
||||||
|
|
||||||
EXCLUDE_PATTERNS = .svn
|
EXCLUDE_PATTERNS = .svn .git *.py
|
||||||
|
|
||||||
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
|
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
|
||||||
# (namespaces, classes, functions, etc.) that should be excluded from the
|
# (namespaces, classes, functions, etc.) that should be excluded from the
|
||||||
|
|||||||
@@ -8,14 +8,14 @@
|
|||||||
/** \defgroup render Rendering
|
/** \defgroup render Rendering
|
||||||
* \ingroup blender
|
* \ingroup blender
|
||||||
*/
|
*/
|
||||||
/** \defgroup meshedit Mesh Editing */
|
/** \defgroup bmesh BMesh
|
||||||
|
* \ingroup blender
|
||||||
|
*/
|
||||||
/** \defgroup texture Texturing */
|
/** \defgroup texture Texturing */
|
||||||
/** \defgroup compositor Compositing */
|
/** \defgroup compositor Compositing */
|
||||||
|
|
||||||
/** \defgroup scripts Scripting */
|
|
||||||
|
|
||||||
/** \defgroup python Python
|
/** \defgroup python Python
|
||||||
* \ingroup blender scripts
|
* \ingroup blender
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \defgroup pygen Python Generic
|
/** \defgroup pygen Python Generic
|
||||||
@@ -332,7 +332,7 @@
|
|||||||
* \ingroup imbuf
|
* \ingroup imbuf
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \defgorup imbdds DDS
|
/** \defgroup imbdds DDS
|
||||||
* \ingroup imbuf
|
* \ingroup imbuf
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
49
extern/libmv/patches/clang-3.diff
vendored
Normal file
49
extern/libmv/patches/clang-3.diff
vendored
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
Index: third_party/glog/src/utilities.h
|
||||||
|
===================================================================
|
||||||
|
--- third_party/glog/src/utilities.h (revision 44501)
|
||||||
|
+++ third_party/glog/src/utilities.h (working copy)
|
||||||
|
@@ -105,7 +105,7 @@
|
||||||
|
# undef STACKTRACE_H
|
||||||
|
#elif defined(HAVE_LIB_UNWIND)
|
||||||
|
# define STACKTRACE_H "stacktrace_libunwind-inl.h"
|
||||||
|
-#elif !defined(NO_FRAME_POINTER)
|
||||||
|
+#elif !defined(NO_FRAME_POINTER) && !defined(__clang__)
|
||||||
|
# if defined(__i386__) && __GNUC__ >= 2
|
||||||
|
# define STACKTRACE_H "stacktrace_x86-inl.h"
|
||||||
|
# elif defined(__x86_64__) && __GNUC__ >= 2
|
||||||
|
Index: third_party/glog/src/logging.cc
|
||||||
|
===================================================================
|
||||||
|
--- third_party/glog/src/logging.cc (revision 44501)
|
||||||
|
+++ third_party/glog/src/logging.cc (working copy)
|
||||||
|
@@ -1231,6 +1231,14 @@
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
+#if defined(HAVE___ATTRIBUTE__)
|
||||||
|
+typedef void (*fail_func_t)() __attribute__((noreturn));
|
||||||
|
+static void logging_fail() __attribute__((noreturn));
|
||||||
|
+#else
|
||||||
|
+typedef void (*fail_func_t)();
|
||||||
|
+static void logging_fail();
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
static void logging_fail() {
|
||||||
|
// #if defined(_DEBUG) && defined(_MSC_VER)
|
||||||
|
// doesn't work for my laptop (sergey)
|
||||||
|
@@ -1243,14 +1251,9 @@
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
-#ifdef HAVE___ATTRIBUTE__
|
||||||
|
-GOOGLE_GLOG_DLL_DECL
|
||||||
|
-void (*g_logging_fail_func)() __attribute__((noreturn)) = &logging_fail;
|
||||||
|
-#else
|
||||||
|
-GOOGLE_GLOG_DLL_DECL void (*g_logging_fail_func)() = &logging_fail;
|
||||||
|
-#endif
|
||||||
|
+GOOGLE_GLOG_DLL_DECL fail_func_t g_logging_fail_func = &logging_fail;
|
||||||
|
|
||||||
|
-void InstallFailureFunction(void (*fail_func)()) {
|
||||||
|
+void InstallFailureFunction(fail_func_t fail_func) {
|
||||||
|
g_logging_fail_func = fail_func;
|
||||||
|
}
|
||||||
|
|
||||||
1
extern/libmv/patches/series
vendored
1
extern/libmv/patches/series
vendored
@@ -1,2 +1,3 @@
|
|||||||
v3d_verbosity.patch
|
v3d_verbosity.patch
|
||||||
bundle_tweaks.patch
|
bundle_tweaks.patch
|
||||||
|
clang-3.diff
|
||||||
|
|||||||
@@ -430,6 +430,14 @@ static MeshSet<3> *Carve_addMesh(CSG_FaceIteratorDescriptor &face_it,
|
|||||||
return poly;
|
return poly;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static double triangleArea(carve::geom3d::Vector &v1, carve::geom3d::Vector &v2, carve::geom3d::Vector &v3)
|
||||||
|
{
|
||||||
|
carve::geom3d::Vector a = v2 - v1;
|
||||||
|
carve::geom3d::Vector b = v3 - v1;
|
||||||
|
|
||||||
|
return carve::geom::cross(a, b).length();
|
||||||
|
}
|
||||||
|
|
||||||
static bool checkValidQuad(std::vector<MeshSet<3>::vertex_t> &vertex_storage, uint quad[4])
|
static bool checkValidQuad(std::vector<MeshSet<3>::vertex_t> &vertex_storage, uint quad[4])
|
||||||
{
|
{
|
||||||
carve::geom3d::Vector &v1 = vertex_storage[quad[0]].v;
|
carve::geom3d::Vector &v1 = vertex_storage[quad[0]].v;
|
||||||
@@ -465,12 +473,12 @@ static bool checkValidQuad(std::vector<MeshSet<3>::vertex_t> &vertex_storage, ui
|
|||||||
|
|
||||||
carve::geom3d::Vector current_normal = carve::geom::cross(edges[i], edges[n]);
|
carve::geom3d::Vector current_normal = carve::geom::cross(edges[i], edges[n]);
|
||||||
|
|
||||||
if (current_normal.length() > 1e-6) {
|
if (current_normal.length() > DBL_EPSILON) {
|
||||||
if (!normal_set) {
|
if (!normal_set) {
|
||||||
normal = current_normal;
|
normal = current_normal;
|
||||||
normal_set = true;
|
normal_set = true;
|
||||||
}
|
}
|
||||||
else if (carve::geom::dot(normal, current_normal) < -1e-6) {
|
else if (carve::geom::dot(normal, current_normal) < 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -481,6 +489,10 @@ static bool checkValidQuad(std::vector<MeshSet<3>::vertex_t> &vertex_storage, ui
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double area = triangleArea(v1, v2, v3) + triangleArea(v1, v3, v4);
|
||||||
|
if (area <= DBL_EPSILON)
|
||||||
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -535,6 +547,20 @@ static uint quadMerge(std::map<MeshSet<3>::vertex_t*, uint> *vertexToIndex_map,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool Carve_checkDegeneratedFace(MeshSet<3>::face_t *face)
|
||||||
|
{
|
||||||
|
/* only tris and quads for now */
|
||||||
|
if (face->n_edges == 3) {
|
||||||
|
return triangleArea(face->edge->prev->vert->v, face->edge->vert->v, face->edge->next->vert->v) < DBL_EPSILON;
|
||||||
|
}
|
||||||
|
else if (face->n_edges == 4) {
|
||||||
|
return triangleArea(face->edge->vert->v, face->edge->next->vert->v, face->edge->next->next->vert->v) +
|
||||||
|
triangleArea(face->edge->prev->vert->v, face->edge->vert->v, face->edge->next->next->vert->v) < DBL_EPSILON;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static BSP_CSGMesh *Carve_exportMesh(MeshSet<3>* &poly, carve::interpolate::FaceAttr<uint> &oface_num,
|
static BSP_CSGMesh *Carve_exportMesh(MeshSet<3>* &poly, carve::interpolate::FaceAttr<uint> &oface_num,
|
||||||
uint num_origfaces)
|
uint num_origfaces)
|
||||||
{
|
{
|
||||||
@@ -591,13 +617,6 @@ static BSP_CSGMesh *Carve_exportMesh(MeshSet<3>* &poly, carve::interpolate::Face
|
|||||||
|
|
||||||
MeshSet<3>::face_t *f = *(poly->faceBegin() + findex);
|
MeshSet<3>::face_t *f = *(poly->faceBegin() + findex);
|
||||||
|
|
||||||
// add all information except vertices to the output mesh
|
|
||||||
outputMesh->FaceSet().push_back(BSP_MFace());
|
|
||||||
BSP_MFace& outFace = outputMesh->FaceSet().back();
|
|
||||||
outFace.m_verts.clear();
|
|
||||||
outFace.m_plane.setValue(f->plane.N.v);
|
|
||||||
outFace.m_orig_face = orig;
|
|
||||||
|
|
||||||
// for each vertex of this face, check other faces containing
|
// for each vertex of this face, check other faces containing
|
||||||
// that vertex to see if there is a neighbor also belonging to
|
// that vertex to see if there is a neighbor also belonging to
|
||||||
// the original face
|
// the original face
|
||||||
@@ -640,20 +659,36 @@ static BSP_CSGMesh *Carve_exportMesh(MeshSet<3>* &poly, carve::interpolate::Face
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if we merged faces, use the list of common vertices; otherwise
|
bool degenerativeFace = false;
|
||||||
// use the faces's vertices
|
|
||||||
if (result) {
|
if (!result) {
|
||||||
// make quat using verts stored in result
|
/* merged triangles are already checked for degenerative quad */
|
||||||
outFace.m_verts.push_back(quadverts[0]);
|
degenerativeFace = Carve_checkDegeneratedFace(f);
|
||||||
outFace.m_verts.push_back(quadverts[1]);
|
}
|
||||||
outFace.m_verts.push_back(quadverts[2]);
|
|
||||||
outFace.m_verts.push_back(quadverts[3]);
|
if (!degenerativeFace) {
|
||||||
} else {
|
// add all information except vertices to the output mesh
|
||||||
MeshSet<3>::face_t::edge_iter_t edge_iter = f->begin();
|
outputMesh->FaceSet().push_back(BSP_MFace());
|
||||||
for (; edge_iter != f->end(); ++edge_iter) {
|
BSP_MFace& outFace = outputMesh->FaceSet().back();
|
||||||
//int index = ofacevert_num.getAttribute(f, edge_iter.idx());
|
outFace.m_verts.clear();
|
||||||
int index = vertexToIndex_map[edge_iter->vert];
|
outFace.m_plane.setValue(f->plane.N.v);
|
||||||
outFace.m_verts.push_back( index );
|
outFace.m_orig_face = orig;
|
||||||
|
|
||||||
|
// if we merged faces, use the list of common vertices; otherwise
|
||||||
|
// use the faces's vertices
|
||||||
|
if (result) {
|
||||||
|
// make quat using verts stored in result
|
||||||
|
outFace.m_verts.push_back(quadverts[0]);
|
||||||
|
outFace.m_verts.push_back(quadverts[1]);
|
||||||
|
outFace.m_verts.push_back(quadverts[2]);
|
||||||
|
outFace.m_verts.push_back(quadverts[3]);
|
||||||
|
} else {
|
||||||
|
MeshSet<3>::face_t::edge_iter_t edge_iter = f->begin();
|
||||||
|
for (; edge_iter != f->end(); ++edge_iter) {
|
||||||
|
//int index = ofacevert_num.getAttribute(f, edge_iter.idx());
|
||||||
|
int index = vertexToIndex_map[edge_iter->vert];
|
||||||
|
outFace.m_verts.push_back( index );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -233,17 +233,17 @@ bool BOP_intersect(const MT_Vector3& vL1, const MT_Point3& pL1, const MT_Vector3
|
|||||||
MT_Scalar den = (vL1.y()*vL2.x() - vL1.x() * vL2.y());
|
MT_Scalar den = (vL1.y()*vL2.x() - vL1.x() * vL2.y());
|
||||||
|
|
||||||
if (!BOP_fuzzyZero(den)) {
|
if (!BOP_fuzzyZero(den)) {
|
||||||
t = (pL2.y()*vL1.x() - vL1.y()*pL2.x() + pL1.x()*vL1.y() - pL1.y()*vL1.x()) / den ;
|
t = (pL2.y()*vL1.x() - vL1.y()*pL2.x() + pL1.x()*vL1.y() - pL1.y()*vL1.x()) / den;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
den = (vL1.y()*vL2.z() - vL1.z() * vL2.y());
|
den = (vL1.y()*vL2.z() - vL1.z() * vL2.y());
|
||||||
if (!BOP_fuzzyZero(den)) {
|
if (!BOP_fuzzyZero(den)) {
|
||||||
t = (pL2.y()*vL1.z() - vL1.y()*pL2.z() + pL1.z()*vL1.y() - pL1.y()*vL1.z()) / den ;
|
t = (pL2.y()*vL1.z() - vL1.y()*pL2.z() + pL1.z()*vL1.y() - pL1.y()*vL1.z()) / den;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
den = (vL1.x()*vL2.z() - vL1.z() * vL2.x());
|
den = (vL1.x()*vL2.z() - vL1.z() * vL2.x());
|
||||||
if (!BOP_fuzzyZero(den)) {
|
if (!BOP_fuzzyZero(den)) {
|
||||||
t = (pL2.x()*vL1.z() - vL1.x()*pL2.z() + pL1.z()*vL1.x() - pL1.x()*vL1.z()) / den ;
|
t = (pL2.x()*vL1.z() - vL1.x()*pL2.z() + pL1.z()*vL1.x() - pL1.x()*vL1.z()) / den;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -289,7 +289,7 @@ void BOP_Merge2::cleanup( void )
|
|||||||
BOP_Indexs faces = (*edge)->getFaces();
|
BOP_Indexs faces = (*edge)->getFaces();
|
||||||
for (BOP_IT_Indexs face = faces.begin(); face != faces.end(); ++face) {
|
for (BOP_IT_Indexs face = faces.begin(); face != faces.end(); ++face) {
|
||||||
BOP_Face *f = m_mesh->getFace(*face);
|
BOP_Face *f = m_mesh->getFace(*face);
|
||||||
if(f->getTAG()== UNCLASSIFIED) ;
|
if (f->getTAG()== UNCLASSIFIED);
|
||||||
else (*edge)->removeFace(*face);
|
else (*edge)->removeFace(*face);
|
||||||
}
|
}
|
||||||
if( (*edge)->getFaces().size() == 0) (*edge)->setUsed(false);
|
if( (*edge)->getFaces().size() == 0) (*edge)->setUsed(false);
|
||||||
|
|||||||
@@ -108,11 +108,10 @@ public :
|
|||||||
|
|
||||||
std::vector<BSP_MVertex> &
|
std::vector<BSP_MVertex> &
|
||||||
VertexSet(
|
VertexSet(
|
||||||
) const ;
|
) const;
|
||||||
|
|
||||||
std::vector<BSP_MFace> &
|
std::vector<BSP_MFace> &
|
||||||
FaceSet(
|
FaceSet(
|
||||||
) const ;
|
) const;
|
||||||
|
|
||||||
std::vector<BSP_MEdge> &
|
std::vector<BSP_MEdge> &
|
||||||
EdgeSet(
|
EdgeSet(
|
||||||
|
|||||||
@@ -37,42 +37,42 @@
|
|||||||
class CTR_Link {
|
class CTR_Link {
|
||||||
public:
|
public:
|
||||||
CTR_Link(
|
CTR_Link(
|
||||||
) ;
|
);
|
||||||
|
|
||||||
CTR_Link(
|
CTR_Link(
|
||||||
CTR_Link *next,
|
CTR_Link *next,
|
||||||
CTR_Link *prev
|
CTR_Link *prev
|
||||||
) ;
|
);
|
||||||
|
|
||||||
CTR_Link *
|
CTR_Link *
|
||||||
getNext(
|
getNext(
|
||||||
) const ;
|
) const;
|
||||||
|
|
||||||
CTR_Link *
|
CTR_Link *
|
||||||
getPrev(
|
getPrev(
|
||||||
) const ;
|
) const;
|
||||||
|
|
||||||
bool
|
bool
|
||||||
isHead(
|
isHead(
|
||||||
) const ;
|
) const;
|
||||||
|
|
||||||
bool
|
bool
|
||||||
isTail(
|
isTail(
|
||||||
) const ;
|
) const;
|
||||||
|
|
||||||
void
|
void
|
||||||
insertBefore(
|
insertBefore(
|
||||||
CTR_Link *link
|
CTR_Link *link
|
||||||
) ;
|
);
|
||||||
|
|
||||||
void
|
void
|
||||||
insertAfter(
|
insertAfter(
|
||||||
CTR_Link *link
|
CTR_Link *link
|
||||||
) ;
|
);
|
||||||
|
|
||||||
void
|
void
|
||||||
remove(
|
remove(
|
||||||
) ;
|
);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CTR_Link *m_next;
|
CTR_Link *m_next;
|
||||||
@@ -83,25 +83,25 @@ class CTR_List {
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
CTR_List(
|
CTR_List(
|
||||||
) ;
|
);
|
||||||
|
|
||||||
CTR_Link *
|
CTR_Link *
|
||||||
getHead(
|
getHead(
|
||||||
) const ;
|
) const;
|
||||||
|
|
||||||
CTR_Link *
|
CTR_Link *
|
||||||
getTail(
|
getTail(
|
||||||
) const ;
|
) const;
|
||||||
|
|
||||||
void
|
void
|
||||||
addHead(
|
addHead(
|
||||||
CTR_Link *link
|
CTR_Link *link
|
||||||
) ;
|
);
|
||||||
|
|
||||||
void
|
void
|
||||||
addTail(
|
addTail(
|
||||||
CTR_Link *link
|
CTR_Link *link
|
||||||
) ;
|
);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CTR_Link m_head;
|
CTR_Link m_head;
|
||||||
|
|||||||
@@ -288,9 +288,11 @@ static void xml_read_camera(const XMLReadState& state, pugi::xml_node node)
|
|||||||
xml_read_float(&cam->shutterclose, node, "shutterclose");
|
xml_read_float(&cam->shutterclose, node, "shutterclose");
|
||||||
|
|
||||||
if(xml_equal_string(node, "type", "orthographic"))
|
if(xml_equal_string(node, "type", "orthographic"))
|
||||||
cam->ortho = true;
|
cam->type = CAMERA_ORTHOGRAPHIC;
|
||||||
else if(xml_equal_string(node, "type", "perspective"))
|
else if(xml_equal_string(node, "type", "perspective"))
|
||||||
cam->ortho = false;
|
cam->type = CAMERA_PERSPECTIVE;
|
||||||
|
else if(xml_equal_string(node, "type", "environment"))
|
||||||
|
cam->type = CAMERA_ENVIRONMENT;
|
||||||
|
|
||||||
cam->matrix = state.tfm;
|
cam->matrix = state.tfm;
|
||||||
|
|
||||||
|
|||||||
@@ -177,11 +177,14 @@ class CyclesRender_PT_layers(CyclesButtonsPanel, Panel):
|
|||||||
|
|
||||||
col = split.column()
|
col = split.column()
|
||||||
col.prop(scene, "layers", text="Scene")
|
col.prop(scene, "layers", text="Scene")
|
||||||
|
col.label(text="Material:")
|
||||||
|
col.prop(rl, "material_override", text="")
|
||||||
|
col.prop(rl, "use_zmask");
|
||||||
|
|
||||||
col = split.column()
|
col = split.column()
|
||||||
col.prop(rl, "layers", text="Layer")
|
col.prop(rl, "layers", text="Layer")
|
||||||
|
col.label(text="Mask Layers:")
|
||||||
layout.separator()
|
col.prop(rl, "layers_zmask", text="")
|
||||||
|
|
||||||
split = layout.split()
|
split = layout.split()
|
||||||
|
|
||||||
@@ -194,6 +197,7 @@ class CyclesRender_PT_layers(CyclesButtonsPanel, Panel):
|
|||||||
col.prop(rl, "use_pass_material_index")
|
col.prop(rl, "use_pass_material_index")
|
||||||
col.prop(rl, "use_pass_emit")
|
col.prop(rl, "use_pass_emit")
|
||||||
col.prop(rl, "use_pass_environment")
|
col.prop(rl, "use_pass_environment")
|
||||||
|
col.prop(rl, "use_pass_ambient_occlusion")
|
||||||
|
|
||||||
col = split.column()
|
col = split.column()
|
||||||
col.label()
|
col.label()
|
||||||
@@ -213,11 +217,6 @@ class CyclesRender_PT_layers(CyclesButtonsPanel, Panel):
|
|||||||
row.prop(rl, "use_pass_transmission_indirect", text="Indirect", toggle=True)
|
row.prop(rl, "use_pass_transmission_indirect", text="Indirect", toggle=True)
|
||||||
row.prop(rl, "use_pass_transmission_color", text="Color", toggle=True)
|
row.prop(rl, "use_pass_transmission_color", text="Color", toggle=True)
|
||||||
|
|
||||||
layout.separator()
|
|
||||||
|
|
||||||
rl = rd.layers[0]
|
|
||||||
layout.prop(rl, "material_override", text="Material")
|
|
||||||
|
|
||||||
|
|
||||||
class Cycles_PT_post_processing(CyclesButtonsPanel, Panel):
|
class Cycles_PT_post_processing(CyclesButtonsPanel, Panel):
|
||||||
bl_label = "Post Processing"
|
bl_label = "Post Processing"
|
||||||
@@ -486,6 +485,45 @@ class CyclesWorld_PT_surface(CyclesButtonsPanel, Panel):
|
|||||||
if not panel_node_draw(layout, world, 'OUTPUT_WORLD', 'Surface'):
|
if not panel_node_draw(layout, world, 'OUTPUT_WORLD', 'Surface'):
|
||||||
layout.prop(world, "horizon_color", text="Color")
|
layout.prop(world, "horizon_color", text="Color")
|
||||||
|
|
||||||
|
class CyclesWorld_PT_volume(CyclesButtonsPanel, Panel):
|
||||||
|
bl_label = "Volume"
|
||||||
|
bl_context = "world"
|
||||||
|
bl_options = {'DEFAULT_CLOSED'}
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context):
|
||||||
|
# world = context.world
|
||||||
|
# world and world.node_tree and CyclesButtonsPanel.poll(context)
|
||||||
|
return False
|
||||||
|
|
||||||
|
def draw(self, context):
|
||||||
|
layout = self.layout
|
||||||
|
layout.active = False
|
||||||
|
|
||||||
|
world = context.world
|
||||||
|
panel_node_draw(layout, world, 'OUTPUT_WORLD', 'Volume')
|
||||||
|
|
||||||
|
class CyclesWorld_PT_ambient_occlusion(CyclesButtonsPanel, Panel):
|
||||||
|
bl_label = "Ambient Occlusion"
|
||||||
|
bl_context = "world"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context):
|
||||||
|
return context.world and CyclesButtonsPanel.poll(context)
|
||||||
|
|
||||||
|
def draw_header(self, context):
|
||||||
|
light = context.world.light_settings
|
||||||
|
self.layout.prop(light, "use_ambient_occlusion", text="")
|
||||||
|
|
||||||
|
def draw(self, context):
|
||||||
|
layout = self.layout
|
||||||
|
light = context.world.light_settings
|
||||||
|
|
||||||
|
layout.active = light.use_ambient_occlusion
|
||||||
|
|
||||||
|
split = layout.split()
|
||||||
|
split.prop(light, "ao_factor", text="Factor")
|
||||||
|
split.prop(light, "distance", text="Distance")
|
||||||
|
|
||||||
class CyclesWorld_PT_settings(CyclesButtonsPanel, Panel):
|
class CyclesWorld_PT_settings(CyclesButtonsPanel, Panel):
|
||||||
bl_label = "Settings"
|
bl_label = "Settings"
|
||||||
@@ -509,26 +547,6 @@ class CyclesWorld_PT_settings(CyclesButtonsPanel, Panel):
|
|||||||
row.active = cworld.sample_as_light
|
row.active = cworld.sample_as_light
|
||||||
row.prop(cworld, "sample_map_resolution")
|
row.prop(cworld, "sample_map_resolution")
|
||||||
|
|
||||||
|
|
||||||
class CyclesWorld_PT_volume(CyclesButtonsPanel, Panel):
|
|
||||||
bl_label = "Volume"
|
|
||||||
bl_context = "world"
|
|
||||||
bl_options = {'DEFAULT_CLOSED'}
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def poll(cls, context):
|
|
||||||
# world = context.world
|
|
||||||
# world and world.node_tree and CyclesButtonsPanel.poll(context)
|
|
||||||
return False
|
|
||||||
|
|
||||||
def draw(self, context):
|
|
||||||
layout = self.layout
|
|
||||||
layout.active = False
|
|
||||||
|
|
||||||
world = context.world
|
|
||||||
panel_node_draw(layout, world, 'OUTPUT_WORLD', 'Volume')
|
|
||||||
|
|
||||||
|
|
||||||
class CyclesMaterial_PT_surface(CyclesButtonsPanel, Panel):
|
class CyclesMaterial_PT_surface(CyclesButtonsPanel, Panel):
|
||||||
bl_label = "Surface"
|
bl_label = "Surface"
|
||||||
bl_context = "material"
|
bl_context = "material"
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ struct BlenderCamera {
|
|||||||
float nearclip;
|
float nearclip;
|
||||||
float farclip;
|
float farclip;
|
||||||
|
|
||||||
bool ortho;
|
CameraType type;
|
||||||
float ortho_scale;
|
float ortho_scale;
|
||||||
|
|
||||||
float lens;
|
float lens;
|
||||||
@@ -58,6 +58,7 @@ static void blender_camera_init(BlenderCamera *bcam)
|
|||||||
{
|
{
|
||||||
memset(bcam, 0, sizeof(BlenderCamera));
|
memset(bcam, 0, sizeof(BlenderCamera));
|
||||||
|
|
||||||
|
bcam->type = CAMERA_PERSPECTIVE;
|
||||||
bcam->zoom = 1.0f;
|
bcam->zoom = 1.0f;
|
||||||
bcam->pixelaspect = make_float2(1.0f, 1.0f);
|
bcam->pixelaspect = make_float2(1.0f, 1.0f);
|
||||||
bcam->sensor_width = 32.0f;
|
bcam->sensor_width = 32.0f;
|
||||||
@@ -91,7 +92,9 @@ static void blender_camera_from_object(BlenderCamera *bcam, BL::Object b_ob)
|
|||||||
bcam->nearclip = b_camera.clip_start();
|
bcam->nearclip = b_camera.clip_start();
|
||||||
bcam->farclip = b_camera.clip_end();
|
bcam->farclip = b_camera.clip_end();
|
||||||
|
|
||||||
bcam->ortho = (b_camera.type() == BL::Camera::type_ORTHO);
|
bcam->type = (b_camera.type() == BL::Camera::type_ORTHO)? CAMERA_ORTHOGRAPHIC: CAMERA_PERSPECTIVE;
|
||||||
|
if(bcam->type == CAMERA_PERSPECTIVE && b_camera.use_panorama())
|
||||||
|
bcam->type = CAMERA_ENVIRONMENT;
|
||||||
bcam->ortho_scale = b_camera.ortho_scale();
|
bcam->ortho_scale = b_camera.ortho_scale();
|
||||||
|
|
||||||
bcam->lens = b_camera.lens();
|
bcam->lens = b_camera.lens();
|
||||||
@@ -159,39 +162,48 @@ static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* modify aspect for orthographic scale */
|
/* modify aspect for orthographic scale */
|
||||||
if(bcam->ortho) {
|
if(bcam->type == CAMERA_ORTHOGRAPHIC) {
|
||||||
xaspect = xaspect*bcam->ortho_scale/(aspectratio*2.0f);
|
xaspect = xaspect*bcam->ortho_scale/(aspectratio*2.0f);
|
||||||
yaspect = yaspect*bcam->ortho_scale/(aspectratio*2.0f);
|
yaspect = yaspect*bcam->ortho_scale/(aspectratio*2.0f);
|
||||||
aspectratio = bcam->ortho_scale/2.0f;
|
aspectratio = bcam->ortho_scale/2.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set viewplane */
|
if(bcam->type == CAMERA_ENVIRONMENT) {
|
||||||
cam->left = -xaspect;
|
/* set viewplane */
|
||||||
cam->right = xaspect;
|
cam->left = 0.0f;
|
||||||
cam->bottom = -yaspect;
|
cam->right = 1.0f;
|
||||||
cam->top = yaspect;
|
cam->bottom = 0.0f;
|
||||||
|
cam->top = 1.0f;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* set viewplane */
|
||||||
|
cam->left = -xaspect;
|
||||||
|
cam->right = xaspect;
|
||||||
|
cam->bottom = -yaspect;
|
||||||
|
cam->top = yaspect;
|
||||||
|
|
||||||
/* zoom for 3d camera view */
|
/* zoom for 3d camera view */
|
||||||
cam->left *= bcam->zoom;
|
cam->left *= bcam->zoom;
|
||||||
cam->right *= bcam->zoom;
|
cam->right *= bcam->zoom;
|
||||||
cam->bottom *= bcam->zoom;
|
cam->bottom *= bcam->zoom;
|
||||||
cam->top *= bcam->zoom;
|
cam->top *= bcam->zoom;
|
||||||
|
|
||||||
/* modify viewplane with camera shift and 3d camera view offset */
|
/* modify viewplane with camera shift and 3d camera view offset */
|
||||||
float dx = 2.0f*(aspectratio*bcam->shift.x + bcam->offset.x*xaspect*2.0f);
|
float dx = 2.0f*(aspectratio*bcam->shift.x + bcam->offset.x*xaspect*2.0f);
|
||||||
float dy = 2.0f*(aspectratio*bcam->shift.y + bcam->offset.y*yaspect*2.0f);
|
float dy = 2.0f*(aspectratio*bcam->shift.y + bcam->offset.y*yaspect*2.0f);
|
||||||
|
|
||||||
cam->left += dx;
|
cam->left += dx;
|
||||||
cam->right += dx;
|
cam->right += dx;
|
||||||
cam->bottom += dy;
|
cam->bottom += dy;
|
||||||
cam->top += dy;
|
cam->top += dy;
|
||||||
|
}
|
||||||
|
|
||||||
/* clipping distances */
|
/* clipping distances */
|
||||||
cam->nearclip = bcam->nearclip;
|
cam->nearclip = bcam->nearclip;
|
||||||
cam->farclip = bcam->farclip;
|
cam->farclip = bcam->farclip;
|
||||||
|
|
||||||
/* orthographic */
|
/* type */
|
||||||
cam->ortho = bcam->ortho;
|
cam->type = bcam->type;
|
||||||
|
|
||||||
/* perspective */
|
/* perspective */
|
||||||
cam->fov = 2.0f*atan((0.5f*sensor_size)/bcam->lens/aspectratio);
|
cam->fov = 2.0f*atan((0.5f*sensor_size)/bcam->lens/aspectratio);
|
||||||
@@ -200,8 +212,24 @@ static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int
|
|||||||
cam->blades = bcam->apertureblades;
|
cam->blades = bcam->apertureblades;
|
||||||
cam->bladesrotation = bcam->aperturerotation;
|
cam->bladesrotation = bcam->aperturerotation;
|
||||||
|
|
||||||
/* transform, note the blender camera points along the negative z-axis */
|
/* transform */
|
||||||
cam->matrix = bcam->matrix * transform_scale(1.0f, 1.0f, -1.0f);
|
cam->matrix = bcam->matrix;
|
||||||
|
|
||||||
|
if(bcam->type == CAMERA_ENVIRONMENT) {
|
||||||
|
/* make it so environment camera needs to be pointed in the direction
|
||||||
|
of the positive x-axis to match an environment texture, this way
|
||||||
|
it is looking at the center of the texture */
|
||||||
|
cam->matrix = cam->matrix *
|
||||||
|
make_transform( 0.0f, -1.0f, 0.0f, 0.0f,
|
||||||
|
0.0f, 0.0f, 1.0f, 0.0f,
|
||||||
|
-1.0f, 0.0f, 0.0f, 0.0f,
|
||||||
|
0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* note the blender camera points along the negative z-axis */
|
||||||
|
cam->matrix = cam->matrix * transform_scale(1.0f, 1.0f, -1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
cam->matrix = transform_clear_scale(cam->matrix);
|
cam->matrix = transform_clear_scale(cam->matrix);
|
||||||
|
|
||||||
/* set update flag */
|
/* set update flag */
|
||||||
@@ -269,7 +297,7 @@ void BlenderSync::sync_view(BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int
|
|||||||
bcam.farclip *= 0.5;
|
bcam.farclip *= 0.5;
|
||||||
bcam.nearclip = -bcam.farclip;
|
bcam.nearclip = -bcam.farclip;
|
||||||
|
|
||||||
bcam.ortho = true;
|
bcam.type = CAMERA_ORTHOGRAPHIC;
|
||||||
bcam.ortho_scale = b_rv3d.view_distance();
|
bcam.ortho_scale = b_rv3d.view_distance();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -222,20 +222,22 @@ static void create_subd_mesh(Mesh *mesh, BL::Mesh b_mesh, PointerRNA *cmesh, con
|
|||||||
|
|
||||||
/* Sync */
|
/* Sync */
|
||||||
|
|
||||||
Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated)
|
Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool holdout, bool object_updated)
|
||||||
{
|
{
|
||||||
/* test if we can instance or if the object is modified */
|
/* test if we can instance or if the object is modified */
|
||||||
BL::ID b_ob_data = b_ob.data();
|
BL::ID b_ob_data = b_ob.data();
|
||||||
BL::ID key = (object_is_modified(b_ob))? b_ob: b_ob_data;
|
BL::ID key = (object_is_modified(b_ob) || holdout)? b_ob: b_ob_data;
|
||||||
|
|
||||||
/* find shader indices */
|
/* find shader indices */
|
||||||
vector<uint> used_shaders;
|
vector<uint> used_shaders;
|
||||||
|
|
||||||
BL::Object::material_slots_iterator slot;
|
BL::Object::material_slots_iterator slot;
|
||||||
for(b_ob.material_slots.begin(slot); slot != b_ob.material_slots.end(); ++slot) {
|
for(b_ob.material_slots.begin(slot); slot != b_ob.material_slots.end(); ++slot) {
|
||||||
BL::Material material_override = render_layers.front().material_override;
|
BL::Material material_override = render_layer.material_override;
|
||||||
|
|
||||||
if(material_override)
|
if(holdout)
|
||||||
|
find_shader(PointerRNA_NULL, used_shaders, scene->default_holdout);
|
||||||
|
else if(material_override)
|
||||||
find_shader(material_override, used_shaders, scene->default_surface);
|
find_shader(material_override, used_shaders, scene->default_surface);
|
||||||
else
|
else
|
||||||
find_shader(slot->material(), used_shaders, scene->default_surface);
|
find_shader(slot->material(), used_shaders, scene->default_surface);
|
||||||
|
|||||||
@@ -208,8 +208,11 @@ void BlenderSync::sync_object(BL::Object b_parent, int b_index, BL::Object b_ob,
|
|||||||
if(object_map.sync(&object, b_ob, b_parent, key))
|
if(object_map.sync(&object, b_ob, b_parent, key))
|
||||||
object_updated = true;
|
object_updated = true;
|
||||||
|
|
||||||
|
/* holdout? */
|
||||||
|
bool holdout = (layer_flag & render_layer.holdout_layer) != 0;
|
||||||
|
|
||||||
/* mesh sync */
|
/* mesh sync */
|
||||||
object->mesh = sync_mesh(b_ob, object_updated);
|
object->mesh = sync_mesh(b_ob, holdout, object_updated);
|
||||||
|
|
||||||
/* object sync */
|
/* object sync */
|
||||||
if(object_updated || (object->mesh && object->mesh->need_update)) {
|
if(object_updated || (object->mesh && object->mesh->need_update)) {
|
||||||
@@ -238,7 +241,7 @@ void BlenderSync::sync_object(BL::Object b_parent, int b_index, BL::Object b_ob,
|
|||||||
void BlenderSync::sync_objects(BL::SpaceView3D b_v3d)
|
void BlenderSync::sync_objects(BL::SpaceView3D b_v3d)
|
||||||
{
|
{
|
||||||
/* layer data */
|
/* layer data */
|
||||||
uint scene_layer = render_layers.front().scene_layer;
|
uint scene_layer = render_layer.scene_layer;
|
||||||
|
|
||||||
/* prepare for sync */
|
/* prepare for sync */
|
||||||
light_map.pre_sync();
|
light_map.pre_sync();
|
||||||
|
|||||||
@@ -158,10 +158,11 @@ static PassType get_pass_type(BL::RenderPass b_pass)
|
|||||||
return PASS_EMISSION;
|
return PASS_EMISSION;
|
||||||
case BL::RenderPass::type_ENVIRONMENT:
|
case BL::RenderPass::type_ENVIRONMENT:
|
||||||
return PASS_BACKGROUND;
|
return PASS_BACKGROUND;
|
||||||
|
case BL::RenderPass::type_AO:
|
||||||
|
return PASS_AO;
|
||||||
|
|
||||||
case BL::RenderPass::type_DIFFUSE:
|
case BL::RenderPass::type_DIFFUSE:
|
||||||
case BL::RenderPass::type_SHADOW:
|
case BL::RenderPass::type_SHADOW:
|
||||||
case BL::RenderPass::type_AO:
|
|
||||||
case BL::RenderPass::type_COLOR:
|
case BL::RenderPass::type_COLOR:
|
||||||
case BL::RenderPass::type_REFRACTION:
|
case BL::RenderPass::type_REFRACTION:
|
||||||
case BL::RenderPass::type_SPECULAR:
|
case BL::RenderPass::type_SPECULAR:
|
||||||
|
|||||||
@@ -696,6 +696,18 @@ void BlenderSync::sync_world()
|
|||||||
graph->connect(closure->output("Background"), out->input("Surface"));
|
graph->connect(closure->output("Background"), out->input("Surface"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* AO */
|
||||||
|
if(b_world) {
|
||||||
|
BL::WorldLighting b_light = b_world.light_settings();
|
||||||
|
|
||||||
|
if(b_light.use_ambient_occlusion())
|
||||||
|
background->ao_factor = b_light.ao_factor();
|
||||||
|
else
|
||||||
|
background->ao_factor = 0.0f;
|
||||||
|
|
||||||
|
background->ao_distance = b_light.distance();
|
||||||
|
}
|
||||||
|
|
||||||
shader->set_graph(graph);
|
shader->set_graph(graph);
|
||||||
shader->tag_update(scene);
|
shader->tag_update(scene);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,8 +48,7 @@ BlenderSync::BlenderSync(BL::BlendData b_data_, BL::Scene b_scene_, Scene *scene
|
|||||||
light_map(&scene_->lights),
|
light_map(&scene_->lights),
|
||||||
world_map(NULL),
|
world_map(NULL),
|
||||||
world_recalc(false),
|
world_recalc(false),
|
||||||
experimental(false),
|
experimental(false)
|
||||||
active_layer(0)
|
|
||||||
{
|
{
|
||||||
scene = scene_;
|
scene = scene_;
|
||||||
preview = preview_;
|
preview = preview_;
|
||||||
@@ -124,8 +123,8 @@ bool BlenderSync::sync_recalc()
|
|||||||
|
|
||||||
void BlenderSync::sync_data(BL::SpaceView3D b_v3d, const char *layer)
|
void BlenderSync::sync_data(BL::SpaceView3D b_v3d, const char *layer)
|
||||||
{
|
{
|
||||||
sync_render_layers(b_v3d);
|
sync_render_layers(b_v3d, layer);
|
||||||
sync_integrator(layer);
|
sync_integrator();
|
||||||
sync_film();
|
sync_film();
|
||||||
sync_shaders();
|
sync_shaders();
|
||||||
sync_objects(b_v3d);
|
sync_objects(b_v3d);
|
||||||
@@ -133,7 +132,7 @@ void BlenderSync::sync_data(BL::SpaceView3D b_v3d, const char *layer)
|
|||||||
|
|
||||||
/* Integrator */
|
/* Integrator */
|
||||||
|
|
||||||
void BlenderSync::sync_integrator(const char *layer)
|
void BlenderSync::sync_integrator()
|
||||||
{
|
{
|
||||||
PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
|
PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
|
||||||
|
|
||||||
@@ -156,19 +155,7 @@ void BlenderSync::sync_integrator(const char *layer)
|
|||||||
integrator->no_caustics = get_boolean(cscene, "no_caustics");
|
integrator->no_caustics = get_boolean(cscene, "no_caustics");
|
||||||
integrator->seed = get_int(cscene, "seed");
|
integrator->seed = get_int(cscene, "seed");
|
||||||
|
|
||||||
/* render layer */
|
integrator->layer_flag = render_layer.layer;
|
||||||
int active_layer = 0;
|
|
||||||
|
|
||||||
if(layer) {
|
|
||||||
for(int i = 0; i < render_layers.size(); i++) {
|
|
||||||
if(render_layers[i].name == layer) {
|
|
||||||
active_layer = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
integrator->layer_flag = render_layers[active_layer].layer;
|
|
||||||
|
|
||||||
if(integrator->modified(previntegrator))
|
if(integrator->modified(previntegrator))
|
||||||
integrator->tag_update(scene);
|
integrator->tag_update(scene);
|
||||||
@@ -200,33 +187,29 @@ void BlenderSync::sync_film()
|
|||||||
|
|
||||||
/* Render Layer */
|
/* Render Layer */
|
||||||
|
|
||||||
void BlenderSync::sync_render_layers(BL::SpaceView3D b_v3d)
|
void BlenderSync::sync_render_layers(BL::SpaceView3D b_v3d, const char *layer)
|
||||||
{
|
{
|
||||||
render_layers.clear();
|
|
||||||
|
|
||||||
if(b_v3d) {
|
if(b_v3d) {
|
||||||
RenderLayerInfo rlay;
|
render_layer.scene_layer = get_layer(b_v3d.layers());
|
||||||
|
render_layer.layer = render_layer.scene_layer;
|
||||||
rlay.scene_layer = get_layer(b_v3d.layers());
|
render_layer.material_override = PointerRNA_NULL;
|
||||||
rlay.layer = rlay.scene_layer;
|
|
||||||
rlay.material_override = PointerRNA_NULL;
|
|
||||||
|
|
||||||
render_layers.push_back(rlay);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
BL::RenderSettings r = b_scene.render();
|
BL::RenderSettings r = b_scene.render();
|
||||||
BL::RenderSettings::layers_iterator b_rlay;
|
BL::RenderSettings::layers_iterator b_rlay;
|
||||||
|
bool first_layer = true;
|
||||||
|
|
||||||
for(r.layers.begin(b_rlay); b_rlay != r.layers.end(); ++b_rlay) {
|
for(r.layers.begin(b_rlay); b_rlay != r.layers.end(); ++b_rlay) {
|
||||||
/* single layer for now */
|
if((!layer && first_layer) || (layer && b_rlay->name() == layer)) {
|
||||||
RenderLayerInfo rlay;
|
render_layer.name = b_rlay->name();
|
||||||
|
render_layer.scene_layer = get_layer(b_scene.layers());
|
||||||
|
render_layer.layer = get_layer(b_rlay->layers());
|
||||||
|
render_layer.holdout_layer = (b_rlay->use_zmask())? ~get_layer(b_rlay->layers_zmask()): 0;
|
||||||
|
render_layer.layer |= render_layer.holdout_layer;
|
||||||
|
render_layer.material_override = b_rlay->material_override();
|
||||||
|
}
|
||||||
|
|
||||||
rlay.name = b_rlay->name();
|
first_layer = false;
|
||||||
rlay.scene_layer = get_layer(b_scene.layers());
|
|
||||||
rlay.layer = get_layer(b_rlay->layers());
|
|
||||||
rlay.material_override = b_rlay->material_override();
|
|
||||||
|
|
||||||
render_layers.push_back(rlay);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,14 +70,14 @@ private:
|
|||||||
void sync_materials();
|
void sync_materials();
|
||||||
void sync_objects(BL::SpaceView3D b_v3d);
|
void sync_objects(BL::SpaceView3D b_v3d);
|
||||||
void sync_film();
|
void sync_film();
|
||||||
void sync_integrator(const char *layer);
|
void sync_integrator();
|
||||||
void sync_view();
|
void sync_view();
|
||||||
void sync_world();
|
void sync_world();
|
||||||
void sync_render_layers(BL::SpaceView3D b_v3d);
|
void sync_render_layers(BL::SpaceView3D b_v3d, const char *layer);
|
||||||
void sync_shaders();
|
void sync_shaders();
|
||||||
|
|
||||||
void sync_nodes(Shader *shader, BL::ShaderNodeTree b_ntree);
|
void sync_nodes(Shader *shader, BL::ShaderNodeTree b_ntree);
|
||||||
Mesh *sync_mesh(BL::Object b_ob, bool object_updated);
|
Mesh *sync_mesh(BL::Object b_ob, bool holdout, bool object_updated);
|
||||||
void sync_object(BL::Object b_parent, int b_index, BL::Object b_object, Transform& tfm, uint layer_flag);
|
void sync_object(BL::Object b_parent, int b_index, BL::Object b_object, Transform& tfm, uint layer_flag);
|
||||||
void sync_light(BL::Object b_parent, int b_index, BL::Object b_ob, Transform& tfm);
|
void sync_light(BL::Object b_parent, int b_index, BL::Object b_ob, Transform& tfm);
|
||||||
void sync_background_light();
|
void sync_background_light();
|
||||||
@@ -113,11 +113,9 @@ private:
|
|||||||
string name;
|
string name;
|
||||||
uint scene_layer;
|
uint scene_layer;
|
||||||
uint layer;
|
uint layer;
|
||||||
|
uint holdout_layer;
|
||||||
BL::Material material_override;
|
BL::Material material_override;
|
||||||
};
|
} render_layer;
|
||||||
|
|
||||||
vector<RenderLayerInfo> render_layers;
|
|
||||||
int active_layer;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
CCL_NAMESPACE_END
|
CCL_NAMESPACE_END
|
||||||
|
|||||||
@@ -135,6 +135,7 @@ __device_inline void path_radiance_init(PathRadiance *L, int use_light_pass)
|
|||||||
|
|
||||||
L->emission = 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);
|
L->background = make_float3(0.0f, 0.0f, 0.0f);
|
||||||
|
L->ao = make_float3(0.0f, 0.0f, 0.0f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
L->emission = make_float3(0.0f, 0.0f, 0.0f);
|
L->emission = make_float3(0.0f, 0.0f, 0.0f);
|
||||||
@@ -199,6 +200,27 @@ __device_inline void path_radiance_accum_emission(PathRadiance *L, float3 throug
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__device_inline void path_radiance_accum_ao(PathRadiance *L, float3 throughput, float3 bsdf, float3 ao, int bounce)
|
||||||
|
{
|
||||||
|
#ifdef __PASSES__
|
||||||
|
if(L->use_light_pass) {
|
||||||
|
if(bounce == 0) {
|
||||||
|
/* directly visible lighting */
|
||||||
|
L->direct_diffuse += throughput*bsdf*ao;
|
||||||
|
L->ao += throughput*ao;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* indirectly visible lighting after BSDF bounce */
|
||||||
|
L->indirect += throughput*bsdf*ao;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
L->emission += throughput*bsdf*ao;
|
||||||
|
#else
|
||||||
|
*L += throughput*bsdf*ao;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
__device_inline void path_radiance_accum_light(PathRadiance *L, float3 throughput, BsdfEval *bsdf_eval, int bounce)
|
__device_inline void path_radiance_accum_light(PathRadiance *L, float3 throughput, BsdfEval *bsdf_eval, int bounce)
|
||||||
{
|
{
|
||||||
#ifdef __PASSES__
|
#ifdef __PASSES__
|
||||||
|
|||||||
@@ -122,6 +122,44 @@ __device void camera_sample_orthographic(KernelGlobals *kg, float raster_x, floa
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Environment Camera */
|
||||||
|
|
||||||
|
__device void camera_sample_environment(KernelGlobals *kg, float raster_x, float raster_y, Ray *ray)
|
||||||
|
{
|
||||||
|
Transform rastertocamera = kernel_data.cam.rastertocamera;
|
||||||
|
float3 Pcamera = transform(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
|
||||||
|
|
||||||
|
/* create ray form raster position */
|
||||||
|
ray->P = make_float3(0.0, 0.0f, 0.0f);
|
||||||
|
ray->D = equirectangular_to_direction(Pcamera.x, Pcamera.y);
|
||||||
|
|
||||||
|
/* transform ray from camera to world */
|
||||||
|
Transform cameratoworld = kernel_data.cam.cameratoworld;
|
||||||
|
|
||||||
|
ray->P = transform(&cameratoworld, ray->P);
|
||||||
|
ray->D = transform_direction(&cameratoworld, ray->D);
|
||||||
|
ray->D = normalize(ray->D);
|
||||||
|
|
||||||
|
#ifdef __RAY_DIFFERENTIALS__
|
||||||
|
/* ray differential */
|
||||||
|
ray->dP.dx = make_float3(0.0f, 0.0f, 0.0f);
|
||||||
|
ray->dP.dy = make_float3(0.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
|
Pcamera = transform(&rastertocamera, make_float3(raster_x + 1.0f, raster_y, 0.0f));
|
||||||
|
ray->dD.dx = equirectangular_to_direction(Pcamera.x, Pcamera.y) - ray->D;
|
||||||
|
|
||||||
|
Pcamera = transform(&rastertocamera, make_float3(raster_x, raster_y + 1.0f, 0.0f));
|
||||||
|
ray->dD.dy = equirectangular_to_direction(Pcamera.x, Pcamera.y) - ray->D;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __CAMERA_CLIPPING__
|
||||||
|
/* clipping */
|
||||||
|
ray->t = kernel_data.cam.cliplength;
|
||||||
|
#else
|
||||||
|
ray->t = FLT_MAX;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/* Common */
|
/* Common */
|
||||||
|
|
||||||
__device void camera_sample(KernelGlobals *kg, int x, int y, float filter_u, float filter_v, float lens_u, float lens_v, Ray *ray)
|
__device void camera_sample(KernelGlobals *kg, int x, int y, float filter_u, float filter_v, float lens_u, float lens_v, Ray *ray)
|
||||||
@@ -134,10 +172,12 @@ __device void camera_sample(KernelGlobals *kg, int x, int y, float filter_u, flo
|
|||||||
//ray->time = lerp(time_t, kernel_data.cam.shutter_open, kernel_data.cam.shutter_close);
|
//ray->time = lerp(time_t, kernel_data.cam.shutter_open, kernel_data.cam.shutter_close);
|
||||||
|
|
||||||
/* sample */
|
/* sample */
|
||||||
if(kernel_data.cam.ortho)
|
if(kernel_data.cam.type == CAMERA_PERSPECTIVE)
|
||||||
|
camera_sample_perspective(kg, raster_x, raster_y, lens_u, lens_v, ray);
|
||||||
|
else if(kernel_data.cam.type == CAMERA_ORTHOGRAPHIC)
|
||||||
camera_sample_orthographic(kg, raster_x, raster_y, ray);
|
camera_sample_orthographic(kg, raster_x, raster_y, ray);
|
||||||
else
|
else
|
||||||
camera_sample_perspective(kg, raster_x, raster_y, lens_u, lens_v, ray);
|
camera_sample_environment(kg, raster_x, raster_y, ray);
|
||||||
}
|
}
|
||||||
|
|
||||||
CCL_NAMESPACE_END
|
CCL_NAMESPACE_END
|
||||||
|
|||||||
@@ -41,9 +41,11 @@ __device void kernel_shader_evaluate(KernelGlobals *kg, uint4 *input, float4 *ou
|
|||||||
else { // SHADER_EVAL_BACKGROUND
|
else { // SHADER_EVAL_BACKGROUND
|
||||||
/* setup ray */
|
/* setup ray */
|
||||||
Ray ray;
|
Ray ray;
|
||||||
|
float u = __int_as_float(in.x);
|
||||||
|
float v = __int_as_float(in.y);
|
||||||
|
|
||||||
ray.P = make_float3(0.0f, 0.0f, 0.0f);
|
ray.P = make_float3(0.0f, 0.0f, 0.0f);
|
||||||
ray.D = make_float3(__int_as_float(in.x), __int_as_float(in.y), __int_as_float(in.z));
|
ray.D = equirectangular_to_direction(u, v);
|
||||||
ray.t = 0.0f;
|
ray.t = 0.0f;
|
||||||
|
|
||||||
#ifdef __RAY_DIFFERENTIALS__
|
#ifdef __RAY_DIFFERENTIALS__
|
||||||
|
|||||||
@@ -120,13 +120,9 @@ __device float3 background_light_sample(KernelGlobals *kg, float randu, float ra
|
|||||||
float du = (randu - cdf_u.y) / (cdf_next_u.y - cdf_u.y);
|
float du = (randu - cdf_u.y) / (cdf_next_u.y - cdf_u.y);
|
||||||
float u = (index_u + du) / res;
|
float u = (index_u + du) / res;
|
||||||
|
|
||||||
/* spherical coordinates */
|
|
||||||
float theta = v * M_PI_F;
|
|
||||||
float phi = u * M_PI_F * 2.0f;
|
|
||||||
|
|
||||||
/* compute pdf */
|
/* compute pdf */
|
||||||
float denom = cdf_last_u.x * cdf_last_v.x;
|
float denom = cdf_last_u.x * cdf_last_v.x;
|
||||||
float sin_theta = sinf(theta);
|
float sin_theta = sinf(M_PI_F * v);
|
||||||
|
|
||||||
if(sin_theta == 0.0f || denom == 0.0f)
|
if(sin_theta == 0.0f || denom == 0.0f)
|
||||||
*pdf = 0.0f;
|
*pdf = 0.0f;
|
||||||
@@ -136,7 +132,7 @@ __device float3 background_light_sample(KernelGlobals *kg, float randu, float ra
|
|||||||
*pdf *= kernel_data.integrator.pdf_lights;
|
*pdf *= kernel_data.integrator.pdf_lights;
|
||||||
|
|
||||||
/* compute direction */
|
/* compute direction */
|
||||||
return spherical_to_direction(theta, phi);
|
return -equirectangular_to_direction(u, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
__device float background_light_pdf(KernelGlobals *kg, float3 direction)
|
__device float background_light_pdf(KernelGlobals *kg, float3 direction)
|
||||||
|
|||||||
@@ -185,7 +185,7 @@ __device float2 regular_polygon_sample(float corners, float rotation, float u, f
|
|||||||
return make_float2(cr*p.x - sr*p.y, sr*p.x + cr*p.y);
|
return make_float2(cr*p.x - sr*p.y, sr*p.x + cr*p.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Spherical coordinates <-> Cartesion direction */
|
/* Spherical coordinates <-> Cartesian direction */
|
||||||
|
|
||||||
__device float2 direction_to_spherical(float3 dir)
|
__device float2 direction_to_spherical(float3 dir)
|
||||||
{
|
{
|
||||||
@@ -203,11 +203,11 @@ __device float3 spherical_to_direction(float theta, float phi)
|
|||||||
cosf(theta));
|
cosf(theta));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Equirectangular */
|
/* Equirectangular coordinates <-> Cartesian direction */
|
||||||
|
|
||||||
__device float2 direction_to_equirectangular(float3 dir)
|
__device float2 direction_to_equirectangular(float3 dir)
|
||||||
{
|
{
|
||||||
float u = (atan2f(dir.y, dir.x) + M_PI_F)/(2.0f*M_PI_F);
|
float u = -atan2f(dir.y, dir.x)/(2.0f*M_PI_F) + 0.5f;
|
||||||
float v = atan2f(dir.z, hypotf(dir.x, dir.y))/M_PI_F + 0.5f;
|
float v = atan2f(dir.z, hypotf(dir.x, dir.y))/M_PI_F + 0.5f;
|
||||||
|
|
||||||
return make_float2(u, v);
|
return make_float2(u, v);
|
||||||
@@ -215,9 +215,8 @@ __device float2 direction_to_equirectangular(float3 dir)
|
|||||||
|
|
||||||
__device float3 equirectangular_to_direction(float u, float v)
|
__device float3 equirectangular_to_direction(float u, float v)
|
||||||
{
|
{
|
||||||
/* XXX check correctness? */
|
float phi = M_PI_F*(1.0f - 2.0f*u);
|
||||||
float theta = M_PI_F*v;
|
float theta = M_PI_F*(1.0f - v);
|
||||||
float phi = 2.0f*M_PI_F*u;
|
|
||||||
|
|
||||||
return make_float3(
|
return make_float3(
|
||||||
sin(theta)*cos(phi),
|
sin(theta)*cos(phi),
|
||||||
|
|||||||
@@ -123,6 +123,8 @@ __device_inline void kernel_write_light_passes(KernelGlobals *kg, __global float
|
|||||||
kernel_write_pass_float3(buffer + kernel_data.film.pass_emission, sample, L->emission);
|
kernel_write_pass_float3(buffer + kernel_data.film.pass_emission, sample, L->emission);
|
||||||
if(flag & PASS_BACKGROUND)
|
if(flag & PASS_BACKGROUND)
|
||||||
kernel_write_pass_float3(buffer + kernel_data.film.pass_background, sample, L->background);
|
kernel_write_pass_float3(buffer + kernel_data.film.pass_background, sample, L->background);
|
||||||
|
if(flag & PASS_AO)
|
||||||
|
kernel_write_pass_float3(buffer + kernel_data.film.pass_ao, sample, L->ao);
|
||||||
|
|
||||||
if(flag & PASS_DIFFUSE_COLOR)
|
if(flag & PASS_DIFFUSE_COLOR)
|
||||||
kernel_write_pass_float3(buffer + kernel_data.film.pass_diffuse_color, sample, L->color_diffuse);
|
kernel_write_pass_float3(buffer + kernel_data.film.pass_diffuse_color, sample, L->color_diffuse);
|
||||||
|
|||||||
@@ -145,12 +145,15 @@ __device_inline float path_state_terminate_probability(KernelGlobals *kg, PathSt
|
|||||||
return average(throughput);
|
return average(throughput);
|
||||||
}
|
}
|
||||||
|
|
||||||
__device_inline bool shadow_blocked(KernelGlobals *kg, PathState *state, Ray *ray, Intersection *isect, BsdfEval *L_light)
|
__device_inline bool shadow_blocked(KernelGlobals *kg, PathState *state, Ray *ray, float3 *shadow)
|
||||||
{
|
{
|
||||||
if(ray->t == 0.0f)
|
if(ray->t == 0.0f)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
bool result = scene_intersect(kg, ray, PATH_RAY_SHADOW_OPAQUE, isect);
|
Intersection isect;
|
||||||
|
bool result = scene_intersect(kg, ray, PATH_RAY_SHADOW_OPAQUE, &isect);
|
||||||
|
|
||||||
|
*shadow = make_float3(1.0f, 1.0f, 1.0f);
|
||||||
|
|
||||||
#ifdef __TRANSPARENT_SHADOWS__
|
#ifdef __TRANSPARENT_SHADOWS__
|
||||||
if(result && kernel_data.integrator.transparent_shadows) {
|
if(result && kernel_data.integrator.transparent_shadows) {
|
||||||
@@ -162,7 +165,7 @@ __device_inline bool shadow_blocked(KernelGlobals *kg, PathState *state, Ray *ra
|
|||||||
|
|
||||||
also note that for this to work correct, multi close sampling must
|
also note that for this to work correct, multi close sampling must
|
||||||
be used, since we don't pass a random number to shader_eval_surface */
|
be used, since we don't pass a random number to shader_eval_surface */
|
||||||
if(shader_transparent_shadow(kg, isect)) {
|
if(shader_transparent_shadow(kg, &isect)) {
|
||||||
float3 throughput = make_float3(1.0f, 1.0f, 1.0f);
|
float3 throughput = make_float3(1.0f, 1.0f, 1.0f);
|
||||||
float3 Pend = ray->P + ray->D*ray->t;
|
float3 Pend = ray->P + ray->D*ray->t;
|
||||||
int bounce = state->transparent_bounce;
|
int bounce = state->transparent_bounce;
|
||||||
@@ -184,16 +187,16 @@ __device_inline bool shadow_blocked(KernelGlobals *kg, PathState *state, Ray *ra
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!scene_intersect(kg, ray, PATH_RAY_SHADOW_TRANSPARENT, isect)) {
|
if(!scene_intersect(kg, ray, PATH_RAY_SHADOW_TRANSPARENT, &isect)) {
|
||||||
bsdf_eval_mul(L_light, throughput);
|
*shadow *= throughput;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!shader_transparent_shadow(kg, isect))
|
if(!shader_transparent_shadow(kg, &isect))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
ShaderData sd;
|
ShaderData sd;
|
||||||
shader_setup_from_ray(kg, &sd, isect, ray);
|
shader_setup_from_ray(kg, &sd, &isect, ray);
|
||||||
shader_eval_surface(kg, &sd, 0.0f, PATH_RAY_SHADOW);
|
shader_eval_surface(kg, &sd, 0.0f, PATH_RAY_SHADOW);
|
||||||
|
|
||||||
throughput *= shader_bsdf_transparency(kg, &sd);
|
throughput *= shader_bsdf_transparency(kg, &sd);
|
||||||
@@ -285,6 +288,35 @@ __device float4 kernel_path_integrate(KernelGlobals *kg, RNG *rng, int sample, R
|
|||||||
|
|
||||||
throughput /= probability;
|
throughput /= probability;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __AO__
|
||||||
|
/* ambient occlusion */
|
||||||
|
if(kernel_data.integrator.use_ambient_occlusion) {
|
||||||
|
/* todo: solve correlation */
|
||||||
|
float bsdf_u = path_rng(kg, rng, sample, rng_offset + PRNG_BSDF_U);
|
||||||
|
float bsdf_v = path_rng(kg, rng, sample, rng_offset + PRNG_BSDF_V);
|
||||||
|
|
||||||
|
float3 ao_D;
|
||||||
|
float ao_pdf;
|
||||||
|
|
||||||
|
sample_cos_hemisphere(sd.N, bsdf_u, bsdf_v, &ao_D, &ao_pdf);
|
||||||
|
|
||||||
|
if(dot(sd.Ng, ao_D) > 0.0f && ao_pdf != 0.0f) {
|
||||||
|
Ray light_ray;
|
||||||
|
float3 ao_shadow;
|
||||||
|
|
||||||
|
light_ray.P = ray_offset(sd.P, sd.Ng);
|
||||||
|
light_ray.D = ao_D;
|
||||||
|
light_ray.t = kernel_data.background.ao_distance;
|
||||||
|
|
||||||
|
if(!shadow_blocked(kg, &state, &light_ray, &ao_shadow)) {
|
||||||
|
float3 ao_bsdf = shader_bsdf_diffuse(kg, &sd)*kernel_data.background.ao_factor;
|
||||||
|
path_radiance_accum_ao(&L, throughput, ao_bsdf, ao_shadow, state.bounce);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __EMISSION__
|
#ifdef __EMISSION__
|
||||||
if(kernel_data.integrator.use_direct_light) {
|
if(kernel_data.integrator.use_direct_light) {
|
||||||
/* sample illumination from lights to find path contribution */
|
/* sample illumination from lights to find path contribution */
|
||||||
@@ -307,8 +339,13 @@ __device float4 kernel_path_integrate(KernelGlobals *kg, RNG *rng, int sample, R
|
|||||||
#endif
|
#endif
|
||||||
if(direct_emission(kg, &sd, i, light_t, light_o, light_u, light_v, &light_ray, &L_light)) {
|
if(direct_emission(kg, &sd, i, light_t, light_o, light_u, light_v, &light_ray, &L_light)) {
|
||||||
/* trace shadow ray */
|
/* trace shadow ray */
|
||||||
if(!shadow_blocked(kg, &state, &light_ray, &isect, &L_light))
|
float3 shadow;
|
||||||
|
|
||||||
|
if(!shadow_blocked(kg, &state, &light_ray, &shadow)) {
|
||||||
|
/* accumulate */
|
||||||
|
bsdf_eval_mul(&L_light, shadow);
|
||||||
path_radiance_accum_light(&L, throughput, &L_light, state.bounce);
|
path_radiance_accum_light(&L, throughput, &L_light, state.bounce);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#ifdef __MULTI_LIGHT__
|
#ifdef __MULTI_LIGHT__
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ CCL_NAMESPACE_BEGIN
|
|||||||
#define __TRANSPARENT_SHADOWS__
|
#define __TRANSPARENT_SHADOWS__
|
||||||
#define __PASSES__
|
#define __PASSES__
|
||||||
#define __BACKGROUND_MIS__
|
#define __BACKGROUND_MIS__
|
||||||
|
#define __AO__
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//#define __MULTI_LIGHT__
|
//#define __MULTI_LIGHT__
|
||||||
@@ -172,7 +173,8 @@ typedef enum PassType {
|
|||||||
PASS_GLOSSY_DIRECT = 16384,
|
PASS_GLOSSY_DIRECT = 16384,
|
||||||
PASS_TRANSMISSION_DIRECT = 32768,
|
PASS_TRANSMISSION_DIRECT = 32768,
|
||||||
PASS_EMISSION = 65536,
|
PASS_EMISSION = 65536,
|
||||||
PASS_BACKGROUND = 131072
|
PASS_BACKGROUND = 131072,
|
||||||
|
PASS_AO = 262144
|
||||||
} PassType;
|
} PassType;
|
||||||
|
|
||||||
#define PASS_ALL (~0)
|
#define PASS_ALL (~0)
|
||||||
@@ -186,6 +188,7 @@ typedef struct PathRadiance {
|
|||||||
|
|
||||||
float3 emission;
|
float3 emission;
|
||||||
float3 background;
|
float3 background;
|
||||||
|
float3 ao;
|
||||||
|
|
||||||
float3 indirect;
|
float3 indirect;
|
||||||
float3 direct_throughput;
|
float3 direct_throughput;
|
||||||
@@ -237,9 +240,18 @@ typedef enum LightType {
|
|||||||
LIGHT_POINT,
|
LIGHT_POINT,
|
||||||
LIGHT_DISTANT,
|
LIGHT_DISTANT,
|
||||||
LIGHT_BACKGROUND,
|
LIGHT_BACKGROUND,
|
||||||
LIGHT_AREA
|
LIGHT_AREA,
|
||||||
|
LIGHT_AO
|
||||||
} LightType;
|
} LightType;
|
||||||
|
|
||||||
|
/* Camera Type */
|
||||||
|
|
||||||
|
enum CameraType {
|
||||||
|
CAMERA_PERSPECTIVE,
|
||||||
|
CAMERA_ORTHOGRAPHIC,
|
||||||
|
CAMERA_ENVIRONMENT
|
||||||
|
};
|
||||||
|
|
||||||
/* Differential */
|
/* Differential */
|
||||||
|
|
||||||
typedef struct differential3 {
|
typedef struct differential3 {
|
||||||
@@ -387,7 +399,7 @@ typedef struct ShaderData {
|
|||||||
|
|
||||||
typedef struct KernelCamera {
|
typedef struct KernelCamera {
|
||||||
/* type */
|
/* type */
|
||||||
int ortho;
|
int type;
|
||||||
int pad1, pad2, pad3;
|
int pad1, pad2, pad3;
|
||||||
|
|
||||||
/* matrices */
|
/* matrices */
|
||||||
@@ -450,7 +462,7 @@ typedef struct KernelFilm {
|
|||||||
|
|
||||||
int pass_emission;
|
int pass_emission;
|
||||||
int pass_background;
|
int pass_background;
|
||||||
int pass_pad1;
|
int pass_ao;
|
||||||
int pass_pad2;
|
int pass_pad2;
|
||||||
} KernelFilm;
|
} KernelFilm;
|
||||||
|
|
||||||
@@ -458,7 +470,10 @@ typedef struct KernelBackground {
|
|||||||
/* only shader index */
|
/* only shader index */
|
||||||
int shader;
|
int shader;
|
||||||
int transparent;
|
int transparent;
|
||||||
int pad1, pad2;
|
|
||||||
|
/* ambient occlusion */
|
||||||
|
float ao_factor;
|
||||||
|
float ao_distance;
|
||||||
} KernelBackground;
|
} KernelBackground;
|
||||||
|
|
||||||
typedef struct KernelSunSky {
|
typedef struct KernelSunSky {
|
||||||
@@ -474,6 +489,7 @@ typedef struct KernelSunSky {
|
|||||||
typedef struct KernelIntegrator {
|
typedef struct KernelIntegrator {
|
||||||
/* emission */
|
/* emission */
|
||||||
int use_direct_light;
|
int use_direct_light;
|
||||||
|
int use_ambient_occlusion;
|
||||||
int num_distribution;
|
int num_distribution;
|
||||||
int num_all_lights;
|
int num_all_lights;
|
||||||
float pdf_triangles;
|
float pdf_triangles;
|
||||||
@@ -501,7 +517,7 @@ typedef struct KernelIntegrator {
|
|||||||
|
|
||||||
/* render layer */
|
/* render layer */
|
||||||
int layer_flag;
|
int layer_flag;
|
||||||
int pad1, pad2, pad3;
|
int pad1, pad2;
|
||||||
} KernelIntegrator;
|
} KernelIntegrator;
|
||||||
|
|
||||||
typedef struct KernelBVH {
|
typedef struct KernelBVH {
|
||||||
|
|||||||
@@ -101,9 +101,9 @@ ustring Attribute::standard_name(Attribute::Standard std)
|
|||||||
|
|
||||||
/* Attribute Set */
|
/* Attribute Set */
|
||||||
|
|
||||||
AttributeSet::AttributeSet(Mesh *mesh_)
|
AttributeSet::AttributeSet()
|
||||||
{
|
{
|
||||||
mesh = mesh_;
|
mesh = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
AttributeSet::~AttributeSet()
|
AttributeSet::~AttributeSet()
|
||||||
@@ -133,7 +133,8 @@ Attribute *AttributeSet::add(ustring name, TypeDesc type, Attribute::Element ele
|
|||||||
else if(element == Attribute::CORNER)
|
else if(element == Attribute::CORNER)
|
||||||
attr->set(name, type, element);
|
attr->set(name, type, element);
|
||||||
|
|
||||||
attr->reserve(mesh->verts.size(), mesh->triangles.size());
|
if(mesh)
|
||||||
|
attr->reserve(mesh->verts.size(), mesh->triangles.size());
|
||||||
|
|
||||||
return attr;
|
return attr;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ public:
|
|||||||
Mesh *mesh;
|
Mesh *mesh;
|
||||||
list<Attribute> attributes;
|
list<Attribute> attributes;
|
||||||
|
|
||||||
AttributeSet(Mesh *mesh);
|
AttributeSet();
|
||||||
~AttributeSet();
|
~AttributeSet();
|
||||||
|
|
||||||
Attribute *add(ustring name, TypeDesc type, Attribute::Element element);
|
Attribute *add(ustring name, TypeDesc type, Attribute::Element element);
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
#include "background.h"
|
#include "background.h"
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
|
#include "integrator.h"
|
||||||
#include "graph.h"
|
#include "graph.h"
|
||||||
#include "nodes.h"
|
#include "nodes.h"
|
||||||
#include "scene.h"
|
#include "scene.h"
|
||||||
@@ -31,6 +32,9 @@ CCL_NAMESPACE_BEGIN
|
|||||||
|
|
||||||
Background::Background()
|
Background::Background()
|
||||||
{
|
{
|
||||||
|
ao_factor = 0.0f;
|
||||||
|
ao_distance = FLT_MAX;
|
||||||
|
|
||||||
transparent = false;
|
transparent = false;
|
||||||
need_update = true;
|
need_update = true;
|
||||||
}
|
}
|
||||||
@@ -48,6 +52,10 @@ void Background::device_update(Device *device, DeviceScene *dscene, Scene *scene
|
|||||||
|
|
||||||
/* set shader index and transparent option */
|
/* set shader index and transparent option */
|
||||||
KernelBackground *kbackground = &dscene->data.background;
|
KernelBackground *kbackground = &dscene->data.background;
|
||||||
|
|
||||||
|
kbackground->ao_factor = ao_factor;
|
||||||
|
kbackground->ao_distance = ao_distance;
|
||||||
|
|
||||||
kbackground->transparent = transparent;
|
kbackground->transparent = transparent;
|
||||||
kbackground->shader = scene->shader_manager->get_shader_id(scene->default_background);
|
kbackground->shader = scene->shader_manager->get_shader_id(scene->default_background);
|
||||||
|
|
||||||
@@ -60,11 +68,14 @@ void Background::device_free(Device *device, DeviceScene *dscene)
|
|||||||
|
|
||||||
bool Background::modified(const Background& background)
|
bool Background::modified(const Background& background)
|
||||||
{
|
{
|
||||||
return !(transparent == background.transparent);
|
return !(transparent == background.transparent &&
|
||||||
|
ao_factor == background.ao_factor &&
|
||||||
|
ao_distance == background.ao_distance);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Background::tag_update(Scene *scene)
|
void Background::tag_update(Scene *scene)
|
||||||
{
|
{
|
||||||
|
scene->integrator->tag_update(scene);
|
||||||
need_update = true;
|
need_update = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,9 @@ class Scene;
|
|||||||
|
|
||||||
class Background {
|
class Background {
|
||||||
public:
|
public:
|
||||||
|
float ao_factor;
|
||||||
|
float ao_distance;
|
||||||
|
|
||||||
bool transparent;
|
bool transparent;
|
||||||
bool need_update;
|
bool need_update;
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ Camera::Camera()
|
|||||||
|
|
||||||
matrix = transform_identity();
|
matrix = transform_identity();
|
||||||
|
|
||||||
ortho = false;
|
type = CAMERA_PERSPECTIVE;
|
||||||
fov = M_PI_F/4.0f;
|
fov = M_PI_F/4.0f;
|
||||||
|
|
||||||
nearclip = 1e-5f;
|
nearclip = 1e-5f;
|
||||||
@@ -77,17 +77,21 @@ void Camera::update()
|
|||||||
Transform ndctoraster = transform_scale(width, height, 1.0f);
|
Transform ndctoraster = transform_scale(width, height, 1.0f);
|
||||||
|
|
||||||
/* raster to screen */
|
/* raster to screen */
|
||||||
Transform screentoraster = ndctoraster *
|
Transform screentoraster = ndctoraster;
|
||||||
|
|
||||||
|
screentoraster = ndctoraster *
|
||||||
transform_scale(1.0f/(right - left), 1.0f/(top - bottom), 1.0f) *
|
transform_scale(1.0f/(right - left), 1.0f/(top - bottom), 1.0f) *
|
||||||
transform_translate(-left, -bottom, 0.0f);
|
transform_translate(-left, -bottom, 0.0f);
|
||||||
|
|
||||||
Transform rastertoscreen = transform_inverse(screentoraster);
|
Transform rastertoscreen = transform_inverse(screentoraster);
|
||||||
|
|
||||||
/* screen to camera */
|
/* screen to camera */
|
||||||
if(ortho)
|
if(type == CAMERA_PERSPECTIVE)
|
||||||
|
screentocamera = transform_inverse(transform_perspective(fov, nearclip, farclip));
|
||||||
|
else if(type == CAMERA_ORTHOGRAPHIC)
|
||||||
screentocamera = transform_inverse(transform_orthographic(nearclip, farclip));
|
screentocamera = transform_inverse(transform_orthographic(nearclip, farclip));
|
||||||
else
|
else
|
||||||
screentocamera = transform_inverse(transform_perspective(fov, nearclip, farclip));
|
screentocamera = transform_identity();
|
||||||
|
|
||||||
rastertocamera = screentocamera * rastertoscreen;
|
rastertocamera = screentocamera * rastertoscreen;
|
||||||
|
|
||||||
@@ -98,16 +102,20 @@ void Camera::update()
|
|||||||
worldtoraster = transform_inverse(rastertoworld);
|
worldtoraster = transform_inverse(rastertoworld);
|
||||||
|
|
||||||
/* differentials */
|
/* differentials */
|
||||||
if(ortho) {
|
if(type == CAMERA_ORTHOGRAPHIC) {
|
||||||
dx = transform_direction(&rastertocamera, make_float3(1, 0, 0));
|
dx = transform_direction(&rastertocamera, make_float3(1, 0, 0));
|
||||||
dy = transform_direction(&rastertocamera, make_float3(0, 1, 0));
|
dy = transform_direction(&rastertocamera, make_float3(0, 1, 0));
|
||||||
}
|
}
|
||||||
else {
|
else if(type == CAMERA_PERSPECTIVE) {
|
||||||
dx = transform(&rastertocamera, make_float3(1, 0, 0)) -
|
dx = transform(&rastertocamera, make_float3(1, 0, 0)) -
|
||||||
transform(&rastertocamera, make_float3(0, 0, 0));
|
transform(&rastertocamera, make_float3(0, 0, 0));
|
||||||
dy = transform(&rastertocamera, make_float3(0, 1, 0)) -
|
dy = transform(&rastertocamera, make_float3(0, 1, 0)) -
|
||||||
transform(&rastertocamera, make_float3(0, 0, 0));
|
transform(&rastertocamera, make_float3(0, 0, 0));
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
dx = make_float3(0, 0, 0);
|
||||||
|
dy = make_float3(0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
dx = transform_direction(&cameratoworld, dx);
|
dx = transform_direction(&cameratoworld, dx);
|
||||||
dy = transform_direction(&cameratoworld, dy);
|
dy = transform_direction(&cameratoworld, dy);
|
||||||
@@ -147,7 +155,7 @@ void Camera::device_update(Device *device, DeviceScene *dscene)
|
|||||||
kcam->shutterclose = shutterclose;
|
kcam->shutterclose = shutterclose;
|
||||||
|
|
||||||
/* type */
|
/* type */
|
||||||
kcam->ortho = ortho;
|
kcam->type = type;
|
||||||
|
|
||||||
/* store differentials */
|
/* store differentials */
|
||||||
kcam->dx = float3_to_float4(dx);
|
kcam->dx = float3_to_float4(dx);
|
||||||
@@ -173,7 +181,7 @@ bool Camera::modified(const Camera& cam)
|
|||||||
(blades == cam.blades) &&
|
(blades == cam.blades) &&
|
||||||
(bladesrotation == cam.bladesrotation) &&
|
(bladesrotation == cam.bladesrotation) &&
|
||||||
(focaldistance == cam.focaldistance) &&
|
(focaldistance == cam.focaldistance) &&
|
||||||
(ortho == cam.ortho) &&
|
(type == cam.type) &&
|
||||||
(fov == cam.fov) &&
|
(fov == cam.fov) &&
|
||||||
(nearclip == cam.nearclip) &&
|
(nearclip == cam.nearclip) &&
|
||||||
(farclip == cam.farclip) &&
|
(farclip == cam.farclip) &&
|
||||||
|
|||||||
@@ -19,6 +19,8 @@
|
|||||||
#ifndef __CAMERA_H__
|
#ifndef __CAMERA_H__
|
||||||
#define __CAMERA_H__
|
#define __CAMERA_H__
|
||||||
|
|
||||||
|
#include "kernel_types.h"
|
||||||
|
|
||||||
#include "util_transform.h"
|
#include "util_transform.h"
|
||||||
#include "util_types.h"
|
#include "util_types.h"
|
||||||
|
|
||||||
@@ -44,8 +46,8 @@ public:
|
|||||||
uint blades;
|
uint blades;
|
||||||
float bladesrotation;
|
float bladesrotation;
|
||||||
|
|
||||||
/* orthographic/perspective */
|
/* type */
|
||||||
bool ortho;
|
CameraType type;
|
||||||
float fov;
|
float fov;
|
||||||
|
|
||||||
/* clipping */
|
/* clipping */
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
#include "camera.h"
|
#include "camera.h"
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
#include "film.h"
|
#include "film.h"
|
||||||
|
#include "integrator.h"
|
||||||
#include "scene.h"
|
#include "scene.h"
|
||||||
|
|
||||||
#include "util_algorithm.h"
|
#include "util_algorithm.h"
|
||||||
@@ -111,6 +112,10 @@ void Pass::add(PassType type, vector<Pass>& passes)
|
|||||||
pass.components = 4;
|
pass.components = 4;
|
||||||
pass.exposure = true;
|
pass.exposure = true;
|
||||||
break;
|
break;
|
||||||
|
case PASS_AO:
|
||||||
|
pass.components = 4;
|
||||||
|
pass.exposure = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
passes.push_back(pass);
|
passes.push_back(pass);
|
||||||
@@ -224,6 +229,9 @@ void Film::device_update(Device *device, DeviceScene *dscene)
|
|||||||
case PASS_BACKGROUND:
|
case PASS_BACKGROUND:
|
||||||
kfilm->pass_background = kfilm->pass_stride;
|
kfilm->pass_background = kfilm->pass_stride;
|
||||||
kfilm->use_light_pass = 1;
|
kfilm->use_light_pass = 1;
|
||||||
|
case PASS_AO:
|
||||||
|
kfilm->pass_ao = kfilm->pass_stride;
|
||||||
|
kfilm->use_light_pass = 1;
|
||||||
case PASS_NONE:
|
case PASS_NONE:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -248,6 +256,7 @@ bool Film::modified(const Film& film)
|
|||||||
|
|
||||||
void Film::tag_update(Scene *scene)
|
void Film::tag_update(Scene *scene)
|
||||||
{
|
{
|
||||||
|
scene->integrator->tag_update(scene);
|
||||||
need_update = true;
|
need_update = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -83,6 +83,9 @@ void Integrator::device_update(Device *device, DeviceScene *dscene)
|
|||||||
kintegrator->seed = hash_int(seed);
|
kintegrator->seed = hash_int(seed);
|
||||||
kintegrator->layer_flag = layer_flag << PATH_RAY_LAYER_SHIFT;
|
kintegrator->layer_flag = layer_flag << PATH_RAY_LAYER_SHIFT;
|
||||||
|
|
||||||
|
kintegrator->use_ambient_occlusion =
|
||||||
|
((dscene->data.film.pass_flag & PASS_AO) || dscene->data.background.ao_factor != 0.0f);
|
||||||
|
|
||||||
/* sobol directions table */
|
/* sobol directions table */
|
||||||
int dimensions = PRNG_BASE_NUM + (max_bounce + transparent_max_bounce + 2)*PRNG_BOUNCE_NUM;
|
int dimensions = PRNG_BASE_NUM + (max_bounce + transparent_max_bounce + 2)*PRNG_BOUNCE_NUM;
|
||||||
uint *directions = dscene->sobol_directions.resize(SOBOL_BITS*dimensions);
|
uint *directions = dscene->sobol_directions.resize(SOBOL_BITS*dimensions);
|
||||||
|
|||||||
@@ -45,9 +45,8 @@ static void dump_background_pixels(Device *device, DeviceScene *dscene, int res,
|
|||||||
for(int x = 0; x < width; x++) {
|
for(int x = 0; x < width; x++) {
|
||||||
float u = x/(float)width;
|
float u = x/(float)width;
|
||||||
float v = y/(float)height;
|
float v = y/(float)height;
|
||||||
float3 D = -equirectangular_to_direction(u, v);
|
|
||||||
|
|
||||||
uint4 in = make_uint4(__float_as_int(D.x), __float_as_int(D.y), __float_as_int(D.z), 0);
|
uint4 in = make_uint4(__float_as_int(u), __float_as_int(v), 0, 0);
|
||||||
d_input_data[x + y*width] = in;
|
d_input_data[x + y*width] = in;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,6 @@ CCL_NAMESPACE_BEGIN
|
|||||||
/* Mesh */
|
/* Mesh */
|
||||||
|
|
||||||
Mesh::Mesh()
|
Mesh::Mesh()
|
||||||
: attributes(this)
|
|
||||||
{
|
{
|
||||||
need_update = true;
|
need_update = true;
|
||||||
transform_applied = false;
|
transform_applied = false;
|
||||||
@@ -49,6 +48,8 @@ Mesh::Mesh()
|
|||||||
|
|
||||||
tri_offset = 0;
|
tri_offset = 0;
|
||||||
vert_offset = 0;
|
vert_offset = 0;
|
||||||
|
|
||||||
|
attributes.mesh = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Mesh::~Mesh()
|
Mesh::~Mesh()
|
||||||
|
|||||||
@@ -152,13 +152,13 @@ void Scene::device_update(Device *device_, Progress& progress)
|
|||||||
|
|
||||||
if(progress.get_cancel()) return;
|
if(progress.get_cancel()) return;
|
||||||
|
|
||||||
progress.set_status("Updating Integrator");
|
progress.set_status("Updating Film");
|
||||||
integrator->device_update(device, &dscene);
|
film->device_update(device, &dscene);
|
||||||
|
|
||||||
if(progress.get_cancel()) return;
|
if(progress.get_cancel()) return;
|
||||||
|
|
||||||
progress.set_status("Updating Film");
|
progress.set_status("Updating Integrator");
|
||||||
film->device_update(device, &dscene);
|
integrator->device_update(device, &dscene);
|
||||||
|
|
||||||
if(progress.get_cancel()) return;
|
if(progress.get_cancel()) return;
|
||||||
|
|
||||||
|
|||||||
@@ -156,6 +156,7 @@ public:
|
|||||||
int default_surface;
|
int default_surface;
|
||||||
int default_light;
|
int default_light;
|
||||||
int default_background;
|
int default_background;
|
||||||
|
int default_holdout;
|
||||||
|
|
||||||
/* device */
|
/* device */
|
||||||
Device *device;
|
Device *device;
|
||||||
|
|||||||
@@ -256,6 +256,22 @@ void ShaderManager::add_default(Scene *scene)
|
|||||||
scene->shaders.push_back(shader);
|
scene->shaders.push_back(shader);
|
||||||
scene->default_background = scene->shaders.size() - 1;
|
scene->default_background = scene->shaders.size() - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* default holdout */
|
||||||
|
{
|
||||||
|
graph = new ShaderGraph();
|
||||||
|
|
||||||
|
closure = graph->add(new HoldoutNode());
|
||||||
|
out = graph->output();
|
||||||
|
|
||||||
|
graph->connect(closure->output("Holdout"), out->input("Surface"));
|
||||||
|
|
||||||
|
shader = new Shader();
|
||||||
|
shader->name = "default_holdout";
|
||||||
|
shader->graph = graph;
|
||||||
|
scene->shaders.push_back(shader);
|
||||||
|
scene->default_holdout = scene->shaders.size() - 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CCL_NAMESPACE_END
|
CCL_NAMESPACE_END
|
||||||
|
|||||||
@@ -235,6 +235,9 @@ int clLibraryInit()
|
|||||||
__clewEnqueueBarrier = (PFNCLENQUEUEBARRIER )CLCC_DYNLIB_IMPORT(module, "clEnqueueBarrier");
|
__clewEnqueueBarrier = (PFNCLENQUEUEBARRIER )CLCC_DYNLIB_IMPORT(module, "clEnqueueBarrier");
|
||||||
__clewGetExtensionFunctionAddress = (PFNCLGETEXTENSIONFUNCTIONADDRESS )CLCC_DYNLIB_IMPORT(module, "clGetExtensionFunctionAddress");
|
__clewGetExtensionFunctionAddress = (PFNCLGETEXTENSIONFUNCTIONADDRESS )CLCC_DYNLIB_IMPORT(module, "clGetExtensionFunctionAddress");
|
||||||
|
|
||||||
|
if(__clewGetPlatformIDs == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ private :
|
|||||||
MT_Vector3
|
MT_Vector3
|
||||||
ComputeNormal(
|
ComputeNormal(
|
||||||
const LOD_TriFace &face
|
const LOD_TriFace &face
|
||||||
) const ;
|
) const;
|
||||||
|
|
||||||
const
|
const
|
||||||
MT_Vector3
|
MT_Vector3
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ private :
|
|||||||
MT_Vector3
|
MT_Vector3
|
||||||
ComputeNormal(
|
ComputeNormal(
|
||||||
const LOD_TriFace &face
|
const LOD_TriFace &face
|
||||||
) const ;
|
) const;
|
||||||
|
|
||||||
const
|
const
|
||||||
MT_Vector3
|
MT_Vector3
|
||||||
|
|||||||
@@ -76,11 +76,11 @@ public:
|
|||||||
|
|
||||||
std::vector<LOD_Vertex> &
|
std::vector<LOD_Vertex> &
|
||||||
VertexSet(
|
VertexSet(
|
||||||
) const ;
|
) const;
|
||||||
|
|
||||||
std::vector<LOD_TriFace> &
|
std::vector<LOD_TriFace> &
|
||||||
FaceSet(
|
FaceSet(
|
||||||
) const ;
|
) const;
|
||||||
|
|
||||||
std::vector<LOD_Edge> &
|
std::vector<LOD_Edge> &
|
||||||
EdgeSet(
|
EdgeSet(
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ public :
|
|||||||
bool m_select_tag;
|
bool m_select_tag;
|
||||||
|
|
||||||
LOD_Vertex(
|
LOD_Vertex(
|
||||||
) ;
|
);
|
||||||
|
|
||||||
bool
|
bool
|
||||||
RemoveEdge(
|
RemoveEdge(
|
||||||
@@ -109,13 +109,13 @@ public :
|
|||||||
LOD_FaceInd
|
LOD_FaceInd
|
||||||
OpFace(
|
OpFace(
|
||||||
LOD_FaceInd f
|
LOD_FaceInd f
|
||||||
) const ;
|
) const;
|
||||||
|
|
||||||
void
|
void
|
||||||
SwapFace(
|
SwapFace(
|
||||||
LOD_FaceInd old_f,
|
LOD_FaceInd old_f,
|
||||||
LOD_FaceInd new_f
|
LOD_FaceInd new_f
|
||||||
) ;
|
);
|
||||||
|
|
||||||
|
|
||||||
// return the half edge face - the half edge is defined
|
// return the half edge face - the half edge is defined
|
||||||
@@ -139,11 +139,11 @@ public :
|
|||||||
SwapVertex(
|
SwapVertex(
|
||||||
LOD_VertexInd v_old,
|
LOD_VertexInd v_old,
|
||||||
LOD_VertexInd v_new
|
LOD_VertexInd v_new
|
||||||
) ;
|
);
|
||||||
|
|
||||||
bool
|
bool
|
||||||
SelectTag(
|
SelectTag(
|
||||||
) const ;
|
) const;
|
||||||
|
|
||||||
void
|
void
|
||||||
SetSelectTag(
|
SetSelectTag(
|
||||||
@@ -157,7 +157,7 @@ public :
|
|||||||
void
|
void
|
||||||
SetOpenTag(
|
SetOpenTag(
|
||||||
int tag
|
int tag
|
||||||
) ;
|
);
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Degenerate(
|
Degenerate(
|
||||||
|
|||||||
@@ -494,7 +494,7 @@ extern void GHOST_SetTimerTaskUserData(GHOST_TimerTaskHandle timertaskhandle,
|
|||||||
* @param windowhandle The handle to the window
|
* @param windowhandle The handle to the window
|
||||||
* @return The validity of the window.
|
* @return The validity of the window.
|
||||||
*/
|
*/
|
||||||
extern int GHOST_GetValid(GHOST_WindowHandle windowhandle) ;
|
extern int GHOST_GetValid(GHOST_WindowHandle windowhandle);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the type of drawing context used in this window.
|
* Returns the type of drawing context used in this window.
|
||||||
@@ -592,7 +592,7 @@ extern void GHOST_ScreenToClient(GHOST_WindowHandle windowhandle,
|
|||||||
GHOST_TInt32 inX,
|
GHOST_TInt32 inX,
|
||||||
GHOST_TInt32 inY,
|
GHOST_TInt32 inY,
|
||||||
GHOST_TInt32* outX,
|
GHOST_TInt32* outX,
|
||||||
GHOST_TInt32* outY) ;
|
GHOST_TInt32* outY);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts a point in screen coordinates to client rectangle coordinates
|
* Converts a point in screen coordinates to client rectangle coordinates
|
||||||
|
|||||||
@@ -66,6 +66,11 @@ static const char* ndof_button_names[] = {
|
|||||||
"NDOF_BUTTON_DOMINANT",
|
"NDOF_BUTTON_DOMINANT",
|
||||||
"NDOF_BUTTON_PLUS",
|
"NDOF_BUTTON_PLUS",
|
||||||
"NDOF_BUTTON_MINUS",
|
"NDOF_BUTTON_MINUS",
|
||||||
|
// keyboard emulation
|
||||||
|
"NDOF_BUTTON_ESC",
|
||||||
|
"NDOF_BUTTON_ALT",
|
||||||
|
"NDOF_BUTTON_SHIFT",
|
||||||
|
"NDOF_BUTTON_CTRL",
|
||||||
// general-purpose buttons
|
// general-purpose buttons
|
||||||
"NDOF_BUTTON_1",
|
"NDOF_BUTTON_1",
|
||||||
"NDOF_BUTTON_2",
|
"NDOF_BUTTON_2",
|
||||||
@@ -86,30 +91,10 @@ static const char* ndof_button_names[] = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const NDOF_ButtonT SpaceNavigator_HID_map[] = {
|
// shared by the latest 3Dconnexion hardware
|
||||||
NDOF_BUTTON_MENU,
|
// SpacePilotPro uses all of these
|
||||||
NDOF_BUTTON_FIT
|
// smaller devices use only some, based on button mask
|
||||||
};
|
static const NDOF_ButtonT Modern3Dx_HID_map[] = {
|
||||||
|
|
||||||
static const NDOF_ButtonT SpaceExplorer_HID_map[] = {
|
|
||||||
NDOF_BUTTON_1,
|
|
||||||
NDOF_BUTTON_2,
|
|
||||||
NDOF_BUTTON_TOP,
|
|
||||||
NDOF_BUTTON_LEFT,
|
|
||||||
NDOF_BUTTON_RIGHT,
|
|
||||||
NDOF_BUTTON_FRONT,
|
|
||||||
NDOF_BUTTON_NONE, // esc key
|
|
||||||
NDOF_BUTTON_NONE, // alt key
|
|
||||||
NDOF_BUTTON_NONE, // shift key
|
|
||||||
NDOF_BUTTON_NONE, // ctrl key
|
|
||||||
NDOF_BUTTON_FIT,
|
|
||||||
NDOF_BUTTON_MENU,
|
|
||||||
NDOF_BUTTON_PLUS,
|
|
||||||
NDOF_BUTTON_MINUS,
|
|
||||||
NDOF_BUTTON_ROTATE
|
|
||||||
};
|
|
||||||
|
|
||||||
static const NDOF_ButtonT SpacePilotPro_HID_map[] = {
|
|
||||||
NDOF_BUTTON_MENU,
|
NDOF_BUTTON_MENU,
|
||||||
NDOF_BUTTON_FIT,
|
NDOF_BUTTON_FIT,
|
||||||
NDOF_BUTTON_TOP,
|
NDOF_BUTTON_TOP,
|
||||||
@@ -132,10 +117,10 @@ static const NDOF_ButtonT SpacePilotPro_HID_map[] = {
|
|||||||
NDOF_BUTTON_8,
|
NDOF_BUTTON_8,
|
||||||
NDOF_BUTTON_9,
|
NDOF_BUTTON_9,
|
||||||
NDOF_BUTTON_10,
|
NDOF_BUTTON_10,
|
||||||
NDOF_BUTTON_NONE, // esc key
|
NDOF_BUTTON_ESC,
|
||||||
NDOF_BUTTON_NONE, // alt key
|
NDOF_BUTTON_ALT,
|
||||||
NDOF_BUTTON_NONE, // shift key
|
NDOF_BUTTON_SHIFT,
|
||||||
NDOF_BUTTON_NONE, // ctrl key
|
NDOF_BUTTON_CTRL,
|
||||||
NDOF_BUTTON_ROTATE,
|
NDOF_BUTTON_ROTATE,
|
||||||
NDOF_BUTTON_PANZOOM,
|
NDOF_BUTTON_PANZOOM,
|
||||||
NDOF_BUTTON_DOMINANT,
|
NDOF_BUTTON_DOMINANT,
|
||||||
@@ -143,35 +128,22 @@ static const NDOF_ButtonT SpacePilotPro_HID_map[] = {
|
|||||||
NDOF_BUTTON_MINUS
|
NDOF_BUTTON_MINUS
|
||||||
};
|
};
|
||||||
|
|
||||||
// latest HW: button-compatible with SpacePilotPro, just fewer of them
|
static const NDOF_ButtonT SpaceExplorer_HID_map[] = {
|
||||||
static const NDOF_ButtonT SpaceMousePro_HID_map[] = {
|
|
||||||
NDOF_BUTTON_MENU,
|
|
||||||
NDOF_BUTTON_FIT,
|
|
||||||
NDOF_BUTTON_TOP,
|
|
||||||
NDOF_BUTTON_NONE, // left
|
|
||||||
NDOF_BUTTON_RIGHT,
|
|
||||||
NDOF_BUTTON_FRONT,
|
|
||||||
NDOF_BUTTON_NONE, // bottom
|
|
||||||
NDOF_BUTTON_NONE, // back
|
|
||||||
NDOF_BUTTON_ROLL_CW,
|
|
||||||
NDOF_BUTTON_NONE, // roll ccw
|
|
||||||
NDOF_BUTTON_NONE, // iso 1
|
|
||||||
NDOF_BUTTON_NONE, // iso 2
|
|
||||||
NDOF_BUTTON_1,
|
NDOF_BUTTON_1,
|
||||||
NDOF_BUTTON_2,
|
NDOF_BUTTON_2,
|
||||||
NDOF_BUTTON_3,
|
NDOF_BUTTON_TOP,
|
||||||
NDOF_BUTTON_4,
|
NDOF_BUTTON_LEFT,
|
||||||
NDOF_BUTTON_NONE, // 5
|
NDOF_BUTTON_RIGHT,
|
||||||
NDOF_BUTTON_NONE, // 6
|
NDOF_BUTTON_FRONT,
|
||||||
NDOF_BUTTON_NONE, // 7
|
NDOF_BUTTON_ESC,
|
||||||
NDOF_BUTTON_NONE, // 8
|
NDOF_BUTTON_ALT,
|
||||||
NDOF_BUTTON_NONE, // 9
|
NDOF_BUTTON_SHIFT,
|
||||||
NDOF_BUTTON_NONE, // 10
|
NDOF_BUTTON_CTRL,
|
||||||
NDOF_BUTTON_NONE, // esc key
|
NDOF_BUTTON_FIT,
|
||||||
NDOF_BUTTON_NONE, // alt key
|
NDOF_BUTTON_MENU,
|
||||||
NDOF_BUTTON_NONE, // shift key
|
NDOF_BUTTON_PLUS,
|
||||||
NDOF_BUTTON_NONE, // ctrl key
|
NDOF_BUTTON_MINUS,
|
||||||
NDOF_BUTTON_ROTATE,
|
NDOF_BUTTON_ROTATE
|
||||||
};
|
};
|
||||||
|
|
||||||
/* this is the older SpacePilot (sans Pro)
|
/* this is the older SpacePilot (sans Pro)
|
||||||
@@ -187,10 +159,10 @@ static const NDOF_ButtonT SpacePilot_HID_map[] = {
|
|||||||
NDOF_BUTTON_LEFT,
|
NDOF_BUTTON_LEFT,
|
||||||
NDOF_BUTTON_RIGHT,
|
NDOF_BUTTON_RIGHT,
|
||||||
NDOF_BUTTON_FRONT,
|
NDOF_BUTTON_FRONT,
|
||||||
NDOF_BUTTON_NONE, // esc key
|
NDOF_BUTTON_ESC,
|
||||||
NDOF_BUTTON_NONE, // alt key
|
NDOF_BUTTON_ALT,
|
||||||
NDOF_BUTTON_NONE, // shift key
|
NDOF_BUTTON_SHIFT,
|
||||||
NDOF_BUTTON_NONE, // ctrl key
|
NDOF_BUTTON_CTRL,
|
||||||
NDOF_BUTTON_FIT,
|
NDOF_BUTTON_FIT,
|
||||||
NDOF_BUTTON_MENU,
|
NDOF_BUTTON_MENU,
|
||||||
NDOF_BUTTON_PLUS,
|
NDOF_BUTTON_PLUS,
|
||||||
@@ -200,9 +172,7 @@ static const NDOF_ButtonT SpacePilot_HID_map[] = {
|
|||||||
NDOF_BUTTON_NONE // the CONFIG button -- what does it do?
|
NDOF_BUTTON_NONE // the CONFIG button -- what does it do?
|
||||||
};
|
};
|
||||||
|
|
||||||
/* this is the older Spaceball 5000 USB
|
static const NDOF_ButtonT Generic_HID_map[] = {
|
||||||
* thanks to Tehrasha Darkon for info about this device */
|
|
||||||
static const NDOF_ButtonT Spaceball5000_HID_map[] = {
|
|
||||||
NDOF_BUTTON_1,
|
NDOF_BUTTON_1,
|
||||||
NDOF_BUTTON_2,
|
NDOF_BUTTON_2,
|
||||||
NDOF_BUTTON_3,
|
NDOF_BUTTON_3,
|
||||||
@@ -217,11 +187,14 @@ static const NDOF_ButtonT Spaceball5000_HID_map[] = {
|
|||||||
NDOF_BUTTON_C
|
NDOF_BUTTON_C
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const int genericButtonCount = sizeof(Generic_HID_map) / sizeof(NDOF_ButtonT);
|
||||||
|
|
||||||
GHOST_NDOFManager::GHOST_NDOFManager(GHOST_System& sys)
|
GHOST_NDOFManager::GHOST_NDOFManager(GHOST_System& sys)
|
||||||
: m_system(sys)
|
: m_system(sys)
|
||||||
, m_deviceType(NDOF_UnknownDevice) // each platform has its own device detection code
|
, m_deviceType(NDOF_UnknownDevice) // each platform has its own device detection code
|
||||||
, m_buttonCount(0)
|
, m_buttonCount(genericButtonCount)
|
||||||
, m_buttonMask(0)
|
, m_buttonMask(0)
|
||||||
|
, m_hidMap(Generic_HID_map)
|
||||||
, m_buttons(0)
|
, m_buttons(0)
|
||||||
, m_motionTime(0)
|
, m_motionTime(0)
|
||||||
, m_prevMotionTime(0)
|
, m_prevMotionTime(0)
|
||||||
@@ -237,38 +210,53 @@ GHOST_NDOFManager::GHOST_NDOFManager(GHOST_System& sys)
|
|||||||
|
|
||||||
bool GHOST_NDOFManager::setDevice(unsigned short vendor_id, unsigned short product_id)
|
bool GHOST_NDOFManager::setDevice(unsigned short vendor_id, unsigned short product_id)
|
||||||
{
|
{
|
||||||
// default to NDOF_UnknownDevice so rogue button events will get discarded
|
// call this function until it returns true
|
||||||
|
// it's a good idea to stop calling it after that, as it will "forget"
|
||||||
|
// whichever device it already found
|
||||||
|
|
||||||
|
// default to safe generic behavior for "unknown" devices
|
||||||
|
// unidentified devices will emit motion events like normal
|
||||||
|
// rogue buttons do nothing by default, but can be customized by the user
|
||||||
|
|
||||||
|
m_deviceType = NDOF_UnknownDevice;
|
||||||
|
m_hidMap = Generic_HID_map;
|
||||||
|
m_buttonCount = genericButtonCount;
|
||||||
|
m_buttonMask = 0;
|
||||||
|
|
||||||
// "mystery device" owners can help build a HID_map for their hardware
|
// "mystery device" owners can help build a HID_map for their hardware
|
||||||
|
// A few users have already contributed information about several older devices
|
||||||
|
// that I don't have access to. Thanks!
|
||||||
|
|
||||||
switch (vendor_id) {
|
switch (vendor_id) {
|
||||||
case 0x046D: // Logitech (3Dconnexion)
|
case 0x046D: // Logitech (3Dconnexion)
|
||||||
switch (product_id) {
|
switch (product_id) {
|
||||||
// -- current devices --
|
// -- current devices --
|
||||||
case 0xC626:
|
case 0xC626: // full-size SpaceNavigator
|
||||||
|
case 0xC628: // the "for Notebooks" one
|
||||||
puts("ndof: using SpaceNavigator");
|
puts("ndof: using SpaceNavigator");
|
||||||
m_deviceType = NDOF_SpaceNavigator;
|
m_deviceType = NDOF_SpaceNavigator;
|
||||||
m_buttonCount = 2;
|
m_buttonCount = 2;
|
||||||
break;
|
m_hidMap = Modern3Dx_HID_map;
|
||||||
case 0xC628:
|
|
||||||
puts("ndof: using SpaceNavigator for Notebooks");
|
|
||||||
m_deviceType = NDOF_SpaceNavigator; // for Notebooks
|
|
||||||
m_buttonCount = 2;
|
|
||||||
break;
|
break;
|
||||||
case 0xC627:
|
case 0xC627:
|
||||||
puts("ndof: using SpaceExplorer");
|
puts("ndof: using SpaceExplorer");
|
||||||
m_deviceType = NDOF_SpaceExplorer;
|
m_deviceType = NDOF_SpaceExplorer;
|
||||||
m_buttonCount = 15;
|
m_buttonCount = 15;
|
||||||
|
m_hidMap = SpaceExplorer_HID_map;
|
||||||
break;
|
break;
|
||||||
case 0xC629:
|
case 0xC629:
|
||||||
puts("ndof: using SpacePilot Pro");
|
puts("ndof: using SpacePilot Pro");
|
||||||
m_deviceType = NDOF_SpacePilotPro;
|
m_deviceType = NDOF_SpacePilotPro;
|
||||||
m_buttonCount = 31;
|
m_buttonCount = 31;
|
||||||
|
m_hidMap = Modern3Dx_HID_map;
|
||||||
break;
|
break;
|
||||||
case 0xC62B:
|
case 0xC62B:
|
||||||
puts("ndof: using SpaceMouse Pro");
|
puts("ndof: using SpaceMouse Pro");
|
||||||
m_deviceType = NDOF_SpaceMousePro;
|
m_deviceType = NDOF_SpaceMousePro;
|
||||||
m_buttonCount = 27;
|
m_buttonCount = 27;
|
||||||
// ^^ actually has 15 buttons, but their HID codes range from 0 to 26
|
// ^^ actually has 15 buttons, but their HID codes range from 0 to 26
|
||||||
|
m_buttonMask = 0x07C0F137;
|
||||||
|
m_hidMap = Modern3Dx_HID_map;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// -- older devices --
|
// -- older devices --
|
||||||
@@ -276,16 +264,16 @@ bool GHOST_NDOFManager::setDevice(unsigned short vendor_id, unsigned short produ
|
|||||||
puts("ndof: using SpacePilot");
|
puts("ndof: using SpacePilot");
|
||||||
m_deviceType = NDOF_SpacePilot;
|
m_deviceType = NDOF_SpacePilot;
|
||||||
m_buttonCount = 21;
|
m_buttonCount = 21;
|
||||||
|
m_hidMap = SpacePilot_HID_map;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xC621:
|
case 0xC621:
|
||||||
puts("ndof: using Spaceball 5000");
|
puts("ndof: using Spaceball 5000");
|
||||||
m_deviceType = NDOF_Spaceball5000;
|
m_deviceType = NDOF_Spaceball5000;
|
||||||
m_buttonCount = 12;
|
m_buttonCount = 12;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xC623:
|
case 0xC623:
|
||||||
puts("ndof: SpaceTraveler not supported, please file a bug report");
|
puts("ndof: using SpaceTraveler");
|
||||||
|
m_deviceType = NDOF_SpaceTraveler;
|
||||||
m_buttonCount = 8;
|
m_buttonCount = 8;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -297,20 +285,14 @@ bool GHOST_NDOFManager::setDevice(unsigned short vendor_id, unsigned short produ
|
|||||||
printf("ndof: unknown device %04hx:%04hx\n", vendor_id, product_id);
|
printf("ndof: unknown device %04hx:%04hx\n", vendor_id, product_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_deviceType == NDOF_UnknownDevice) {
|
if (m_buttonMask == 0)
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_buttonMask = ~(-1 << m_buttonCount);
|
m_buttonMask = ~(-1 << m_buttonCount);
|
||||||
|
|
||||||
// special case for SpaceMousePro? maybe...
|
|
||||||
|
|
||||||
#ifdef DEBUG_NDOF_BUTTONS
|
#ifdef DEBUG_NDOF_BUTTONS
|
||||||
printf("ndof: %d buttons -> hex:%X\n", m_buttonCount, m_buttonMask);
|
printf("ndof: %d buttons -> hex:%X\n", m_buttonCount, m_buttonMask);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return true;
|
return m_deviceType != NDOF_UnknownDevice;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GHOST_NDOFManager::updateTranslation(short t[3], GHOST_TUns64 time)
|
void GHOST_NDOFManager::updateTranslation(short t[3], GHOST_TUns64 time)
|
||||||
@@ -329,15 +311,8 @@ void GHOST_NDOFManager::updateRotation(short r[3], GHOST_TUns64 time)
|
|||||||
|
|
||||||
void GHOST_NDOFManager::sendButtonEvent(NDOF_ButtonT button, bool press, GHOST_TUns64 time, GHOST_IWindow* window)
|
void GHOST_NDOFManager::sendButtonEvent(NDOF_ButtonT button, bool press, GHOST_TUns64 time, GHOST_IWindow* window)
|
||||||
{
|
{
|
||||||
if (button == NDOF_BUTTON_NONE) {
|
GHOST_ASSERT(button > NDOF_BUTTON_NONE && button < NDOF_BUTTON_LAST,
|
||||||
// just being exceptionally cautious...
|
"rogue button trying to escape NDOF manager");
|
||||||
// air-tight button masking and proper function key emulation
|
|
||||||
// should guarantee we never get to this point
|
|
||||||
#ifdef DEBUG_NDOF_BUTTONS
|
|
||||||
printf("discarding NDOF_BUTTON_NONE (should not escape the NDOF manager)\n");
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
GHOST_EventNDOFButton* event = new GHOST_EventNDOFButton(time, window);
|
GHOST_EventNDOFButton* event = new GHOST_EventNDOFButton(time, window);
|
||||||
GHOST_TEventNDOFButtonData* data = (GHOST_TEventNDOFButtonData*) event->getData();
|
GHOST_TEventNDOFButtonData* data = (GHOST_TEventNDOFButtonData*) event->getData();
|
||||||
@@ -369,66 +344,23 @@ void GHOST_NDOFManager::updateButton(int button_number, bool press, GHOST_TUns64
|
|||||||
GHOST_IWindow* window = m_system.getWindowManager()->getActiveWindow();
|
GHOST_IWindow* window = m_system.getWindowManager()->getActiveWindow();
|
||||||
|
|
||||||
#ifdef DEBUG_NDOF_BUTTONS
|
#ifdef DEBUG_NDOF_BUTTONS
|
||||||
if (m_deviceType != NDOF_UnknownDevice)
|
printf("ndof: button %d -> ", button_number);
|
||||||
printf("ndof: button %d -> ", button_number);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
switch (m_deviceType) {
|
NDOF_ButtonT button = (button_number < m_buttonCount) ? m_hidMap[button_number] : NDOF_BUTTON_NONE;
|
||||||
case NDOF_SpaceNavigator:
|
|
||||||
sendButtonEvent(SpaceNavigator_HID_map[button_number], press, time, window);
|
switch (button)
|
||||||
|
{
|
||||||
|
case NDOF_BUTTON_NONE:
|
||||||
|
#ifdef DEBUG_NDOF_BUTTONS
|
||||||
|
printf("discarded\n");
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case NDOF_SpaceExplorer:
|
case NDOF_BUTTON_ESC: sendKeyEvent(GHOST_kKeyEsc, press, time, window); break;
|
||||||
switch (button_number) {
|
case NDOF_BUTTON_ALT: sendKeyEvent(GHOST_kKeyLeftAlt, press, time, window); break;
|
||||||
case 6: sendKeyEvent(GHOST_kKeyEsc, press, time, window); break;
|
case NDOF_BUTTON_SHIFT: sendKeyEvent(GHOST_kKeyLeftShift, press, time, window); break;
|
||||||
case 7: sendKeyEvent(GHOST_kKeyLeftAlt, press, time, window); break;
|
case NDOF_BUTTON_CTRL: sendKeyEvent(GHOST_kKeyLeftControl, press, time, window); break;
|
||||||
case 8: sendKeyEvent(GHOST_kKeyLeftShift, press, time, window); break;
|
default: sendButtonEvent(button, press, time, window);
|
||||||
case 9: sendKeyEvent(GHOST_kKeyLeftControl, press, time, window); break;
|
|
||||||
default: sendButtonEvent(SpaceExplorer_HID_map[button_number], press, time, window);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case NDOF_SpacePilotPro:
|
|
||||||
switch (button_number) {
|
|
||||||
case 22: sendKeyEvent(GHOST_kKeyEsc, press, time, window); break;
|
|
||||||
case 23: sendKeyEvent(GHOST_kKeyLeftAlt, press, time, window); break;
|
|
||||||
case 24: sendKeyEvent(GHOST_kKeyLeftShift, press, time, window); break;
|
|
||||||
case 25: sendKeyEvent(GHOST_kKeyLeftControl, press, time, window); break;
|
|
||||||
default: sendButtonEvent(SpacePilotPro_HID_map[button_number], press, time, window);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case NDOF_SpaceMousePro:
|
|
||||||
switch (button_number) {
|
|
||||||
case 22: sendKeyEvent(GHOST_kKeyEsc, press, time, window); break;
|
|
||||||
case 23: sendKeyEvent(GHOST_kKeyLeftAlt, press, time, window); break;
|
|
||||||
case 24: sendKeyEvent(GHOST_kKeyLeftShift, press, time, window); break;
|
|
||||||
case 25: sendKeyEvent(GHOST_kKeyLeftControl, press, time, window); break;
|
|
||||||
default: sendButtonEvent(SpaceMousePro_HID_map[button_number], press, time, window);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case NDOF_SpacePilot:
|
|
||||||
switch (button_number) {
|
|
||||||
case 10: sendKeyEvent(GHOST_kKeyEsc, press, time, window); break;
|
|
||||||
case 11: sendKeyEvent(GHOST_kKeyLeftAlt, press, time, window); break;
|
|
||||||
case 12: sendKeyEvent(GHOST_kKeyLeftShift, press, time, window); break;
|
|
||||||
case 13: sendKeyEvent(GHOST_kKeyLeftControl, press, time, window); break;
|
|
||||||
case 20: puts("ndof: ignoring CONFIG button"); break;
|
|
||||||
default: sendButtonEvent(SpacePilot_HID_map[button_number], press, time, window);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case NDOF_Spaceball5000:
|
|
||||||
// has no special 'keyboard' buttons
|
|
||||||
sendButtonEvent(Spaceball5000_HID_map[button_number], press, time, window);
|
|
||||||
break;
|
|
||||||
case NDOF_UnknownDevice:
|
|
||||||
printf("ndof: button %d on unknown device (", button_number);
|
|
||||||
// map to the 'general purpose' buttons
|
|
||||||
// this is mainly for old serial devices
|
|
||||||
if (button_number < NDOF_BUTTON_LAST - NDOF_BUTTON_1) {
|
|
||||||
printf("sending)\n");
|
|
||||||
sendButtonEvent((NDOF_ButtonT)(NDOF_BUTTON_1 + button_number), press, time, window);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
printf("discarding)\n");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int mask = 1 << button_number;
|
int mask = 1 << button_number;
|
||||||
@@ -558,6 +490,9 @@ bool GHOST_NDOFManager::sendMotionEvent()
|
|||||||
printf("ndof motion sent -- %s\n", progress_string[data->progress]);
|
printf("ndof motion sent -- %s\n", progress_string[data->progress]);
|
||||||
|
|
||||||
// show details about this motion event
|
// show details about this motion event
|
||||||
|
printf(" T=(%d,%d,%d) R=(%d,%d,%d) raw\n",
|
||||||
|
m_translation[0], m_translation[1], m_translation[2],
|
||||||
|
m_rotation[0], m_rotation[1], m_rotation[2]);
|
||||||
printf(" T=(%.2f,%.2f,%.2f) R=(%.2f,%.2f,%.2f) dt=%.3f\n",
|
printf(" T=(%.2f,%.2f,%.2f) R=(%.2f,%.2f,%.2f) dt=%.3f\n",
|
||||||
data->tx, data->ty, data->tz,
|
data->tx, data->ty, data->tz,
|
||||||
data->rx, data->ry, data->rz,
|
data->rx, data->ry, data->rz,
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
// #define DEBUG_NDOF_BUTTONS
|
// #define DEBUG_NDOF_BUTTONS
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NDOF_UnknownDevice, // <-- motion will work fine, buttons are ignored
|
NDOF_UnknownDevice,
|
||||||
|
|
||||||
// current devices
|
// current devices
|
||||||
NDOF_SpaceNavigator,
|
NDOF_SpaceNavigator,
|
||||||
@@ -41,7 +41,8 @@ typedef enum {
|
|||||||
|
|
||||||
// older devices
|
// older devices
|
||||||
NDOF_SpacePilot,
|
NDOF_SpacePilot,
|
||||||
NDOF_Spaceball5000
|
NDOF_Spaceball5000,
|
||||||
|
NDOF_SpaceTraveler
|
||||||
|
|
||||||
} NDOF_DeviceT;
|
} NDOF_DeviceT;
|
||||||
|
|
||||||
@@ -76,6 +77,11 @@ typedef enum {
|
|||||||
NDOF_BUTTON_DOMINANT,
|
NDOF_BUTTON_DOMINANT,
|
||||||
NDOF_BUTTON_PLUS,
|
NDOF_BUTTON_PLUS,
|
||||||
NDOF_BUTTON_MINUS,
|
NDOF_BUTTON_MINUS,
|
||||||
|
// keyboard emulation
|
||||||
|
NDOF_BUTTON_ESC,
|
||||||
|
NDOF_BUTTON_ALT,
|
||||||
|
NDOF_BUTTON_SHIFT,
|
||||||
|
NDOF_BUTTON_CTRL,
|
||||||
// general-purpose buttons
|
// general-purpose buttons
|
||||||
// users can assign functions via keymap editor
|
// users can assign functions via keymap editor
|
||||||
NDOF_BUTTON_1,
|
NDOF_BUTTON_1,
|
||||||
@@ -149,6 +155,7 @@ private:
|
|||||||
NDOF_DeviceT m_deviceType;
|
NDOF_DeviceT m_deviceType;
|
||||||
int m_buttonCount;
|
int m_buttonCount;
|
||||||
int m_buttonMask;
|
int m_buttonMask;
|
||||||
|
const NDOF_ButtonT* m_hidMap;
|
||||||
|
|
||||||
short m_translation[3];
|
short m_translation[3];
|
||||||
short m_rotation[3];
|
short m_rotation[3];
|
||||||
|
|||||||
@@ -47,7 +47,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PREFIX
|
#ifdef PREFIX
|
||||||
static const char *static_path= PREFIX "/share" ;
|
static const char *static_path= PREFIX "/share";
|
||||||
#else
|
#else
|
||||||
static const char *static_path= NULL;
|
static const char *static_path= NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -716,7 +716,7 @@ GHOST_EventKey* GHOST_SystemWin32::processKeyEvent(GHOST_IWindow *window, RAWINP
|
|||||||
GHOST_EventKey* event;
|
GHOST_EventKey* event;
|
||||||
|
|
||||||
if (key != GHOST_kKeyUnknown) {
|
if (key != GHOST_kKeyUnknown) {
|
||||||
char utf8_char[6] = {0} ;
|
char utf8_char[6] = {0};
|
||||||
char ascii = 0;
|
char ascii = 0;
|
||||||
|
|
||||||
wchar_t utf16[2]={0};
|
wchar_t utf16[2]={0};
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ public:
|
|||||||
GHOST_TSuccess
|
GHOST_TSuccess
|
||||||
getModifierKeys(
|
getModifierKeys(
|
||||||
GHOST_ModifierKeys& keys
|
GHOST_ModifierKeys& keys
|
||||||
) const ;
|
) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the state of the mouse buttons (ouside the message queue).
|
* Returns the state of the mouse buttons (ouside the message queue).
|
||||||
@@ -310,7 +310,7 @@ private :
|
|||||||
GHOST_WindowX11 *
|
GHOST_WindowX11 *
|
||||||
findGhostWindow(
|
findGhostWindow(
|
||||||
Window xwind
|
Window xwind
|
||||||
) const ;
|
) const;
|
||||||
|
|
||||||
void
|
void
|
||||||
processEvent(
|
processEvent(
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ GHOST_WindowSDL::GHOST_WindowSDL(GHOST_SystemSDL *system,
|
|||||||
m_sdl_glcontext= SDL_GL_CreateContext(m_sdl_win);
|
m_sdl_glcontext= SDL_GL_CreateContext(m_sdl_win);
|
||||||
|
|
||||||
//fprintf(stderr, "Ignoring Xlib error: error code %d request code %d\n",
|
//fprintf(stderr, "Ignoring Xlib error: error code %d request code %d\n",
|
||||||
// theEvent->error_code, theEvent->request_code) ;
|
// theEvent->error_code, theEvent->request_code);
|
||||||
|
|
||||||
setTitle(title);
|
setTitle(title);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -373,7 +373,7 @@ GHOST_WindowX11(
|
|||||||
XFree(xsizehints);
|
XFree(xsizehints);
|
||||||
|
|
||||||
XClassHint * xclasshint = XAllocClassHint();
|
XClassHint * xclasshint = XAllocClassHint();
|
||||||
int len = title.Length() +1 ;
|
const int len = title.Length() + 1;
|
||||||
char *wmclass = (char *)malloc(sizeof(char) * len);
|
char *wmclass = (char *)malloc(sizeof(char) * len);
|
||||||
strncpy(wmclass, (const char*)title, sizeof(char) * len);
|
strncpy(wmclass, (const char*)title, sizeof(char) * len);
|
||||||
xclasshint->res_name = wmclass;
|
xclasshint->res_name = wmclass;
|
||||||
@@ -485,10 +485,10 @@ GHOST_WindowX11(
|
|||||||
static int ApplicationErrorHandler(Display *display, XErrorEvent *theEvent)
|
static int ApplicationErrorHandler(Display *display, XErrorEvent *theEvent)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Ignoring Xlib error: error code %d request code %d\n",
|
fprintf(stderr, "Ignoring Xlib error: error code %d request code %d\n",
|
||||||
theEvent->error_code, theEvent->request_code) ;
|
theEvent->error_code, theEvent->request_code);
|
||||||
|
|
||||||
/* No exit! - but keep lint happy */
|
/* No exit! - but keep lint happy */
|
||||||
return 0 ;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* These C functions are copied from Wine 1.1.13's wintab.c */
|
/* These C functions are copied from Wine 1.1.13's wintab.c */
|
||||||
@@ -588,7 +588,7 @@ static BOOL is_eraser(const char *name, const char *type)
|
|||||||
|
|
||||||
void GHOST_WindowX11::initXInputDevices()
|
void GHOST_WindowX11::initXInputDevices()
|
||||||
{
|
{
|
||||||
static XErrorHandler old_handler = (XErrorHandler) 0 ;
|
static XErrorHandler old_handler = (XErrorHandler) 0;
|
||||||
XExtensionVersion *version = XGetExtensionVersion(m_display, INAME);
|
XExtensionVersion *version = XGetExtensionVersion(m_display, INAME);
|
||||||
|
|
||||||
if(version && (version != (XExtensionVersion*)NoSuchExtension)) {
|
if(version && (version != (XExtensionVersion*)NoSuchExtension)) {
|
||||||
@@ -600,7 +600,7 @@ void GHOST_WindowX11::initXInputDevices()
|
|||||||
m_xtablet.CommonData.Active= GHOST_kTabletModeNone;
|
m_xtablet.CommonData.Active= GHOST_kTabletModeNone;
|
||||||
|
|
||||||
/* Install our error handler to override Xlib's termination behavior */
|
/* Install our error handler to override Xlib's termination behavior */
|
||||||
old_handler = XSetErrorHandler(ApplicationErrorHandler) ;
|
old_handler = XSetErrorHandler(ApplicationErrorHandler);
|
||||||
|
|
||||||
for(int i=0; i<device_count; ++i) {
|
for(int i=0; i<device_count; ++i) {
|
||||||
char *device_type = device_info[i].type ? XGetAtomName(m_display, device_info[i].type) : NULL;
|
char *device_type = device_info[i].type ? XGetAtomName(m_display, device_info[i].type) : NULL;
|
||||||
@@ -648,7 +648,7 @@ void GHOST_WindowX11::initXInputDevices()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Restore handler */
|
/* Restore handler */
|
||||||
(void) XSetErrorHandler(old_handler) ;
|
(void) XSetErrorHandler(old_handler);
|
||||||
|
|
||||||
XFreeDeviceList(device_info);
|
XFreeDeviceList(device_info);
|
||||||
|
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ public:
|
|||||||
|
|
||||||
GHOST_TWindowState
|
GHOST_TWindowState
|
||||||
getState(
|
getState(
|
||||||
) const ;
|
) const;
|
||||||
|
|
||||||
GHOST_TSuccess
|
GHOST_TSuccess
|
||||||
setState(
|
setState(
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ int main (int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* now corrupt a few blocks...*/
|
/* now corrupt a few blocks...*/
|
||||||
ip = (int*) p[5] - 50 ;
|
ip = (int*) p[5] - 50;
|
||||||
for (i = 0; i< 1000; i++,ip++) *ip = i+1;
|
for (i = 0; i< 1000; i++,ip++) *ip = i+1;
|
||||||
ip = (int*) p[6];
|
ip = (int*) p[6];
|
||||||
*(ip+10005) = 0;
|
*(ip+10005) = 0;
|
||||||
|
|||||||
@@ -335,7 +335,7 @@ path_reference_mode = EnumProperty(
|
|||||||
('MATCH', "Match", "Match Absolute/Relative "
|
('MATCH', "Match", "Match Absolute/Relative "
|
||||||
"setting with input path"),
|
"setting with input path"),
|
||||||
('STRIP', "Strip Path", "Filename only"),
|
('STRIP', "Strip Path", "Filename only"),
|
||||||
('COPY', "Copy", "copy the file to the destination path "
|
('COPY', "Copy", "Copy the file to the destination path "
|
||||||
"(or subdirectory)"),
|
"(or subdirectory)"),
|
||||||
),
|
),
|
||||||
default='AUTO'
|
default='AUTO'
|
||||||
|
|||||||
@@ -366,7 +366,7 @@ class Mesh(bpy_types.ID):
|
|||||||
:type edges: iterable object
|
:type edges: iterable object
|
||||||
:arg faces:
|
:arg faces:
|
||||||
|
|
||||||
iterator of faces, each faces contains three or four indices to
|
iterator of faces, each faces contains three or more indices to
|
||||||
the *vertices* argument. eg: [(5, 6, 8, 9), (1, 2, 3), ...]
|
the *vertices* argument. eg: [(5, 6, 8, 9), (1, 2, 3), ...]
|
||||||
|
|
||||||
:type faces: iterable object
|
:type faces: iterable object
|
||||||
@@ -394,6 +394,10 @@ class Mesh(bpy_types.ID):
|
|||||||
p.vertices = f
|
p.vertices = f
|
||||||
loop_index += loop_len
|
loop_index += loop_len
|
||||||
|
|
||||||
|
# if no edges - calculae them
|
||||||
|
if faces and (not edges):
|
||||||
|
self.update(calc_edges=True)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def edge_keys(self):
|
def edge_keys(self):
|
||||||
return [ed.key for ed in self.edges]
|
return [ed.key for ed in self.edges]
|
||||||
|
|||||||
@@ -333,7 +333,7 @@ kmi = km.keymap_items.new('mesh.fill', 'F', 'PRESS', alt=True)
|
|||||||
kmi = km.keymap_items.new('mesh.beautify_fill', 'F', 'PRESS', shift=True, alt=True)
|
kmi = km.keymap_items.new('mesh.beautify_fill', 'F', 'PRESS', shift=True, alt=True)
|
||||||
kmi = km.keymap_items.new('mesh.quads_convert_to_tris', 'T', 'PRESS', ctrl=True)
|
kmi = km.keymap_items.new('mesh.quads_convert_to_tris', 'T', 'PRESS', ctrl=True)
|
||||||
kmi = km.keymap_items.new('mesh.tris_convert_to_quads', 'J', 'PRESS', alt=True)
|
kmi = km.keymap_items.new('mesh.tris_convert_to_quads', 'J', 'PRESS', alt=True)
|
||||||
kmi = km.keymap_items.new('mesh.edge_flip', 'F', 'PRESS', shift=True, ctrl=True)
|
# kmi = km.keymap_items.new('mesh.edge_flip', 'F', 'PRESS', shift=True, ctrl=True) # removed since bmesh, can be made into something else?
|
||||||
kmi = km.keymap_items.new('mesh.rip_move', 'V', 'PRESS')
|
kmi = km.keymap_items.new('mesh.rip_move', 'V', 'PRESS')
|
||||||
kmi = km.keymap_items.new('mesh.merge', 'M', 'PRESS', alt=True)
|
kmi = km.keymap_items.new('mesh.merge', 'M', 'PRESS', alt=True)
|
||||||
kmi = km.keymap_items.new('transform.shrink_fatten', 'S', 'PRESS', ctrl=True, alt=True)
|
kmi = km.keymap_items.new('transform.shrink_fatten', 'S', 'PRESS', ctrl=True, alt=True)
|
||||||
|
|||||||
@@ -1114,7 +1114,7 @@ class SmartProject(Operator):
|
|||||||
|
|
||||||
angle_limit = FloatProperty(
|
angle_limit = FloatProperty(
|
||||||
name="Angle Limit",
|
name="Angle Limit",
|
||||||
description="lower for more projection groups, higher for less distortion",
|
description="Lower for more projection groups, higher for less distortion",
|
||||||
min=1.0, max=89.0,
|
min=1.0, max=89.0,
|
||||||
default=66.0,
|
default=66.0,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -146,12 +146,12 @@ class BRUSH_OT_active_index_set(Operator):
|
|||||||
bl_label = "Set Brush Number"
|
bl_label = "Set Brush Number"
|
||||||
|
|
||||||
mode = StringProperty(
|
mode = StringProperty(
|
||||||
name="mode",
|
name="Mode",
|
||||||
description="Paint mode to set brush for",
|
description="Paint mode to set brush for",
|
||||||
maxlen=1024,
|
maxlen=1024,
|
||||||
)
|
)
|
||||||
index = IntProperty(
|
index = IntProperty(
|
||||||
name="number",
|
name="Number",
|
||||||
description="Brush number",
|
description="Brush number",
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -707,9 +707,14 @@ class WM_OT_context_modal_mouse(Operator):
|
|||||||
if event_type == 'MOUSEMOVE':
|
if event_type == 'MOUSEMOVE':
|
||||||
delta = event.mouse_x - self.initial_x
|
delta = event.mouse_x - self.initial_x
|
||||||
self._values_delta(delta)
|
self._values_delta(delta)
|
||||||
if self.header_text:
|
header_text = self.header_text
|
||||||
for item, value_orig in self._values.items():
|
if header_text:
|
||||||
context.area.header_text_set(self.header_text % eval("item.%s" % self.data_path_item))
|
if len(self._values) == 1:
|
||||||
|
(item, ) = self._values.keys()
|
||||||
|
header_text = header_text % eval("item.%s" % self.data_path_item)
|
||||||
|
else:
|
||||||
|
header_text = (self.header_text % delta) + " (delta)"
|
||||||
|
context.area.header_text_set(header_text)
|
||||||
|
|
||||||
elif 'LEFTMOUSE' == event_type:
|
elif 'LEFTMOUSE' == event_type:
|
||||||
item = next(iter(self._values.keys()))
|
item = next(iter(self._values.keys()))
|
||||||
|
|||||||
@@ -88,11 +88,7 @@ class DATA_PT_lens(CameraButtonsPanel, Panel):
|
|||||||
col.prop(cam, "ortho_scale")
|
col.prop(cam, "ortho_scale")
|
||||||
|
|
||||||
col = layout.column()
|
col = layout.column()
|
||||||
if cam.type == 'ORTHO':
|
col.enabled = cam.type == 'PERSPECTIVE'
|
||||||
if cam.use_panorama:
|
|
||||||
col.alert = True
|
|
||||||
else:
|
|
||||||
col.enabled = False
|
|
||||||
|
|
||||||
col.prop(cam, "use_panorama")
|
col.prop(cam, "use_panorama")
|
||||||
|
|
||||||
|
|||||||
@@ -113,6 +113,14 @@ class DATA_PT_shape_curve(CurveButtonsPanel, Panel):
|
|||||||
sub.prop(curve, "fill_mode", text="")
|
sub.prop(curve, "fill_mode", text="")
|
||||||
col.prop(curve, "use_fill_deform")
|
col.prop(curve, "use_fill_deform")
|
||||||
|
|
||||||
|
if is_curve:
|
||||||
|
col.label(text="Path / Curve-Deform:")
|
||||||
|
sub = col.column()
|
||||||
|
rowsub = sub.row()
|
||||||
|
rowsub.prop(curve, "use_radius")
|
||||||
|
rowsub.prop(curve, "use_stretch")
|
||||||
|
sub.prop(curve, "use_deform_bounds")
|
||||||
|
|
||||||
|
|
||||||
class DATA_PT_curve_texture_space(CurveButtonsPanel, Panel):
|
class DATA_PT_curve_texture_space(CurveButtonsPanel, Panel):
|
||||||
bl_label = "Texture Space"
|
bl_label = "Texture Space"
|
||||||
@@ -189,16 +197,11 @@ class DATA_PT_pathanim(CurveButtonsPanelCurve, Panel):
|
|||||||
layout.prop(curve, "path_duration", text="Frames")
|
layout.prop(curve, "path_duration", text="Frames")
|
||||||
layout.prop(curve, "eval_time")
|
layout.prop(curve, "eval_time")
|
||||||
|
|
||||||
split = layout.split()
|
|
||||||
|
|
||||||
col = split.column()
|
# these are for paths only
|
||||||
col.prop(curve, "use_path_follow")
|
row = layout.row()
|
||||||
col.prop(curve, "use_stretch")
|
row.prop(curve, "use_path_follow")
|
||||||
col.prop(curve, "use_deform_bounds")
|
row.prop(curve, "use_time_offset", text="Offset Children")
|
||||||
|
|
||||||
col = split.column()
|
|
||||||
col.prop(curve, "use_radius")
|
|
||||||
col.prop(curve, "use_time_offset", text="Offset Children")
|
|
||||||
|
|
||||||
|
|
||||||
class DATA_PT_active_spline(CurveButtonsPanelActive, Panel):
|
class DATA_PT_active_spline(CurveButtonsPanelActive, Panel):
|
||||||
|
|||||||
@@ -264,6 +264,9 @@ class SEQUENCER_MT_strip(Menu):
|
|||||||
layout.separator()
|
layout.separator()
|
||||||
# layout.operator("sequencer.movie_change")
|
# layout.operator("sequencer.movie_change")
|
||||||
layout.operator("sequencer.rendersize")
|
layout.operator("sequencer.rendersize")
|
||||||
|
elif stype == 'SOUND':
|
||||||
|
layout.separator()
|
||||||
|
layout.operator("sequencer.crossfade_sounds")
|
||||||
|
|
||||||
layout.separator()
|
layout.separator()
|
||||||
|
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ class VIEW3D_HT_header(Header):
|
|||||||
row = layout.row(align=True)
|
row = layout.row(align=True)
|
||||||
row.prop(toolsettings, "use_snap", text="")
|
row.prop(toolsettings, "use_snap", text="")
|
||||||
row.prop(toolsettings, "snap_element", text="", icon_only=True)
|
row.prop(toolsettings, "snap_element", text="", icon_only=True)
|
||||||
if snap_element not in ('INCREMENT', 'VOLUME'):
|
if snap_element not in {'INCREMENT', 'VOLUME'}:
|
||||||
row.prop(toolsettings, "snap_target", text="")
|
row.prop(toolsettings, "snap_target", text="")
|
||||||
if obj:
|
if obj:
|
||||||
if obj.mode == 'OBJECT':
|
if obj.mode == 'OBJECT':
|
||||||
@@ -1730,7 +1730,6 @@ class VIEW3D_MT_edit_mesh_faces(Menu):
|
|||||||
|
|
||||||
layout.operator("mesh.quads_convert_to_tris")
|
layout.operator("mesh.quads_convert_to_tris")
|
||||||
layout.operator("mesh.tris_convert_to_quads")
|
layout.operator("mesh.tris_convert_to_quads")
|
||||||
layout.operator("mesh.edge_flip")
|
|
||||||
|
|
||||||
layout.separator()
|
layout.separator()
|
||||||
|
|
||||||
|
|||||||
@@ -1133,13 +1133,15 @@ class VIEW3D_PT_tools_projectpaint(View3DPanel, Panel):
|
|||||||
|
|
||||||
row = split.row()
|
row = split.row()
|
||||||
row.active = (ipaint.use_stencil_layer)
|
row.active = (ipaint.use_stencil_layer)
|
||||||
row.menu("VIEW3D_MT_tools_projectpaint_stencil", text=mesh.uv_texture_stencil.name)
|
stencil_text = mesh.uv_texture_stencil.name if mesh.uv_texture_stencil else ""
|
||||||
|
row.menu("VIEW3D_MT_tools_projectpaint_stencil", text=stencil_text)
|
||||||
row.prop(ipaint, "invert_stencil", text="", icon='IMAGE_ALPHA')
|
row.prop(ipaint, "invert_stencil", text="", icon='IMAGE_ALPHA')
|
||||||
|
|
||||||
row = layout.row()
|
row = layout.row()
|
||||||
row.active = (settings.brush.image_tool == 'CLONE')
|
row.active = (settings.brush.image_tool == 'CLONE')
|
||||||
row.prop(ipaint, "use_clone_layer", text="Layer")
|
row.prop(ipaint, "use_clone_layer", text="Clone")
|
||||||
row.menu("VIEW3D_MT_tools_projectpaint_clone", text=mesh.uv_texture_clone.name)
|
clone_text = mesh.uv_texture_clone.name if mesh.uv_texture_clone else ""
|
||||||
|
row.menu("VIEW3D_MT_tools_projectpaint_clone", text=clone_text)
|
||||||
|
|
||||||
layout.prop(ipaint, "seam_bleed")
|
layout.prop(ipaint, "seam_bleed")
|
||||||
|
|
||||||
|
|||||||
@@ -249,7 +249,7 @@ AviError AVI_open_compress (char *name, AviMovie *movie, int streams, ...);
|
|||||||
AviError AVI_close_compress (AviMovie *movie);
|
AviError AVI_close_compress (AviMovie *movie);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Choose a compression option for <movie>. Possible options are
|
* Choose a compression option for \<movie\>. Possible options are
|
||||||
* AVI_OPTION_TYPE_MAIN, AVI_OPTION_TYPE_STRH, AVI_OPTION_TYPE_STRF
|
* AVI_OPTION_TYPE_MAIN, AVI_OPTION_TYPE_STRH, AVI_OPTION_TYPE_STRF
|
||||||
*/
|
*/
|
||||||
AviError AVI_set_compress_option (AviMovie *movie,
|
AviError AVI_set_compress_option (AviMovie *movie,
|
||||||
@@ -272,7 +272,7 @@ AviError AVI_set_compress_option (AviMovie *movie,
|
|||||||
#define AVI_OPTION_TYPE_STRF 2
|
#define AVI_OPTION_TYPE_STRF 2
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Direct the streams <avist_type> to <movie>. Redirect <stream_num>
|
* Direct the streams \<avist_type\> to \<movie\>. Redirect \<stream_num\>
|
||||||
* streams.
|
* streams.
|
||||||
*/
|
*/
|
||||||
int AVI_get_stream (AviMovie *movie, int avist_type, int stream_num);
|
int AVI_get_stream (AviMovie *movie, int avist_type, int stream_num);
|
||||||
|
|||||||
@@ -836,8 +836,10 @@ AviError AVI_open_compress (char *name, AviMovie *movie, int streams, ...)
|
|||||||
tmp->f = 2;
|
tmp->f = 2;
|
||||||
tmp->g = 1;
|
tmp->g = 1;
|
||||||
}
|
}
|
||||||
} else if (movie->streams[i].sh.Type == FCC("auds")) {
|
}
|
||||||
;
|
else if (movie->streams[i].sh.Type == FCC("auds")) {
|
||||||
|
// pass
|
||||||
|
}
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,8 +57,6 @@ void BLF_lang_init(void);
|
|||||||
void BLF_lang_set(const char *);
|
void BLF_lang_set(const char *);
|
||||||
|
|
||||||
/* Set the current encoding name. */
|
/* Set the current encoding name. */
|
||||||
void BLF_lang_encoding_name(const char *str);
|
|
||||||
|
|
||||||
void BLF_lang_encoding(const char *str);
|
void BLF_lang_encoding(const char *str);
|
||||||
|
|
||||||
/* translation */
|
/* translation */
|
||||||
|
|||||||
@@ -271,10 +271,6 @@ struct DerivedMesh {
|
|||||||
*/
|
*/
|
||||||
struct ListBase *(*getPolyMap)(struct Object *ob, DerivedMesh *dm);
|
struct ListBase *(*getPolyMap)(struct Object *ob, DerivedMesh *dm);
|
||||||
|
|
||||||
/* Get a map of vertices to faces
|
|
||||||
*/
|
|
||||||
struct ListBase *(*getFaceMap)(struct Object *ob, DerivedMesh *dm);
|
|
||||||
|
|
||||||
/* Get the BVH used for paint modes
|
/* Get the BVH used for paint modes
|
||||||
*/
|
*/
|
||||||
struct PBVH *(*getPBVH)(struct Object *ob, DerivedMesh *dm);
|
struct PBVH *(*getPBVH)(struct Object *ob, DerivedMesh *dm);
|
||||||
@@ -617,7 +613,6 @@ DerivedMesh *mesh_create_derived_no_virtual(struct Scene *scene, struct Object *
|
|||||||
DerivedMesh *mesh_create_derived_physics(struct Scene *scene, struct Object *ob, float (*vertCos)[3],
|
DerivedMesh *mesh_create_derived_physics(struct Scene *scene, struct Object *ob, float (*vertCos)[3],
|
||||||
CustomDataMask dataMask);
|
CustomDataMask dataMask);
|
||||||
|
|
||||||
DerivedMesh *editbmesh_get_derived(struct BMEditMesh *em, float (*vertexCos)[3]);
|
|
||||||
DerivedMesh *editbmesh_get_derived_base(struct Object *, struct BMEditMesh *em);
|
DerivedMesh *editbmesh_get_derived_base(struct Object *, struct BMEditMesh *em);
|
||||||
DerivedMesh *editbmesh_get_derived_cage(struct Scene *scene, struct Object *,
|
DerivedMesh *editbmesh_get_derived_cage(struct Scene *scene, struct Object *,
|
||||||
struct BMEditMesh *em, CustomDataMask dataMask);
|
struct BMEditMesh *em, CustomDataMask dataMask);
|
||||||
@@ -634,11 +629,6 @@ void makeDerivedMesh(struct Scene *scene, struct Object *ob, struct BMEditMesh *
|
|||||||
int editbmesh_get_first_deform_matrices(struct Scene *, struct Object *, struct BMEditMesh *em,
|
int editbmesh_get_first_deform_matrices(struct Scene *, struct Object *, struct BMEditMesh *em,
|
||||||
float (**deformmats)[3][3], float (**deformcos)[3]);
|
float (**deformmats)[3][3], float (**deformcos)[3]);
|
||||||
|
|
||||||
/* returns an array of deform matrices for crazyspace correction when sculpting,
|
|
||||||
and the number of modifiers left */
|
|
||||||
int sculpt_get_deform_matrices(struct Scene *scene, struct Object *ob,
|
|
||||||
float (**deformmats)[3][3], float (**deformcos)[3]);
|
|
||||||
|
|
||||||
void weight_to_rgb(float r_rgb[3], const float weight);
|
void weight_to_rgb(float r_rgb[3], const float weight);
|
||||||
/* Update the weight MCOL preview layer.
|
/* Update the weight MCOL preview layer.
|
||||||
* If weights are NULL, use object's active vgroup(s).
|
* If weights are NULL, use object's active vgroup(s).
|
||||||
|
|||||||
@@ -97,16 +97,16 @@ void where_is_pose_bone_tail(struct bPoseChannel *pchan);
|
|||||||
|
|
||||||
/* get_objectspace_bone_matrix has to be removed still */
|
/* get_objectspace_bone_matrix has to be removed still */
|
||||||
void get_objectspace_bone_matrix (struct Bone* bone, float M_accumulatedMatrix[][4], int root, int posed);
|
void get_objectspace_bone_matrix (struct Bone* bone, float M_accumulatedMatrix[][4], int root, int posed);
|
||||||
void vec_roll_to_mat3(float *vec, float roll, float mat[][3]);
|
void vec_roll_to_mat3(const float vec[3], const float roll, float mat[][3]);
|
||||||
void mat3_to_vec_roll(float mat[][3], float *vec, float *roll);
|
void mat3_to_vec_roll(float mat[][3], float *vec, float *roll);
|
||||||
|
|
||||||
int get_selected_defgroups(struct Object *ob, char *defbase_sel, int defbase_len);
|
int get_selected_defgroups(struct Object *ob, char *defbase_sel, int defbase_len);
|
||||||
|
|
||||||
/* Common Conversions Between Co-ordinate Spaces */
|
/* Common Conversions Between Co-ordinate Spaces */
|
||||||
void armature_mat_world_to_pose(struct Object *ob, float inmat[][4], float outmat[][4]);
|
void armature_mat_world_to_pose(struct Object *ob, float inmat[][4], float outmat[][4]);
|
||||||
void armature_loc_world_to_pose(struct Object *ob, float *inloc, float *outloc);
|
void armature_loc_world_to_pose(struct Object *ob, const float inloc[3], float outloc[3]);
|
||||||
void armature_mat_pose_to_bone(struct bPoseChannel *pchan, float inmat[][4], float outmat[][4]);
|
void armature_mat_pose_to_bone(struct bPoseChannel *pchan, float inmat[][4], float outmat[][4]);
|
||||||
void armature_loc_pose_to_bone(struct bPoseChannel *pchan, float *inloc, float *outloc);
|
void armature_loc_pose_to_bone(struct bPoseChannel *pchan, const float inloc[3], float outloc[3]);
|
||||||
void armature_mat_bone_to_pose(struct bPoseChannel *pchan, float inmat[][4], float outmat[][4]);
|
void armature_mat_bone_to_pose(struct bPoseChannel *pchan, float inmat[][4], float outmat[][4]);
|
||||||
void armature_mat_pose_to_delta(float delta_mat[][4], float pose_mat[][4], float arm_mat[][4]);
|
void armature_mat_pose_to_delta(float delta_mat[][4], float pose_mat[][4], float arm_mat[][4]);
|
||||||
|
|
||||||
|
|||||||
@@ -90,7 +90,6 @@ extern void BKE_reset_undo(void);
|
|||||||
extern char *BKE_undo_menu_string(void);
|
extern char *BKE_undo_menu_string(void);
|
||||||
extern void BKE_undo_number(struct bContext *C, int nr);
|
extern void BKE_undo_number(struct bContext *C, int nr);
|
||||||
extern const char *BKE_undo_get_name(int nr, int *active);
|
extern const char *BKE_undo_get_name(int nr, int *active);
|
||||||
void BKE_undo_save(char *fname);
|
|
||||||
extern void BKE_undo_save_quit(void);
|
extern void BKE_undo_save_quit(void);
|
||||||
extern struct Main *BKE_undo_get_main(struct Scene **scene);
|
extern struct Main *BKE_undo_get_main(struct Scene **scene);
|
||||||
|
|
||||||
|
|||||||
@@ -35,159 +35,8 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "DNA_listBase.h"
|
|
||||||
#include "BLI_utildefines.h"
|
|
||||||
#include "BLI_ghash.h"
|
|
||||||
#include "BLI_mempool.h"
|
|
||||||
#include "BLI_memarena.h"
|
|
||||||
#include "DNA_image_types.h"
|
|
||||||
#include "BKE_DerivedMesh.h"
|
|
||||||
//XXX #include "transform.h"
|
|
||||||
#include "bmesh.h"
|
|
||||||
|
|
||||||
/*forward declerations*/
|
|
||||||
struct BME_Vert;
|
|
||||||
struct BME_Edge;
|
|
||||||
struct BME_Poly;
|
|
||||||
struct BME_Loop;
|
|
||||||
|
|
||||||
/*NOTE: this is the bmesh 1.0 code. it's completely outdated.*/
|
/*NOTE: this is the bmesh 1.0 code. it's completely outdated.*/
|
||||||
|
|
||||||
/*Notes on further structure Cleanup:
|
|
||||||
-Remove the tflags, they belong in custom data layers
|
|
||||||
-Remove the eflags completely, they are mostly not used
|
|
||||||
-Remove the selection/vis/bevel weight flag/values ect and move them to custom data
|
|
||||||
-Remove EID member and move to custom data
|
|
||||||
-Add a radial cycle length, disk cycle length and loop cycle length attributes to custom data and have eulers maintain/use them if present.
|
|
||||||
-Move data such as vertex coordinates/normals to custom data and leave pointers in structures to active layer data.
|
|
||||||
-Remove BME_CycleNode structure?
|
|
||||||
*/
|
|
||||||
typedef struct BME_CycleNode{
|
|
||||||
struct BME_CycleNode *next, *prev;
|
|
||||||
void *data;
|
|
||||||
} BME_CycleNode;
|
|
||||||
|
|
||||||
typedef struct BME_Mesh
|
|
||||||
{
|
|
||||||
ListBase verts, edges, polys;
|
|
||||||
/*memory pools used for storing mesh elements*/
|
|
||||||
struct BLI_mempool *vpool;
|
|
||||||
struct BLI_mempool *epool;
|
|
||||||
struct BLI_mempool *ppool;
|
|
||||||
struct BLI_mempool *lpool;
|
|
||||||
/*some scratch arrays used by eulers*/
|
|
||||||
struct BME_Vert **vtar;
|
|
||||||
struct BME_Edge **edar;
|
|
||||||
struct BME_Loop **lpar;
|
|
||||||
struct BME_Poly **plar;
|
|
||||||
int vtarlen, edarlen, lparlen, plarlen;
|
|
||||||
int totvert, totedge, totpoly, totloop; /*record keeping*/
|
|
||||||
int nextv, nexte, nextp, nextl; /*Next element ID for verts/edges/faces/loops. Never reused*/
|
|
||||||
struct CustomData vdata, edata, pdata, ldata; /*Custom Data Layer information*/
|
|
||||||
} BME_Mesh;
|
|
||||||
|
|
||||||
typedef struct BME_Vert
|
|
||||||
{
|
|
||||||
struct BME_Vert *next, *prev;
|
|
||||||
int EID;
|
|
||||||
float co[3];
|
|
||||||
float no[3];
|
|
||||||
struct BME_Edge *edge; /*first edge in the disk cycle for this vertex*/
|
|
||||||
void *data; /*custom vertex data*/
|
|
||||||
int eflag1, eflag2; /*reserved for use by eulers*/
|
|
||||||
int tflag1, tflag2; /*reserved for use by tools*/
|
|
||||||
unsigned short flag, h;
|
|
||||||
float bweight;
|
|
||||||
} BME_Vert;
|
|
||||||
|
|
||||||
typedef struct BME_Edge
|
|
||||||
{
|
|
||||||
struct BME_Edge *next, *prev;
|
|
||||||
int EID;
|
|
||||||
struct BME_Vert *v1, *v2; /*note that order of vertex pointers means nothing to eulers*/
|
|
||||||
struct BME_CycleNode d1, d2; /*disk cycle nodes for v1 and v2 respectivley*/
|
|
||||||
struct BME_Loop *loop; /*first BME_Loop in the radial cycle around this edge*/
|
|
||||||
void *data; /*custom edge data*/
|
|
||||||
int eflag1, eflag2; /*reserved for use by eulers*/
|
|
||||||
int tflag1, tflag2; /*reserved for use by tools*/
|
|
||||||
unsigned short flag, h;
|
|
||||||
float crease, bweight;
|
|
||||||
} BME_Edge;
|
|
||||||
|
|
||||||
typedef struct BME_Loop
|
|
||||||
{
|
|
||||||
struct BME_Loop *next, *prev; /*circularly linked list around face*/
|
|
||||||
int EID;
|
|
||||||
struct BME_CycleNode radial; /*circularly linked list used to find faces around an edge*/
|
|
||||||
struct BME_Vert *v; /*vertex that this loop starts at.*/
|
|
||||||
struct BME_Edge *e; /*edge this loop belongs to*/
|
|
||||||
struct BME_Poly *f; /*face this loop belongs to*/
|
|
||||||
void *data; /*custom per face vertex data*/
|
|
||||||
int eflag1, eflag2; /*reserved for use by eulers*/
|
|
||||||
int tflag1, tflag2; /*reserved for use by tools*/
|
|
||||||
unsigned short flag, h;
|
|
||||||
} BME_Loop;
|
|
||||||
|
|
||||||
typedef struct BME_Poly
|
|
||||||
{
|
|
||||||
struct BME_Poly *next, *prev;
|
|
||||||
int EID;
|
|
||||||
struct BME_Loop *loopbase; /*First editloop around Polygon.*/
|
|
||||||
unsigned int len; /*total length of the face. Eulers should preserve this data*/
|
|
||||||
void *data; /*custom face data*/
|
|
||||||
int eflag1, eflag2; /*reserved for use by eulers*/
|
|
||||||
int tflag1, tflag2; /*reserved for use by tools*/
|
|
||||||
unsigned short flag, h, mat_nr;
|
|
||||||
} BME_Poly;
|
|
||||||
|
|
||||||
/*EDGE UTILITIES*/
|
|
||||||
int BME_verts_in_edge(struct BME_Vert *v1, struct BME_Vert *v2, struct BME_Edge *e);
|
|
||||||
int BME_vert_in_edge(struct BME_Edge *e, BME_Vert *v);
|
|
||||||
struct BME_Vert *BME_edge_getothervert(struct BME_Edge *e, struct BME_Vert *v);
|
|
||||||
|
|
||||||
/*GENERAL CYCLE*/
|
|
||||||
int BME_cycle_length(void *h);
|
|
||||||
|
|
||||||
/*DISK CYCLE*/
|
|
||||||
struct BME_Edge *BME_disk_nextedge(struct BME_Edge *e, struct BME_Vert *v);
|
|
||||||
struct BME_CycleNode *BME_disk_getpointer(struct BME_Edge *e, struct BME_Vert *v);
|
|
||||||
struct BME_Edge *BME_disk_next_edgeflag(struct BME_Edge *e, struct BME_Vert *v, int eflag, int tflag);
|
|
||||||
int BME_disk_count_edgeflag(struct BME_Vert *v, int eflag, int tflag);
|
|
||||||
|
|
||||||
/*RADIAL CYCLE*/
|
|
||||||
struct BME_Loop *BME_radial_nextloop(struct BME_Loop *l);
|
|
||||||
int BME_radial_find_face(struct BME_Edge *e,struct BME_Poly *f);
|
|
||||||
|
|
||||||
/*LOOP CYCLE*/
|
|
||||||
struct BME_Loop *BME_loop_find_loop(struct BME_Poly *f, struct BME_Vert *v);
|
|
||||||
|
|
||||||
/*MESH CREATION/DESTRUCTION*/
|
|
||||||
struct BME_Mesh *BME_make_mesh(int allocsize[4]);
|
|
||||||
void BME_free_mesh(struct BME_Mesh *bm);
|
|
||||||
/*FULL MESH VALIDATION*/
|
|
||||||
int BME_validate_mesh(struct BME_Mesh *bm, int halt);
|
|
||||||
/*ENTER/EXIT MODELLING LOOP*/
|
|
||||||
int BME_model_begin(struct BME_Mesh *bm);
|
|
||||||
void BME_model_end(struct BME_Mesh *bm);
|
|
||||||
|
|
||||||
/*MESH CONSTRUCTION API.*/
|
|
||||||
/*MAKE*/
|
|
||||||
struct BME_Vert *BME_MV(struct BME_Mesh *bm, float *vec);
|
|
||||||
struct BME_Edge *BME_ME(struct BME_Mesh *bm, struct BME_Vert *v1, struct BME_Vert *v2);
|
|
||||||
struct BME_Poly *BME_MF(struct BME_Mesh *bm, struct BME_Vert *v1, struct BME_Vert *v2, struct BME_Edge **elist, int len);
|
|
||||||
/*KILL*/
|
|
||||||
int BME_KV(struct BME_Mesh *bm, struct BME_Vert *v);
|
|
||||||
int BME_KE(struct BME_Mesh *bm, struct BME_Edge *e);
|
|
||||||
int BME_KF(struct BME_Mesh *bm, struct BME_Poly *bply);
|
|
||||||
/*SPLIT*/
|
|
||||||
struct BME_Vert *BME_SEMV(struct BME_Mesh *bm, struct BME_Vert *tv, struct BME_Edge *e, struct BME_Edge **re);
|
|
||||||
struct BME_Poly *BME_SFME(struct BME_Mesh *bm, struct BME_Poly *f, struct BME_Vert *v1, struct BME_Vert *v2, struct BME_Loop **rl);
|
|
||||||
/*JOIN*/
|
|
||||||
int BME_JEKV(struct BME_Mesh *bm, struct BME_Edge *ke, struct BME_Vert *kv);
|
|
||||||
struct BME_Poly *BME_JFKE(struct BME_Mesh *bm, struct BME_Poly *f1, struct BME_Poly *f2,struct BME_Edge *e); /*no reason to return BME_Poly pointer?*/
|
|
||||||
/*NORMAL FLIP(Is its own inverse)*/
|
|
||||||
int BME_loop_reverse(struct BME_Mesh *bm, struct BME_Poly *f);
|
|
||||||
|
|
||||||
/* bevel tool defines */
|
/* bevel tool defines */
|
||||||
/* element flags */
|
/* element flags */
|
||||||
#define BME_BEVEL_ORIG 1
|
#define BME_BEVEL_ORIG 1
|
||||||
@@ -214,8 +63,8 @@ int BME_loop_reverse(struct BME_Mesh *bm, struct BME_Poly *f);
|
|||||||
#define BME_BEVEL_DIST (1<<12) /* same as above */
|
#define BME_BEVEL_DIST (1<<12) /* same as above */
|
||||||
|
|
||||||
typedef struct BME_TransData {
|
typedef struct BME_TransData {
|
||||||
BMesh *bm; /* the bmesh the vert belongs to */
|
struct BMesh *bm; /* the bmesh the vert belongs to */
|
||||||
BMVert *v; /* pointer to the vert this tdata applies to */
|
struct BMVert *v; /* pointer to the vert this tdata applies to */
|
||||||
float co[3]; /* the original coordinate */
|
float co[3]; /* the original coordinate */
|
||||||
float org[3]; /* the origin */
|
float org[3]; /* the origin */
|
||||||
float vec[3]; /* a directional vector; always, always normalize! */
|
float vec[3]; /* a directional vector; always, always normalize! */
|
||||||
@@ -230,13 +79,13 @@ typedef struct BME_TransData {
|
|||||||
} BME_TransData;
|
} BME_TransData;
|
||||||
|
|
||||||
typedef struct BME_TransData_Head {
|
typedef struct BME_TransData_Head {
|
||||||
GHash *gh; /* the hash structure for element lookup */
|
struct GHash *gh; /* the hash structure for element lookup */
|
||||||
MemArena *ma; /* the memory "pool" we will be drawing individual elements from */
|
struct MemArena *ma; /* the memory "pool" we will be drawing individual elements from */
|
||||||
int len;
|
int len;
|
||||||
} BME_TransData_Head;
|
} BME_TransData_Head;
|
||||||
|
|
||||||
typedef struct BME_Glob { /* stored in Global G for Transform() purposes */
|
typedef struct BME_Glob { /* stored in Global G for Transform() purposes */
|
||||||
BMesh *bm;
|
struct BMesh *bm;
|
||||||
BME_TransData_Head *td;
|
BME_TransData_Head *td;
|
||||||
struct TransInfo *Trans; /* a pointer to the global Trans struct */
|
struct TransInfo *Trans; /* a pointer to the global Trans struct */
|
||||||
int imval[2]; /* for restoring original mouse co when initTransform() is called multiple times */
|
int imval[2]; /* for restoring original mouse co when initTransform() is called multiple times */
|
||||||
@@ -246,7 +95,6 @@ typedef struct BME_Glob { /* stored in Global G for Transform() purposes */
|
|||||||
|
|
||||||
struct BME_TransData *BME_get_transdata(struct BME_TransData_Head *td, struct BMVert *v);
|
struct BME_TransData *BME_get_transdata(struct BME_TransData_Head *td, struct BMVert *v);
|
||||||
void BME_free_transdata(struct BME_TransData_Head *td);
|
void BME_free_transdata(struct BME_TransData_Head *td);
|
||||||
float *BME_bevel_calc_polynormal(struct BME_Poly *f, struct BME_TransData_Head *td);
|
|
||||||
struct BMesh *BME_bevel(struct BMEditMesh *em, float value, int res, int options, int defgrp_index, float angle, BME_TransData_Head **rtd);
|
struct BMesh *BME_bevel(struct BMEditMesh *em, float value, int res, int options, int defgrp_index, float angle, BME_TransData_Head **rtd);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,105 +0,0 @@
|
|||||||
/*
|
|
||||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* The Original Code is Copyright (C) 2004 Blender Foundation.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* The Original Code is: all of this file.
|
|
||||||
*
|
|
||||||
* Contributor(s): Geoffrey Bantle.
|
|
||||||
*
|
|
||||||
* ***** END GPL LICENSE BLOCK *****
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __BKE_BMESHCUSTOMDATA_H__
|
|
||||||
#define __BKE_BMESHCUSTOMDATA_H__
|
|
||||||
|
|
||||||
/** \file BKE_bmeshCustomData.h
|
|
||||||
* \ingroup bke
|
|
||||||
* \since January 2007
|
|
||||||
* \brief BMesh modeler structure and functions - custom data.
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct BLI_mempool;
|
|
||||||
|
|
||||||
/*Custom Data Types and defines
|
|
||||||
Eventual plan is to move almost everything to custom data and let caller
|
|
||||||
decide when making the mesh what layers they want to store in the mesh
|
|
||||||
|
|
||||||
This stuff should probably go in a seperate file....
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define BME_CD_FACETEX 0 /*Image texture/texface*/
|
|
||||||
#define BME_CD_LOOPTEX 1 /*UV coordinates*/
|
|
||||||
#define BME_CD_LOOPCOL 2 /*Vcolors*/
|
|
||||||
#define BME_CD_DEFORMVERT 3 /*Vertex Group/Weights*/
|
|
||||||
#define BME_CD_NUMTYPES 4
|
|
||||||
|
|
||||||
typedef struct BME_CustomDataLayer {
|
|
||||||
int type; /* type of data in layer */
|
|
||||||
int offset; /* offset of layer in block */
|
|
||||||
int active; /* offset of active layer*/
|
|
||||||
char name[32]; /* layer name */
|
|
||||||
} BME_CustomDataLayer;
|
|
||||||
|
|
||||||
typedef struct BME_CustomData {
|
|
||||||
struct BME_CustomDataLayer *layers; /*Custom Data Layers*/
|
|
||||||
struct BLI_mempool *pool; /*pool for alloc of blocks*/
|
|
||||||
int totlayer, totsize; /*total layers and total size in bytes of each block*/
|
|
||||||
} BME_CustomData;
|
|
||||||
|
|
||||||
typedef struct BME_CustomDataInit{
|
|
||||||
int layout[BME_CD_NUMTYPES];
|
|
||||||
int active[BME_CD_NUMTYPES];
|
|
||||||
int totlayers;
|
|
||||||
char *nametemplate;
|
|
||||||
} BME_CustomDataInit;
|
|
||||||
|
|
||||||
/*Custom data types*/
|
|
||||||
typedef struct BME_DeformWeight {
|
|
||||||
int def_nr;
|
|
||||||
float weight;
|
|
||||||
} BME_DeformWeight;
|
|
||||||
|
|
||||||
typedef struct BME_DeformVert {
|
|
||||||
struct BME_DeformWeight *dw;
|
|
||||||
int totweight;
|
|
||||||
} BME_DeformVert;
|
|
||||||
|
|
||||||
typedef struct BME_facetex{
|
|
||||||
struct Image *tpage;
|
|
||||||
char flag, transp;
|
|
||||||
short mode, tile, unwrap;
|
|
||||||
}BME_facetex;
|
|
||||||
|
|
||||||
typedef struct BME_looptex{
|
|
||||||
float u, v;
|
|
||||||
}BME_looptex;
|
|
||||||
|
|
||||||
typedef struct BME_loopcol{
|
|
||||||
char r, g, b, a;
|
|
||||||
}BME_loopcol;
|
|
||||||
|
|
||||||
/*CUSTOM DATA API*/
|
|
||||||
void BME_CD_Create(struct BME_CustomData *data, struct BME_CustomDataInit *init, int initalloc);
|
|
||||||
void BME_CD_Free(struct BME_CustomData *data);
|
|
||||||
void BME_CD_free_block(struct BME_CustomData *data, void **block);
|
|
||||||
void BME_CD_copy_data(const struct BME_CustomData *source, struct BME_CustomData *dest, void *src_block, void **dest_block);
|
|
||||||
void BME_CD_set_default(struct BME_CustomData *data, void **block);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -52,7 +52,6 @@ void brush_reset_sculpt(struct Brush *brush);
|
|||||||
struct ImBuf *get_brush_icon(struct Brush *brush);
|
struct ImBuf *get_brush_icon(struct Brush *brush);
|
||||||
|
|
||||||
/* brush library operations used by different paint panels */
|
/* brush library operations used by different paint panels */
|
||||||
int brush_delete(struct Brush **current_brush);
|
|
||||||
int brush_texture_set_nr(struct Brush *brush, int nr);
|
int brush_texture_set_nr(struct Brush *brush, int nr);
|
||||||
int brush_texture_delete(struct Brush *brush);
|
int brush_texture_delete(struct Brush *brush);
|
||||||
int brush_clone_image_set_nr(struct Brush *brush, int nr);
|
int brush_clone_image_set_nr(struct Brush *brush, int nr);
|
||||||
@@ -60,7 +59,7 @@ int brush_clone_image_delete(struct Brush *brush);
|
|||||||
|
|
||||||
/* jitter */
|
/* jitter */
|
||||||
void brush_jitter_pos(const struct Scene *scene, struct Brush *brush,
|
void brush_jitter_pos(const struct Scene *scene, struct Brush *brush,
|
||||||
float *pos, float *jitterpos);
|
const float pos[2], float jitterpos[2]);
|
||||||
|
|
||||||
/* brush curve */
|
/* brush curve */
|
||||||
void brush_curve_preset(struct Brush *b, /*enum CurveMappingPreset*/int preset);
|
void brush_curve_preset(struct Brush *b, /*enum CurveMappingPreset*/int preset);
|
||||||
@@ -75,13 +74,13 @@ void brush_imbuf_new(const struct Scene *scene, struct Brush *brush, short flt,
|
|||||||
/* painting */
|
/* painting */
|
||||||
struct BrushPainter;
|
struct BrushPainter;
|
||||||
typedef struct BrushPainter BrushPainter;
|
typedef struct BrushPainter BrushPainter;
|
||||||
typedef int (*BrushFunc)(void *user, struct ImBuf *ibuf, float *lastpos, float *pos);
|
typedef int (*BrushFunc)(void *user, struct ImBuf *ibuf, const float lastpos[2], const float pos[2]);
|
||||||
|
|
||||||
BrushPainter *brush_painter_new(struct Scene *scene, struct Brush *brush);
|
BrushPainter *brush_painter_new(struct Scene *scene, struct Brush *brush);
|
||||||
void brush_painter_require_imbuf(BrushPainter *painter, short flt,
|
void brush_painter_require_imbuf(BrushPainter *painter, short flt,
|
||||||
short texonly, int size);
|
short texonly, int size);
|
||||||
int brush_painter_paint(BrushPainter *painter, BrushFunc func, float *pos,
|
int brush_painter_paint(BrushPainter *painter, BrushFunc func, const float pos[2],
|
||||||
double time, float pressure, void *user, int use_color_correction);
|
double time, float pressure, void *user, int use_color_correction);
|
||||||
void brush_painter_break_stroke(BrushPainter *painter);
|
void brush_painter_break_stroke(BrushPainter *painter);
|
||||||
void brush_painter_free(BrushPainter *painter);
|
void brush_painter_free(BrushPainter *painter);
|
||||||
|
|
||||||
|
|||||||
@@ -203,11 +203,6 @@ int implicit_free ( struct ClothModifierData *clmd );
|
|||||||
int implicit_solver ( struct Object *ob, float frame, struct ClothModifierData *clmd, struct ListBase *effectors );
|
int implicit_solver ( struct Object *ob, float frame, struct ClothModifierData *clmd, struct ListBase *effectors );
|
||||||
void implicit_set_positions ( struct ClothModifierData *clmd );
|
void implicit_set_positions ( struct ClothModifierData *clmd );
|
||||||
|
|
||||||
// globally needed
|
|
||||||
void clmdSetInterruptCallBack ( int ( *f ) ( void ) );
|
|
||||||
////////////////////////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////
|
/////////////////////////////////////////////////
|
||||||
// cloth.c
|
// cloth.c
|
||||||
////////////////////////////////////////////////
|
////////////////////////////////////////////////
|
||||||
@@ -218,7 +213,6 @@ void cloth_free_modifier ( struct ClothModifierData *clmd );
|
|||||||
void cloth_init ( struct ClothModifierData *clmd );
|
void cloth_init ( struct ClothModifierData *clmd );
|
||||||
void clothModifier_do ( struct ClothModifierData *clmd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, float (*vertexCos)[3]);
|
void clothModifier_do ( struct ClothModifierData *clmd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, float (*vertexCos)[3]);
|
||||||
|
|
||||||
void cloth_update_normals ( ClothVertex *verts, int nVerts, struct MFace *face, int totface );
|
|
||||||
int cloth_uses_vgroup(struct ClothModifierData *clmd);
|
int cloth_uses_vgroup(struct ClothModifierData *clmd);
|
||||||
|
|
||||||
// needed for collision.c
|
// needed for collision.c
|
||||||
|
|||||||
@@ -135,16 +135,10 @@ void bvhtree_update_from_mvert ( BVHTree * bvhtree, struct MFace *faces, int num
|
|||||||
|
|
||||||
/////////////////////////////////////////////////
|
/////////////////////////////////////////////////
|
||||||
|
|
||||||
struct LinkNode *BLI_linklist_append_fast ( struct LinkNode **listp, void *ptr );
|
|
||||||
|
|
||||||
// move Collision modifier object inter-frame with step = [0,1]
|
// move Collision modifier object inter-frame with step = [0,1]
|
||||||
// defined in collisions.c
|
// defined in collisions.c
|
||||||
void collision_move_object ( struct CollisionModifierData *collmd, float step, float prevstep );
|
void collision_move_object ( struct CollisionModifierData *collmd, float step, float prevstep );
|
||||||
|
|
||||||
// interface for collision functions
|
|
||||||
void collisions_compute_barycentric ( float pv[3], float p1[3], float p2[3], float p3[3], float *w1, float *w2, float *w3 );
|
|
||||||
void interpolateOnTriangle ( float to[3], float v1[3], float v2[3], float v3[3], double w1, double w2, double w3 );
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////
|
/////////////////////////////////////////////////
|
||||||
// used in effect.c
|
// used in effect.c
|
||||||
/////////////////////////////////////////////////
|
/////////////////////////////////////////////////
|
||||||
|
|||||||
@@ -291,11 +291,7 @@ void CustomData_bmesh_set_default(struct CustomData *data, void **block);
|
|||||||
void CustomData_bmesh_free_block(struct CustomData *data, void **block);
|
void CustomData_bmesh_free_block(struct CustomData *data, void **block);
|
||||||
|
|
||||||
/* copy custom data to/from layers as in mesh/derivedmesh, to editmesh
|
/* copy custom data to/from layers as in mesh/derivedmesh, to editmesh
|
||||||
blocks of data. the CustomData's must not be compatible */
|
* blocks of data. the CustomData's must not be compatible */
|
||||||
void CustomData_to_em_block(const struct CustomData *source,
|
|
||||||
struct CustomData *dest, int index, void **block);
|
|
||||||
void CustomData_from_em_block(const struct CustomData *source,
|
|
||||||
struct CustomData *dest, void *block, int index);
|
|
||||||
void CustomData_to_bmesh_block(const struct CustomData *source,
|
void CustomData_to_bmesh_block(const struct CustomData *source,
|
||||||
struct CustomData *dest, int src_index, void **dest_block);
|
struct CustomData *dest, int src_index, void **dest_block);
|
||||||
void CustomData_from_bmesh_block(const struct CustomData *source,
|
void CustomData_from_bmesh_block(const struct CustomData *source,
|
||||||
|
|||||||
@@ -97,9 +97,6 @@ short are_obs_related(struct DagForest *dag, void *ob1, void *ob2);
|
|||||||
int is_acyclic(struct DagForest *dag); //
|
int is_acyclic(struct DagForest *dag); //
|
||||||
//int get_cycles(struct DagForest *dag, struct DagNodeQueue **queues, int *count); //
|
//int get_cycles(struct DagForest *dag, struct DagNodeQueue **queues, int *count); //
|
||||||
|
|
||||||
void boundbox_deps(void);
|
|
||||||
void draw_all_deps(void);
|
|
||||||
|
|
||||||
/* ********** API *************** */
|
/* ********** API *************** */
|
||||||
/* Note that the DAG never executes changes in Objects, only sets flags in Objects */
|
/* Note that the DAG never executes changes in Objects, only sets flags in Objects */
|
||||||
|
|
||||||
|
|||||||
@@ -109,10 +109,6 @@ typedef struct EffectorCache {
|
|||||||
int flag;
|
int flag;
|
||||||
} EffectorCache;
|
} EffectorCache;
|
||||||
|
|
||||||
struct Effect *copy_effect(struct Effect *eff);
|
|
||||||
void copy_effects(struct ListBase *lbn, struct ListBase *lb);
|
|
||||||
void deselectall_eff(struct Object *ob);
|
|
||||||
|
|
||||||
void free_partdeflect(struct PartDeflect *pd);
|
void free_partdeflect(struct PartDeflect *pd);
|
||||||
struct ListBase *pdInitEffectors(struct Scene *scene, struct Object *ob_src, struct ParticleSystem *psys_src, struct EffectorWeights *weights);
|
struct ListBase *pdInitEffectors(struct Scene *scene, struct Object *ob_src, struct ParticleSystem *psys_src, struct EffectorWeights *weights);
|
||||||
void pdEndEffectors(struct ListBase **effectors);
|
void pdEndEffectors(struct ListBase **effectors);
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ void BKE_previewimg_free(struct PreviewImage **prv);
|
|||||||
void BKE_previewimg_free_id(struct ID *id);
|
void BKE_previewimg_free_id(struct ID *id);
|
||||||
|
|
||||||
/* create a new preview image */
|
/* create a new preview image */
|
||||||
struct PreviewImage* BKE_previewimg_create(void) ;
|
struct PreviewImage* BKE_previewimg_create(void);
|
||||||
|
|
||||||
/* create a copy of the preview image */
|
/* create a copy of the preview image */
|
||||||
struct PreviewImage* BKE_previewimg_copy(struct PreviewImage *prv);
|
struct PreviewImage* BKE_previewimg_copy(struct PreviewImage *prv);
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ int BKE_idcode_is_valid(int code);
|
|||||||
/**
|
/**
|
||||||
* Return an ID code and steps the index forward 1.
|
* Return an ID code and steps the index forward 1.
|
||||||
*
|
*
|
||||||
* @param index, start as 0.
|
* @param index start as 0.
|
||||||
* @return the code, 0 when all codes have been returned.
|
* @return the code, 0 when all codes have been returned.
|
||||||
*/
|
*/
|
||||||
int BKE_idcode_iter_step(int *index);
|
int BKE_idcode_iter_step(int *index);
|
||||||
|
|||||||
@@ -75,7 +75,6 @@ void IDP_ResizeIDPArray(struct IDProperty *prop, int len);
|
|||||||
/*this function works for strings too!*/
|
/*this function works for strings too!*/
|
||||||
void IDP_ResizeArray(struct IDProperty *prop, int newlen);
|
void IDP_ResizeArray(struct IDProperty *prop, int newlen);
|
||||||
void IDP_FreeArray(struct IDProperty *prop);
|
void IDP_FreeArray(struct IDProperty *prop);
|
||||||
void IDP_UnlinkArray(struct IDProperty *prop);
|
|
||||||
|
|
||||||
/* ---------- String Type ------------ */
|
/* ---------- String Type ------------ */
|
||||||
IDProperty *IDP_NewString(const char *st, const char *name, int maxlen);/* maxlen excludes '\0' */
|
IDProperty *IDP_NewString(const char *st, const char *name, int maxlen);/* maxlen excludes '\0' */
|
||||||
|
|||||||
@@ -149,9 +149,6 @@ void BKE_image_assign_ibuf(struct Image *ima, struct ImBuf *ibuf);
|
|||||||
void BKE_image_user_calc_frame(struct ImageUser *iuser, int cfra, int fieldnr);
|
void BKE_image_user_calc_frame(struct ImageUser *iuser, int cfra, int fieldnr);
|
||||||
int BKE_image_user_get_frame(const struct ImageUser *iuser, int cfra, int fieldnr);
|
int BKE_image_user_get_frame(const struct ImageUser *iuser, int cfra, int fieldnr);
|
||||||
|
|
||||||
/* fix things in ImageUser when new image gets assigned */
|
|
||||||
void BKE_image_user_new_image(struct Image *ima, struct ImageUser *iuser);
|
|
||||||
|
|
||||||
/* sets index offset for multilayer files */
|
/* sets index offset for multilayer files */
|
||||||
struct RenderPass *BKE_image_multilayer_index(struct RenderResult *rr, struct ImageUser *iuser);
|
struct RenderPass *BKE_image_multilayer_index(struct RenderResult *rr, struct ImageUser *iuser);
|
||||||
|
|
||||||
|
|||||||
@@ -83,9 +83,10 @@ void BKE_library_make_local(struct Main *bmain, struct Library *lib, int untagge
|
|||||||
struct ID *find_id(const char *type, const char *name);
|
struct ID *find_id(const char *type, const char *name);
|
||||||
void clear_id_newpoins(void);
|
void clear_id_newpoins(void);
|
||||||
|
|
||||||
void IDnames_to_pupstring(const char **str, const char *title, const char *extraops, struct ListBase *lb,struct ID* link, short *nr);
|
void IDnames_to_pupstring(const char **str, const char *title, const char *extraops,
|
||||||
void IMAnames_to_pupstring(const char **str, const char *title, const char *extraops, struct ListBase *lb, struct ID *link, short *nr);
|
struct ListBase *lb,struct ID* link, short *nr);
|
||||||
void IPOnames_to_pupstring(const char **str, const char *title, const char *extraops, struct ListBase *lb, struct ID* link, short *nr, int blocktype);
|
void IMAnames_to_pupstring(const char **str, const char *title, const char *extraops,
|
||||||
|
struct ListBase *lb, struct ID *link, short *nr);
|
||||||
|
|
||||||
void flag_listbase_ids(ListBase *lb, short flag, short value);
|
void flag_listbase_ids(ListBase *lb, short flag, short value);
|
||||||
void flag_all_listbases_ids(short flag, short value);
|
void flag_all_listbases_ids(short flag, short value);
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ void free_material(struct Material *sc);
|
|||||||
void test_object_materials(struct ID *id);
|
void test_object_materials(struct ID *id);
|
||||||
void resize_object_material(struct Object *ob, const short totcol);
|
void resize_object_material(struct Object *ob, const short totcol);
|
||||||
void init_material(struct Material *ma);
|
void init_material(struct Material *ma);
|
||||||
struct Material *add_material_main(struct Main *main, const char *name);
|
|
||||||
struct Material *add_material(const char *name);
|
struct Material *add_material(const char *name);
|
||||||
struct Material *copy_material(struct Material *ma);
|
struct Material *copy_material(struct Material *ma);
|
||||||
struct Material *localize_material(struct Material *ma);
|
struct Material *localize_material(struct Material *ma);
|
||||||
@@ -99,10 +98,6 @@ void free_matcopybuf(void);
|
|||||||
void copy_matcopybuf(struct Material *ma);
|
void copy_matcopybuf(struct Material *ma);
|
||||||
void paste_matcopybuf(struct Material *ma);
|
void paste_matcopybuf(struct Material *ma);
|
||||||
|
|
||||||
void clear_mat_mtex_copybuf(void);
|
|
||||||
void copy_mat_mtex_copybuf(struct ID *id);
|
|
||||||
void paste_mat_mtex_copybuf(struct ID *id);
|
|
||||||
|
|
||||||
/* handle backward compatibility for tface/materials called from doversion (fileload=1) or Help Menu (fileload=0) */
|
/* handle backward compatibility for tface/materials called from doversion (fileload=1) or Help Menu (fileload=0) */
|
||||||
int do_version_tface(struct Main *main, int fileload);
|
int do_version_tface(struct Main *main, int fileload);
|
||||||
|
|
||||||
|
|||||||
@@ -166,7 +166,7 @@ struct Object *find_basis_mball(struct Scene *scene, struct Object *ob);
|
|||||||
int is_basis_mball(struct Object *ob);
|
int is_basis_mball(struct Object *ob);
|
||||||
int is_mball_basis_for(struct Object *ob1, struct Object *ob2);
|
int is_mball_basis_for(struct Object *ob1, struct Object *ob2);
|
||||||
void metaball_polygonize(struct Scene *scene, struct Object *ob, struct ListBase *dispbase);
|
void metaball_polygonize(struct Scene *scene, struct Object *ob, struct ListBase *dispbase);
|
||||||
void calc_mballco(struct MetaElem *ml, float *vec);
|
void calc_mballco(struct MetaElem *ml, float vec[3]);
|
||||||
float densfunc(struct MetaElem *ball, float x, float y, float z);
|
float densfunc(struct MetaElem *ball, float x, float y, float z);
|
||||||
float metaball(float x, float y, float z);
|
float metaball(float x, float y, float z);
|
||||||
void accum_mballfaces(int i1, int i2, int i3, int i4);
|
void accum_mballfaces(int i1, int i2, int i3, int i4);
|
||||||
@@ -174,5 +174,10 @@ void *new_pgn_element(int size);
|
|||||||
int nextcwedge (int edge, int face);
|
int nextcwedge (int edge, int face);
|
||||||
void BKE_freecubetable(void);
|
void BKE_freecubetable(void);
|
||||||
|
|
||||||
|
int BKE_metaball_minmax(struct MetaBall *mb, float min[3], float max[3]);
|
||||||
|
int BKE_metaball_center_median(struct MetaBall *mb, float cent[3]);
|
||||||
|
int BKE_metaball_center_bounds(struct MetaBall *mb, float cent[3]);
|
||||||
|
void BKE_metaball_translate(struct MetaBall *mb, float offset[3]);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -99,6 +99,18 @@ void mesh_calc_poly_center(struct MPoly *mpoly, struct MLoop *loopstart,
|
|||||||
float mesh_calc_poly_area(struct MPoly *mpoly, struct MLoop *loopstart,
|
float mesh_calc_poly_area(struct MPoly *mpoly, struct MLoop *loopstart,
|
||||||
struct MVert *mvarray, float polynormal[3]);
|
struct MVert *mvarray, float polynormal[3]);
|
||||||
|
|
||||||
|
/* Find the index of the loop in 'poly' which references vertex,
|
||||||
|
returns -1 if not found */
|
||||||
|
int poly_find_loop_from_vert(const struct MPoly *poly,
|
||||||
|
const struct MLoop *loopstart,
|
||||||
|
unsigned vert);
|
||||||
|
|
||||||
|
/* Fill 'adj_r' with the loop indices in 'poly' adjacent to the
|
||||||
|
vertex. Returns the index of the loop matching vertex, or -1 if the
|
||||||
|
vertex is not in 'poly' */
|
||||||
|
int poly_get_adj_loops_from_vert(unsigned adj_r[3], const struct MPoly *poly,
|
||||||
|
const struct MLoop *mloop, unsigned vert);
|
||||||
|
|
||||||
void unlink_mesh(struct Mesh *me);
|
void unlink_mesh(struct Mesh *me);
|
||||||
void free_mesh(struct Mesh *me, int unlink);
|
void free_mesh(struct Mesh *me, int unlink);
|
||||||
struct Mesh *add_mesh(const char *name);
|
struct Mesh *add_mesh(const char *name);
|
||||||
@@ -136,7 +148,7 @@ void mesh_calc_normals_tessface(struct MVert *mverts, int numVerts,struct MFace
|
|||||||
const char *mesh_cmp(struct Mesh *me1, struct Mesh *me2, float thresh);
|
const char *mesh_cmp(struct Mesh *me1, struct Mesh *me2, float thresh);
|
||||||
|
|
||||||
struct BoundBox *mesh_get_bb(struct Object *ob);
|
struct BoundBox *mesh_get_bb(struct Object *ob);
|
||||||
void mesh_get_texspace(struct Mesh *me, float *loc_r, float *rot_r, float *size_r);
|
void mesh_get_texspace(struct Mesh *me, float r_loc[3], float r_rot[3], float r_size[3]);
|
||||||
|
|
||||||
/* if old, it converts mface->edcode to edge drawflags */
|
/* if old, it converts mface->edcode to edge drawflags */
|
||||||
void make_edges(struct Mesh *me, int old);
|
void make_edges(struct Mesh *me, int old);
|
||||||
@@ -238,16 +250,9 @@ typedef struct IndexNode {
|
|||||||
void create_vert_poly_map(struct ListBase **map, IndexNode **mem,
|
void create_vert_poly_map(struct ListBase **map, IndexNode **mem,
|
||||||
struct MPoly *mface, struct MLoop *mloop,
|
struct MPoly *mface, struct MLoop *mloop,
|
||||||
const int totvert, const int totface, const int totloop);
|
const int totvert, const int totface, const int totloop);
|
||||||
void create_vert_face_map(struct ListBase **map, IndexNode **mem, const struct MFace *mface,
|
|
||||||
const int totvert, const int totface);
|
|
||||||
void create_vert_edge_map(struct ListBase **map, IndexNode **mem, const struct MEdge *medge,
|
void create_vert_edge_map(struct ListBase **map, IndexNode **mem, const struct MEdge *medge,
|
||||||
const int totvert, const int totedge);
|
const int totvert, const int totedge);
|
||||||
|
|
||||||
/* functions for making menu's from customdata layers */
|
|
||||||
int mesh_layers_menu_charlen(struct CustomData *data, int type); /* use this to work out how many chars to allocate */
|
|
||||||
void mesh_layers_menu_concat(struct CustomData *data, int type, char *str);
|
|
||||||
int mesh_layers_menu(struct CustomData *data, int type);
|
|
||||||
|
|
||||||
/* vertex level transformations & checks (no derived mesh) */
|
/* vertex level transformations & checks (no derived mesh) */
|
||||||
|
|
||||||
int minmax_mesh(struct Mesh *me, float min[3], float max[3]);
|
int minmax_mesh(struct Mesh *me, float min[3], float max[3]);
|
||||||
|
|||||||
@@ -55,8 +55,6 @@ void BKE_movieclip_aspect(struct MovieClip *clip, float *aspx, float *aspy);
|
|||||||
int BKE_movieclip_has_frame(struct MovieClip *clip, struct MovieClipUser *user);
|
int BKE_movieclip_has_frame(struct MovieClip *clip, struct MovieClipUser *user);
|
||||||
void BKE_movieclip_user_set_frame(struct MovieClipUser *user, int framenr);
|
void BKE_movieclip_user_set_frame(struct MovieClipUser *user, int framenr);
|
||||||
|
|
||||||
void BKE_movieclip_select_track(struct MovieClip *clip, struct MovieTrackingTrack *track, int area, int extend);
|
|
||||||
|
|
||||||
void BKE_movieclip_update_scopes(struct MovieClip *clip, struct MovieClipUser *user, struct MovieClipScopes *scopes);
|
void BKE_movieclip_update_scopes(struct MovieClip *clip, struct MovieClipUser *user, struct MovieClipScopes *scopes);
|
||||||
|
|
||||||
void BKE_movieclip_get_cache_segments(struct MovieClip *clip, struct MovieClipUser *user, int *totseg_r, int **points_r);
|
void BKE_movieclip_get_cache_segments(struct MovieClip *clip, struct MovieClipUser *user, int *totseg_r, int **points_r);
|
||||||
|
|||||||
@@ -165,7 +165,7 @@ typedef struct bNodeType {
|
|||||||
/// Create a template from an existing node.
|
/// Create a template from an existing node.
|
||||||
struct bNodeTemplate (*templatefunc)(struct bNode *);
|
struct bNodeTemplate (*templatefunc)(struct bNode *);
|
||||||
/** If a node can be made from the template in the given node tree.
|
/** If a node can be made from the template in the given node tree.
|
||||||
* \example Node groups can not be created inside their own node tree.
|
* \note Node groups can not be created inside their own node tree.
|
||||||
*/
|
*/
|
||||||
int (*validfunc)(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
|
int (*validfunc)(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
|
||||||
|
|
||||||
@@ -180,6 +180,10 @@ typedef struct bNodeType {
|
|||||||
struct bNodeTree *(*group_edit_set)(struct bNode *node, int edit);
|
struct bNodeTree *(*group_edit_set)(struct bNode *node, int edit);
|
||||||
void (*group_edit_clear)(struct bNode *node);
|
void (*group_edit_clear)(struct bNode *node);
|
||||||
|
|
||||||
|
/* Generate a temporary list of internal links (bNodeLink), for muting and disconnect operators.
|
||||||
|
* Result must be freed by caller!
|
||||||
|
*/
|
||||||
|
ListBase (*internal_connect)(struct bNodeTree *, struct bNode *node);
|
||||||
|
|
||||||
/* **** execution callbacks **** */
|
/* **** execution callbacks **** */
|
||||||
void *(*initexecfunc)(struct bNode *node);
|
void *(*initexecfunc)(struct bNode *node);
|
||||||
@@ -189,24 +193,10 @@ typedef struct bNodeType {
|
|||||||
* when a final generic version of execution code is defined, this will be changed anyway
|
* when a final generic version of execution code is defined, this will be changed anyway
|
||||||
*/
|
*/
|
||||||
void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **);
|
void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **);
|
||||||
/* This is the muting callback.
|
|
||||||
* XXX Mimics the newexecfunc signature... Not sure all of this will be useful, we will see.
|
|
||||||
*/
|
|
||||||
void (*mutefunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **);
|
|
||||||
/* And the muting util.
|
|
||||||
* Returns links as a ListBase, as pairs of bNodeStack* if in/out bNodeStacks were provided,
|
|
||||||
* else as pairs of bNodeSocket* if node tree was provided.
|
|
||||||
*/
|
|
||||||
ListBase (*mutelinksfunc)(struct bNodeTree *, struct bNode *, struct bNodeStack **, struct bNodeStack **,
|
|
||||||
struct GPUNodeStack *, struct GPUNodeStack *);
|
|
||||||
/* gpu */
|
/* gpu */
|
||||||
int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out);
|
int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out);
|
||||||
/* extended gpu function */
|
/* extended gpu function */
|
||||||
int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node, void *nodedata, struct GPUNodeStack *in, struct GPUNodeStack *out);
|
int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node, void *nodedata, struct GPUNodeStack *in, struct GPUNodeStack *out);
|
||||||
/* This is the muting gpu callback.
|
|
||||||
* XXX Mimics the gpuextfunc signature... Not sure all of this will be useful, we will see.
|
|
||||||
*/
|
|
||||||
int (*gpumutefunc)(struct GPUMaterial *, struct bNode *, void *, struct GPUNodeStack *, struct GPUNodeStack *);
|
|
||||||
} bNodeType;
|
} bNodeType;
|
||||||
|
|
||||||
/* node->exec, now in use for composites (#define for break is same as ready yes) */
|
/* node->exec, now in use for composites (#define for break is same as ready yes) */
|
||||||
@@ -284,12 +274,8 @@ typedef struct bNodeTreeType
|
|||||||
|
|
||||||
int (*validate_link)(struct bNodeTree *ntree, struct bNodeLink *link);
|
int (*validate_link)(struct bNodeTree *ntree, struct bNodeLink *link);
|
||||||
|
|
||||||
/* Default muting pointers. */
|
/* Default internal linking. */
|
||||||
void (*mutefunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **);
|
ListBase (*internal_connect)(struct bNodeTree *, struct bNode *node);
|
||||||
ListBase (*mutelinksfunc)(struct bNodeTree *, struct bNode *, struct bNodeStack **, struct bNodeStack **,
|
|
||||||
struct GPUNodeStack *, struct GPUNodeStack *);
|
|
||||||
/* gpu */
|
|
||||||
int (*gpumutefunc)(struct GPUMaterial *, struct bNode *, void *, struct GPUNodeStack *, struct GPUNodeStack *);
|
|
||||||
} bNodeTreeType;
|
} bNodeTreeType;
|
||||||
|
|
||||||
/* ************** GENERIC API, TREES *************** */
|
/* ************** GENERIC API, TREES *************** */
|
||||||
@@ -343,7 +329,7 @@ struct bNode *nodeAddNode(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
|
|||||||
void nodeUnlinkNode(struct bNodeTree *ntree, struct bNode *node);
|
void nodeUnlinkNode(struct bNodeTree *ntree, struct bNode *node);
|
||||||
void nodeUniqueName(struct bNodeTree *ntree, struct bNode *node);
|
void nodeUniqueName(struct bNodeTree *ntree, struct bNode *node);
|
||||||
|
|
||||||
void nodeRegisterType(struct bNodeTreeType *ttype, struct bNodeType *ntype) ;
|
void nodeRegisterType(struct bNodeTreeType *ttype, struct bNodeType *ntype);
|
||||||
void nodeMakeDynamicType(struct bNode *node);
|
void nodeMakeDynamicType(struct bNode *node);
|
||||||
int nodeDynamicUnlinkText(struct ID *txtid);
|
int nodeDynamicUnlinkText(struct ID *txtid);
|
||||||
|
|
||||||
@@ -353,6 +339,7 @@ struct bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node);
|
|||||||
struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, struct bNodeSocket *fromsock, struct bNode *tonode, struct bNodeSocket *tosock);
|
struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, struct bNodeSocket *fromsock, struct bNode *tonode, struct bNodeSocket *tosock);
|
||||||
void nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link);
|
void nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link);
|
||||||
void nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
|
void nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
|
||||||
|
void nodeInternalRelink(struct bNodeTree *ntree, struct bNode *node);
|
||||||
|
|
||||||
void nodeSpaceCoords(struct bNode *node, float *locx, float *locy);
|
void nodeSpaceCoords(struct bNode *node, float *locx, float *locy);
|
||||||
void nodeAttachNode(struct bNode *node, struct bNode *parent);
|
void nodeAttachNode(struct bNode *node, struct bNode *parent);
|
||||||
@@ -418,18 +405,12 @@ void node_type_exec_new(struct bNodeType *ntype,
|
|||||||
void (*freeexecfunc)(struct bNode *node, void *nodedata),
|
void (*freeexecfunc)(struct bNode *node, void *nodedata),
|
||||||
void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata,
|
void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata,
|
||||||
struct bNodeStack **, struct bNodeStack **));
|
struct bNodeStack **, struct bNodeStack **));
|
||||||
void node_type_mute(struct bNodeType *ntype,
|
void node_type_internal_connect(struct bNodeType *ntype, ListBase (*internal_connect)(struct bNodeTree *, struct bNode *));
|
||||||
void (*mutefunc)(void *data, int thread, struct bNode *, void *nodedata,
|
|
||||||
struct bNodeStack **, struct bNodeStack **),
|
|
||||||
ListBase (*mutelinksfunc)(struct bNodeTree *, struct bNode *, struct bNodeStack **,
|
|
||||||
struct bNodeStack **, struct GPUNodeStack*, struct GPUNodeStack*));
|
|
||||||
void node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node,
|
void node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node,
|
||||||
struct GPUNodeStack *in, struct GPUNodeStack *out));
|
struct GPUNodeStack *in, struct GPUNodeStack *out));
|
||||||
void node_type_gpu_ext(struct bNodeType *ntype, int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node,
|
void node_type_gpu_ext(struct bNodeType *ntype, int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node,
|
||||||
void *nodedata, struct GPUNodeStack *in,
|
void *nodedata, struct GPUNodeStack *in,
|
||||||
struct GPUNodeStack *out));
|
struct GPUNodeStack *out));
|
||||||
void node_type_gpu_mute(struct bNodeType *ntype, int (*gpumutefunc)(struct GPUMaterial *, struct bNode *, void *,
|
|
||||||
struct GPUNodeStack *, struct GPUNodeStack *));
|
|
||||||
void node_type_compatibility(struct bNodeType *ntype, short compatibility);
|
void node_type_compatibility(struct bNodeType *ntype, short compatibility);
|
||||||
|
|
||||||
/* ************** COMMON NODES *************** */
|
/* ************** COMMON NODES *************** */
|
||||||
@@ -732,9 +713,7 @@ struct TexResult;
|
|||||||
|
|
||||||
/* API */
|
/* API */
|
||||||
int ntreeTexTagAnimated(struct bNodeTree *ntree);
|
int ntreeTexTagAnimated(struct bNodeTree *ntree);
|
||||||
void ntreeTexSetPreviewFlag(int);
|
|
||||||
void ntreeTexCheckCyclics(struct bNodeTree *ntree);
|
void ntreeTexCheckCyclics(struct bNodeTree *ntree);
|
||||||
char* ntreeTexOutputMenu(struct bNodeTree *ntree);
|
|
||||||
|
|
||||||
struct bNodeTreeExec *ntreeTexBeginExecTree(struct bNodeTree *ntree, int use_tree_data);
|
struct bNodeTreeExec *ntreeTexBeginExecTree(struct bNodeTree *ntree, int use_tree_data);
|
||||||
void ntreeTexEndExecTree(struct bNodeTreeExec *exec, int use_tree_data);
|
void ntreeTexEndExecTree(struct bNodeTreeExec *exec, int use_tree_data);
|
||||||
|
|||||||
@@ -83,9 +83,6 @@ struct Object *copy_object(struct Object *ob);
|
|||||||
void make_local_object(struct Object *ob);
|
void make_local_object(struct Object *ob);
|
||||||
int object_is_libdata(struct Object *ob);
|
int object_is_libdata(struct Object *ob);
|
||||||
int object_data_is_libdata(struct Object *ob);
|
int object_data_is_libdata(struct Object *ob);
|
||||||
void set_mblur_offs(float blur);
|
|
||||||
void set_field_offs(float field);
|
|
||||||
void disable_speed_curve(int val);
|
|
||||||
|
|
||||||
void object_scale_to_mat3(struct Object *ob, float mat[][3]);
|
void object_scale_to_mat3(struct Object *ob, float mat[][3]);
|
||||||
void object_rot_to_mat3(struct Object *ob, float mat[][3]);
|
void object_rot_to_mat3(struct Object *ob, float mat[][3]);
|
||||||
@@ -104,11 +101,11 @@ void where_is_object_mat(struct Scene *scene, struct Object *ob, float obmat[4][
|
|||||||
struct BoundBox *unit_boundbox(void);
|
struct BoundBox *unit_boundbox(void);
|
||||||
void boundbox_set_from_min_max(struct BoundBox *bb, float min[3], float max[3]);
|
void boundbox_set_from_min_max(struct BoundBox *bb, float min[3], float max[3]);
|
||||||
struct BoundBox *object_get_boundbox(struct Object *ob);
|
struct BoundBox *object_get_boundbox(struct Object *ob);
|
||||||
void object_get_dimensions(struct Object *ob, float *value);
|
void object_get_dimensions(struct Object *ob, float vec[3]);
|
||||||
void object_set_dimensions(struct Object *ob, const float *value);
|
void object_set_dimensions(struct Object *ob, const float *value);
|
||||||
void object_boundbox_flag(struct Object *ob, int flag, int set);
|
void object_boundbox_flag(struct Object *ob, int flag, int set);
|
||||||
void minmax_object(struct Object *ob, float min[3], float max[3]);
|
void minmax_object(struct Object *ob, float min[3], float max[3]);
|
||||||
int minmax_object_duplis(struct Scene *scene, struct Object *ob, float *min, float *max);
|
int minmax_object_duplis(struct Scene *scene, struct Object *ob, float min[3], float max[3]);
|
||||||
|
|
||||||
/* sometimes min-max isnt enough, we need to loop over each point */
|
/* sometimes min-max isnt enough, we need to loop over each point */
|
||||||
void BKE_object_foreach_display_point(
|
void BKE_object_foreach_display_point(
|
||||||
@@ -122,7 +119,6 @@ void BKE_scene_foreach_display_point(
|
|||||||
|
|
||||||
int BKE_object_parent_loop_check(const struct Object *parent, const struct Object *ob);
|
int BKE_object_parent_loop_check(const struct Object *parent, const struct Object *ob);
|
||||||
|
|
||||||
void solve_tracking (struct Object *ob, float targetmat[][4]);
|
|
||||||
int ray_hit_boundbox(struct BoundBox *bb, float ray_start[3], float ray_normal[3]);
|
int ray_hit_boundbox(struct BoundBox *bb, float ray_start[3], float ray_normal[3]);
|
||||||
|
|
||||||
void *object_tfm_backup(struct Object *ob);
|
void *object_tfm_backup(struct Object *ob);
|
||||||
|
|||||||
@@ -319,7 +319,7 @@ void psys_free_particles(struct ParticleSystem *psys);
|
|||||||
void psys_free_children(struct ParticleSystem *psys);
|
void psys_free_children(struct ParticleSystem *psys);
|
||||||
|
|
||||||
void psys_interpolate_particle(short type, struct ParticleKey keys[4], float dt, struct ParticleKey *result, int velocity);
|
void psys_interpolate_particle(short type, struct ParticleKey keys[4], float dt, struct ParticleKey *result, int velocity);
|
||||||
void psys_vec_rot_to_face(struct DerivedMesh *dm, struct ParticleData *pa, float *vec);
|
void psys_vec_rot_to_face(struct DerivedMesh *dm, struct ParticleData *pa, float vec[3]);
|
||||||
void psys_mat_hair_to_object(struct Object *ob, struct DerivedMesh *dm, short from, struct ParticleData *pa, float hairmat[][4]);
|
void psys_mat_hair_to_object(struct Object *ob, struct DerivedMesh *dm, short from, struct ParticleData *pa, float hairmat[][4]);
|
||||||
void psys_mat_hair_to_global(struct Object *ob, struct DerivedMesh *dm, short from, struct ParticleData *pa, float hairmat[][4]);
|
void psys_mat_hair_to_global(struct Object *ob, struct DerivedMesh *dm, short from, struct ParticleData *pa, float hairmat[][4]);
|
||||||
void psys_mat_hair_to_orco(struct Object *ob, struct DerivedMesh *dm, short from, struct ParticleData *pa, float hairmat[][4]);
|
void psys_mat_hair_to_orco(struct Object *ob, struct DerivedMesh *dm, short from, struct ParticleData *pa, float hairmat[][4]);
|
||||||
|
|||||||
@@ -288,12 +288,6 @@ void BKE_ptcache_mem_pointers_init(struct PTCacheMem *pm);
|
|||||||
void BKE_ptcache_mem_pointers_incr(struct PTCacheMem *pm);
|
void BKE_ptcache_mem_pointers_incr(struct PTCacheMem *pm);
|
||||||
int BKE_ptcache_mem_pointers_seek(int point_index, struct PTCacheMem *pm);
|
int BKE_ptcache_mem_pointers_seek(int point_index, struct PTCacheMem *pm);
|
||||||
|
|
||||||
/* Copy a specific data type from cache data to point data. */
|
|
||||||
void BKE_ptcache_data_get(void **data, int type, int index, void *to);
|
|
||||||
|
|
||||||
/* Copy a specific data type from point data to cache data. */
|
|
||||||
void BKE_ptcache_data_set(void **data, int type, void *from);
|
|
||||||
|
|
||||||
/* Main cache reading call. */
|
/* Main cache reading call. */
|
||||||
int BKE_ptcache_read(PTCacheID *pid, float cfra);
|
int BKE_ptcache_read(PTCacheID *pid, float cfra);
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,8 @@ struct Strip;
|
|||||||
struct StripElem;
|
struct StripElem;
|
||||||
struct bSound;
|
struct bSound;
|
||||||
|
|
||||||
|
struct SeqIndexBuildContext;
|
||||||
|
|
||||||
#define BUILD_SEQAR_COUNT_NOTHING 0
|
#define BUILD_SEQAR_COUNT_NOTHING 0
|
||||||
#define BUILD_SEQAR_COUNT_CURRENT 1
|
#define BUILD_SEQAR_COUNT_CURRENT 1
|
||||||
#define BUILD_SEQAR_COUNT_CHILDREN 2
|
#define BUILD_SEQAR_COUNT_CHILDREN 2
|
||||||
@@ -194,9 +196,10 @@ void update_changed_seq_and_deps(struct Scene *scene, struct Sequence *changed_s
|
|||||||
int input_have_to_preprocess(
|
int input_have_to_preprocess(
|
||||||
SeqRenderData context, struct Sequence * seq, float cfra);
|
SeqRenderData context, struct Sequence * seq, float cfra);
|
||||||
|
|
||||||
void seq_proxy_rebuild(struct Main * bmain,
|
struct SeqIndexBuildContext *seq_proxy_rebuild_context(struct Main *bmain, struct Scene *scene, struct Sequence *seq);
|
||||||
struct Scene *scene, struct Sequence * seq,
|
void seq_proxy_rebuild(struct SeqIndexBuildContext *context,
|
||||||
short *stop, short *do_update, float *progress);
|
short *stop, short *do_update, float *progress);
|
||||||
|
void seq_proxy_rebuild_finish(struct SeqIndexBuildContext *context, short stop);
|
||||||
|
|
||||||
|
|
||||||
/* **********************************************************************
|
/* **********************************************************************
|
||||||
@@ -283,7 +286,6 @@ void seq_update_sound_bounds_all(struct Scene *scene);
|
|||||||
void seq_update_sound_bounds(struct Scene* scene, struct Sequence *seq);
|
void seq_update_sound_bounds(struct Scene* scene, struct Sequence *seq);
|
||||||
void seq_update_muting(struct Editing *ed);
|
void seq_update_muting(struct Editing *ed);
|
||||||
void seq_update_sound(struct Scene *scene, struct bSound *sound);
|
void seq_update_sound(struct Scene *scene, struct bSound *sound);
|
||||||
void seqbase_sound_reload(struct Scene *scene, ListBase *seqbase);
|
|
||||||
void seqbase_unique_name_recursive(ListBase *seqbasep, struct Sequence *seq);
|
void seqbase_unique_name_recursive(ListBase *seqbasep, struct Sequence *seq);
|
||||||
void seqbase_dupli_recursive(struct Scene *scene, struct Scene *scene_to, ListBase *nseqbase, ListBase *seqbase, int dupe_flag);
|
void seqbase_dupli_recursive(struct Scene *scene, struct Scene *scene_to, ListBase *nseqbase, ListBase *seqbase, int dupe_flag);
|
||||||
|
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ void sk_reverseStroke(SK_Stroke *stk);
|
|||||||
void sk_filterLastContinuousStroke(SK_Stroke *stk);
|
void sk_filterLastContinuousStroke(SK_Stroke *stk);
|
||||||
void sk_filterStroke(SK_Stroke *stk, int start, int end);
|
void sk_filterStroke(SK_Stroke *stk, int start, int end);
|
||||||
|
|
||||||
void sk_initPoint(SK_Point *pt, SK_DrawData *dd, float *no);
|
void sk_initPoint(SK_Point *pt, SK_DrawData *dd, const float no[3]);
|
||||||
void sk_copyPoint(SK_Point *dst, SK_Point *src);
|
void sk_copyPoint(SK_Point *dst, SK_Point *src);
|
||||||
|
|
||||||
int sk_stroke_filtermval(SK_DrawData *dd);
|
int sk_stroke_filtermval(SK_DrawData *dd);
|
||||||
|
|||||||
@@ -41,10 +41,10 @@ struct MultiresSubsurf;
|
|||||||
struct Object;
|
struct Object;
|
||||||
struct PBVH;
|
struct PBVH;
|
||||||
struct SubsurfModifierData;
|
struct SubsurfModifierData;
|
||||||
struct _CCGEdge;
|
struct CCGEdge;
|
||||||
struct _CCGFace;
|
struct CCGFace;
|
||||||
struct _CCGSubsurf;
|
struct CCGSubsurf;
|
||||||
struct _CCGVert;
|
struct CCGVert;
|
||||||
struct EdgeHash;
|
struct EdgeHash;
|
||||||
struct PBVH;
|
struct PBVH;
|
||||||
struct DMGridData;
|
struct DMGridData;
|
||||||
@@ -65,14 +65,14 @@ void subsurf_calculate_limit_positions(struct Mesh *me, float (*positions_r)[3])
|
|||||||
typedef struct CCGDerivedMesh {
|
typedef struct CCGDerivedMesh {
|
||||||
DerivedMesh dm;
|
DerivedMesh dm;
|
||||||
|
|
||||||
struct _CCGSubSurf *ss;
|
struct CCGSubSurf *ss;
|
||||||
int freeSS;
|
int freeSS;
|
||||||
int drawInteriorEdges, useSubsurfUv;
|
int drawInteriorEdges, useSubsurfUv;
|
||||||
|
|
||||||
struct {int startVert; struct _CCGVert *vert;} *vertMap;
|
struct {int startVert; struct CCGVert *vert;} *vertMap;
|
||||||
struct {int startVert; int startEdge; struct _CCGEdge *edge;} *edgeMap;
|
struct {int startVert; int startEdge; struct CCGEdge *edge;} *edgeMap;
|
||||||
struct {int startVert; int startEdge;
|
struct {int startVert; int startEdge;
|
||||||
int startFace; struct _CCGFace *face;} *faceMap;
|
int startFace; struct CCGFace *face;} *faceMap;
|
||||||
|
|
||||||
short *edgeFlags;
|
short *edgeFlags;
|
||||||
char *faceFlags;
|
char *faceFlags;
|
||||||
@@ -89,7 +89,7 @@ typedef struct CCGDerivedMesh {
|
|||||||
struct DMGridData **gridData;
|
struct DMGridData **gridData;
|
||||||
struct DMGridAdjacency *gridAdjacency;
|
struct DMGridAdjacency *gridAdjacency;
|
||||||
int *gridOffset;
|
int *gridOffset;
|
||||||
struct _CCGFace **gridFaces;
|
struct CCGFace **gridFaces;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
struct MultiresModifierData *mmd;
|
struct MultiresModifierData *mmd;
|
||||||
|
|||||||
@@ -92,8 +92,6 @@ void txt_backspace_word (struct Text *text);
|
|||||||
int txt_add_char (struct Text *text, unsigned int add);
|
int txt_add_char (struct Text *text, unsigned int add);
|
||||||
int txt_add_raw_char (struct Text *text, unsigned int add);
|
int txt_add_raw_char (struct Text *text, unsigned int add);
|
||||||
int txt_replace_char (struct Text *text, unsigned int add);
|
int txt_replace_char (struct Text *text, unsigned int add);
|
||||||
void txt_export_to_object(struct Text *text);
|
|
||||||
void txt_export_to_objects(struct Text *text);
|
|
||||||
void txt_unindent (struct Text *text);
|
void txt_unindent (struct Text *text);
|
||||||
void txt_comment (struct Text *text);
|
void txt_comment (struct Text *text);
|
||||||
void txt_indent (struct Text *text);
|
void txt_indent (struct Text *text);
|
||||||
@@ -107,8 +105,6 @@ struct TextMarker *txt_find_marker (struct Text *text, struct TextLine *line, i
|
|||||||
struct TextMarker *txt_find_marker_region (struct Text *text, struct TextLine *line, int start, int end, int group, int flags);
|
struct TextMarker *txt_find_marker_region (struct Text *text, struct TextLine *line, int start, int end, int group, int flags);
|
||||||
struct TextMarker *txt_prev_marker (struct Text *text, struct TextMarker *marker);
|
struct TextMarker *txt_prev_marker (struct Text *text, struct TextMarker *marker);
|
||||||
struct TextMarker *txt_next_marker (struct Text *text, struct TextMarker *marker);
|
struct TextMarker *txt_next_marker (struct Text *text, struct TextMarker *marker);
|
||||||
struct TextMarker *txt_prev_marker_color (struct Text *text, struct TextMarker *marker);
|
|
||||||
struct TextMarker *txt_next_marker_color (struct Text *text, struct TextMarker *marker);
|
|
||||||
|
|
||||||
/* utility functions, could be moved somewhere more generic but are python/text related */
|
/* utility functions, could be moved somewhere more generic but are python/text related */
|
||||||
int text_check_bracket(char ch);
|
int text_check_bracket(char ch);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user