forked from bartvdbraak/blender
svn merge -r 31211:31313 https://svn.blender.org/svnroot/bf-blender/trunk/blender
This commit is contained in:
commit
47d38dbd20
@ -316,12 +316,6 @@ IF(UNIX AND NOT APPLE)
|
|||||||
|
|
||||||
SET(PLATFORM_CFLAGS "-pipe -fPIC -funsigned-char -fno-strict-aliasing -Wno-char-subscripts")
|
SET(PLATFORM_CFLAGS "-pipe -fPIC -funsigned-char -fno-strict-aliasing -Wno-char-subscripts")
|
||||||
|
|
||||||
IF(WITH_RAYOPTIMIZATION AND SUPPORT_SSE_BUILD)
|
|
||||||
SET(PLATFORM_CFLAGS " -msse -msse2 ${PLATFORM_CFLAGS}")
|
|
||||||
ADD_DEFINITIONS(-D__SSE__)
|
|
||||||
ADD_DEFINITIONS(-D__MMX__)
|
|
||||||
ENDIF(WITH_RAYOPTIMIZATION AND SUPPORT_SSE_BUILD)
|
|
||||||
|
|
||||||
SET(PLATFORM_LINKFLAGS "-pthread")
|
SET(PLATFORM_LINKFLAGS "-pthread")
|
||||||
|
|
||||||
# Better warnings
|
# Better warnings
|
||||||
@ -633,12 +627,6 @@ IF(WIN32)
|
|||||||
SET(WITH_JACK OFF)
|
SET(WITH_JACK OFF)
|
||||||
ENDIF(WITH_JACK)
|
ENDIF(WITH_JACK)
|
||||||
|
|
||||||
IF(WITH_RAYOPTIMIZATION AND SUPPORT_SSE_BUILD)
|
|
||||||
SET(PLATFORM_CFLAGS " -msse -msse2 ${PLATFORM_CFLAGS}")
|
|
||||||
ADD_DEFINITIONS(-D__SSE__)
|
|
||||||
ADD_DEFINITIONS(-D__MMX__)
|
|
||||||
ENDIF(WITH_RAYOPTIMIZATION AND SUPPORT_SSE_BUILD)
|
|
||||||
|
|
||||||
ENDIF(MSVC)
|
ENDIF(MSVC)
|
||||||
|
|
||||||
ENDIF(WIN32)
|
ENDIF(WIN32)
|
||||||
@ -819,12 +807,6 @@ IF(APPLE)
|
|||||||
SET(TIFF_LIBPATH ${TIFF}/lib)
|
SET(TIFF_LIBPATH ${TIFF}/lib)
|
||||||
ENDIF(WITH_IMAGE_TIFF)
|
ENDIF(WITH_IMAGE_TIFF)
|
||||||
|
|
||||||
IF(WITH_RAYOPTIMIZATION AND SUPPORT_SSE_BUILD)
|
|
||||||
SET(PLATFORM_CFLAGS " -msse -msse2 ${PLATFORM_CFLAGS}")
|
|
||||||
ADD_DEFINITIONS(-D__SSE__)
|
|
||||||
ADD_DEFINITIONS(-D__MMX__)
|
|
||||||
ENDIF(WITH_RAYOPTIMIZATION AND SUPPORT_SSE_BUILD)
|
|
||||||
|
|
||||||
SET(EXETYPE MACOSX_BUNDLE)
|
SET(EXETYPE MACOSX_BUNDLE)
|
||||||
|
|
||||||
SET(CMAKE_C_FLAGS_DEBUG "-fno-strict-aliasing -g")
|
SET(CMAKE_C_FLAGS_DEBUG "-fno-strict-aliasing -g")
|
||||||
@ -868,9 +850,26 @@ IF(WITH_BUILDINFO)
|
|||||||
ENDIF(BUILD_REV_RETURN)
|
ENDIF(BUILD_REV_RETURN)
|
||||||
ENDIF(WIN32)
|
ENDIF(WIN32)
|
||||||
ENDIF(WITH_BUILDINFO)
|
ENDIF(WITH_BUILDINFO)
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
# Common.
|
# Common.
|
||||||
|
|
||||||
|
IF(WITH_RAYOPTIMIZATION)
|
||||||
|
IF(CMAKE_COMPILER_IS_GNUCC)
|
||||||
|
IF(SUPPORT_SSE_BUILD)
|
||||||
|
SET(PLATFORM_CFLAGS " -msse ${PLATFORM_CFLAGS}")
|
||||||
|
ADD_DEFINITIONS(-D__SSE__)
|
||||||
|
ADD_DEFINITIONS(-D__MMX__)
|
||||||
|
ENDIF(SUPPORT_SSE_BUILD)
|
||||||
|
IF(SUPPORT_SSE2_BUILD)
|
||||||
|
SET(PLATFORM_CFLAGS " -msse2 ${PLATFORM_CFLAGS}")
|
||||||
|
ADD_DEFINITIONS(-D__SSE2__)
|
||||||
|
IF(NOT SUPPORT_SSE_BUILD) # dont double up
|
||||||
|
ADD_DEFINITIONS(-D__MMX__)
|
||||||
|
ENDIF(NOT SUPPORT_SSE_BUILD)
|
||||||
|
ENDIF(SUPPORT_SSE2_BUILD)
|
||||||
|
ENDIF(CMAKE_COMPILER_IS_GNUCC)
|
||||||
|
ENDIF(WITH_RAYOPTIMIZATION)
|
||||||
|
|
||||||
IF(WITH_IMAGE_OPENJPEG)
|
IF(WITH_IMAGE_OPENJPEG)
|
||||||
set(OPENJPEG ${CMAKE_SOURCE_DIR}/extern/libopenjpeg)
|
set(OPENJPEG ${CMAKE_SOURCE_DIR}/extern/libopenjpeg)
|
||||||
set(OPENJPEG_INC ${OPENJPEG})
|
set(OPENJPEG_INC ${OPENJPEG})
|
||||||
|
@ -183,19 +183,38 @@ MACRO(SETUP_LIBLINKS
|
|||||||
ENDMACRO(SETUP_LIBLINKS)
|
ENDMACRO(SETUP_LIBLINKS)
|
||||||
|
|
||||||
MACRO(TEST_SSE_SUPPORT)
|
MACRO(TEST_SSE_SUPPORT)
|
||||||
INCLUDE(CheckCXXSourceCompiles)
|
INCLUDE(CheckCSourceRuns)
|
||||||
|
|
||||||
MESSAGE(STATUS "Detecting SSE support")
|
MESSAGE(STATUS "Detecting SSE support")
|
||||||
IF(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
|
IF(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
|
||||||
SET(CMAKE_REQUIRED_FLAGS "-msse -msse2")
|
SET(CMAKE_REQUIRED_FLAGS "-msse -msse2")
|
||||||
ELSEIF(MSVC)
|
ELSEIF(MSVC)
|
||||||
SET(CMAKE_REQUIRED_FLAGS "/arch:SSE2")
|
SET(CMAKE_REQUIRED_FLAGS "/arch:SSE2") # TODO, SSE 1 ?
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
CHECK_CXX_SOURCE_COMPILES("
|
CHECK_C_SOURCE_RUNS("
|
||||||
#include <xmmintrin.h>
|
#include <xmmintrin.h>
|
||||||
int main() { __m128 v = _mm_setzero_ps(); return 0; }"
|
int main() { __m128 v = _mm_setzero_ps(); return 0; }"
|
||||||
SUPPORT_SSE_BUILD)
|
SUPPORT_SSE_BUILD)
|
||||||
|
|
||||||
|
CHECK_C_SOURCE_RUNS("
|
||||||
|
#include <emmintrin.h>
|
||||||
|
int main() { __m128d v = _mm_setzero_pd(); return 0; }"
|
||||||
|
SUPPORT_SSE2_BUILD)
|
||||||
|
MESSAGE(STATUS "Detecting SSE support")
|
||||||
|
|
||||||
|
IF(SUPPORT_SSE_BUILD)
|
||||||
|
MESSAGE(STATUS " ...SSE support found.")
|
||||||
|
ELSE(SUPPORT_SSE_BUILD)
|
||||||
|
MESSAGE(STATUS " ...SSE support missing.")
|
||||||
|
ENDIF(SUPPORT_SSE_BUILD)
|
||||||
|
|
||||||
|
IF(SUPPORT_SSE2_BUILD)
|
||||||
|
MESSAGE(STATUS " ...SSE2 support found.")
|
||||||
|
ELSE(SUPPORT_SSE2_BUILD)
|
||||||
|
MESSAGE(STATUS " ...SSE2 support missing.")
|
||||||
|
ENDIF(SUPPORT_SSE2_BUILD)
|
||||||
|
|
||||||
ENDMACRO(TEST_SSE_SUPPORT)
|
ENDMACRO(TEST_SSE_SUPPORT)
|
||||||
|
|
||||||
|
|
||||||
|
@ -176,6 +176,9 @@ ifeq ($(OS),linux)
|
|||||||
REL_CFLAGS += -O2
|
REL_CFLAGS += -O2
|
||||||
REL_CCFLAGS += -O2
|
REL_CCFLAGS += -O2
|
||||||
NAN_DEPEND = true
|
NAN_DEPEND = true
|
||||||
|
ifeq ($(WITH_BF_RAYOPTIMIZATION), true)
|
||||||
|
CCFLAGS += -msse
|
||||||
|
endif
|
||||||
ifeq ($(CPU),alpha)
|
ifeq ($(CPU),alpha)
|
||||||
CFLAGS += -mieee
|
CFLAGS += -mieee
|
||||||
endif
|
endif
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -1114,13 +1114,13 @@ class Export3DS(bpy.types.Operator):
|
|||||||
bl_idname = "export.autodesk_3ds"
|
bl_idname = "export.autodesk_3ds"
|
||||||
bl_label = 'Export 3DS'
|
bl_label = 'Export 3DS'
|
||||||
|
|
||||||
# List of operator properties, the attributes will be assigned
|
|
||||||
# to the class instance from the operator settings before calling.
|
|
||||||
|
|
||||||
|
|
||||||
filepath = StringProperty(name="File Path", description="Filepath used for exporting the 3DS file", maxlen= 1024, default= "")
|
filepath = StringProperty(name="File Path", description="Filepath used for exporting the 3DS file", maxlen= 1024, default= "")
|
||||||
check_existing = BoolProperty(name="Check Existing", description="Check and warn on overwriting existing files", default=True, options={'HIDDEN'})
|
check_existing = BoolProperty(name="Check Existing", description="Check and warn on overwriting existing files", default=True, options={'HIDDEN'})
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context): # Poll isnt working yet
|
||||||
|
return context.active_object != None
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
filepath = self.properties.filepath
|
filepath = self.properties.filepath
|
||||||
filepath = bpy.path.ensure_ext(filepath, ".3ds")
|
filepath = bpy.path.ensure_ext(filepath, ".3ds")
|
||||||
@ -1129,23 +1129,23 @@ class Export3DS(bpy.types.Operator):
|
|||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
|
|
||||||
def invoke(self, context, event):
|
def invoke(self, context, event):
|
||||||
wm = context.manager
|
import os
|
||||||
wm.add_fileselect(self)
|
if not self.properties.is_property_set("filepath"):
|
||||||
|
self.properties.filepath = os.path.splitext(bpy.data.filepath)[0] + ".3ds"
|
||||||
|
|
||||||
|
context.manager.add_fileselect(self)
|
||||||
return {'RUNNING_MODAL'}
|
return {'RUNNING_MODAL'}
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def poll(cls, context): # Poll isnt working yet
|
|
||||||
return context.active_object != None
|
|
||||||
|
|
||||||
# Add to a menu
|
# Add to a menu
|
||||||
def menu_func(self, context):
|
def menu_func(self, context):
|
||||||
default_path = os.path.splitext(bpy.data.filepath)[0] + ".3ds"
|
self.layout.operator(Export3DS.bl_idname, text="3D Studio (.3ds)")
|
||||||
self.layout.operator(Export3DS.bl_idname, text="3D Studio (.3ds)").filepath = default_path
|
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
bpy.types.INFO_MT_file_export.append(menu_func)
|
bpy.types.INFO_MT_file_export.append(menu_func)
|
||||||
|
|
||||||
|
|
||||||
def unregister():
|
def unregister():
|
||||||
bpy.types.INFO_MT_file_export.remove(menu_func)
|
bpy.types.INFO_MT_file_export.remove(menu_func)
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ import math # math.pi
|
|||||||
import shutil # for file copying
|
import shutil # for file copying
|
||||||
|
|
||||||
import bpy
|
import bpy
|
||||||
from mathutils import Vector, Euler, Matrix, RotationMatrix
|
from mathutils import Vector, Euler, Matrix
|
||||||
|
|
||||||
def copy_file(source, dest):
|
def copy_file(source, dest):
|
||||||
# XXX - remove, can use shutil
|
# XXX - remove, can use shutil
|
||||||
@ -107,19 +107,19 @@ def eulerRadToDeg(eul):
|
|||||||
mtx4_identity = Matrix()
|
mtx4_identity = Matrix()
|
||||||
|
|
||||||
# testing
|
# testing
|
||||||
mtx_x90 = RotationMatrix( math.pi/2, 3, 'X') # used
|
mtx_x90 = Matrix.Rotation( math.pi/2, 3, 'X') # used
|
||||||
#mtx_x90n = RotationMatrix(-90, 3, 'x')
|
#mtx_x90n = Matrix.Rotation(-90, 3, 'x')
|
||||||
#mtx_y90 = RotationMatrix( 90, 3, 'y')
|
#mtx_y90 = Matrix.Rotation( 90, 3, 'y')
|
||||||
#mtx_y90n = RotationMatrix(-90, 3, 'y')
|
#mtx_y90n = Matrix.Rotation(-90, 3, 'y')
|
||||||
#mtx_z90 = RotationMatrix( 90, 3, 'z')
|
#mtx_z90 = Matrix.Rotation( 90, 3, 'z')
|
||||||
#mtx_z90n = RotationMatrix(-90, 3, 'z')
|
#mtx_z90n = Matrix.Rotation(-90, 3, 'z')
|
||||||
|
|
||||||
#mtx4_x90 = RotationMatrix( 90, 4, 'x')
|
#mtx4_x90 = Matrix.Rotation( 90, 4, 'x')
|
||||||
mtx4_x90n = RotationMatrix(-math.pi/2, 4, 'X') # used
|
mtx4_x90n = Matrix.Rotation(-math.pi/2, 4, 'X') # used
|
||||||
#mtx4_y90 = RotationMatrix( 90, 4, 'y')
|
#mtx4_y90 = Matrix.Rotation( 90, 4, 'y')
|
||||||
mtx4_y90n = RotationMatrix(-math.pi/2, 4, 'Y') # used
|
mtx4_y90n = Matrix.Rotation(-math.pi/2, 4, 'Y') # used
|
||||||
mtx4_z90 = RotationMatrix( math.pi/2, 4, 'Z') # used
|
mtx4_z90 = Matrix.Rotation( math.pi/2, 4, 'Z') # used
|
||||||
mtx4_z90n = RotationMatrix(-math.pi/2, 4, 'Z') # used
|
mtx4_z90n = Matrix.Rotation(-math.pi/2, 4, 'Z') # used
|
||||||
|
|
||||||
# def strip_path(p):
|
# def strip_path(p):
|
||||||
# return p.split('\\')[-1].split('/')[-1]
|
# return p.split('\\')[-1].split('/')[-1]
|
||||||
@ -562,7 +562,7 @@ def write(filename, batch_objects = None, \
|
|||||||
elif type =='CAMERA':
|
elif type =='CAMERA':
|
||||||
# elif ob and type =='Camera':
|
# elif ob and type =='Camera':
|
||||||
y = matrix_rot * Vector((0.0, 1.0, 0.0))
|
y = matrix_rot * Vector((0.0, 1.0, 0.0))
|
||||||
matrix_rot = RotationMatrix(math.pi/2, 3, y) * matrix_rot
|
matrix_rot = Matrix.Rotation(math.pi/2, 3, y) * matrix_rot
|
||||||
|
|
||||||
return matrix_rot
|
return matrix_rot
|
||||||
|
|
||||||
@ -664,7 +664,7 @@ def write(filename, batch_objects = None, \
|
|||||||
rot = tuple(matrix_rot.to_euler())
|
rot = tuple(matrix_rot.to_euler())
|
||||||
elif ob and ob.type =='Camera':
|
elif ob and ob.type =='Camera':
|
||||||
y = matrix_rot * Vector((0.0, 1.0, 0.0))
|
y = matrix_rot * Vector((0.0, 1.0, 0.0))
|
||||||
matrix_rot = RotationMatrix(math.pi/2, 3, y) * matrix_rot
|
matrix_rot = Matrix.Rotation(math.pi/2, 3, y) * matrix_rot
|
||||||
rot = tuple(matrix_rot.to_euler())
|
rot = tuple(matrix_rot.to_euler())
|
||||||
else:
|
else:
|
||||||
rot = tuple(matrix_rot.to_euler())
|
rot = tuple(matrix_rot.to_euler())
|
||||||
@ -3404,8 +3404,11 @@ class ExportFBX(bpy.types.Operator):
|
|||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
|
|
||||||
def invoke(self, context, event):
|
def invoke(self, context, event):
|
||||||
wm = context.manager
|
import os
|
||||||
wm.add_fileselect(self)
|
if not self.properties.is_property_set("filepath"):
|
||||||
|
self.properties.filepath = os.path.splitext(bpy.data.filepath)[0] + ".fbx"
|
||||||
|
|
||||||
|
context.manager.add_fileselect(self)
|
||||||
return {'RUNNING_MODAL'}
|
return {'RUNNING_MODAL'}
|
||||||
|
|
||||||
|
|
||||||
@ -3439,8 +3442,7 @@ class ExportFBX(bpy.types.Operator):
|
|||||||
|
|
||||||
|
|
||||||
def menu_func(self, context):
|
def menu_func(self, context):
|
||||||
default_path = os.path.splitext(bpy.data.filepath)[0] + ".fbx"
|
self.layout.operator(ExportFBX.bl_idname, text="Autodesk FBX (.fbx)")
|
||||||
self.layout.operator(ExportFBX.bl_idname, text="Autodesk FBX (.fbx)").filepath = default_path
|
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
|
@ -185,15 +185,16 @@ class ExportMDD(bpy.types.Operator):
|
|||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
|
|
||||||
def invoke(self, context, event):
|
def invoke(self, context, event):
|
||||||
wm = context.manager
|
import os
|
||||||
wm.add_fileselect(self)
|
if not self.properties.is_property_set("filepath"):
|
||||||
|
self.properties.filepath = os.path.splitext(bpy.data.filepath)[0] + ".mdd"
|
||||||
|
|
||||||
|
context.manager.add_fileselect(self)
|
||||||
return {'RUNNING_MODAL'}
|
return {'RUNNING_MODAL'}
|
||||||
|
|
||||||
|
|
||||||
def menu_func(self, context):
|
def menu_func(self, context):
|
||||||
import os
|
self.layout.operator(ExportMDD.bl_idname, text="Lightwave Point Cache (.mdd)")
|
||||||
default_path = os.path.splitext(bpy.data.filepath)[0] + ".mdd"
|
|
||||||
self.layout.operator(ExportMDD.bl_idname, text="Lightwave Point Cache (.mdd)").filepath = default_path
|
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
|
@ -363,7 +363,7 @@ def write_file(filepath, objects, scene,
|
|||||||
file.write('mtllib %s\n' % ( mtlfilepath.split('\\')[-1].split('/')[-1] ))
|
file.write('mtllib %s\n' % ( mtlfilepath.split('\\')[-1].split('/')[-1] ))
|
||||||
|
|
||||||
if EXPORT_ROTX90:
|
if EXPORT_ROTX90:
|
||||||
mat_xrot90= mathutils.RotationMatrix(-math.pi/2, 4, 'X')
|
mat_xrot90= mathutils.Matrix.Rotation(-math.pi/2, 4, 'X')
|
||||||
|
|
||||||
# Initialize totals, these are updated each object
|
# Initialize totals, these are updated each object
|
||||||
totverts = totuvco = totno = 1
|
totverts = totuvco = totno = 1
|
||||||
@ -960,14 +960,16 @@ class ExportOBJ(bpy.types.Operator):
|
|||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
|
|
||||||
def invoke(self, context, event):
|
def invoke(self, context, event):
|
||||||
wm = context.manager
|
import os
|
||||||
wm.add_fileselect(self)
|
if not self.properties.is_property_set("filepath"):
|
||||||
|
self.properties.filepath = os.path.splitext(bpy.data.filepath)[0] + ".obj"
|
||||||
|
|
||||||
|
context.manager.add_fileselect(self)
|
||||||
return {'RUNNING_MODAL'}
|
return {'RUNNING_MODAL'}
|
||||||
|
|
||||||
|
|
||||||
def menu_func(self, context):
|
def menu_func(self, context):
|
||||||
default_path = os.path.splitext(bpy.data.filepath)[0] + ".obj"
|
self.layout.operator(ExportOBJ.bl_idname, text="Wavefront (.obj)")
|
||||||
self.layout.operator(ExportOBJ.bl_idname, text="Wavefront (.obj)").filepath = default_path
|
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
|
@ -293,8 +293,11 @@ class ExportPLY(bpy.types.Operator):
|
|||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
|
|
||||||
def invoke(self, context, event):
|
def invoke(self, context, event):
|
||||||
wm = context.manager
|
import os
|
||||||
wm.add_fileselect(self)
|
if not self.properties.is_property_set("filepath"):
|
||||||
|
self.properties.filepath = os.path.splitext(bpy.data.filepath)[0] + ".ply"
|
||||||
|
|
||||||
|
context.manager.add_fileselect(self)
|
||||||
return {'RUNNING_MODAL'}
|
return {'RUNNING_MODAL'}
|
||||||
|
|
||||||
def draw(self, context):
|
def draw(self, context):
|
||||||
@ -310,9 +313,7 @@ class ExportPLY(bpy.types.Operator):
|
|||||||
|
|
||||||
|
|
||||||
def menu_func(self, context):
|
def menu_func(self, context):
|
||||||
import os
|
self.layout.operator(ExportPLY.bl_idname, text="Stanford (.ply)")
|
||||||
default_path = os.path.splitext(bpy.data.filepath)[0] + ".ply"
|
|
||||||
self.layout.operator(ExportPLY.bl_idname, text="Stanford (.ply)").filepath = default_path
|
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
|
@ -81,7 +81,7 @@ from export_3ds import create_derived_objects, free_derived_objects
|
|||||||
|
|
||||||
#
|
#
|
||||||
DEG2RAD=0.017453292519943295
|
DEG2RAD=0.017453292519943295
|
||||||
MATWORLD= mathutils.RotationMatrix(-90, 4, 'X')
|
MATWORLD= mathutils.Matrix.Rotation(-90, 4, 'X')
|
||||||
|
|
||||||
####################################
|
####################################
|
||||||
# Global Variables
|
# Global Variables
|
||||||
@ -1205,14 +1205,16 @@ class ExportX3D(bpy.types.Operator):
|
|||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
|
|
||||||
def invoke(self, context, event):
|
def invoke(self, context, event):
|
||||||
wm = context.manager
|
import os
|
||||||
wm.add_fileselect(self)
|
if not self.properties.is_property_set("filepath"):
|
||||||
|
self.properties.filepath = os.path.splitext(bpy.data.filepath)[0] + ".x3d"
|
||||||
|
|
||||||
|
context.manager.add_fileselect(self)
|
||||||
return {'RUNNING_MODAL'}
|
return {'RUNNING_MODAL'}
|
||||||
|
|
||||||
|
|
||||||
def menu_func(self, context):
|
def menu_func(self, context):
|
||||||
default_path = os.path.splitext(bpy.data.filepath)[0] + ".x3d"
|
self.layout.operator(ExportX3D.bl_idname, text="X3D Extensible 3D (.x3d)")
|
||||||
self.layout.operator(ExportX3D.bl_idname, text="X3D Extensible 3D (.x3d)").filepath = default_path
|
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
|
@ -23,7 +23,7 @@ from math import radians
|
|||||||
|
|
||||||
import bpy
|
import bpy
|
||||||
import mathutils
|
import mathutils
|
||||||
from mathutils import Vector, Euler, Matrix, RotationMatrix, TranslationMatrix
|
from mathutils import Vector, Euler, Matrix
|
||||||
|
|
||||||
|
|
||||||
class bvh_node_class(object):
|
class bvh_node_class(object):
|
||||||
@ -78,7 +78,7 @@ MATRIX_IDENTITY_4x4 = Matrix([1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0,
|
|||||||
|
|
||||||
def eulerRotate(x, y, z, rot_order):
|
def eulerRotate(x, y, z, rot_order):
|
||||||
# Clamp all values between 0 and 360, values outside this raise an error.
|
# Clamp all values between 0 and 360, values outside this raise an error.
|
||||||
mats = [RotationMatrix(x, 3, 'X'), RotationMatrix(y, 3, 'Y'), RotationMatrix(z, 3, 'Z')]
|
mats = [Matrix.Rotation(x, 3, 'X'), Matrix.Rotation(y, 3, 'Y'), Matrix.Rotation(z, 3, 'Z')]
|
||||||
return (MATRIX_IDENTITY_3x3 * mats[rot_order[0]] * (mats[rot_order[1]] * (mats[rot_order[2]]))).to_euler()
|
return (MATRIX_IDENTITY_3x3 * mats[rot_order[0]] * (mats[rot_order[1]] * (mats[rot_order[2]]))).to_euler()
|
||||||
|
|
||||||
# Should work but doesnt!
|
# Should work but doesnt!
|
||||||
@ -529,7 +529,7 @@ def bvh_node_dict2armature(context, bvh_nodes, ROT_MODE='XYZ', IMPORT_START_FRAM
|
|||||||
prev_euler[i] = euler
|
prev_euler[i] = euler
|
||||||
|
|
||||||
if bvh_node.has_loc:
|
if bvh_node.has_loc:
|
||||||
pose_bone.location = (bone_rest_matrix_inv * TranslationMatrix(Vector((lx, ly, lz)) - bvh_node.rest_head_local)).translation_part()
|
pose_bone.location = (bone_rest_matrix_inv * Matrix.Translation(Vector((lx, ly, lz)) - bvh_node.rest_head_local)).translation_part()
|
||||||
|
|
||||||
if bvh_node.has_loc:
|
if bvh_node.has_loc:
|
||||||
pose_bone.keyframe_insert("location")
|
pose_bone.keyframe_insert("location")
|
||||||
|
@ -141,7 +141,7 @@ import os
|
|||||||
import time
|
import time
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
from import_scene_obj import unpack_face_list, load_image
|
from import_scene_obj import load_image
|
||||||
|
|
||||||
import bpy
|
import bpy
|
||||||
import mathutils
|
import mathutils
|
||||||
@ -312,10 +312,10 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
|
|||||||
contextMaterial = None
|
contextMaterial = None
|
||||||
contextMatrix_rot = None # Blender.mathutils.Matrix(); contextMatrix.identity()
|
contextMatrix_rot = None # Blender.mathutils.Matrix(); contextMatrix.identity()
|
||||||
#contextMatrix_tx = None # Blender.mathutils.Matrix(); contextMatrix.identity()
|
#contextMatrix_tx = None # Blender.mathutils.Matrix(); contextMatrix.identity()
|
||||||
contextMesh_vertls = None
|
contextMesh_vertls = None # flat array: (verts * 3)
|
||||||
contextMesh_facels = None
|
contextMesh_facels = None
|
||||||
contextMeshMaterials = {} # matname:[face_idxs]
|
contextMeshMaterials = {} # matname:[face_idxs]
|
||||||
contextMeshUV = None
|
contextMeshUV = None # flat array (verts * 2)
|
||||||
|
|
||||||
TEXTURE_DICT = {}
|
TEXTURE_DICT = {}
|
||||||
MATDICT = {}
|
MATDICT = {}
|
||||||
@ -334,112 +334,68 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
|
|||||||
|
|
||||||
def putContextMesh(myContextMesh_vertls, myContextMesh_facels, myContextMeshMaterials):
|
def putContextMesh(myContextMesh_vertls, myContextMesh_facels, myContextMeshMaterials):
|
||||||
|
|
||||||
materialFaces = set() # faces that have a material. Can optimize?
|
bmesh = bpy.data.meshes.new(contextObName)
|
||||||
|
if myContextMesh_vertls:
|
||||||
|
|
||||||
# Now make copies with assigned materils.
|
bmesh.add_geometry(len(myContextMesh_vertls)//3, 0, len(myContextMesh_facels))
|
||||||
|
bmesh.verts.foreach_set("co", myContextMesh_vertls)
|
||||||
|
|
||||||
def makeMeshMaterialCopy(matName, faces):
|
eekadoodle_faces = []
|
||||||
'''
|
for v1, v2, v3 in myContextMesh_facels:
|
||||||
Make a new mesh with only face the faces that use this material.
|
eekadoodle_faces.extend([v3, v1, v2, 0] if v3 == 0 else [v1, v2, v3, 0])
|
||||||
faces can be any iterable object - containing ints.
|
bmesh.faces.foreach_set("verts_raw", eekadoodle_faces)
|
||||||
'''
|
|
||||||
|
|
||||||
faceVertUsers = [False] * len(myContextMesh_vertls)
|
if bmesh.faces and contextMeshUV:
|
||||||
ok = 0
|
bmesh.add_uv_texture()
|
||||||
for fIdx in faces:
|
uv_faces = bmesh.active_uv_texture.data[:]
|
||||||
for vindex in myContextMesh_facels[fIdx]:
|
|
||||||
faceVertUsers[vindex] = True
|
|
||||||
if matName != None: # if matName is none then this is a set(), meaning we are using the untextured faces and do not need to store textured faces.
|
|
||||||
materialFaces.add(fIdx)
|
|
||||||
ok = 1
|
|
||||||
|
|
||||||
if not ok:
|
|
||||||
return
|
|
||||||
|
|
||||||
myVertMapping = {}
|
|
||||||
vertMappingIndex = 0
|
|
||||||
|
|
||||||
vertsToUse = [i for i in range(len(myContextMesh_vertls)) if faceVertUsers[i]]
|
|
||||||
myVertMapping = {ii: i for i, ii in enumerate(vertsToUse)}
|
|
||||||
|
|
||||||
tempName= '%s_%s' % (contextObName, matName) # matName may be None.
|
|
||||||
bmesh = bpy.data.meshes.new(tempName)
|
|
||||||
|
|
||||||
if matName == None:
|
|
||||||
img = None
|
|
||||||
else:
|
else:
|
||||||
bmat = MATDICT[matName][1]
|
uv_faces = None
|
||||||
bmesh.add_material(bmat)
|
|
||||||
# bmesh.materials = [bmat]
|
|
||||||
try: img = TEXTURE_DICT[bmat.name]
|
|
||||||
except: img = None
|
|
||||||
|
|
||||||
# bmesh_verts = bmesh.verts
|
for mat_idx, (matName, faces) in enumerate(myContextMeshMaterials.items()):
|
||||||
if len(vertsToUse):
|
if matName is None:
|
||||||
bmesh.add_geometry(len(vertsToUse), 0, len(faces))
|
bmesh.add_material(None)
|
||||||
|
else:
|
||||||
|
bmat = MATDICT[matName][1]
|
||||||
|
bmesh.add_material(bmat) # can be None
|
||||||
|
img = TEXTURE_DICT.get(bmat.name)
|
||||||
|
|
||||||
# XXX why add extra vertex?
|
if uv_faces and img:
|
||||||
# bmesh_verts.extend( [Vector()] )
|
for fidx in faces:
|
||||||
bmesh.verts.foreach_set("co", [x for tup in [myContextMesh_vertls[i] for i in vertsToUse] for x in tup])
|
bmesh.faces[fidx].material_index = mat_idx
|
||||||
# bmesh_verts.extend( [myContextMesh_vertls[i] for i in vertsToUse] )
|
uf = uv_faces[fidx]
|
||||||
|
uf.image = img
|
||||||
|
uf.tex = True
|
||||||
|
else:
|
||||||
|
for fidx in faces:
|
||||||
|
bmesh.faces[fidx].material_index = mat_idx
|
||||||
|
|
||||||
# +1 because of DUMMYVERT
|
if uv_faces:
|
||||||
bmesh.faces.foreach_set("verts_raw", unpack_face_list([[myVertMapping[vindex] for vindex in myContextMesh_facels[fIdx]] for fIdx in faces]))
|
for fidx, uf in enumerate(uv_faces):
|
||||||
# face_mapping = bmesh.faces.extend( [ [ bmesh_verts[ myVertMapping[vindex]+1] for vindex in myContextMesh_facels[fIdx]] for fIdx in faces ], indexList=True )
|
face = myContextMesh_facels[fidx]
|
||||||
|
v1, v2, v3 = face
|
||||||
|
|
||||||
if bmesh.faces and (contextMeshUV or img):
|
# eekadoodle
|
||||||
bmesh.add_uv_texture()
|
if v3 == 0:
|
||||||
for ii, i in enumerate(faces):
|
v1, v2, v3 = v3, v1, v2
|
||||||
|
|
||||||
# Mapped index- faces may have not been added- if so, then map to the correct index
|
uf.uv1 = contextMeshUV[v1 * 2:(v1 * 2) + 2]
|
||||||
# BUGGY API - face_mapping is not always the right length
|
uf.uv2 = contextMeshUV[v2 * 2:(v2 * 2) + 2]
|
||||||
# map_index = face_mapping[ii]
|
uf.uv3 = contextMeshUV[v3 * 2:(v3 * 2) + 2]
|
||||||
|
# always a tri
|
||||||
|
|
||||||
if 1:
|
ob = bpy.data.objects.new(tempName, bmesh)
|
||||||
# if map_index != None:
|
SCN.objects.link(ob)
|
||||||
targetFace = bmesh.faces[ii]
|
|
||||||
# targetFace = bmesh.faces[map_index]
|
|
||||||
|
|
||||||
uf = bmesh.active_uv_texture.data[ii]
|
'''
|
||||||
|
if contextMatrix_tx:
|
||||||
|
ob.setMatrix(contextMatrix_tx)
|
||||||
|
'''
|
||||||
|
|
||||||
if contextMeshUV:
|
if contextMatrix_rot:
|
||||||
# v.index-1 because of the DUMMYVERT
|
ob.matrix_world = contextMatrix_rot
|
||||||
uvs = [contextMeshUV[vindex] for vindex in myContextMesh_facels[i]]
|
|
||||||
|
|
||||||
if len(myContextMesh_facels[i]) == 3:
|
importedObjects.append(ob)
|
||||||
uf.uv1, uf.uv2, uf.uv3, uf.uv4 = uvs + [(0.0, 0.0)]
|
bmesh.update()
|
||||||
else:
|
|
||||||
uf.uv1, uf.uv2, uf.uv3, uf.uv4 = uvs
|
|
||||||
# targetFace.uv = [contextMeshUV[vindex] for vindex in myContextMesh_facels[i]]
|
|
||||||
if img:
|
|
||||||
uf.image = img
|
|
||||||
|
|
||||||
# to get this image to show up in 'Textured' shading mode
|
|
||||||
uf.tex = True
|
|
||||||
|
|
||||||
# bmesh.transform(contextMatrix)
|
|
||||||
ob = bpy.data.objects.new(tempName, bmesh)
|
|
||||||
SCN.objects.link(ob)
|
|
||||||
# ob = SCN_OBJECTS.new(bmesh, tempName)
|
|
||||||
'''
|
|
||||||
if contextMatrix_tx:
|
|
||||||
ob.setMatrix(contextMatrix_tx)
|
|
||||||
'''
|
|
||||||
|
|
||||||
if contextMatrix_rot:
|
|
||||||
ob.matrix_world = contextMatrix_rot
|
|
||||||
|
|
||||||
importedObjects.append(ob)
|
|
||||||
bmesh.update()
|
|
||||||
# bmesh.calcNormals()
|
|
||||||
|
|
||||||
for matName, faces in myContextMeshMaterials.items():
|
|
||||||
makeMeshMaterialCopy(matName, faces)
|
|
||||||
|
|
||||||
if len(materialFaces) != len(myContextMesh_facels):
|
|
||||||
# Invert material faces.
|
|
||||||
makeMeshMaterialCopy(None, set(range(len( myContextMesh_facels ))) - materialFaces)
|
|
||||||
#raise 'Some UnMaterialed faces', len(contextMesh.faces)
|
|
||||||
|
|
||||||
#a spare chunk
|
#a spare chunk
|
||||||
new_chunk = chunk()
|
new_chunk = chunk()
|
||||||
@ -667,13 +623,9 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
|
|||||||
new_chunk.bytes_read += 2
|
new_chunk.bytes_read += 2
|
||||||
|
|
||||||
# print 'number of verts: ', num_verts
|
# print 'number of verts: ', num_verts
|
||||||
def getvert():
|
contextMesh_vertls = struct.unpack('<%df' % (num_verts * 3), file.read(STRUCT_SIZE_3FLOAT * num_verts))
|
||||||
temp_data = struct.unpack('<3f', file.read(STRUCT_SIZE_3FLOAT))
|
new_chunk.bytes_read += STRUCT_SIZE_3FLOAT * num_verts
|
||||||
new_chunk.bytes_read += STRUCT_SIZE_3FLOAT #12: 3 floats x 4 bytes each
|
# dummyvert is not used atm!
|
||||||
return temp_data
|
|
||||||
|
|
||||||
#contextMesh.verts.extend( [Vector(),] ) # DUMMYVERT! - remove when blenders internals are fixed.
|
|
||||||
contextMesh_vertls = [getvert() for i in range(num_verts)]
|
|
||||||
|
|
||||||
#print 'object verts: bytes read: ', new_chunk.bytes_read
|
#print 'object verts: bytes read: ', new_chunk.bytes_read
|
||||||
|
|
||||||
@ -684,15 +636,11 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
|
|||||||
new_chunk.bytes_read += 2
|
new_chunk.bytes_read += 2
|
||||||
#print 'number of faces: ', num_faces
|
#print 'number of faces: ', num_faces
|
||||||
|
|
||||||
def getface():
|
# print '\ngetting a face'
|
||||||
# print '\ngetting a face'
|
temp_data = file.read(STRUCT_SIZE_4UNSIGNED_SHORT * num_faces)
|
||||||
temp_data = file.read(STRUCT_SIZE_4UNSIGNED_SHORT)
|
new_chunk.bytes_read += STRUCT_SIZE_4UNSIGNED_SHORT * num_faces #4 short ints x 2 bytes each
|
||||||
new_chunk.bytes_read += STRUCT_SIZE_4UNSIGNED_SHORT #4 short ints x 2 bytes each
|
contextMesh_facels = struct.unpack('<%dH' % (num_faces * 4), temp_data)
|
||||||
v1,v2,v3,dummy = struct.unpack('<4H', temp_data)
|
contextMesh_facels = [contextMesh_facels[i - 3:i] for i in range(3, (num_faces * 4) + 3, 4)]
|
||||||
return v1, v2, v3
|
|
||||||
|
|
||||||
contextMesh_facels = [ getface() for i in range(num_faces) ]
|
|
||||||
|
|
||||||
|
|
||||||
elif (new_chunk.ID == OBJECT_MATERIAL):
|
elif (new_chunk.ID == OBJECT_MATERIAL):
|
||||||
# print 'elif (new_chunk.ID == OBJECT_MATERIAL):'
|
# print 'elif (new_chunk.ID == OBJECT_MATERIAL):'
|
||||||
@ -703,12 +651,11 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
|
|||||||
num_faces_using_mat = struct.unpack('<H', temp_data)[0]
|
num_faces_using_mat = struct.unpack('<H', temp_data)[0]
|
||||||
new_chunk.bytes_read += STRUCT_SIZE_UNSIGNED_SHORT
|
new_chunk.bytes_read += STRUCT_SIZE_UNSIGNED_SHORT
|
||||||
|
|
||||||
def getmat():
|
|
||||||
temp_data = file.read(STRUCT_SIZE_UNSIGNED_SHORT)
|
|
||||||
new_chunk.bytes_read += STRUCT_SIZE_UNSIGNED_SHORT
|
|
||||||
return struct.unpack('<H', temp_data)[0]
|
|
||||||
|
|
||||||
contextMeshMaterials[material_name]= [ getmat() for i in range(num_faces_using_mat) ]
|
temp_data = file.read(STRUCT_SIZE_UNSIGNED_SHORT * num_faces_using_mat)
|
||||||
|
new_chunk.bytes_read += STRUCT_SIZE_UNSIGNED_SHORT * num_faces_using_mat
|
||||||
|
|
||||||
|
contextMeshMaterials[material_name]= struct.unpack("<%dH" % (num_faces_using_mat), temp_data)
|
||||||
|
|
||||||
#look up the material in all the materials
|
#look up the material in all the materials
|
||||||
|
|
||||||
@ -717,12 +664,9 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
|
|||||||
num_uv = struct.unpack('<H', temp_data)[0]
|
num_uv = struct.unpack('<H', temp_data)[0]
|
||||||
new_chunk.bytes_read += 2
|
new_chunk.bytes_read += 2
|
||||||
|
|
||||||
def getuv():
|
temp_data = file.read(STRUCT_SIZE_2FLOAT * num_uv)
|
||||||
temp_data = file.read(STRUCT_SIZE_2FLOAT)
|
new_chunk.bytes_read += STRUCT_SIZE_2FLOAT * num_uv
|
||||||
new_chunk.bytes_read += STRUCT_SIZE_2FLOAT #2 float x 4 bytes each
|
contextMeshUV = struct.unpack('<%df' % (num_uv * 2), temp_data)
|
||||||
return mathutils.Vector( struct.unpack('<2f', temp_data) )
|
|
||||||
|
|
||||||
contextMeshUV = [ getuv() for i in range(num_uv) ]
|
|
||||||
|
|
||||||
elif (new_chunk.ID == OBJECT_TRANS_MATRIX):
|
elif (new_chunk.ID == OBJECT_TRANS_MATRIX):
|
||||||
# How do we know the matrix size? 54 == 4x4 48 == 4x3
|
# How do we know the matrix size? 54 == 4x4 48 == 4x3
|
||||||
@ -771,7 +715,7 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
|
|||||||
#print contextMatrix_rot
|
#print contextMatrix_rot
|
||||||
contextMatrix_rot.invert()
|
contextMatrix_rot.invert()
|
||||||
#print contextMatrix_rot
|
#print contextMatrix_rot
|
||||||
#contextMatrix_tx = Blender.mathutils.TranslationMatrix(0.5 * Blender.mathutils.Vector(data[9:]))
|
#contextMatrix_tx = mathutils.Matrix.Translation(0.5 * Blender.mathutils.Vector(data[9:]))
|
||||||
#contextMatrix_tx.invert()
|
#contextMatrix_tx.invert()
|
||||||
|
|
||||||
#tx.invert()
|
#tx.invert()
|
||||||
@ -806,7 +750,7 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
|
|||||||
|
|
||||||
# FINISHED LOOP
|
# FINISHED LOOP
|
||||||
# There will be a number of objects still not added
|
# There will be a number of objects still not added
|
||||||
if contextMesh_facels != None:
|
if CreateBlenderObject:
|
||||||
putContextMesh(contextMesh_vertls, contextMesh_facels, contextMeshMaterials)
|
putContextMesh(contextMesh_vertls, contextMesh_facels, contextMeshMaterials)
|
||||||
|
|
||||||
def load_3ds(filename, context, IMPORT_CONSTRAIN_BOUNDS=10.0, IMAGE_SEARCH=True, APPLY_MATRIX=False):
|
def load_3ds(filename, context, IMPORT_CONSTRAIN_BOUNDS=10.0, IMAGE_SEARCH=True, APPLY_MATRIX=False):
|
||||||
|
@ -82,23 +82,21 @@ def unpack_list(list_of_tuples):
|
|||||||
|
|
||||||
# same as above except that it adds 0 for triangle faces
|
# same as above except that it adds 0 for triangle faces
|
||||||
def unpack_face_list(list_of_tuples):
|
def unpack_face_list(list_of_tuples):
|
||||||
l = []
|
# allocate the entire list
|
||||||
|
flat_ls = [0] * (len(list_of_tuples) * 4)
|
||||||
|
i = 0
|
||||||
|
|
||||||
for t in list_of_tuples:
|
for t in list_of_tuples:
|
||||||
face = [i for i in t]
|
if len(t) == 3:
|
||||||
|
if t[2] == 0:
|
||||||
|
t = t[1], t[2], t[0]
|
||||||
|
else: # assuem quad
|
||||||
|
if t[3] == 0 or t[2] == 0:
|
||||||
|
t = t[2], t[3], t[0], t[1]
|
||||||
|
|
||||||
if len(face) != 3 and len(face) != 4:
|
flat_ls[i:i + len(t)] = t
|
||||||
raise RuntimeError("{0} vertices in face.".format(len(face)))
|
i += 4
|
||||||
|
return flat_ls
|
||||||
# rotate indices if the 4th is 0
|
|
||||||
if len(face) == 4 and face[3] == 0:
|
|
||||||
face = [face[3], face[0], face[1], face[2]]
|
|
||||||
|
|
||||||
if len(face) == 3:
|
|
||||||
face.append(0)
|
|
||||||
|
|
||||||
l.extend(face)
|
|
||||||
|
|
||||||
return l
|
|
||||||
|
|
||||||
def BPyMesh_ngon(from_data, indices, PREF_FIX_LOOPS= True):
|
def BPyMesh_ngon(from_data, indices, PREF_FIX_LOOPS= True):
|
||||||
'''
|
'''
|
||||||
@ -305,24 +303,28 @@ def load_image(imagepath, dirname):
|
|||||||
if os.path.exists(imagepath):
|
if os.path.exists(imagepath):
|
||||||
return bpy.data.images.load(imagepath)
|
return bpy.data.images.load(imagepath)
|
||||||
|
|
||||||
variants = [os.path.join(dirname, imagepath), os.path.join(dirname, os.path.basename(imagepath))]
|
variants = [imagepath, os.path.join(dirname, imagepath), os.path.join(dirname, os.path.basename(imagepath))]
|
||||||
|
|
||||||
for path in variants:
|
for filepath in variants:
|
||||||
if os.path.exists(path):
|
for nfilepath in (filepath, bpy.path.resolve_ncase(filepath)):
|
||||||
return bpy.data.images.load(path)
|
if os.path.exists(nfilepath):
|
||||||
else:
|
return bpy.data.images.load(nfilepath)
|
||||||
print(path, "doesn't exist")
|
|
||||||
|
|
||||||
# TODO comprehensiveImageLoad also searched in bpy.config.textureDir
|
# TODO comprehensiveImageLoad also searched in bpy.config.textureDir
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def obj_image_load(imagepath, DIR, IMAGE_SEARCH):
|
def obj_image_load(imagepath, DIR, IMAGE_SEARCH):
|
||||||
|
|
||||||
if '_' in imagepath:
|
if '_' in imagepath:
|
||||||
image= load_image(imagepath.replace('_', ' '), DIR)
|
image= load_image(imagepath.replace('_', ' '), DIR)
|
||||||
if image: return image
|
if image:
|
||||||
|
return image
|
||||||
|
|
||||||
return load_image(imagepath, DIR)
|
image = load_image(imagepath, DIR)
|
||||||
|
if image:
|
||||||
|
return image
|
||||||
|
|
||||||
|
print("failed to load '%s' doesn't exist", imagepath)
|
||||||
|
return None
|
||||||
|
|
||||||
# def obj_image_load(imagepath, DIR, IMAGE_SEARCH):
|
# def obj_image_load(imagepath, DIR, IMAGE_SEARCH):
|
||||||
# '''
|
# '''
|
||||||
@ -765,14 +767,12 @@ def create_mesh(scn, new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_l
|
|||||||
blender_tface= me.uv_textures[0].data[i]
|
blender_tface= me.uv_textures[0].data[i]
|
||||||
|
|
||||||
if context_material:
|
if context_material:
|
||||||
image, has_data= unique_material_images[context_material]
|
image, has_data = unique_material_images[context_material]
|
||||||
if image: # Can be none if the material dosnt have an image.
|
if image: # Can be none if the material dosnt have an image.
|
||||||
blender_tface.image= image
|
blender_tface.image = image
|
||||||
# blender_face.image= image
|
blender_tface.tex = True
|
||||||
if has_data:
|
if has_data and image.depth == 32:
|
||||||
# if has_data and image.depth == 32:
|
|
||||||
blender_tface.transp = 'ALPHA'
|
blender_tface.transp = 'ALPHA'
|
||||||
# blender_face.transp |= ALPHA
|
|
||||||
|
|
||||||
# BUG - Evil eekadoodle problem where faces that have vert index 0 location at 3 or 4 are shuffled.
|
# BUG - Evil eekadoodle problem where faces that have vert index 0 location at 3 or 4 are shuffled.
|
||||||
if len(face_vert_loc_indicies)==4:
|
if len(face_vert_loc_indicies)==4:
|
||||||
@ -1596,8 +1596,7 @@ class IMPORT_OT_obj(bpy.types.Operator):
|
|||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
|
|
||||||
def invoke(self, context, event):
|
def invoke(self, context, event):
|
||||||
wm = context.manager
|
context.manager.add_fileselect(self)
|
||||||
wm.add_fileselect(self)
|
|
||||||
return {'RUNNING_MODAL'}
|
return {'RUNNING_MODAL'}
|
||||||
|
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# ***** END GPL LICENCE BLOCK *****
|
# ***** END GPL LICENCE BLOCK *****
|
||||||
|
|
||||||
|
@ -25,11 +25,11 @@ import mathutils
|
|||||||
def add_object_align_init(context, operator):
|
def add_object_align_init(context, operator):
|
||||||
|
|
||||||
if operator and operator.properties.is_property_set("location") and operator.properties.is_property_set("rotation"):
|
if operator and operator.properties.is_property_set("location") and operator.properties.is_property_set("rotation"):
|
||||||
location = mathutils.TranslationMatrix(mathutils.Vector(operator.properties.location))
|
location = mathutils.Matrix.Translation(mathutils.Vector(operator.properties.location))
|
||||||
rotation = mathutils.Euler(operator.properties.rotation).to_matrix().resize4x4()
|
rotation = mathutils.Euler(operator.properties.rotation).to_matrix().resize4x4()
|
||||||
else:
|
else:
|
||||||
# TODO, local view cursor!
|
# TODO, local view cursor!
|
||||||
location = mathutils.TranslationMatrix(context.scene.cursor_location)
|
location = mathutils.Matrix.Translation(context.scene.cursor_location)
|
||||||
|
|
||||||
if context.user_preferences.edit.object_align == 'VIEW' and context.space_data.type == 'VIEW_3D':
|
if context.user_preferences.edit.object_align == 'VIEW' and context.space_data.type == 'VIEW_3D':
|
||||||
rotation = context.space_data.region_3d.view_matrix.rotation_part().invert().resize4x4()
|
rotation = context.space_data.region_3d.view_matrix.rotation_part().invert().resize4x4()
|
||||||
|
@ -30,8 +30,6 @@ import sys as _sys
|
|||||||
from _bpy import blend_paths
|
from _bpy import blend_paths
|
||||||
from _bpy import script_paths as _bpy_script_paths
|
from _bpy import script_paths as _bpy_script_paths
|
||||||
|
|
||||||
_TEST_XML = _bpy.app.debug
|
|
||||||
|
|
||||||
def _test_import(module_name, loaded_modules):
|
def _test_import(module_name, loaded_modules):
|
||||||
import traceback
|
import traceback
|
||||||
import time
|
import time
|
||||||
@ -54,35 +52,6 @@ def _test_import(module_name, loaded_modules):
|
|||||||
loaded_modules.add(mod.__name__) # should match mod.__name__ too
|
loaded_modules.add(mod.__name__) # should match mod.__name__ too
|
||||||
return mod
|
return mod
|
||||||
|
|
||||||
if _TEST_XML:
|
|
||||||
# TEST CODE
|
|
||||||
def _test_import_xml(path, f, loaded_modules):
|
|
||||||
import bpy_xml_ui
|
|
||||||
import traceback
|
|
||||||
|
|
||||||
f_full = _os.path.join(path, f)
|
|
||||||
_bpy_types._register_immediate = True
|
|
||||||
try:
|
|
||||||
classes = bpy_xml_ui.load_xml(f_full)
|
|
||||||
except:
|
|
||||||
traceback.print_exc()
|
|
||||||
classes = []
|
|
||||||
_bpy_types._register_immediate = False
|
|
||||||
|
|
||||||
if classes:
|
|
||||||
mod_name = f.split(".")[0]
|
|
||||||
|
|
||||||
# fake module
|
|
||||||
mod = type(traceback)(mod_name)
|
|
||||||
mod.__file__ = f_full
|
|
||||||
for cls in classes:
|
|
||||||
setattr(mod, cls.__name__, cls)
|
|
||||||
|
|
||||||
loaded_modules.add(mod_name)
|
|
||||||
_sys.modules[mod_name] = mod
|
|
||||||
mod.register = lambda: None # quiet errors
|
|
||||||
return mod
|
|
||||||
|
|
||||||
|
|
||||||
def modules_from_path(path, loaded_modules):
|
def modules_from_path(path, loaded_modules):
|
||||||
"""
|
"""
|
||||||
@ -110,10 +79,6 @@ def modules_from_path(path, loaded_modules):
|
|||||||
else:
|
else:
|
||||||
mod = None
|
mod = None
|
||||||
|
|
||||||
if _TEST_XML:
|
|
||||||
if mod is None and f.endswith(".xml"):
|
|
||||||
mod = _test_import_xml(path, f, loaded_modules)
|
|
||||||
|
|
||||||
if mod:
|
if mod:
|
||||||
modules.append(mod)
|
modules.append(mod)
|
||||||
|
|
||||||
|
@ -525,7 +525,7 @@ class Text(bpy_types.ID):
|
|||||||
|
|
||||||
def as_string(self):
|
def as_string(self):
|
||||||
"""Return the text as a string."""
|
"""Return the text as a string."""
|
||||||
return "\n".join(line.line for line in self.lines)
|
return "\n".join(line.body for line in self.lines)
|
||||||
|
|
||||||
def from_string(self, string):
|
def from_string(self, string):
|
||||||
"""Replace text with this string."""
|
"""Replace text with this string."""
|
||||||
|
@ -1,151 +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.
|
|
||||||
#
|
|
||||||
# ##### END GPL LICENSE BLOCK #####
|
|
||||||
|
|
||||||
# <pep8 compliant>
|
|
||||||
|
|
||||||
"""
|
|
||||||
This module translates XML into blender/ui function calls.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import xml.dom.minidom
|
|
||||||
import bpy as _bpy
|
|
||||||
|
|
||||||
def parse_rna(prop, value):
|
|
||||||
if prop.type == 'FLOAT':
|
|
||||||
value = float(value)
|
|
||||||
elif prop.type == 'INT':
|
|
||||||
value = int(value)
|
|
||||||
elif prop.type == 'BOOLEAN':
|
|
||||||
if value not in ("true", "false"):
|
|
||||||
raise Exception("invalid bool value: %s", value)
|
|
||||||
value = bool(value == "true")
|
|
||||||
elif prop.type in ('STRING', 'ENUM'):
|
|
||||||
pass
|
|
||||||
elif prop.type == 'POINTER':
|
|
||||||
value = eval("_bpy." + value)
|
|
||||||
else:
|
|
||||||
raise Exception("type not supported %s.%s" % (prop.identifier, prop.type))
|
|
||||||
return value
|
|
||||||
|
|
||||||
def parse_args(base, xml_node):
|
|
||||||
args = {}
|
|
||||||
rna_params = base.bl_rna.functions[xml_node.tagName].parameters
|
|
||||||
for key, value in xml_node.attributes.items():
|
|
||||||
args[key] = parse_rna(rna_params[key], value)
|
|
||||||
return args
|
|
||||||
|
|
||||||
def ui_xml(base, xml_node):
|
|
||||||
name = xml_node.tagName
|
|
||||||
prop = base.bl_rna.properties.get(name)
|
|
||||||
if name in base.bl_rna.properties:
|
|
||||||
attr = xml_node.attributes.get("expr")
|
|
||||||
if attr:
|
|
||||||
value = attr.value
|
|
||||||
value = eval(value, {"context": _bpy.context})
|
|
||||||
setattr(base, name, value)
|
|
||||||
else:
|
|
||||||
attr = xml_node.attributes['value']
|
|
||||||
value = attr.value
|
|
||||||
value = parse_rna(prop, value)
|
|
||||||
setattr(base, name, value)
|
|
||||||
else:
|
|
||||||
func_new = getattr(base, name)
|
|
||||||
kw_args = parse_args(base, xml_node)
|
|
||||||
base_new = func_new(**kw_args) # call blender func
|
|
||||||
if xml_node.hasChildNodes():
|
|
||||||
ui_xml_list(base_new, xml_node.childNodes)
|
|
||||||
|
|
||||||
def ui_xml_list(base, xml_nodes):
|
|
||||||
import bpy
|
|
||||||
for node in xml_nodes:
|
|
||||||
if node.nodeType not in (node.TEXT_NODE, node.COMMENT_NODE):
|
|
||||||
ui_xml(base, node)
|
|
||||||
bpy.N = node
|
|
||||||
|
|
||||||
def test(layout):
|
|
||||||
uixml = xml.dom.minidom.parseString(open("/mnt/test/blender-svn/blender/release/scripts/ui/test.xml", 'r').read())
|
|
||||||
panel = uixml.getElementsByTagName('panel')[0]
|
|
||||||
ui_xml_list(layout, panel.childNodes)
|
|
||||||
|
|
||||||
def load_xml(filepath):
|
|
||||||
classes = []
|
|
||||||
fn = open(filepath, 'r')
|
|
||||||
data = fn.read()
|
|
||||||
uixml = xml.dom.minidom.parseString(data).getElementsByTagName("ui")[0]
|
|
||||||
fn.close()
|
|
||||||
|
|
||||||
def draw_xml(self, context):
|
|
||||||
node = self._xml_node.getElementsByTagName("draw")[0]
|
|
||||||
ui_xml_list(self.layout, node.childNodes)
|
|
||||||
|
|
||||||
def draw_header_xml(self, context):
|
|
||||||
node = self._xml_node.getElementsByTagName("draw_header")[0]
|
|
||||||
ui_xml_list(self.layout, node.childNodes)
|
|
||||||
|
|
||||||
for node in uixml.childNodes:
|
|
||||||
if node.nodeType not in (node.TEXT_NODE, node.COMMENT_NODE):
|
|
||||||
name = node.tagName
|
|
||||||
class_name = node.attributes["identifier"].value
|
|
||||||
|
|
||||||
if name == "panel":
|
|
||||||
class_dict = {
|
|
||||||
"bl_label": node.attributes["label"].value,
|
|
||||||
"bl_region_type": node.attributes["region_type"].value,
|
|
||||||
"bl_space_type": node.attributes["space_type"].value,
|
|
||||||
"bl_context": node.attributes["context"].value,
|
|
||||||
"bl_default_closed": ((node.attributes["default_closed"].value == "true") if "default_closed" in node.attributes else False),
|
|
||||||
|
|
||||||
"draw": draw_xml,
|
|
||||||
"_xml_node": node
|
|
||||||
}
|
|
||||||
|
|
||||||
if node.getElementsByTagName("draw_header"):
|
|
||||||
class_dict["draw_header"] = draw_header_xml
|
|
||||||
|
|
||||||
# will register instantly
|
|
||||||
class_new = type(class_name, (_bpy.types.Panel,), class_dict)
|
|
||||||
|
|
||||||
elif name == "menu":
|
|
||||||
class_dict = {
|
|
||||||
"bl_label": node.attributes["label"].value,
|
|
||||||
|
|
||||||
"draw": draw_xml,
|
|
||||||
"_xml_node": node
|
|
||||||
}
|
|
||||||
|
|
||||||
# will register instantly
|
|
||||||
class_new = type(class_name, (_bpy.types.Menu,), class_dict)
|
|
||||||
|
|
||||||
elif name == "header":
|
|
||||||
class_dict = {
|
|
||||||
"bl_label": node.attributes["label"].value,
|
|
||||||
"bl_space_type": node.attributes["space_type"].value,
|
|
||||||
|
|
||||||
"draw": draw_xml,
|
|
||||||
"_xml_node": node
|
|
||||||
}
|
|
||||||
|
|
||||||
# will register instantly
|
|
||||||
class_new = type(class_name, (_bpy.types.Header,), class_dict)
|
|
||||||
else:
|
|
||||||
raise Exception("invalid id found '%s': expected a value in ('header', 'panel', 'menu)'" % name)
|
|
||||||
|
|
||||||
classes.append(class_new)
|
|
||||||
|
|
||||||
|
|
||||||
return classes
|
|
204
release/scripts/modules/bpyml.py
Normal file
204
release/scripts/modules/bpyml.py
Normal file
@ -0,0 +1,204 @@
|
|||||||
|
# ##### 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.
|
||||||
|
#
|
||||||
|
# ##### END GPL LICENSE BLOCK #####
|
||||||
|
|
||||||
|
# <pep8 compliant>
|
||||||
|
|
||||||
|
"""
|
||||||
|
This module translates a python like XML representation into XML
|
||||||
|
or simple python blender/ui function calls.
|
||||||
|
|
||||||
|
sometag(arg=10) [
|
||||||
|
another()
|
||||||
|
another(key="value")
|
||||||
|
]
|
||||||
|
|
||||||
|
# converts into ...
|
||||||
|
|
||||||
|
<sometag arg="10">
|
||||||
|
<another/>
|
||||||
|
<another key="value" />
|
||||||
|
</sometag>
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
TAG, ARGS, CHILDREN = range(3)
|
||||||
|
class ReturnStore(tuple):
|
||||||
|
def __getitem__(self, key):
|
||||||
|
|
||||||
|
# single item get's
|
||||||
|
if type(key) is ReturnStore:
|
||||||
|
key = (key, )
|
||||||
|
|
||||||
|
if type(key) is tuple:
|
||||||
|
children = self[CHILDREN]
|
||||||
|
if children:
|
||||||
|
raise Exception("Only a single __getitem__ is allowed on the ReturnStore")
|
||||||
|
else:
|
||||||
|
children[:] = key
|
||||||
|
return self
|
||||||
|
else:
|
||||||
|
return tuple.__getitem__(self, key)
|
||||||
|
|
||||||
|
|
||||||
|
class FunctionStore(object):
|
||||||
|
def __call__(self, **kwargs):
|
||||||
|
return ReturnStore((self.__class__.__name__, kwargs, []))
|
||||||
|
|
||||||
|
|
||||||
|
def tag_vars(tags, module=__name__):
|
||||||
|
return {tag: type(tag, (FunctionStore, ), {"__module__": module})() for tag in tags}
|
||||||
|
|
||||||
|
|
||||||
|
def tag_module(mod_name, tags):
|
||||||
|
import sys
|
||||||
|
from types import ModuleType
|
||||||
|
mod = ModuleType(mod_name)
|
||||||
|
sys.modules[mod_name] = mod
|
||||||
|
dict_values = tag_vars(tags, mod_name)
|
||||||
|
mod.__dict__.update(dict_values)
|
||||||
|
return mod
|
||||||
|
|
||||||
|
|
||||||
|
def toxml(py_data, indent=" "):
|
||||||
|
|
||||||
|
if len(py_data) != 1 or type(py_data) != list:
|
||||||
|
raise Exception("Expected a list with one member")
|
||||||
|
|
||||||
|
def _to_xml(py_item, xml_node=None):
|
||||||
|
if xml_node is None:
|
||||||
|
xml_node = newdoc.createElement(py_item[TAG])
|
||||||
|
|
||||||
|
for key, value in py_item[ARGS].items():
|
||||||
|
xml_node.setAttribute(key, str(value))
|
||||||
|
|
||||||
|
for py_item_child in py_item[CHILDREN]:
|
||||||
|
xml_node.appendChild(_to_xml(py_item_child))
|
||||||
|
|
||||||
|
return xml_node
|
||||||
|
|
||||||
|
def _to_xml_iter(xml_parent, data_ls):
|
||||||
|
for py_item in data_ls:
|
||||||
|
xml_node = newdoc.createElement(py_item[TAG])
|
||||||
|
|
||||||
|
|
||||||
|
# ok if its empty
|
||||||
|
_to_xml_iter(xml_node, py_item[CHILDREN])
|
||||||
|
|
||||||
|
import xml.dom.minidom
|
||||||
|
impl = xml.dom.minidom.getDOMImplementation()
|
||||||
|
newdoc = impl.createDocument(None, py_data[0][TAG], None)
|
||||||
|
|
||||||
|
_to_xml(py_data[0], newdoc.documentElement)
|
||||||
|
|
||||||
|
return newdoc.documentElement.toprettyxml(indent=" ")
|
||||||
|
|
||||||
|
|
||||||
|
def fromxml(data):
|
||||||
|
def _fromxml_kwargs(xml_node):
|
||||||
|
kwargs = {}
|
||||||
|
for key, value in xml_node.attributes.items():
|
||||||
|
kwargs[key] = value
|
||||||
|
return kwargs
|
||||||
|
|
||||||
|
|
||||||
|
def _fromxml(xml_node):
|
||||||
|
py_item = (xml_node.tagName, _fromxml_kwargs(xml_node), [])
|
||||||
|
#_fromxml_iter(py_item, xml_node.childNodes)
|
||||||
|
for xml_node_child in xml_node.childNodes:
|
||||||
|
if xml_node_child.nodeType not in (xml_node_child.TEXT_NODE, xml_node_child.COMMENT_NODE):
|
||||||
|
py_item[CHILDREN].append(_fromxml(xml_node_child))
|
||||||
|
return py_item
|
||||||
|
|
||||||
|
import xml.dom.minidom
|
||||||
|
xml_doc = xml.dom.minidom.parseString(data)
|
||||||
|
return [_fromxml(xml_doc.documentElement)]
|
||||||
|
|
||||||
|
|
||||||
|
def topretty_py(py_data, indent=" "):
|
||||||
|
|
||||||
|
if len(py_data) != 1:
|
||||||
|
raise Exception("Expected a list with one member")
|
||||||
|
|
||||||
|
lines = []
|
||||||
|
|
||||||
|
def _to_kwargs(kwargs):
|
||||||
|
return ", ".join([("%s=%s" % (key, repr(value))) for key, value in sorted(kwargs.items())])
|
||||||
|
|
||||||
|
def _topretty(py_item, indent_ctx, last):
|
||||||
|
if py_item[CHILDREN]:
|
||||||
|
lines.append("%s%s(%s) [" % (indent_ctx, py_item[TAG], _to_kwargs(py_item[ARGS])))
|
||||||
|
py_item_last = py_item[CHILDREN][-1]
|
||||||
|
for py_item_child in py_item[CHILDREN]:
|
||||||
|
_topretty(py_item_child, indent_ctx + indent, (py_item_child is py_item_last))
|
||||||
|
lines.append("%s]%s" % (indent_ctx, ("" if last else ",")))
|
||||||
|
else:
|
||||||
|
lines.append("%s%s(%s)%s" % (indent_ctx, py_item[TAG], _to_kwargs(py_item[ARGS]), ("" if last else ",")))
|
||||||
|
|
||||||
|
_topretty(py_data[0], "", True)
|
||||||
|
|
||||||
|
return "\n".join(lines)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# testing code.
|
||||||
|
|
||||||
|
tag_module("bpyml_test", ("ui", "prop", "row", "column", "active", "separator", "split"))
|
||||||
|
from bpyml_test import *
|
||||||
|
|
||||||
|
draw = [
|
||||||
|
ui() [
|
||||||
|
split() [
|
||||||
|
column() [
|
||||||
|
prop(data='context.scene.render', property='stamp_time', text='Time'),
|
||||||
|
prop(data='context.scene.render', property='stamp_date', text='Date'),
|
||||||
|
prop(data='context.scene.render', property='stamp_render_time', text='RenderTime'),
|
||||||
|
prop(data='context.scene.render', property='stamp_frame', text='Frame'),
|
||||||
|
prop(data='context.scene.render', property='stamp_scene', text='Scene'),
|
||||||
|
prop(data='context.scene.render', property='stamp_camera', text='Camera'),
|
||||||
|
prop(data='context.scene.render', property='stamp_filename', text='Filename'),
|
||||||
|
prop(data='context.scene.render', property='stamp_marker', text='Marker'),
|
||||||
|
prop(data='context.scene.render', property='stamp_sequencer_strip', text='Seq. Strip')
|
||||||
|
],
|
||||||
|
column() [
|
||||||
|
active(expr='context.scene.render.render_stamp'),
|
||||||
|
prop(data='context.scene.render', property='stamp_foreground', slider=True),
|
||||||
|
prop(data='context.scene.render', property='stamp_background', slider=True),
|
||||||
|
separator(),
|
||||||
|
prop(data='context.scene.render', property='stamp_font_size', text='Font Size')
|
||||||
|
]
|
||||||
|
],
|
||||||
|
split(percentage=0.2) [
|
||||||
|
prop(data='context.scene.render', property='stamp_note', text='Note'),
|
||||||
|
row() [
|
||||||
|
active(expr='context.scene.render.stamp_note'),
|
||||||
|
prop(data='context.scene.render', property='stamp_note_text', text='')
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
xml_data = toxml(draw)
|
||||||
|
print(xml_data) # xml version
|
||||||
|
|
||||||
|
py_data = fromxml(xml_data)
|
||||||
|
print(py_data) # converted back to py
|
||||||
|
|
||||||
|
xml_data = toxml(py_data)
|
||||||
|
print(xml_data) # again back to xml
|
||||||
|
|
||||||
|
py_data = fromxml(xml_data) # pretty python version
|
||||||
|
print(topretty_py(py_data))
|
100
release/scripts/modules/bpyml_ui.py
Normal file
100
release/scripts/modules/bpyml_ui.py
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
# ##### 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.
|
||||||
|
#
|
||||||
|
# ##### END GPL LICENSE BLOCK #####
|
||||||
|
|
||||||
|
# <pep8 compliant>
|
||||||
|
|
||||||
|
|
||||||
|
import bpy as _bpy
|
||||||
|
import bpyml
|
||||||
|
from bpyml import TAG, ARGS, CHILDREN
|
||||||
|
from types import ModuleType
|
||||||
|
|
||||||
|
_uilayout_rna = _bpy.types.UILayout.bl_rna
|
||||||
|
|
||||||
|
_uilayout_tags = ["ui"] + \
|
||||||
|
_uilayout_rna.properties.keys() + \
|
||||||
|
_uilayout_rna.functions.keys()
|
||||||
|
|
||||||
|
# these need to be imported directly
|
||||||
|
# >>> from bpyml_ui.locals import *
|
||||||
|
locals = bpyml.tag_module("%s.locals" % __name__ , _uilayout_tags)
|
||||||
|
|
||||||
|
|
||||||
|
def _parse_rna(prop, value):
|
||||||
|
if prop.type == 'FLOAT':
|
||||||
|
value = float(value)
|
||||||
|
elif prop.type == 'INT':
|
||||||
|
value = int(value)
|
||||||
|
elif prop.type == 'BOOLEAN':
|
||||||
|
if value in (True, False):
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
if value not in ("True", "False"):
|
||||||
|
raise Exception("invalid bool value: %s" % value)
|
||||||
|
value = bool(value == "True")
|
||||||
|
elif prop.type in ('STRING', 'ENUM'):
|
||||||
|
pass
|
||||||
|
elif prop.type == 'POINTER':
|
||||||
|
value = eval("_bpy." + value)
|
||||||
|
else:
|
||||||
|
raise Exception("type not supported %s.%s" % (prop.identifier, prop.type))
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
def _parse_rna_args(base, py_node):
|
||||||
|
rna_params = base.bl_rna.functions[py_node[TAG]].parameters
|
||||||
|
args = {}
|
||||||
|
for key, value in py_node[ARGS].items():
|
||||||
|
args[key] = _parse_rna(rna_params[key], value)
|
||||||
|
return args
|
||||||
|
|
||||||
|
|
||||||
|
def _call_recursive(context, base, py_node):
|
||||||
|
prop = base.bl_rna.properties.get(py_node[TAG])
|
||||||
|
if py_node[TAG] in base.bl_rna.properties:
|
||||||
|
value = py_node[ARGS].get("expr")
|
||||||
|
if value:
|
||||||
|
value = eval(value, {"context": _bpy.context})
|
||||||
|
setattr(base, py_node[TAG], value)
|
||||||
|
else:
|
||||||
|
value = py_node[ARGS]['value'] # have to have this
|
||||||
|
setattr(base, name, value)
|
||||||
|
else:
|
||||||
|
args = _parse_rna_args(base, py_node)
|
||||||
|
func_new = getattr(base, py_node[TAG])
|
||||||
|
base_new = func_new(**args) # call blender func
|
||||||
|
if base_new is not None:
|
||||||
|
for py_node_child in py_node[CHILDREN]:
|
||||||
|
_call_recursive(context, base_new, py_node_child)
|
||||||
|
|
||||||
|
|
||||||
|
class BPyML_BaseUI():
|
||||||
|
'''
|
||||||
|
This is a mix-in class that defines a draw function
|
||||||
|
which checks for draw_data
|
||||||
|
'''
|
||||||
|
|
||||||
|
def draw(self, context):
|
||||||
|
layout = self.layout
|
||||||
|
for py_node in self.draw_data[CHILDREN]:
|
||||||
|
_call_recursive(context, layout, py_node)
|
||||||
|
|
||||||
|
def draw_header(self, context):
|
||||||
|
layout = self.layout
|
||||||
|
for py_node in self.draw_header_data[CHILDREN]:
|
||||||
|
_call_recursive(context, layout, py_node)
|
@ -147,7 +147,7 @@ def deform(obj, definitions, base_names, options):
|
|||||||
|
|
||||||
|
|
||||||
def main(obj, bone_definition, base_names, options):
|
def main(obj, bone_definition, base_names, options):
|
||||||
from mathutils import Vector, RotationMatrix
|
from mathutils import Vector, Matrix
|
||||||
from math import radians, pi
|
from math import radians, pi
|
||||||
|
|
||||||
arm = obj.data
|
arm = obj.data
|
||||||
@ -264,7 +264,7 @@ def main(obj, bone_definition, base_names, options):
|
|||||||
|
|
||||||
# Rotate the rev chain 180 about the by the first bones center point
|
# Rotate the rev chain 180 about the by the first bones center point
|
||||||
pivot = (rv_chain.spine_01_e.head + rv_chain.spine_01_e.tail) * 0.5
|
pivot = (rv_chain.spine_01_e.head + rv_chain.spine_01_e.tail) * 0.5
|
||||||
matrix = RotationMatrix(radians(180), 3, 'X')
|
matrix = Matrix.Rotation(radians(180), 3, 'X')
|
||||||
for i, attr in enumerate(rv_chain.attr_names): # similar to neck
|
for i, attr in enumerate(rv_chain.attr_names): # similar to neck
|
||||||
spine_e = getattr(rv_chain, attr + "_e")
|
spine_e = getattr(rv_chain, attr + "_e")
|
||||||
# use the first bone as the pivot
|
# use the first bone as the pivot
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# ##### END GPL LICENSE BLOCK #####
|
# ##### END GPL LICENSE BLOCK #####
|
||||||
|
|
||||||
@ -22,7 +22,7 @@ import bpy
|
|||||||
from rigify import RigifyError
|
from rigify import RigifyError
|
||||||
from rigify_utils import bone_class_instance, copy_bone_simple
|
from rigify_utils import bone_class_instance, copy_bone_simple
|
||||||
from rna_prop_ui import rna_idprop_ui_prop_get
|
from rna_prop_ui import rna_idprop_ui_prop_get
|
||||||
from mathutils import Vector, RotationMatrix
|
from mathutils import Vector, Matrix
|
||||||
from math import radians, pi
|
from math import radians, pi
|
||||||
|
|
||||||
# not used, defined for completeness
|
# not used, defined for completeness
|
||||||
|
@ -131,7 +131,7 @@ def execute(context):
|
|||||||
is_multiline = False
|
is_multiline = False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
line = line_object.line
|
line = line_object.body
|
||||||
|
|
||||||
# run the console, "\n" executes a multiline statement
|
# run the console, "\n" executes a multiline statement
|
||||||
line_exec = line if line.strip() else "\n"
|
line_exec = line if line.strip() else "\n"
|
||||||
@ -208,13 +208,13 @@ def autocomplete(context):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
current_line = sc.history[-1]
|
current_line = sc.history[-1]
|
||||||
line = current_line.line
|
line = current_line.body
|
||||||
|
|
||||||
# This function isnt aware of the text editor or being an operator
|
# This function isnt aware of the text editor or being an operator
|
||||||
# just does the autocomp then copy its results back
|
# just does the autocomp then copy its results back
|
||||||
current_line.line, current_line.current_character, scrollback = \
|
current_line.body, current_line.current_character, scrollback = \
|
||||||
intellisense.expand(
|
intellisense.expand(
|
||||||
line=current_line.line,
|
line=current_line.body,
|
||||||
cursor=current_line.current_character,
|
cursor=current_line.current_character,
|
||||||
namespace=console.locals,
|
namespace=console.locals,
|
||||||
private=bpy.app.debug)
|
private=bpy.app.debug)
|
||||||
@ -226,7 +226,7 @@ def autocomplete(context):
|
|||||||
|
|
||||||
# Separate automplete output by command prompts
|
# Separate automplete output by command prompts
|
||||||
if scrollback != '':
|
if scrollback != '':
|
||||||
bpy.ops.console.scrollback_append(text=sc.prompt + current_line.line, type='INPUT')
|
bpy.ops.console.scrollback_append(text=sc.prompt + current_line.body, type='INPUT')
|
||||||
|
|
||||||
# Now we need to copy back the line from blender back into the
|
# Now we need to copy back the line from blender back into the
|
||||||
# text editor. This will change when we dont use the text editor
|
# text editor. This will change when we dont use the text editor
|
||||||
|
@ -47,7 +47,7 @@ def execute(context):
|
|||||||
sc = context.space_data
|
sc = context.space_data
|
||||||
|
|
||||||
try:
|
try:
|
||||||
line = sc.history[-1].line
|
line = sc.history[-1].body
|
||||||
except:
|
except:
|
||||||
return {'CANCELLED'}
|
return {'CANCELLED'}
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
# <pep8 compliant>
|
# <pep8 compliant>
|
||||||
|
|
||||||
from mathutils import Matrix, Vector, RotationMatrix
|
from mathutils import Matrix, Vector
|
||||||
import time
|
import time
|
||||||
import geometry
|
import geometry
|
||||||
import bpy
|
import bpy
|
||||||
@ -275,15 +275,15 @@ def testNewVecLs2DRotIsBetter(vecs, mat=-1, bestAreaSoFar = -1):
|
|||||||
|
|
||||||
# Takes a list of faces that make up a UV island and rotate
|
# Takes a list of faces that make up a UV island and rotate
|
||||||
# until they optimally fit inside a square.
|
# until they optimally fit inside a square.
|
||||||
ROTMAT_2D_POS_90D = RotationMatrix( radians(90.0), 2)
|
ROTMAT_2D_POS_90D = Matrix.Rotation( radians(90.0), 2)
|
||||||
ROTMAT_2D_POS_45D = RotationMatrix( radians(45.0), 2)
|
ROTMAT_2D_POS_45D = Matrix.Rotation( radians(45.0), 2)
|
||||||
|
|
||||||
RotMatStepRotation = []
|
RotMatStepRotation = []
|
||||||
rot_angle = 22.5 #45.0/2
|
rot_angle = 22.5 #45.0/2
|
||||||
while rot_angle > 0.1:
|
while rot_angle > 0.1:
|
||||||
RotMatStepRotation.append([\
|
RotMatStepRotation.append([\
|
||||||
RotationMatrix( radians(rot_angle), 2),\
|
Matrix.Rotation( radians(rot_angle), 2),\
|
||||||
RotationMatrix( radians(-rot_angle), 2)])
|
Matrix.Rotation( radians(-rot_angle), 2)])
|
||||||
|
|
||||||
rot_angle = rot_angle/2.0
|
rot_angle = rot_angle/2.0
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
# for keyboard event comparison
|
# for keyboard event comparison
|
||||||
# import GameKeys
|
# import GameKeys
|
||||||
|
|
||||||
# support for Vector(), Matrix() types and advanced functions like ScaleMatrix(...) and RotationMatrix(...)
|
# support for Vector(), Matrix() types and advanced functions like Matrix.Scale(...) and Matrix.Rotation(...)
|
||||||
# import mathutils
|
# import mathutils
|
||||||
|
|
||||||
# for functions like getWindowWidth(), getWindowHeight()
|
# for functions like getWindowWidth(), getWindowHeight()
|
||||||
|
@ -51,11 +51,6 @@ class DATA_PT_context_arm(ArmatureButtonsPanel, bpy.types.Panel):
|
|||||||
split.separator()
|
split.separator()
|
||||||
|
|
||||||
|
|
||||||
class DATA_PT_custom_props_arm(ArmatureButtonsPanel, PropertyPanel, bpy.types.Panel):
|
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
|
||||||
_context_path = "object.data"
|
|
||||||
|
|
||||||
|
|
||||||
class DATA_PT_skeleton(ArmatureButtonsPanel, bpy.types.Panel):
|
class DATA_PT_skeleton(ArmatureButtonsPanel, bpy.types.Panel):
|
||||||
bl_label = "Skeleton"
|
bl_label = "Skeleton"
|
||||||
|
|
||||||
@ -285,6 +280,11 @@ class DATA_PT_onion_skinning(OnionSkinButtonsPanel): #, bpy.types.Panel): # inhe
|
|||||||
|
|
||||||
self.draw_settings(context, ob.pose.animation_visualisation, bones=True)
|
self.draw_settings(context, ob.pose.animation_visualisation, bones=True)
|
||||||
|
|
||||||
|
|
||||||
|
class DATA_PT_custom_props_arm(ArmatureButtonsPanel, PropertyPanel, bpy.types.Panel):
|
||||||
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||||
|
_context_path = "object.data"
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -95,12 +95,13 @@ class DATA_PT_template(bpy.types.Panel):
|
|||||||
subsubrow.operator("pose.metarig_assign", text="Assign")
|
subsubrow.operator("pose.metarig_assign", text="Assign")
|
||||||
subsubrow.operator("pose.metarig_clear", text="Clear")
|
subsubrow.operator("pose.metarig_clear", text="Clear")
|
||||||
|
|
||||||
subsubrow = subrow.split(percentage=0.8)
|
if self.templates:
|
||||||
subsubrow.operator("pose.metarig_sample_add", text="Sample").metarig_type = self.templates[pose_templates.active_template_index]
|
subsubrow = subrow.split(percentage=0.8)
|
||||||
subsubrow.operator("pose.metarig_sample_add", text="All").metarig_type = "" # self.templates[pose_templates.active_template_index]
|
subsubrow.operator("pose.metarig_sample_add", text="Sample").metarig_type = self.templates[pose_templates.active_template_index]
|
||||||
|
subsubrow.operator("pose.metarig_sample_add", text="All").metarig_type = "" # self.templates[pose_templates.active_template_index]
|
||||||
|
|
||||||
sub = row.column(align=True)
|
sub = row.column(align=True)
|
||||||
sub.operator("pose.metarig_reload", icon="FILE_REFRESH", text="")
|
sub.operator("pose.metarig_reload", icon="FILE_REFRESH", text="")
|
||||||
|
|
||||||
|
|
||||||
# operators
|
# operators
|
||||||
|
@ -47,18 +47,6 @@ class BONE_PT_context_bone(BoneButtonsPanel, bpy.types.Panel):
|
|||||||
row.prop(bone, "name", text="")
|
row.prop(bone, "name", text="")
|
||||||
|
|
||||||
|
|
||||||
class BONE_PT_custom_props(BoneButtonsPanel, PropertyPanel, bpy.types.Panel):
|
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
|
||||||
|
|
||||||
@property
|
|
||||||
def _context_path(self):
|
|
||||||
obj = bpy.context.object
|
|
||||||
if obj and obj.mode == 'POSE':
|
|
||||||
return "active_pose_bone"
|
|
||||||
else:
|
|
||||||
return "active_bone"
|
|
||||||
|
|
||||||
|
|
||||||
class BONE_PT_transform(BoneButtonsPanel, bpy.types.Panel):
|
class BONE_PT_transform(BoneButtonsPanel, bpy.types.Panel):
|
||||||
bl_label = "Transform"
|
bl_label = "Transform"
|
||||||
|
|
||||||
@ -354,6 +342,18 @@ class BONE_PT_deform(BoneButtonsPanel, bpy.types.Panel):
|
|||||||
col.prop(bone, "cyclic_offset")
|
col.prop(bone, "cyclic_offset")
|
||||||
|
|
||||||
|
|
||||||
|
class BONE_PT_custom_props(BoneButtonsPanel, PropertyPanel, bpy.types.Panel):
|
||||||
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||||
|
|
||||||
|
@property
|
||||||
|
def _context_path(self):
|
||||||
|
obj = bpy.context.object
|
||||||
|
if obj and obj.mode == 'POSE':
|
||||||
|
return "active_pose_bone"
|
||||||
|
else:
|
||||||
|
return "active_bone"
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -53,11 +53,6 @@ class DATA_PT_context_camera(CameraButtonsPanel, bpy.types.Panel):
|
|||||||
split.separator()
|
split.separator()
|
||||||
|
|
||||||
|
|
||||||
class DATA_PT_custom_props_camera(CameraButtonsPanel, PropertyPanel, bpy.types.Panel):
|
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
|
||||||
_context_path = "object.data"
|
|
||||||
|
|
||||||
|
|
||||||
class DATA_PT_camera(CameraButtonsPanel, bpy.types.Panel):
|
class DATA_PT_camera(CameraButtonsPanel, bpy.types.Panel):
|
||||||
bl_label = "Lens"
|
bl_label = "Lens"
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||||
@ -137,6 +132,11 @@ class DATA_PT_camera_display(CameraButtonsPanel, bpy.types.Panel):
|
|||||||
sub.prop(cam, "passepartout_alpha", text="Alpha", slider=True)
|
sub.prop(cam, "passepartout_alpha", text="Alpha", slider=True)
|
||||||
|
|
||||||
|
|
||||||
|
class DATA_PT_custom_props_camera(CameraButtonsPanel, PropertyPanel, bpy.types.Panel):
|
||||||
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||||
|
_context_path = "object.data"
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -69,11 +69,6 @@ class DATA_PT_context_curve(CurveButtonsPanel, bpy.types.Panel):
|
|||||||
split.separator()
|
split.separator()
|
||||||
|
|
||||||
|
|
||||||
class DATA_PT_custom_props_curve(CurveButtonsPanel, PropertyPanel, bpy.types.Panel):
|
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
|
||||||
_context_path = "object.data"
|
|
||||||
|
|
||||||
|
|
||||||
class DATA_PT_shape_curve(CurveButtonsPanel, bpy.types.Panel):
|
class DATA_PT_shape_curve(CurveButtonsPanel, bpy.types.Panel):
|
||||||
bl_label = "Shape"
|
bl_label = "Shape"
|
||||||
|
|
||||||
@ -385,6 +380,11 @@ class DATA_PT_textboxes(CurveButtonsPanel, bpy.types.Panel):
|
|||||||
row.operator("font.textbox_remove", text='', icon='X', emboss=False).index = i
|
row.operator("font.textbox_remove", text='', icon='X', emboss=False).index = i
|
||||||
|
|
||||||
|
|
||||||
|
class DATA_PT_custom_props_curve(CurveButtonsPanel, PropertyPanel, bpy.types.Panel):
|
||||||
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||||
|
_context_path = "object.data"
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -40,13 +40,6 @@ class DataButtonsPanel():
|
|||||||
return context.lamp and (engine in cls.COMPAT_ENGINES)
|
return context.lamp and (engine in cls.COMPAT_ENGINES)
|
||||||
|
|
||||||
|
|
||||||
class DATA_PT_preview(DataButtonsPanel, bpy.types.Panel):
|
|
||||||
bl_label = "Preview"
|
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
|
||||||
|
|
||||||
def draw(self, context):
|
|
||||||
self.layout.template_preview(context.lamp)
|
|
||||||
|
|
||||||
class DATA_PT_context_lamp(DataButtonsPanel, bpy.types.Panel):
|
class DATA_PT_context_lamp(DataButtonsPanel, bpy.types.Panel):
|
||||||
bl_label = ""
|
bl_label = ""
|
||||||
bl_show_header = False
|
bl_show_header = False
|
||||||
@ -69,9 +62,12 @@ class DATA_PT_context_lamp(DataButtonsPanel, bpy.types.Panel):
|
|||||||
split.separator()
|
split.separator()
|
||||||
|
|
||||||
|
|
||||||
class DATA_PT_custom_props_lamp(DataButtonsPanel, PropertyPanel, bpy.types.Panel):
|
class DATA_PT_preview(DataButtonsPanel, bpy.types.Panel):
|
||||||
|
bl_label = "Preview"
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||||
_context_path = "object.data"
|
|
||||||
|
def draw(self, context):
|
||||||
|
self.layout.template_preview(context.lamp)
|
||||||
|
|
||||||
|
|
||||||
class DATA_PT_lamp(DataButtonsPanel, bpy.types.Panel):
|
class DATA_PT_lamp(DataButtonsPanel, bpy.types.Panel):
|
||||||
@ -387,6 +383,11 @@ class DATA_PT_falloff_curve(DataButtonsPanel, bpy.types.Panel):
|
|||||||
self.layout.template_curve_mapping(lamp, "falloff_curve")
|
self.layout.template_curve_mapping(lamp, "falloff_curve")
|
||||||
|
|
||||||
|
|
||||||
|
class DATA_PT_custom_props_lamp(DataButtonsPanel, PropertyPanel, bpy.types.Panel):
|
||||||
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||||
|
_context_path = "object.data"
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -51,11 +51,6 @@ class DATA_PT_context_lattice(DataButtonsPanel, bpy.types.Panel):
|
|||||||
split.separator()
|
split.separator()
|
||||||
|
|
||||||
|
|
||||||
class DATA_PT_custom_props_lattice(DataButtonsPanel, PropertyPanel, bpy.types.Panel):
|
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
|
||||||
_context_path = "object.data"
|
|
||||||
|
|
||||||
|
|
||||||
class DATA_PT_lattice(DataButtonsPanel, bpy.types.Panel):
|
class DATA_PT_lattice(DataButtonsPanel, bpy.types.Panel):
|
||||||
bl_label = "Lattice"
|
bl_label = "Lattice"
|
||||||
|
|
||||||
@ -87,6 +82,11 @@ class DATA_PT_lattice(DataButtonsPanel, bpy.types.Panel):
|
|||||||
row.prop_object(lat, "vertex_group", context.object, "vertex_groups", text="")
|
row.prop_object(lat, "vertex_group", context.object, "vertex_groups", text="")
|
||||||
|
|
||||||
|
|
||||||
|
class DATA_PT_custom_props_lattice(DataButtonsPanel, PropertyPanel, bpy.types.Panel):
|
||||||
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||||
|
_context_path = "object.data"
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -79,11 +79,6 @@ class DATA_PT_context_mesh(MeshButtonsPanel, bpy.types.Panel):
|
|||||||
split.separator()
|
split.separator()
|
||||||
|
|
||||||
|
|
||||||
class DATA_PT_custom_props_mesh(MeshButtonsPanel, PropertyPanel, bpy.types.Panel):
|
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
|
||||||
_context_path = "object.data"
|
|
||||||
|
|
||||||
|
|
||||||
class DATA_PT_normals(MeshButtonsPanel, bpy.types.Panel):
|
class DATA_PT_normals(MeshButtonsPanel, bpy.types.Panel):
|
||||||
bl_label = "Normals"
|
bl_label = "Normals"
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||||
@ -351,6 +346,11 @@ class DATA_PT_vertex_colors(MeshButtonsPanel, bpy.types.Panel):
|
|||||||
layout.prop(lay, "name")
|
layout.prop(lay, "name")
|
||||||
|
|
||||||
|
|
||||||
|
class DATA_PT_custom_props_mesh(MeshButtonsPanel, PropertyPanel, bpy.types.Panel):
|
||||||
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||||
|
_context_path = "object.data"
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -51,11 +51,6 @@ class DATA_PT_context_metaball(DataButtonsPanel, bpy.types.Panel):
|
|||||||
split.separator()
|
split.separator()
|
||||||
|
|
||||||
|
|
||||||
class DATA_PT_custom_props_metaball(DataButtonsPanel, PropertyPanel, bpy.types.Panel):
|
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
|
||||||
_context_path = "object.data"
|
|
||||||
|
|
||||||
|
|
||||||
class DATA_PT_metaball(DataButtonsPanel, bpy.types.Panel):
|
class DATA_PT_metaball(DataButtonsPanel, bpy.types.Panel):
|
||||||
bl_label = "Metaball"
|
bl_label = "Metaball"
|
||||||
|
|
||||||
@ -120,6 +115,11 @@ class DATA_PT_metaball_element(DataButtonsPanel, bpy.types.Panel):
|
|||||||
col.prop(metaelem, "size_y", text="Y")
|
col.prop(metaelem, "size_y", text="Y")
|
||||||
|
|
||||||
|
|
||||||
|
class DATA_PT_custom_props_metaball(DataButtonsPanel, PropertyPanel, bpy.types.Panel):
|
||||||
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||||
|
_context_path = "object.data"
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ from rna_prop_ui import PropertyPanel
|
|||||||
def active_node_mat(mat):
|
def active_node_mat(mat):
|
||||||
# TODO, 2.4x has a pipeline section, for 2.5 we need to communicate
|
# TODO, 2.4x has a pipeline section, for 2.5 we need to communicate
|
||||||
# which settings from node-materials are used
|
# which settings from node-materials are used
|
||||||
if mat:
|
if mat is not None:
|
||||||
mat_node = mat.active_node_material
|
mat_node = mat.active_node_material
|
||||||
if mat_node:
|
if mat_node:
|
||||||
return mat_node
|
return mat_node
|
||||||
@ -63,14 +63,6 @@ class MaterialButtonsPanel():
|
|||||||
return context.material and (context.scene.render.engine in cls.COMPAT_ENGINES)
|
return context.material and (context.scene.render.engine in cls.COMPAT_ENGINES)
|
||||||
|
|
||||||
|
|
||||||
class MATERIAL_PT_preview(MaterialButtonsPanel, bpy.types.Panel):
|
|
||||||
bl_label = "Preview"
|
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
|
||||||
|
|
||||||
def draw(self, context):
|
|
||||||
self.layout.template_preview(context.material)
|
|
||||||
|
|
||||||
|
|
||||||
class MATERIAL_PT_context_material(MaterialButtonsPanel, bpy.types.Panel):
|
class MATERIAL_PT_context_material(MaterialButtonsPanel, bpy.types.Panel):
|
||||||
bl_label = ""
|
bl_label = ""
|
||||||
bl_show_header = False
|
bl_show_header = False
|
||||||
@ -129,201 +121,13 @@ class MATERIAL_PT_context_material(MaterialButtonsPanel, bpy.types.Panel):
|
|||||||
layout.prop(mat, "type", expand=True)
|
layout.prop(mat, "type", expand=True)
|
||||||
|
|
||||||
|
|
||||||
class MATERIAL_PT_custom_props(MaterialButtonsPanel, PropertyPanel, bpy.types.Panel):
|
class MATERIAL_PT_preview(MaterialButtonsPanel, bpy.types.Panel):
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
bl_label = "Preview"
|
||||||
_context_path = "material"
|
|
||||||
|
|
||||||
|
|
||||||
class MATERIAL_PT_shading(MaterialButtonsPanel, bpy.types.Panel):
|
|
||||||
bl_label = "Shading"
|
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def poll(cls, context):
|
|
||||||
mat = active_node_mat(context.material)
|
|
||||||
engine = context.scene.render.engine
|
|
||||||
return mat and (mat.type in ('SURFACE', 'WIRE', 'HALO')) and (engine in cls.COMPAT_ENGINES)
|
|
||||||
|
|
||||||
def draw(self, context):
|
def draw(self, context):
|
||||||
layout = self.layout
|
self.layout.template_preview(context.material)
|
||||||
|
|
||||||
mat = active_node_mat(context.material)
|
|
||||||
|
|
||||||
if mat.type in ('SURFACE', 'WIRE'):
|
|
||||||
split = layout.split()
|
|
||||||
|
|
||||||
col = split.column()
|
|
||||||
sub = col.column()
|
|
||||||
sub.active = not mat.shadeless
|
|
||||||
sub.prop(mat, "emit")
|
|
||||||
sub.prop(mat, "ambient")
|
|
||||||
sub = col.column()
|
|
||||||
sub.prop(mat, "translucency")
|
|
||||||
|
|
||||||
col = split.column()
|
|
||||||
col.prop(mat, "shadeless")
|
|
||||||
sub = col.column()
|
|
||||||
sub.active = not mat.shadeless
|
|
||||||
sub.prop(mat, "tangent_shading")
|
|
||||||
sub.prop(mat, "cubic")
|
|
||||||
|
|
||||||
elif mat.type == 'HALO':
|
|
||||||
layout.prop(mat, "alpha")
|
|
||||||
|
|
||||||
|
|
||||||
class MATERIAL_PT_strand(MaterialButtonsPanel, bpy.types.Panel):
|
|
||||||
bl_label = "Strand"
|
|
||||||
bl_default_closed = True
|
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER'}
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def poll(cls, context):
|
|
||||||
mat = context.material
|
|
||||||
engine = context.scene.render.engine
|
|
||||||
return mat and (mat.type in ('SURFACE', 'WIRE', 'HALO')) and (engine in cls.COMPAT_ENGINES)
|
|
||||||
|
|
||||||
def draw(self, context):
|
|
||||||
layout = self.layout
|
|
||||||
|
|
||||||
mat = context.material # dont use node material
|
|
||||||
tan = mat.strand
|
|
||||||
|
|
||||||
split = layout.split()
|
|
||||||
|
|
||||||
col = split.column()
|
|
||||||
sub = col.column(align=True)
|
|
||||||
sub.label(text="Size:")
|
|
||||||
sub.prop(tan, "root_size", text="Root")
|
|
||||||
sub.prop(tan, "tip_size", text="Tip")
|
|
||||||
sub.prop(tan, "min_size", text="Minimum")
|
|
||||||
sub.prop(tan, "blender_units")
|
|
||||||
sub = col.column()
|
|
||||||
sub.active = (not mat.shadeless)
|
|
||||||
sub.prop(tan, "tangent_shading")
|
|
||||||
col.prop(tan, "shape")
|
|
||||||
|
|
||||||
col = split.column()
|
|
||||||
col.label(text="Shading:")
|
|
||||||
col.prop(tan, "width_fade")
|
|
||||||
ob = context.object
|
|
||||||
if ob and ob.type == 'MESH':
|
|
||||||
col.prop_object(tan, "uv_layer", ob.data, "uv_textures", text="")
|
|
||||||
else:
|
|
||||||
col.prop(tan, "uv_layer", text="")
|
|
||||||
col.separator()
|
|
||||||
sub = col.column()
|
|
||||||
sub.active = (not mat.shadeless)
|
|
||||||
sub.prop(tan, "surface_diffuse")
|
|
||||||
sub = col.column()
|
|
||||||
sub.active = tan.surface_diffuse
|
|
||||||
sub.prop(tan, "blend_distance", text="Distance")
|
|
||||||
|
|
||||||
|
|
||||||
class MATERIAL_PT_physics(MaterialButtonsPanel, bpy.types.Panel):
|
|
||||||
bl_label = "Physics"
|
|
||||||
COMPAT_ENGINES = {'BLENDER_GAME'}
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def poll(cls, context):
|
|
||||||
return context.material and (context.scene.render.engine in cls.COMPAT_ENGINES)
|
|
||||||
|
|
||||||
def draw(self, context):
|
|
||||||
layout = self.layout
|
|
||||||
|
|
||||||
phys = context.material.physics # dont use node material
|
|
||||||
|
|
||||||
split = layout.split()
|
|
||||||
|
|
||||||
col = split.column()
|
|
||||||
col.prop(phys, "distance")
|
|
||||||
col.prop(phys, "friction")
|
|
||||||
col.prop(phys, "align_to_normal")
|
|
||||||
|
|
||||||
col = split.column()
|
|
||||||
col.prop(phys, "force", slider=True)
|
|
||||||
col.prop(phys, "elasticity", slider=True)
|
|
||||||
col.prop(phys, "damp", slider=True)
|
|
||||||
|
|
||||||
|
|
||||||
class MATERIAL_PT_options(MaterialButtonsPanel, bpy.types.Panel):
|
|
||||||
bl_label = "Options"
|
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def poll(cls, context):
|
|
||||||
mat = active_node_mat(context.material)
|
|
||||||
engine = context.scene.render.engine
|
|
||||||
return mat and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
|
|
||||||
|
|
||||||
def draw(self, context):
|
|
||||||
layout = self.layout
|
|
||||||
|
|
||||||
mat = active_node_mat(context.material)
|
|
||||||
|
|
||||||
split = layout.split()
|
|
||||||
|
|
||||||
col = split.column()
|
|
||||||
col.prop(mat, "traceable")
|
|
||||||
col.prop(mat, "full_oversampling")
|
|
||||||
col.prop(mat, "use_sky")
|
|
||||||
col.prop(mat, "exclude_mist")
|
|
||||||
col.prop(mat, "invert_z")
|
|
||||||
sub = col.row()
|
|
||||||
sub.prop(mat, "z_offset")
|
|
||||||
sub.active = mat.transparency and mat.transparency_method == 'Z_TRANSPARENCY'
|
|
||||||
sub = col.column(align=True)
|
|
||||||
sub.label(text="Light Group:")
|
|
||||||
sub.prop(mat, "light_group", text="")
|
|
||||||
row = sub.row()
|
|
||||||
row.active = bool(mat.light_group)
|
|
||||||
row.prop(mat, "light_group_exclusive", text="Exclusive")
|
|
||||||
|
|
||||||
col = split.column()
|
|
||||||
col.prop(mat, "face_texture")
|
|
||||||
sub = col.column()
|
|
||||||
sub.active = mat.face_texture
|
|
||||||
sub.prop(mat, "face_texture_alpha")
|
|
||||||
col.separator()
|
|
||||||
col.prop(mat, "vertex_color_paint")
|
|
||||||
col.prop(mat, "vertex_color_light")
|
|
||||||
col.prop(mat, "object_color")
|
|
||||||
|
|
||||||
|
|
||||||
class MATERIAL_PT_shadow(MaterialButtonsPanel, bpy.types.Panel):
|
|
||||||
bl_label = "Shadow"
|
|
||||||
bl_default_closed = True
|
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def poll(cls, context):
|
|
||||||
mat = active_node_mat(context.material)
|
|
||||||
engine = context.scene.render.engine
|
|
||||||
return mat and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
|
|
||||||
|
|
||||||
def draw(self, context):
|
|
||||||
layout = self.layout
|
|
||||||
|
|
||||||
mat = active_node_mat(context.material)
|
|
||||||
|
|
||||||
split = layout.split()
|
|
||||||
|
|
||||||
col = split.column()
|
|
||||||
col.prop(mat, "shadows", text="Receive")
|
|
||||||
col.prop(mat, "receive_transparent_shadows", text="Receive Transparent")
|
|
||||||
col.prop(mat, "only_shadow", text="Shadows Only")
|
|
||||||
col.prop(mat, "cast_shadows_only", text="Cast Only")
|
|
||||||
col.prop(mat, "shadow_casting_alpha", text="Casting Alpha")
|
|
||||||
|
|
||||||
col = split.column()
|
|
||||||
col.prop(mat, "cast_buffer_shadows")
|
|
||||||
sub = col.column()
|
|
||||||
sub.active = mat.cast_buffer_shadows
|
|
||||||
sub.prop(mat, "shadow_buffer_bias", text="Buffer Bias")
|
|
||||||
col.prop(mat, "ray_shadow_bias", text="Auto Ray Bias")
|
|
||||||
sub = col.column()
|
|
||||||
sub.active = (not mat.ray_shadow_bias)
|
|
||||||
sub.prop(mat, "shadow_ray_bias", text="Ray Bias")
|
|
||||||
col.prop(mat, "cast_approximate")
|
|
||||||
|
|
||||||
class MATERIAL_PT_diffuse(MaterialButtonsPanel, bpy.types.Panel):
|
class MATERIAL_PT_diffuse(MaterialButtonsPanel, bpy.types.Panel):
|
||||||
bl_label = "Diffuse"
|
bl_label = "Diffuse"
|
||||||
@ -457,113 +261,41 @@ class MATERIAL_PT_specular(MaterialButtonsPanel, bpy.types.Panel):
|
|||||||
row.prop(mat, "specular_ramp_factor", text="Factor")
|
row.prop(mat, "specular_ramp_factor", text="Factor")
|
||||||
|
|
||||||
|
|
||||||
class MATERIAL_PT_sss(MaterialButtonsPanel, bpy.types.Panel):
|
class MATERIAL_PT_shading(MaterialButtonsPanel, bpy.types.Panel):
|
||||||
bl_label = "Subsurface Scattering"
|
bl_label = "Shading"
|
||||||
bl_default_closed = True
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER'}
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def poll(cls, context):
|
def poll(cls, context):
|
||||||
mat = active_node_mat(context.material)
|
mat = active_node_mat(context.material)
|
||||||
engine = context.scene.render.engine
|
engine = context.scene.render.engine
|
||||||
return mat and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
|
return mat and (mat.type in ('SURFACE', 'WIRE', 'HALO')) and (engine in cls.COMPAT_ENGINES)
|
||||||
|
|
||||||
def draw_header(self, context):
|
|
||||||
mat = active_node_mat(context.material)
|
|
||||||
sss = mat.subsurface_scattering
|
|
||||||
|
|
||||||
self.layout.active = (not mat.shadeless)
|
|
||||||
self.layout.prop(sss, "enabled", text="")
|
|
||||||
|
|
||||||
def draw(self, context):
|
def draw(self, context):
|
||||||
layout = self.layout
|
layout = self.layout
|
||||||
|
|
||||||
mat = active_node_mat(context.material)
|
mat = active_node_mat(context.material)
|
||||||
sss = mat.subsurface_scattering
|
|
||||||
|
|
||||||
layout.active = (sss.enabled) and (not mat.shadeless)
|
if mat.type in ('SURFACE', 'WIRE'):
|
||||||
|
split = layout.split()
|
||||||
|
|
||||||
row = layout.row().split()
|
col = split.column()
|
||||||
sub = row.row(align=True).split(percentage=0.75)
|
sub = col.column()
|
||||||
sub.menu("MATERIAL_MT_sss_presets", text=bpy.types.MATERIAL_MT_sss_presets.bl_label)
|
sub.active = not mat.shadeless
|
||||||
sub.operator("material.sss_preset_add", text="", icon="ZOOMIN")
|
sub.prop(mat, "emit")
|
||||||
|
sub.prop(mat, "ambient")
|
||||||
|
sub = col.column()
|
||||||
|
sub.prop(mat, "translucency")
|
||||||
|
|
||||||
split = layout.split()
|
col = split.column()
|
||||||
|
col.prop(mat, "shadeless")
|
||||||
|
sub = col.column()
|
||||||
|
sub.active = not mat.shadeless
|
||||||
|
sub.prop(mat, "tangent_shading")
|
||||||
|
sub.prop(mat, "cubic")
|
||||||
|
|
||||||
col = split.column()
|
elif mat.type == 'HALO':
|
||||||
col.prop(sss, "ior")
|
layout.prop(mat, "alpha")
|
||||||
col.prop(sss, "scale")
|
|
||||||
col.prop(sss, "color", text="")
|
|
||||||
col.prop(sss, "radius", text="RGB Radius", expand=True)
|
|
||||||
|
|
||||||
col = split.column()
|
|
||||||
sub = col.column(align=True)
|
|
||||||
sub.label(text="Blend:")
|
|
||||||
sub.prop(sss, "color_factor", text="Color")
|
|
||||||
sub.prop(sss, "texture_factor", text="Texture")
|
|
||||||
sub.label(text="Scattering Weight:")
|
|
||||||
sub.prop(sss, "front")
|
|
||||||
sub.prop(sss, "back")
|
|
||||||
col.separator()
|
|
||||||
col.prop(sss, "error_tolerance", text="Error")
|
|
||||||
|
|
||||||
|
|
||||||
class MATERIAL_PT_mirror(MaterialButtonsPanel, bpy.types.Panel):
|
|
||||||
bl_label = "Mirror"
|
|
||||||
bl_default_closed = True
|
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER'}
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def poll(cls, context):
|
|
||||||
mat = active_node_mat(context.material)
|
|
||||||
engine = context.scene.render.engine
|
|
||||||
return mat and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
|
|
||||||
|
|
||||||
def draw_header(self, context):
|
|
||||||
raym = active_node_mat(context.material).raytrace_mirror
|
|
||||||
|
|
||||||
self.layout.prop(raym, "enabled", text="")
|
|
||||||
|
|
||||||
def draw(self, context):
|
|
||||||
layout = self.layout
|
|
||||||
|
|
||||||
mat = active_node_mat(context.material)
|
|
||||||
raym = mat.raytrace_mirror
|
|
||||||
|
|
||||||
layout.active = raym.enabled
|
|
||||||
|
|
||||||
split = layout.split()
|
|
||||||
|
|
||||||
col = split.column()
|
|
||||||
col.prop(raym, "reflect_factor")
|
|
||||||
col.prop(mat, "mirror_color", text="")
|
|
||||||
|
|
||||||
col = split.column()
|
|
||||||
col.prop(raym, "fresnel")
|
|
||||||
sub = col.column()
|
|
||||||
sub.active = raym.fresnel > 0
|
|
||||||
sub.prop(raym, "fresnel_factor", text="Blend")
|
|
||||||
|
|
||||||
split = layout.split()
|
|
||||||
|
|
||||||
col = split.column()
|
|
||||||
col.separator()
|
|
||||||
col.prop(raym, "depth")
|
|
||||||
col.prop(raym, "distance", text="Max Dist")
|
|
||||||
col.separator()
|
|
||||||
sub = col.split(percentage=0.4)
|
|
||||||
sub.active = raym.distance > 0.0
|
|
||||||
sub.label(text="Fade To:")
|
|
||||||
sub.prop(raym, "fade_to", text="")
|
|
||||||
|
|
||||||
col = split.column()
|
|
||||||
col.label(text="Gloss:")
|
|
||||||
col.prop(raym, "gloss_factor", text="Amount")
|
|
||||||
sub = col.column()
|
|
||||||
sub.active = raym.gloss_factor < 1.0
|
|
||||||
sub.prop(raym, "gloss_threshold", text="Threshold")
|
|
||||||
sub.prop(raym, "gloss_samples", text="Samples")
|
|
||||||
sub.prop(raym, "gloss_anisotropic", text="Anisotropic")
|
|
||||||
|
|
||||||
|
|
||||||
class MATERIAL_PT_transp(MaterialButtonsPanel, bpy.types.Panel):
|
class MATERIAL_PT_transp(MaterialButtonsPanel, bpy.types.Panel):
|
||||||
@ -628,36 +360,113 @@ class MATERIAL_PT_transp(MaterialButtonsPanel, bpy.types.Panel):
|
|||||||
sub.prop(rayt, "gloss_samples", text="Samples")
|
sub.prop(rayt, "gloss_samples", text="Samples")
|
||||||
|
|
||||||
|
|
||||||
class MATERIAL_PT_transp_game(MaterialButtonsPanel, bpy.types.Panel):
|
class MATERIAL_PT_mirror(MaterialButtonsPanel, bpy.types.Panel):
|
||||||
bl_label = "Transparency"
|
bl_label = "Mirror"
|
||||||
bl_default_closed = True
|
bl_default_closed = True
|
||||||
COMPAT_ENGINES = {'BLENDER_GAME'}
|
COMPAT_ENGINES = {'BLENDER_RENDER'}
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def poll(cls, context):
|
def poll(cls, context):
|
||||||
mat = active_node_mat(context.material)
|
mat = active_node_mat(context.material)
|
||||||
engine = context.scene.render.engine
|
engine = context.scene.render.engine
|
||||||
return mat and (engine in cls.COMPAT_ENGINES)
|
return mat and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
|
||||||
|
|
||||||
def draw_header(self, context):
|
def draw_header(self, context):
|
||||||
mat = active_node_mat(context.material)
|
raym = active_node_mat(context.material).raytrace_mirror
|
||||||
|
|
||||||
self.layout.prop(mat, "transparency", text="")
|
self.layout.prop(raym, "enabled", text="")
|
||||||
|
|
||||||
def draw(self, context):
|
def draw(self, context):
|
||||||
layout = self.layout
|
layout = self.layout
|
||||||
|
|
||||||
mat = active_node_mat(context.material)
|
mat = active_node_mat(context.material)
|
||||||
rayt = mat.raytrace_transparency
|
raym = mat.raytrace_mirror
|
||||||
|
|
||||||
row = layout.row()
|
layout.active = raym.enabled
|
||||||
row.active = mat.transparency and (not mat.shadeless)
|
|
||||||
row.prop(mat, "transparency_method", expand=True)
|
|
||||||
|
|
||||||
split = layout.split()
|
split = layout.split()
|
||||||
|
|
||||||
col = split.column()
|
col = split.column()
|
||||||
col.prop(mat, "alpha")
|
col.prop(raym, "reflect_factor")
|
||||||
|
col.prop(mat, "mirror_color", text="")
|
||||||
|
|
||||||
|
col = split.column()
|
||||||
|
col.prop(raym, "fresnel")
|
||||||
|
sub = col.column()
|
||||||
|
sub.active = raym.fresnel > 0
|
||||||
|
sub.prop(raym, "fresnel_factor", text="Blend")
|
||||||
|
|
||||||
|
split = layout.split()
|
||||||
|
|
||||||
|
col = split.column()
|
||||||
|
col.separator()
|
||||||
|
col.prop(raym, "depth")
|
||||||
|
col.prop(raym, "distance", text="Max Dist")
|
||||||
|
col.separator()
|
||||||
|
sub = col.split(percentage=0.4)
|
||||||
|
sub.active = raym.distance > 0.0
|
||||||
|
sub.label(text="Fade To:")
|
||||||
|
sub.prop(raym, "fade_to", text="")
|
||||||
|
|
||||||
|
col = split.column()
|
||||||
|
col.label(text="Gloss:")
|
||||||
|
col.prop(raym, "gloss_factor", text="Amount")
|
||||||
|
sub = col.column()
|
||||||
|
sub.active = raym.gloss_factor < 1.0
|
||||||
|
sub.prop(raym, "gloss_threshold", text="Threshold")
|
||||||
|
sub.prop(raym, "gloss_samples", text="Samples")
|
||||||
|
sub.prop(raym, "gloss_anisotropic", text="Anisotropic")
|
||||||
|
|
||||||
|
|
||||||
|
class MATERIAL_PT_sss(MaterialButtonsPanel, bpy.types.Panel):
|
||||||
|
bl_label = "Subsurface Scattering"
|
||||||
|
bl_default_closed = True
|
||||||
|
COMPAT_ENGINES = {'BLENDER_RENDER'}
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context):
|
||||||
|
mat = active_node_mat(context.material)
|
||||||
|
engine = context.scene.render.engine
|
||||||
|
return mat and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
|
||||||
|
|
||||||
|
def draw_header(self, context):
|
||||||
|
mat = active_node_mat(context.material)
|
||||||
|
sss = mat.subsurface_scattering
|
||||||
|
|
||||||
|
self.layout.active = (not mat.shadeless)
|
||||||
|
self.layout.prop(sss, "enabled", text="")
|
||||||
|
|
||||||
|
def draw(self, context):
|
||||||
|
layout = self.layout
|
||||||
|
|
||||||
|
mat = active_node_mat(context.material)
|
||||||
|
sss = mat.subsurface_scattering
|
||||||
|
|
||||||
|
layout.active = (sss.enabled) and (not mat.shadeless)
|
||||||
|
|
||||||
|
row = layout.row().split()
|
||||||
|
sub = row.row(align=True).split(percentage=0.75)
|
||||||
|
sub.menu("MATERIAL_MT_sss_presets", text=bpy.types.MATERIAL_MT_sss_presets.bl_label)
|
||||||
|
sub.operator("material.sss_preset_add", text="", icon="ZOOMIN")
|
||||||
|
|
||||||
|
split = layout.split()
|
||||||
|
|
||||||
|
col = split.column()
|
||||||
|
col.prop(sss, "ior")
|
||||||
|
col.prop(sss, "scale")
|
||||||
|
col.prop(sss, "color", text="")
|
||||||
|
col.prop(sss, "radius", text="RGB Radius", expand=True)
|
||||||
|
|
||||||
|
col = split.column()
|
||||||
|
sub = col.column(align=True)
|
||||||
|
sub.label(text="Blend:")
|
||||||
|
sub.prop(sss, "color_factor", text="Color")
|
||||||
|
sub.prop(sss, "texture_factor", text="Texture")
|
||||||
|
sub.label(text="Scattering Weight:")
|
||||||
|
sub.prop(sss, "front")
|
||||||
|
sub.prop(sss, "back")
|
||||||
|
col.separator()
|
||||||
|
col.prop(sss, "error_tolerance", text="Error")
|
||||||
|
|
||||||
|
|
||||||
class MATERIAL_PT_halo(MaterialButtonsPanel, bpy.types.Panel):
|
class MATERIAL_PT_halo(MaterialButtonsPanel, bpy.types.Panel):
|
||||||
@ -744,6 +553,193 @@ class MATERIAL_PT_flare(MaterialButtonsPanel, bpy.types.Panel):
|
|||||||
col.prop(halo, "flare_subsize", text="Subsize")
|
col.prop(halo, "flare_subsize", text="Subsize")
|
||||||
|
|
||||||
|
|
||||||
|
class MATERIAL_PT_physics(MaterialButtonsPanel, bpy.types.Panel):
|
||||||
|
bl_label = "Physics"
|
||||||
|
COMPAT_ENGINES = {'BLENDER_GAME'}
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context):
|
||||||
|
return context.material and (context.scene.render.engine in cls.COMPAT_ENGINES)
|
||||||
|
|
||||||
|
def draw(self, context):
|
||||||
|
layout = self.layout
|
||||||
|
|
||||||
|
phys = context.material.physics # dont use node material
|
||||||
|
|
||||||
|
split = layout.split()
|
||||||
|
|
||||||
|
col = split.column()
|
||||||
|
col.prop(phys, "distance")
|
||||||
|
col.prop(phys, "friction")
|
||||||
|
col.prop(phys, "align_to_normal")
|
||||||
|
|
||||||
|
col = split.column()
|
||||||
|
col.prop(phys, "force", slider=True)
|
||||||
|
col.prop(phys, "elasticity", slider=True)
|
||||||
|
col.prop(phys, "damp", slider=True)
|
||||||
|
|
||||||
|
|
||||||
|
class MATERIAL_PT_strand(MaterialButtonsPanel, bpy.types.Panel):
|
||||||
|
bl_label = "Strand"
|
||||||
|
bl_default_closed = True
|
||||||
|
COMPAT_ENGINES = {'BLENDER_RENDER'}
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context):
|
||||||
|
mat = context.material
|
||||||
|
engine = context.scene.render.engine
|
||||||
|
return mat and (mat.type in ('SURFACE', 'WIRE', 'HALO')) and (engine in cls.COMPAT_ENGINES)
|
||||||
|
|
||||||
|
def draw(self, context):
|
||||||
|
layout = self.layout
|
||||||
|
|
||||||
|
mat = context.material # dont use node material
|
||||||
|
tan = mat.strand
|
||||||
|
|
||||||
|
split = layout.split()
|
||||||
|
|
||||||
|
col = split.column()
|
||||||
|
sub = col.column(align=True)
|
||||||
|
sub.label(text="Size:")
|
||||||
|
sub.prop(tan, "root_size", text="Root")
|
||||||
|
sub.prop(tan, "tip_size", text="Tip")
|
||||||
|
sub.prop(tan, "min_size", text="Minimum")
|
||||||
|
sub.prop(tan, "blender_units")
|
||||||
|
sub = col.column()
|
||||||
|
sub.active = (not mat.shadeless)
|
||||||
|
sub.prop(tan, "tangent_shading")
|
||||||
|
col.prop(tan, "shape")
|
||||||
|
|
||||||
|
col = split.column()
|
||||||
|
col.label(text="Shading:")
|
||||||
|
col.prop(tan, "width_fade")
|
||||||
|
ob = context.object
|
||||||
|
if ob and ob.type == 'MESH':
|
||||||
|
col.prop_object(tan, "uv_layer", ob.data, "uv_textures", text="")
|
||||||
|
else:
|
||||||
|
col.prop(tan, "uv_layer", text="")
|
||||||
|
col.separator()
|
||||||
|
sub = col.column()
|
||||||
|
sub.active = (not mat.shadeless)
|
||||||
|
sub.prop(tan, "surface_diffuse")
|
||||||
|
sub = col.column()
|
||||||
|
sub.active = tan.surface_diffuse
|
||||||
|
sub.prop(tan, "blend_distance", text="Distance")
|
||||||
|
|
||||||
|
|
||||||
|
class MATERIAL_PT_options(MaterialButtonsPanel, bpy.types.Panel):
|
||||||
|
bl_label = "Options"
|
||||||
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context):
|
||||||
|
mat = active_node_mat(context.material)
|
||||||
|
engine = context.scene.render.engine
|
||||||
|
return mat and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
|
||||||
|
|
||||||
|
def draw(self, context):
|
||||||
|
layout = self.layout
|
||||||
|
|
||||||
|
mat = active_node_mat(context.material)
|
||||||
|
|
||||||
|
split = layout.split()
|
||||||
|
|
||||||
|
col = split.column()
|
||||||
|
col.prop(mat, "traceable")
|
||||||
|
col.prop(mat, "full_oversampling")
|
||||||
|
col.prop(mat, "use_sky")
|
||||||
|
col.prop(mat, "exclude_mist")
|
||||||
|
col.prop(mat, "invert_z")
|
||||||
|
sub = col.row()
|
||||||
|
sub.prop(mat, "z_offset")
|
||||||
|
sub.active = mat.transparency and mat.transparency_method == 'Z_TRANSPARENCY'
|
||||||
|
sub = col.column(align=True)
|
||||||
|
sub.label(text="Light Group:")
|
||||||
|
sub.prop(mat, "light_group", text="")
|
||||||
|
row = sub.row()
|
||||||
|
row.active = bool(mat.light_group)
|
||||||
|
row.prop(mat, "light_group_exclusive", text="Exclusive")
|
||||||
|
|
||||||
|
col = split.column()
|
||||||
|
col.prop(mat, "face_texture")
|
||||||
|
sub = col.column()
|
||||||
|
sub.active = mat.face_texture
|
||||||
|
sub.prop(mat, "face_texture_alpha")
|
||||||
|
col.separator()
|
||||||
|
col.prop(mat, "vertex_color_paint")
|
||||||
|
col.prop(mat, "vertex_color_light")
|
||||||
|
col.prop(mat, "object_color")
|
||||||
|
|
||||||
|
|
||||||
|
class MATERIAL_PT_shadow(MaterialButtonsPanel, bpy.types.Panel):
|
||||||
|
bl_label = "Shadow"
|
||||||
|
bl_default_closed = True
|
||||||
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context):
|
||||||
|
mat = active_node_mat(context.material)
|
||||||
|
engine = context.scene.render.engine
|
||||||
|
return mat and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
|
||||||
|
|
||||||
|
def draw(self, context):
|
||||||
|
layout = self.layout
|
||||||
|
|
||||||
|
mat = active_node_mat(context.material)
|
||||||
|
|
||||||
|
split = layout.split()
|
||||||
|
|
||||||
|
col = split.column()
|
||||||
|
col.prop(mat, "shadows", text="Receive")
|
||||||
|
col.prop(mat, "receive_transparent_shadows", text="Receive Transparent")
|
||||||
|
col.prop(mat, "only_shadow", text="Shadows Only")
|
||||||
|
col.prop(mat, "cast_shadows_only", text="Cast Only")
|
||||||
|
col.prop(mat, "shadow_casting_alpha", text="Casting Alpha")
|
||||||
|
|
||||||
|
col = split.column()
|
||||||
|
col.prop(mat, "cast_buffer_shadows")
|
||||||
|
sub = col.column()
|
||||||
|
sub.active = mat.cast_buffer_shadows
|
||||||
|
sub.prop(mat, "shadow_buffer_bias", text="Buffer Bias")
|
||||||
|
col.prop(mat, "ray_shadow_bias", text="Auto Ray Bias")
|
||||||
|
sub = col.column()
|
||||||
|
sub.active = (not mat.ray_shadow_bias)
|
||||||
|
sub.prop(mat, "shadow_ray_bias", text="Ray Bias")
|
||||||
|
col.prop(mat, "cast_approximate")
|
||||||
|
|
||||||
|
|
||||||
|
class MATERIAL_PT_transp_game(MaterialButtonsPanel, bpy.types.Panel):
|
||||||
|
bl_label = "Transparency"
|
||||||
|
bl_default_closed = True
|
||||||
|
COMPAT_ENGINES = {'BLENDER_GAME'}
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context):
|
||||||
|
mat = active_node_mat(context.material)
|
||||||
|
engine = context.scene.render.engine
|
||||||
|
return mat and (engine in cls.COMPAT_ENGINES)
|
||||||
|
|
||||||
|
def draw_header(self, context):
|
||||||
|
mat = active_node_mat(context.material)
|
||||||
|
|
||||||
|
self.layout.prop(mat, "transparency", text="")
|
||||||
|
|
||||||
|
def draw(self, context):
|
||||||
|
layout = self.layout
|
||||||
|
|
||||||
|
mat = active_node_mat(context.material)
|
||||||
|
rayt = mat.raytrace_transparency
|
||||||
|
|
||||||
|
row = layout.row()
|
||||||
|
row.active = mat.transparency and (not mat.shadeless)
|
||||||
|
row.prop(mat, "transparency_method", expand=True)
|
||||||
|
|
||||||
|
split = layout.split()
|
||||||
|
|
||||||
|
col = split.column()
|
||||||
|
col.prop(mat, "alpha")
|
||||||
|
|
||||||
|
|
||||||
class VolumeButtonsPanel():
|
class VolumeButtonsPanel():
|
||||||
bl_space_type = 'PROPERTIES'
|
bl_space_type = 'PROPERTIES'
|
||||||
bl_region_type = 'WINDOW'
|
bl_region_type = 'WINDOW'
|
||||||
@ -897,6 +893,11 @@ class MATERIAL_PT_volume_options(VolumeButtonsPanel, bpy.types.Panel):
|
|||||||
row.prop(mat, "light_group_exclusive", text="Exclusive")
|
row.prop(mat, "light_group_exclusive", text="Exclusive")
|
||||||
|
|
||||||
|
|
||||||
|
class MATERIAL_PT_custom_props(MaterialButtonsPanel, PropertyPanel, bpy.types.Panel):
|
||||||
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||||
|
_context_path = "material"
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -252,7 +252,7 @@ class OBJECT_PT_animation(ObjectButtonsPanel, bpy.types.Panel):
|
|||||||
col.prop(ob, "time_offset_edit", text="Edit")
|
col.prop(ob, "time_offset_edit", text="Edit")
|
||||||
row = col.row()
|
row = col.row()
|
||||||
row.prop(ob, "time_offset_particle", text="Particle")
|
row.prop(ob, "time_offset_particle", text="Particle")
|
||||||
row.active = len(ob.particle_systems) != 0
|
row.active = bool(ob.particle_systems)
|
||||||
row = col.row()
|
row = col.row()
|
||||||
row.prop(ob, "time_offset_parent", text="Parent")
|
row.prop(ob, "time_offset_parent", text="Parent")
|
||||||
row.active = (ob.parent is not None)
|
row.active = (ob.parent is not None)
|
||||||
|
@ -440,7 +440,7 @@ class RENDER_PT_encoding(RenderButtonsPanel, bpy.types.Panel):
|
|||||||
# Audio:
|
# Audio:
|
||||||
sub = layout.column()
|
sub = layout.column()
|
||||||
|
|
||||||
if rd.ffmpeg_format not in ('MP3'):
|
if rd.ffmpeg_format not in ('MP3', ):
|
||||||
sub.prop(rd, "ffmpeg_audio_codec", text="Audio Codec")
|
sub.prop(rd, "ffmpeg_audio_codec", text="Audio Codec")
|
||||||
|
|
||||||
sub.separator()
|
sub.separator()
|
||||||
|
@ -1,79 +0,0 @@
|
|||||||
<ui>
|
|
||||||
<panel identifier="RENDER_PT_stamp_test" label="Stamp (XML)" space_type="PROPERTIES" region_type="WINDOW" context="render" default_closed="true">
|
|
||||||
<draw_header>
|
|
||||||
<prop data="context.scene.render" property="render_stamp" text=""/>
|
|
||||||
</draw_header>
|
|
||||||
|
|
||||||
<draw>
|
|
||||||
<split>
|
|
||||||
<column>
|
|
||||||
<prop data="context.scene.render" property="stamp_time" text="Time"/>
|
|
||||||
<prop data="context.scene.render" property="stamp_date" text="Date"/>
|
|
||||||
<prop data="context.scene.render" property="stamp_render_time" text="RenderTime"/>
|
|
||||||
<prop data="context.scene.render" property="stamp_frame" text="Frame"/>
|
|
||||||
<prop data="context.scene.render" property="stamp_scene" text="Scene"/>
|
|
||||||
<prop data="context.scene.render" property="stamp_camera" text="Camera"/>
|
|
||||||
<prop data="context.scene.render" property="stamp_filename" text="Filename"/>
|
|
||||||
<prop data="context.scene.render" property="stamp_marker" text="Marker"/>
|
|
||||||
<prop data="context.scene.render" property="stamp_sequencer_strip" text="Seq. Strip"/>
|
|
||||||
</column>
|
|
||||||
<column>
|
|
||||||
<active expr="context.scene.render.render_stamp"/>
|
|
||||||
<prop data="context.scene.render" property="stamp_foreground" slider="true"/>
|
|
||||||
<prop data="context.scene.render" property="stamp_background" slider="true"/>
|
|
||||||
<separator/>
|
|
||||||
<prop data="context.scene.render" property="stamp_font_size" text="Font Size"/>
|
|
||||||
</column>
|
|
||||||
</split>
|
|
||||||
<split percentage="0.2">
|
|
||||||
<prop data="context.scene.render" property="stamp_note" text="Note"/>
|
|
||||||
<row>
|
|
||||||
<active expr="context.scene.render.stamp_note"/>
|
|
||||||
<prop data="context.scene.render" property="stamp_note_text" text=""/>
|
|
||||||
</row>
|
|
||||||
</split>
|
|
||||||
</draw>
|
|
||||||
</panel>
|
|
||||||
|
|
||||||
<panel identifier="RENDER_PT_dimensions_test" label="Dimensions (XML)" space_type="PROPERTIES" region_type="WINDOW" context="render">
|
|
||||||
<draw>
|
|
||||||
<row align="true">
|
|
||||||
<menu menu="RENDER_MT_presets"/>
|
|
||||||
<operator operator="render.preset_add" text="" icon="ZOOMIN"/>
|
|
||||||
</row>
|
|
||||||
<split>
|
|
||||||
<column>
|
|
||||||
<column align="true">
|
|
||||||
<label text="Resolution:"/>
|
|
||||||
<prop data="context.scene.render" property="resolution_x" text="X"/>
|
|
||||||
<prop data="context.scene.render" property="resolution_y" text="Y"/>
|
|
||||||
<prop data="context.scene.render" property="resolution_percentage" text=""/>
|
|
||||||
|
|
||||||
<label text="Aspect Ratio:"/>
|
|
||||||
<prop data="context.scene.render" property="pixel_aspect_x" text="X"/>
|
|
||||||
<prop data="context.scene.render" property="pixel_aspect_y" text="Y"/>
|
|
||||||
</column>
|
|
||||||
<row>
|
|
||||||
<prop data="context.scene.render" property="use_border" text="Border"/>
|
|
||||||
<row>
|
|
||||||
<active expr="context.scene.render.use_border"/>
|
|
||||||
<prop data="context.scene.render" property="crop_to_border" text="Crop"/>
|
|
||||||
</row>
|
|
||||||
</row>
|
|
||||||
</column>
|
|
||||||
<column>
|
|
||||||
<column align="true">
|
|
||||||
<label text="Frame Range:"/>
|
|
||||||
<prop data="context.scene" property="frame_start" text="Start"/>
|
|
||||||
<prop data="context.scene" property="frame_end" text="End"/>
|
|
||||||
<prop data="context.scene" property="frame_step" text="Step"/>
|
|
||||||
|
|
||||||
<label text="Frame Rate:"/>
|
|
||||||
<prop data="context.scene.render" property="fps"/>
|
|
||||||
<prop data="context.scene.render" property="fps_base" text="/"/>
|
|
||||||
</column>
|
|
||||||
</column>
|
|
||||||
</split>
|
|
||||||
</draw>
|
|
||||||
</panel>
|
|
||||||
</ui>
|
|
@ -43,11 +43,6 @@ class SCENE_PT_scene(SceneButtonsPanel, bpy.types.Panel):
|
|||||||
layout.prop(scene, "set", text="Background")
|
layout.prop(scene, "set", text="Background")
|
||||||
|
|
||||||
|
|
||||||
class SCENE_PT_custom_props(SceneButtonsPanel, PropertyPanel, bpy.types.Panel):
|
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
|
||||||
_context_path = "scene"
|
|
||||||
|
|
||||||
|
|
||||||
class SCENE_PT_unit(SceneButtonsPanel, bpy.types.Panel):
|
class SCENE_PT_unit(SceneButtonsPanel, bpy.types.Panel):
|
||||||
bl_label = "Units"
|
bl_label = "Units"
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER'}
|
COMPAT_ENGINES = {'BLENDER_RENDER'}
|
||||||
@ -205,6 +200,11 @@ class SCENE_PT_simplify(SceneButtonsPanel, bpy.types.Panel):
|
|||||||
col.prop(rd, "simplify_ao_sss", text="AO and SSS")
|
col.prop(rd, "simplify_ao_sss", text="AO and SSS")
|
||||||
|
|
||||||
|
|
||||||
|
class SCENE_PT_custom_props(SceneButtonsPanel, PropertyPanel, bpy.types.Panel):
|
||||||
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||||
|
_context_path = "scene"
|
||||||
|
|
||||||
|
|
||||||
from bpy.props import *
|
from bpy.props import *
|
||||||
|
|
||||||
|
|
||||||
|
@ -74,23 +74,6 @@ class TextureButtonsPanel():
|
|||||||
return tex and (tex.type != 'NONE' or tex.use_nodes) and (context.scene.render.engine in cls.COMPAT_ENGINES)
|
return tex and (tex.type != 'NONE' or tex.use_nodes) and (context.scene.render.engine in cls.COMPAT_ENGINES)
|
||||||
|
|
||||||
|
|
||||||
class TEXTURE_PT_preview(TextureButtonsPanel, bpy.types.Panel):
|
|
||||||
bl_label = "Preview"
|
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
|
||||||
|
|
||||||
def draw(self, context):
|
|
||||||
layout = self.layout
|
|
||||||
|
|
||||||
tex = context.texture
|
|
||||||
slot = getattr(context, "texture_slot", None)
|
|
||||||
idblock = context_tex_datablock(context)
|
|
||||||
|
|
||||||
if idblock:
|
|
||||||
layout.template_preview(tex, parent=idblock, slot=slot)
|
|
||||||
else:
|
|
||||||
layout.template_preview(tex, slot=slot)
|
|
||||||
|
|
||||||
|
|
||||||
class TEXTURE_PT_context_texture(TextureButtonsPanel, bpy.types.Panel):
|
class TEXTURE_PT_context_texture(TextureButtonsPanel, bpy.types.Panel):
|
||||||
bl_label = ""
|
bl_label = ""
|
||||||
bl_show_header = False
|
bl_show_header = False
|
||||||
@ -155,9 +138,21 @@ class TEXTURE_PT_context_texture(TextureButtonsPanel, bpy.types.Panel):
|
|||||||
split.prop(tex, "type", text="")
|
split.prop(tex, "type", text="")
|
||||||
|
|
||||||
|
|
||||||
class TEXTURE_PT_custom_props(TextureButtonsPanel, PropertyPanel, bpy.types.Panel):
|
class TEXTURE_PT_preview(TextureButtonsPanel, bpy.types.Panel):
|
||||||
|
bl_label = "Preview"
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||||
_context_path = "texture"
|
|
||||||
|
def draw(self, context):
|
||||||
|
layout = self.layout
|
||||||
|
|
||||||
|
tex = context.texture
|
||||||
|
slot = getattr(context, "texture_slot", None)
|
||||||
|
idblock = context_tex_datablock(context)
|
||||||
|
|
||||||
|
if idblock:
|
||||||
|
layout.template_preview(tex, parent=idblock, slot=slot)
|
||||||
|
else:
|
||||||
|
layout.template_preview(tex, slot=slot)
|
||||||
|
|
||||||
|
|
||||||
class TEXTURE_PT_colors(TextureButtonsPanel, bpy.types.Panel):
|
class TEXTURE_PT_colors(TextureButtonsPanel, bpy.types.Panel):
|
||||||
@ -989,6 +984,11 @@ class TEXTURE_PT_pointdensity_turbulence(TextureButtonsPanel, bpy.types.Panel):
|
|||||||
col.prop(pd, "turbulence_strength")
|
col.prop(pd, "turbulence_strength")
|
||||||
|
|
||||||
|
|
||||||
|
class TEXTURE_PT_custom_props(TextureButtonsPanel, PropertyPanel, bpy.types.Panel):
|
||||||
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||||
|
_context_path = "texture"
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -33,19 +33,6 @@ class WorldButtonsPanel():
|
|||||||
return (rd.engine in cls.COMPAT_ENGINES)
|
return (rd.engine in cls.COMPAT_ENGINES)
|
||||||
|
|
||||||
|
|
||||||
class WORLD_PT_preview(WorldButtonsPanel, bpy.types.Panel):
|
|
||||||
bl_label = "Preview"
|
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER'}
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def poll(cls, context):
|
|
||||||
rd = context.scene.render
|
|
||||||
return (context.world) and (not rd.use_game_engine) and (rd.engine in cls.COMPAT_ENGINES)
|
|
||||||
|
|
||||||
def draw(self, context):
|
|
||||||
self.layout.template_preview(context.world)
|
|
||||||
|
|
||||||
|
|
||||||
class WORLD_PT_context_world(WorldButtonsPanel, bpy.types.Panel):
|
class WORLD_PT_context_world(WorldButtonsPanel, bpy.types.Panel):
|
||||||
bl_label = ""
|
bl_label = ""
|
||||||
bl_show_header = False
|
bl_show_header = False
|
||||||
@ -70,9 +57,23 @@ class WORLD_PT_context_world(WorldButtonsPanel, bpy.types.Panel):
|
|||||||
split.template_ID(space, "pin_id")
|
split.template_ID(space, "pin_id")
|
||||||
|
|
||||||
|
|
||||||
class WORLD_PT_custom_props(WorldButtonsPanel, PropertyPanel, bpy.types.Panel):
|
class WORLD_PT_preview(WorldButtonsPanel, bpy.types.Panel):
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
bl_label = "Preview"
|
||||||
_context_path = "world"
|
COMPAT_ENGINES = {'BLENDER_RENDER'}
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context):
|
||||||
|
rd = context.scene.render
|
||||||
|
return (context.world) and (not rd.use_game_engine) and (rd.engine in cls.COMPAT_ENGINES)
|
||||||
|
|
||||||
|
def draw(self, context):
|
||||||
|
self.layout.template_preview(context.world)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class WORLD_PT_world(WorldButtonsPanel, bpy.types.Panel):
|
class WORLD_PT_world(WorldButtonsPanel, bpy.types.Panel):
|
||||||
@ -96,62 +97,6 @@ class WORLD_PT_world(WorldButtonsPanel, bpy.types.Panel):
|
|||||||
row.column().prop(world, "ambient_color")
|
row.column().prop(world, "ambient_color")
|
||||||
|
|
||||||
|
|
||||||
class WORLD_PT_mist(WorldButtonsPanel, bpy.types.Panel):
|
|
||||||
bl_label = "Mist"
|
|
||||||
bl_default_closed = True
|
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER'}
|
|
||||||
|
|
||||||
def draw_header(self, context):
|
|
||||||
world = context.world
|
|
||||||
|
|
||||||
self.layout.prop(world.mist, "use_mist", text="")
|
|
||||||
|
|
||||||
def draw(self, context):
|
|
||||||
layout = self.layout
|
|
||||||
world = context.world
|
|
||||||
|
|
||||||
layout.active = world.mist.use_mist
|
|
||||||
|
|
||||||
split = layout.split()
|
|
||||||
|
|
||||||
col = split.column()
|
|
||||||
col.prop(world.mist, "intensity", slider=True)
|
|
||||||
col.prop(world.mist, "start")
|
|
||||||
|
|
||||||
col = split.column()
|
|
||||||
col.prop(world.mist, "depth")
|
|
||||||
col.prop(world.mist, "height")
|
|
||||||
|
|
||||||
layout.prop(world.mist, "falloff")
|
|
||||||
|
|
||||||
|
|
||||||
class WORLD_PT_stars(WorldButtonsPanel, bpy.types.Panel):
|
|
||||||
bl_label = "Stars"
|
|
||||||
bl_default_closed = True
|
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER'}
|
|
||||||
|
|
||||||
def draw_header(self, context):
|
|
||||||
world = context.world
|
|
||||||
|
|
||||||
self.layout.prop(world.stars, "use_stars", text="")
|
|
||||||
|
|
||||||
def draw(self, context):
|
|
||||||
layout = self.layout
|
|
||||||
world = context.world
|
|
||||||
|
|
||||||
layout.active = world.stars.use_stars
|
|
||||||
|
|
||||||
split = layout.split()
|
|
||||||
|
|
||||||
col = split.column()
|
|
||||||
col.prop(world.stars, "size")
|
|
||||||
col.prop(world.stars, "color_randomization", text="Colors")
|
|
||||||
|
|
||||||
col = split.column()
|
|
||||||
col.prop(world.stars, "min_distance", text="Min. Dist")
|
|
||||||
col.prop(world.stars, "average_separation", text="Separation")
|
|
||||||
|
|
||||||
|
|
||||||
class WORLD_PT_ambient_occlusion(WorldButtonsPanel, bpy.types.Panel):
|
class WORLD_PT_ambient_occlusion(WorldButtonsPanel, bpy.types.Panel):
|
||||||
bl_label = "Ambient Occlusion"
|
bl_label = "Ambient Occlusion"
|
||||||
COMPAT_ENGINES = {'BLENDER_RENDER'}
|
COMPAT_ENGINES = {'BLENDER_RENDER'}
|
||||||
@ -262,6 +207,67 @@ class WORLD_PT_gather(WorldButtonsPanel, bpy.types.Panel):
|
|||||||
col.prop(light, "correction")
|
col.prop(light, "correction")
|
||||||
|
|
||||||
|
|
||||||
|
class WORLD_PT_mist(WorldButtonsPanel, bpy.types.Panel):
|
||||||
|
bl_label = "Mist"
|
||||||
|
bl_default_closed = True
|
||||||
|
COMPAT_ENGINES = {'BLENDER_RENDER'}
|
||||||
|
|
||||||
|
def draw_header(self, context):
|
||||||
|
world = context.world
|
||||||
|
|
||||||
|
self.layout.prop(world.mist, "use_mist", text="")
|
||||||
|
|
||||||
|
def draw(self, context):
|
||||||
|
layout = self.layout
|
||||||
|
world = context.world
|
||||||
|
|
||||||
|
layout.active = world.mist.use_mist
|
||||||
|
|
||||||
|
split = layout.split()
|
||||||
|
|
||||||
|
col = split.column()
|
||||||
|
col.prop(world.mist, "intensity", slider=True)
|
||||||
|
col.prop(world.mist, "start")
|
||||||
|
|
||||||
|
col = split.column()
|
||||||
|
col.prop(world.mist, "depth")
|
||||||
|
col.prop(world.mist, "height")
|
||||||
|
|
||||||
|
layout.prop(world.mist, "falloff")
|
||||||
|
|
||||||
|
|
||||||
|
class WORLD_PT_stars(WorldButtonsPanel, bpy.types.Panel):
|
||||||
|
bl_label = "Stars"
|
||||||
|
bl_default_closed = True
|
||||||
|
COMPAT_ENGINES = {'BLENDER_RENDER'}
|
||||||
|
|
||||||
|
def draw_header(self, context):
|
||||||
|
world = context.world
|
||||||
|
|
||||||
|
self.layout.prop(world.stars, "use_stars", text="")
|
||||||
|
|
||||||
|
def draw(self, context):
|
||||||
|
layout = self.layout
|
||||||
|
world = context.world
|
||||||
|
|
||||||
|
layout.active = world.stars.use_stars
|
||||||
|
|
||||||
|
split = layout.split()
|
||||||
|
|
||||||
|
col = split.column()
|
||||||
|
col.prop(world.stars, "size")
|
||||||
|
col.prop(world.stars, "color_randomization", text="Colors")
|
||||||
|
|
||||||
|
col = split.column()
|
||||||
|
col.prop(world.stars, "min_distance", text="Min. Dist")
|
||||||
|
col.prop(world.stars, "average_separation", text="Separation")
|
||||||
|
|
||||||
|
|
||||||
|
class WORLD_PT_custom_props(WorldButtonsPanel, PropertyPanel, bpy.types.Panel):
|
||||||
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||||
|
_context_path = "world"
|
||||||
|
|
||||||
|
|
||||||
def register():
|
def register():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ class INFO_HT_header(bpy.types.Header):
|
|||||||
layout = self.layout
|
layout = self.layout
|
||||||
|
|
||||||
wm = context.manager
|
wm = context.manager
|
||||||
if wm and len(wm.operators):
|
if wm and wm.operators:
|
||||||
last_op = wm.operators[-1]
|
last_op = wm.operators[-1]
|
||||||
else:
|
else:
|
||||||
last_op = None
|
last_op = None
|
||||||
@ -131,7 +131,7 @@ class INFO_MT_file_import(bpy.types.Menu):
|
|||||||
bl_label = "Import"
|
bl_label = "Import"
|
||||||
|
|
||||||
def draw(self, context):
|
def draw(self, context):
|
||||||
if "collada_import" in dir(bpy.ops.wm):
|
if hasattr(bpy.types, "WM_OT_collada_import"):
|
||||||
self.layout.operator("wm.collada_import", text="COLLADA (.dae)")
|
self.layout.operator("wm.collada_import", text="COLLADA (.dae)")
|
||||||
|
|
||||||
|
|
||||||
@ -140,7 +140,7 @@ class INFO_MT_file_export(bpy.types.Menu):
|
|||||||
bl_label = "Export"
|
bl_label = "Export"
|
||||||
|
|
||||||
def draw(self, context):
|
def draw(self, context):
|
||||||
if "collada_export" in dir(bpy.ops.wm):
|
if hasattr(bpy.types, "WM_OT_collada_export"):
|
||||||
self.layout.operator("wm.collada_export", text="COLLADA (.dae)")
|
self.layout.operator("wm.collada_export", text="COLLADA (.dae)")
|
||||||
|
|
||||||
|
|
||||||
|
@ -48,9 +48,9 @@ class TEXT_HT_header(bpy.types.Header):
|
|||||||
layout.template_ID(st, "text", new="text.new", unlink="text.unlink")
|
layout.template_ID(st, "text", new="text.new", unlink="text.unlink")
|
||||||
|
|
||||||
row = layout.row(align=True)
|
row = layout.row(align=True)
|
||||||
row.prop(st, "line_numbers", text="")
|
row.prop(st, "show_line_numbers", text="")
|
||||||
row.prop(st, "word_wrap", text="")
|
row.prop(st, "show_word_wrap", text="")
|
||||||
row.prop(st, "syntax_highlight", text="")
|
row.prop(st, "show_syntax_highlight", text="")
|
||||||
|
|
||||||
if text:
|
if text:
|
||||||
row = layout.row()
|
row = layout.row()
|
||||||
@ -81,9 +81,10 @@ class TEXT_PT_properties(bpy.types.Panel):
|
|||||||
st = context.space_data
|
st = context.space_data
|
||||||
|
|
||||||
flow = layout.column_flow()
|
flow = layout.column_flow()
|
||||||
flow.prop(st, "line_numbers")
|
flow.prop(st, "show_line_numbers")
|
||||||
flow.prop(st, "word_wrap")
|
flow.prop(st, "show_word_wrap")
|
||||||
flow.prop(st, "syntax_highlight")
|
flow.prop(st, "show_syntax_highlight")
|
||||||
|
flow.prop(st, "show_line_highlight")
|
||||||
flow.prop(st, "live_edit")
|
flow.prop(st, "live_edit")
|
||||||
|
|
||||||
flow = layout.column_flow()
|
flow = layout.column_flow()
|
||||||
|
@ -1925,8 +1925,8 @@ class VIEW3D_MT_edit_armature_roll(bpy.types.Menu):
|
|||||||
def draw(self, context):
|
def draw(self, context):
|
||||||
layout = self.layout
|
layout = self.layout
|
||||||
|
|
||||||
layout.operator("armature.calculate_roll", text="Clear Roll (Z-Axis Up)").type = 'GLOBALUP'
|
layout.operator("armature.calculate_roll", text="Recalculate with Z-Axis Up").type = 'GLOBALUP'
|
||||||
layout.operator("armature.calculate_roll", text="Roll to Cursor").type = 'CURSOR'
|
layout.operator("armature.calculate_roll", text="Recalculate with Z-Axis to Cursor").type = 'CURSOR'
|
||||||
|
|
||||||
layout.separator()
|
layout.separator()
|
||||||
|
|
||||||
|
@ -487,7 +487,7 @@ class PaintPanel():
|
|||||||
elif context.particle_edit_object:
|
elif context.particle_edit_object:
|
||||||
return ts.particle_edit
|
return ts.particle_edit
|
||||||
|
|
||||||
return False
|
return None
|
||||||
|
|
||||||
|
|
||||||
class VIEW3D_PT_tools_brush(PaintPanel, bpy.types.Panel):
|
class VIEW3D_PT_tools_brush(PaintPanel, bpy.types.Panel):
|
||||||
@ -753,7 +753,7 @@ class VIEW3D_PT_tools_brush_texture(PaintPanel, bpy.types.Panel):
|
|||||||
col.separator()
|
col.separator()
|
||||||
|
|
||||||
col = layout.column()
|
col = layout.column()
|
||||||
col.active = tex_slot.map_mode in ('FIXED')
|
col.active = tex_slot.map_mode in ('FIXED', )
|
||||||
col.label(text="Angle:")
|
col.label(text="Angle:")
|
||||||
|
|
||||||
col = layout.column()
|
col = layout.column()
|
||||||
@ -963,6 +963,7 @@ class VIEW3D_PT_tools_brush_curve(PaintPanel, bpy.types.Panel):
|
|||||||
layout = self.layout
|
layout = self.layout
|
||||||
|
|
||||||
settings = self.paint_settings(context)
|
settings = self.paint_settings(context)
|
||||||
|
|
||||||
brush = settings.brush
|
brush = settings.brush
|
||||||
|
|
||||||
layout.template_curve_mapping(brush, "curve", brush=True)
|
layout.template_curve_mapping(brush, "curve", brush=True)
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2009 Blender Foundation
|
# The Original Code is Copyright (C) 2009 Blender Foundation
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2008 Blender Foundation.
|
# The Original Code is Copyright (C) 2008 Blender Foundation.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
75
source/blender/blenkernel/BKE_idcode.h
Normal file
75
source/blender/blenkernel/BKE_idcode.h
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/**
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* ***** 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) 2001-2002 by NaN Holding BV.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* The Original Code is: all of this file.
|
||||||
|
*
|
||||||
|
* Contributor(s): none yet.
|
||||||
|
*
|
||||||
|
* ***** END GPL LICENSE BLOCK *****
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BKE_ID_INFO_H
|
||||||
|
#define BKE_ID_INFO_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert an idcode into a name.
|
||||||
|
*
|
||||||
|
* @param code The code to convert.
|
||||||
|
* @return A static string representing the name of
|
||||||
|
* the code.
|
||||||
|
*/
|
||||||
|
const char *BKE_idcode_to_name(int code);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert an idcode into a name (plural).
|
||||||
|
*
|
||||||
|
* @param code The code to convert.
|
||||||
|
* @return A static string representing the name of
|
||||||
|
* the code.
|
||||||
|
*/
|
||||||
|
const char *BKE_idcode_to_name_plural(int code);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a name into an idcode (ie. ID_SCE)
|
||||||
|
*
|
||||||
|
* @param name The name to convert.
|
||||||
|
* @return The code for the name, or 0 if invalid.
|
||||||
|
*/
|
||||||
|
int BKE_idcode_from_name(const char *name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return non-zero when an ID type is linkable.
|
||||||
|
*
|
||||||
|
* @param code The code to check.
|
||||||
|
* @return Boolean, 0 when non linkable.
|
||||||
|
*/
|
||||||
|
int BKE_idcode_is_linkable(int code);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return if the ID code is a valid ID code.
|
||||||
|
*
|
||||||
|
* @param code The code to check.
|
||||||
|
* @return Boolean, 0 when invalid.
|
||||||
|
*/
|
||||||
|
int BKE_idcode_is_valid(int code);
|
||||||
|
|
||||||
|
#endif
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -1189,10 +1189,15 @@ static void emDM_getFace(DerivedMesh *dm, int index, MFace *face_r)
|
|||||||
|
|
||||||
static void emDM_copyVertArray(DerivedMesh *dm, MVert *vert_r)
|
static void emDM_copyVertArray(DerivedMesh *dm, MVert *vert_r)
|
||||||
{
|
{
|
||||||
EditVert *ev = ((EditMeshDerivedMesh *)dm)->em->verts.first;
|
EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
|
||||||
|
EditVert *ev = emdm->em->verts.first;
|
||||||
|
int i;
|
||||||
|
|
||||||
for( ; ev; ev = ev->next, ++vert_r) {
|
for(i=0; ev; ev = ev->next, ++vert_r, ++i) {
|
||||||
VECCOPY(vert_r->co, ev->co);
|
if(emdm->vertexCos)
|
||||||
|
copy_v3_v3(vert_r->co, emdm->vertexCos[i]);
|
||||||
|
else
|
||||||
|
copy_v3_v3(vert_r->co, ev->co);
|
||||||
|
|
||||||
vert_r->no[0] = ev->no[0] * 32767.0;
|
vert_r->no[0] = ev->no[0] * 32767.0;
|
||||||
vert_r->no[1] = ev->no[1] * 32767.0;
|
vert_r->no[1] = ev->no[1] * 32767.0;
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -1573,7 +1573,7 @@ static void alfa_bezpart(BezTriple *prevbezt, BezTriple *bezt, Nurb *nu, float *
|
|||||||
|
|
||||||
for(a=0; a<resolu; a++, fac+= dfac) {
|
for(a=0; a<resolu; a++, fac+= dfac) {
|
||||||
if (tilt_array) {
|
if (tilt_array) {
|
||||||
if (nu->tilt_interp==3) { /* May as well support for tilt also 2.47 ease interp */
|
if (nu->tilt_interp==KEY_CU_EASE) { /* May as well support for tilt also 2.47 ease interp */
|
||||||
*tilt_array = prevbezt->alfa + (bezt->alfa - prevbezt->alfa)*(3.0f*fac*fac - 2.0f*fac*fac*fac);
|
*tilt_array = prevbezt->alfa + (bezt->alfa - prevbezt->alfa)*(3.0f*fac*fac - 2.0f*fac*fac*fac);
|
||||||
} else {
|
} else {
|
||||||
key_curve_position_weights(fac, t, nu->tilt_interp);
|
key_curve_position_weights(fac, t, nu->tilt_interp);
|
||||||
@ -1584,7 +1584,7 @@ static void alfa_bezpart(BezTriple *prevbezt, BezTriple *bezt, Nurb *nu, float *
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (radius_array) {
|
if (radius_array) {
|
||||||
if (nu->radius_interp==3) {
|
if (nu->radius_interp==KEY_CU_EASE) {
|
||||||
/* Support 2.47 ease interp
|
/* Support 2.47 ease interp
|
||||||
* Note! - this only takes the 2 points into account,
|
* Note! - this only takes the 2 points into account,
|
||||||
* giving much more localized results to changes in radius, sometimes you want that */
|
* giving much more localized results to changes in radius, sometimes you want that */
|
||||||
|
128
source/blender/blenkernel/intern/idcode.c
Normal file
128
source/blender/blenkernel/intern/idcode.c
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
/**
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* ***** 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) 2001-2002 by NaN Holding BV.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* The Original Code is: all of this file.
|
||||||
|
*
|
||||||
|
* Contributor(s): none yet.
|
||||||
|
*
|
||||||
|
* ***** END GPL LICENSE BLOCK *****
|
||||||
|
* return info about ID types
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "DNA_ID.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned short code;
|
||||||
|
char *name, *plural;
|
||||||
|
|
||||||
|
int flags;
|
||||||
|
#define IDTYPE_FLAGS_ISLINKABLE (1<<0)
|
||||||
|
} IDType;
|
||||||
|
|
||||||
|
/* plural need to match rna_main.c's MainCollectionDef */
|
||||||
|
static IDType idtypes[]= {
|
||||||
|
{ ID_AC, "Action", "actions", IDTYPE_FLAGS_ISLINKABLE},
|
||||||
|
{ ID_AR, "Armature", "armatures", IDTYPE_FLAGS_ISLINKABLE},
|
||||||
|
{ ID_BR, "Brush", "brushes", IDTYPE_FLAGS_ISLINKABLE},
|
||||||
|
{ ID_CA, "Camera", "cameras", IDTYPE_FLAGS_ISLINKABLE},
|
||||||
|
{ ID_CU, "Curve", "curves", IDTYPE_FLAGS_ISLINKABLE},
|
||||||
|
{ ID_GD, "GPencil", "gpencil", IDTYPE_FLAGS_ISLINKABLE}, /* rename gpencil */
|
||||||
|
{ ID_GR, "Group", "groups", IDTYPE_FLAGS_ISLINKABLE},
|
||||||
|
{ ID_ID, "ID", "ids", 0}, /* plural is fake */
|
||||||
|
{ ID_IM, "Image", "images", IDTYPE_FLAGS_ISLINKABLE},
|
||||||
|
{ ID_IP, "Ipo", "ipos", IDTYPE_FLAGS_ISLINKABLE}, /* deprecated */
|
||||||
|
{ ID_KE, "Key", "keys", 0},
|
||||||
|
{ ID_LA, "Lamp", "lamps", IDTYPE_FLAGS_ISLINKABLE},
|
||||||
|
{ ID_LI, "Library", "libraries", 0},
|
||||||
|
{ ID_LT, "Lattice", "lattices", IDTYPE_FLAGS_ISLINKABLE},
|
||||||
|
{ ID_MA, "Material", "materials", IDTYPE_FLAGS_ISLINKABLE},
|
||||||
|
{ ID_MB, "Metaball", "metaballs", IDTYPE_FLAGS_ISLINKABLE},
|
||||||
|
{ ID_ME, "Mesh", "meshes", IDTYPE_FLAGS_ISLINKABLE},
|
||||||
|
{ ID_NT, "NodeTree", "node_groups", IDTYPE_FLAGS_ISLINKABLE},
|
||||||
|
{ ID_OB, "Object", "objects", IDTYPE_FLAGS_ISLINKABLE},
|
||||||
|
{ ID_PA, "ParticleSettings", "particles", 0},
|
||||||
|
{ ID_SCE, "Scene", "scenes", IDTYPE_FLAGS_ISLINKABLE},
|
||||||
|
{ ID_SCR, "Screen", "screens", 0},
|
||||||
|
{ ID_SEQ, "Sequence", "sequences", 0}, /* not actually ID data */
|
||||||
|
{ ID_SO, "Sound", "sounds", IDTYPE_FLAGS_ISLINKABLE},
|
||||||
|
{ ID_TE, "Texture", "textures", IDTYPE_FLAGS_ISLINKABLE},
|
||||||
|
{ ID_TXT, "Text", "texts", IDTYPE_FLAGS_ISLINKABLE},
|
||||||
|
{ ID_VF, "VFont", "fonts", IDTYPE_FLAGS_ISLINKABLE},
|
||||||
|
{ ID_WO, "World", "worlds", IDTYPE_FLAGS_ISLINKABLE},
|
||||||
|
{ ID_WM, "WindowManager", "window_managers", 0},
|
||||||
|
};
|
||||||
|
static int nidtypes= sizeof(idtypes)/sizeof(idtypes[0]);
|
||||||
|
|
||||||
|
static IDType *idtype_from_name(const char *str)
|
||||||
|
{
|
||||||
|
int i= nidtypes;
|
||||||
|
|
||||||
|
while (i--)
|
||||||
|
if (strcmp(str, idtypes[i].name)==0)
|
||||||
|
return &idtypes[i];
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
static IDType *idtype_from_code(int code)
|
||||||
|
{
|
||||||
|
int i= nidtypes;
|
||||||
|
|
||||||
|
while (i--)
|
||||||
|
if (code==idtypes[i].code)
|
||||||
|
return &idtypes[i];
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int BKE_idcode_is_valid(int code)
|
||||||
|
{
|
||||||
|
return idtype_from_code(code)?1:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int BKE_idcode_is_linkable(int code) {
|
||||||
|
IDType *idt= idtype_from_code(code);
|
||||||
|
return idt?(idt->flags&IDTYPE_FLAGS_ISLINKABLE):0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *BKE_idcode_to_name(int code)
|
||||||
|
{
|
||||||
|
IDType *idt= idtype_from_code(code);
|
||||||
|
|
||||||
|
return idt?idt->name:NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int BKE_idcode_from_name(const char *name)
|
||||||
|
{
|
||||||
|
IDType *idt= idtype_from_name(name);
|
||||||
|
|
||||||
|
return idt?idt->code:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *BKE_idcode_to_name_plural(int code)
|
||||||
|
{
|
||||||
|
IDType *idt= idtype_from_code(code);
|
||||||
|
|
||||||
|
return idt?idt->plural:NULL;
|
||||||
|
}
|
@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stddef.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "BKE_idprop.h"
|
#include "BKE_idprop.h"
|
||||||
@ -491,47 +492,41 @@ void IDP_ReplaceGroupInGroup(IDProperty *dest, IDProperty *src)
|
|||||||
void IDP_ReplaceInGroup(IDProperty *group, IDProperty *prop)
|
void IDP_ReplaceInGroup(IDProperty *group, IDProperty *prop)
|
||||||
{
|
{
|
||||||
IDProperty *loop;
|
IDProperty *loop;
|
||||||
for (loop=group->data.group.first; loop; loop=loop->next) {
|
if((loop= IDP_GetPropertyFromGroup(group, prop->name))) {
|
||||||
if (BSTR_EQ(loop->name, prop->name)) {
|
BLI_insertlink(&group->data.group, loop, prop);
|
||||||
BLI_insertlink(&group->data.group, loop, prop);
|
|
||||||
|
|
||||||
BLI_remlink(&group->data.group, loop);
|
BLI_remlink(&group->data.group, loop);
|
||||||
IDP_FreeProperty(loop);
|
IDP_FreeProperty(loop);
|
||||||
MEM_freeN(loop);
|
MEM_freeN(loop);
|
||||||
return;
|
}
|
||||||
}
|
else {
|
||||||
|
group->len++;
|
||||||
|
BLI_addtail(&group->data.group, prop);
|
||||||
}
|
}
|
||||||
|
|
||||||
group->len++;
|
|
||||||
BLI_addtail(&group->data.group, prop);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*returns 0 if an id property with the same name exists and it failed,
|
/*returns 0 if an id property with the same name exists and it failed,
|
||||||
or 1 if it succeeded in adding to the group.*/
|
or 1 if it succeeded in adding to the group.*/
|
||||||
int IDP_AddToGroup(IDProperty *group, IDProperty *prop)
|
int IDP_AddToGroup(IDProperty *group, IDProperty *prop)
|
||||||
{
|
{
|
||||||
IDProperty *loop;
|
if(IDP_GetPropertyFromGroup(group, prop->name) == NULL) {
|
||||||
for (loop=group->data.group.first; loop; loop=loop->next) {
|
group->len++;
|
||||||
if (BSTR_EQ(loop->name, prop->name)) return 0;
|
BLI_addtail(&group->data.group, prop);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
group->len++;
|
return 0;
|
||||||
BLI_addtail(&group->data.group, prop);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int IDP_InsertToGroup(IDProperty *group, IDProperty *previous, IDProperty *pnew)
|
int IDP_InsertToGroup(IDProperty *group, IDProperty *previous, IDProperty *pnew)
|
||||||
{
|
{
|
||||||
IDProperty *loop;
|
if(IDP_GetPropertyFromGroup(group, pnew->name) == NULL) {
|
||||||
for (loop=group->data.group.first; loop; loop=loop->next) {
|
group->len++;
|
||||||
if (BSTR_EQ(loop->name, pnew->name)) return 0;
|
BLI_insertlink(&group->data.group, previous, pnew);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
group->len++;
|
return 0;
|
||||||
|
|
||||||
BLI_insertlink(&group->data.group, previous, pnew);
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void IDP_RemFromGroup(IDProperty *group, IDProperty *prop)
|
void IDP_RemFromGroup(IDProperty *group, IDProperty *prop)
|
||||||
@ -542,11 +537,7 @@ void IDP_RemFromGroup(IDProperty *group, IDProperty *prop)
|
|||||||
|
|
||||||
IDProperty *IDP_GetPropertyFromGroup(IDProperty *prop, const char *name)
|
IDProperty *IDP_GetPropertyFromGroup(IDProperty *prop, const char *name)
|
||||||
{
|
{
|
||||||
IDProperty *loop;
|
return (IDProperty *)BLI_findstring(&prop->data.group, name, offsetof(IDProperty, name));
|
||||||
for (loop=prop->data.group.first; loop; loop=loop->next) {
|
|
||||||
if (strcmp(loop->name, name)==0) return loop;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct IDPIter {
|
typedef struct IDPIter {
|
||||||
|
@ -1850,9 +1850,12 @@ void vertcos_to_key(Object *ob, KeyBlock *kb, float (*vertCos)[3])
|
|||||||
tot= count_curveverts(&cu->nurb);
|
tot= count_curveverts(&cu->nurb);
|
||||||
}
|
}
|
||||||
|
|
||||||
fp= kb->data= MEM_callocN(tot*elemsize, "key_to_vertcos vertCos");
|
if (tot == 0) {
|
||||||
|
kb->data= NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (tot == 0) return;
|
fp= kb->data= MEM_callocN(tot*elemsize, "key_to_vertcos vertCos");
|
||||||
|
|
||||||
/* Copy coords to keyblock */
|
/* Copy coords to keyblock */
|
||||||
|
|
||||||
|
@ -1265,13 +1265,13 @@ void BKE_nlastrip_validate_name (AnimData *adt, NlaStrip *strip)
|
|||||||
char *dot;
|
char *dot;
|
||||||
|
|
||||||
/* Strip off the suffix */
|
/* Strip off the suffix */
|
||||||
dot = strchr(strip->name, '.');
|
dot = strrchr(strip->name, '.');
|
||||||
if (dot) *dot=0;
|
if (dot) *dot=0;
|
||||||
|
|
||||||
/* Try different possibilities */
|
/* Try different possibilities */
|
||||||
for (number = 1; number <= 999; number++) {
|
for (number = 1; number <= 999; number++) {
|
||||||
/* assemble alternative name */
|
/* assemble alternative name */
|
||||||
BLI_snprintf(tempname, 128, "%s%c%03d", strip->name, ".", number);
|
BLI_snprintf(tempname, 128, "%s.%03d", strip->name, number);
|
||||||
|
|
||||||
/* if hash doesn't have this, set it */
|
/* if hash doesn't have this, set it */
|
||||||
if (BLI_ghash_haskey(gh, tempname) == 0) {
|
if (BLI_ghash_haskey(gh, tempname) == 0) {
|
||||||
|
@ -1855,9 +1855,8 @@ static void node_group_execute(bNodeStack *stack, void *data, bNode *gnode, bNod
|
|||||||
|
|
||||||
/* for groups, only execute outputs for edited group */
|
/* for groups, only execute outputs for edited group */
|
||||||
if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) {
|
if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) {
|
||||||
if(gnode->flag & NODE_GROUP_EDIT)
|
if(node->type==CMP_NODE_OUTPUT_FILE || (gnode->flag & NODE_GROUP_EDIT))
|
||||||
if(node->flag & NODE_DO_OUTPUT)
|
node->typeinfo->execfunc(data, node, nsin, nsout);
|
||||||
node->typeinfo->execfunc(data, node, nsin, nsout);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
node->typeinfo->execfunc(data, node, nsin, nsout);
|
node->typeinfo->execfunc(data, node, nsin, nsout);
|
||||||
|
@ -2501,7 +2501,7 @@ void object_handle_update(Scene *scene, Object *ob)
|
|||||||
|
|
||||||
/* includes all keys and modifiers */
|
/* includes all keys and modifiers */
|
||||||
if(ob->type==OB_MESH) {
|
if(ob->type==OB_MESH) {
|
||||||
EditMesh *em = BKE_mesh_get_editmesh(ob->data);
|
EditMesh *em = (ob == scene->obedit)? BKE_mesh_get_editmesh(ob->data): NULL;
|
||||||
|
|
||||||
/* evaluate drivers */
|
/* evaluate drivers */
|
||||||
// XXX: should we push this to derivedmesh instead?
|
// XXX: should we push this to derivedmesh instead?
|
||||||
|
@ -69,6 +69,8 @@ static int ccgDM_getVertMapIndex(CCGSubSurf *ss, CCGVert *v);
|
|||||||
static int ccgDM_getEdgeMapIndex(CCGSubSurf *ss, CCGEdge *e);
|
static int ccgDM_getEdgeMapIndex(CCGSubSurf *ss, CCGEdge *e);
|
||||||
static int ccgDM_getFaceMapIndex(CCGSubSurf *ss, CCGFace *f);
|
static int ccgDM_getFaceMapIndex(CCGSubSurf *ss, CCGFace *f);
|
||||||
|
|
||||||
|
static int ccgDM_use_grid_pbvh(CCGDerivedMesh *ccgdm);
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
static void *arena_alloc(CCGAllocatorHDL a, int numBytes) {
|
static void *arena_alloc(CCGAllocatorHDL a, int numBytes) {
|
||||||
@ -1249,7 +1251,7 @@ static void ccgDM_glNormalFast(float *a, float *b, float *c, float *d)
|
|||||||
|
|
||||||
static void ccgdm_pbvh_update(CCGDerivedMesh *ccgdm)
|
static void ccgdm_pbvh_update(CCGDerivedMesh *ccgdm)
|
||||||
{
|
{
|
||||||
if(ccgdm->pbvh && ccgdm->multires.mmd) {
|
if(ccgdm->pbvh && ccgDM_use_grid_pbvh(ccgdm)) {
|
||||||
CCGFace **faces;
|
CCGFace **faces;
|
||||||
int totface;
|
int totface;
|
||||||
|
|
||||||
|
@ -45,6 +45,7 @@ void BLI_insertlink(struct ListBase *listbase, void *vprevlink, void *vnewlink);
|
|||||||
void *BLI_findlink(struct ListBase *listbase, int number);
|
void *BLI_findlink(struct ListBase *listbase, int number);
|
||||||
int BLI_findindex(struct ListBase *listbase, void *vlink);
|
int BLI_findindex(struct ListBase *listbase, void *vlink);
|
||||||
void *BLI_findstring(struct ListBase *listbase, const char *id, int offset);
|
void *BLI_findstring(struct ListBase *listbase, const char *id, int offset);
|
||||||
|
void *BLI_findstring_ptr(struct ListBase *listbase, const char *id, int offset);
|
||||||
int BLI_findstringindex(struct ListBase *listbase, const char *id, int offset);
|
int BLI_findstringindex(struct ListBase *listbase, const char *id, int offset);
|
||||||
void BLI_freelistN(struct ListBase *listbase);
|
void BLI_freelistN(struct ListBase *listbase);
|
||||||
void BLI_addtail(struct ListBase *listbase, void *vlink);
|
void BLI_addtail(struct ListBase *listbase, void *vlink);
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -374,6 +374,27 @@ void *BLI_findstring(ListBase *listbase, const char *id, int offset)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *BLI_findstring_ptr(ListBase *listbase, const char *id, int offset)
|
||||||
|
{
|
||||||
|
Link *link= NULL;
|
||||||
|
const char *id_iter;
|
||||||
|
|
||||||
|
if (listbase == NULL) return NULL;
|
||||||
|
|
||||||
|
link= listbase->first;
|
||||||
|
while (link) {
|
||||||
|
/* exact copy of BLI_findstring(), except for this line */
|
||||||
|
id_iter= *((const char **)(((const char *)link) + offset));
|
||||||
|
|
||||||
|
if(id[0] == id_iter[0] && strcmp(id, id_iter)==0)
|
||||||
|
return link;
|
||||||
|
|
||||||
|
link= link->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
int BLI_findstringindex(ListBase *listbase, const char *id, int offset)
|
int BLI_findstringindex(ListBase *listbase, const char *id, int offset)
|
||||||
{
|
{
|
||||||
Link *link= NULL;
|
Link *link= NULL;
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software Foundation,
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
*
|
*
|
||||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
|
@ -586,7 +586,7 @@ int BLI_path_abs(char *path, const char *basepath)
|
|||||||
BLI_strncpy(tmp, path, FILE_MAX);
|
BLI_strncpy(tmp, path, FILE_MAX);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
BLI_strncpy(tmp, path, FILE_MAX);
|
BLI_strncpy(tmp, path, sizeof(tmp));
|
||||||
|
|
||||||
/* Check for loading a windows path on a posix system
|
/* Check for loading a windows path on a posix system
|
||||||
* in this case, there is no use in trying C:/ since it
|
* in this case, there is no use in trying C:/ since it
|
||||||
@ -603,7 +603,7 @@ int BLI_path_abs(char *path, const char *basepath)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
BLI_strncpy(base, basepath, FILE_MAX);
|
BLI_strncpy(base, basepath, sizeof(base));
|
||||||
|
|
||||||
BLI_cleanup_file(NULL, base);
|
BLI_cleanup_file(NULL, base);
|
||||||
|
|
||||||
@ -626,13 +626,13 @@ int BLI_path_abs(char *path, const char *basepath)
|
|||||||
BLI_strncpy(path, tmp+2, FILE_MAX);
|
BLI_strncpy(path, tmp+2, FILE_MAX);
|
||||||
|
|
||||||
memcpy(tmp, base, baselen);
|
memcpy(tmp, base, baselen);
|
||||||
strcpy(tmp+baselen, path);
|
BLI_strncpy(tmp+baselen, path, sizeof(tmp)-baselen);
|
||||||
strcpy(path, tmp);
|
BLI_strncpy(path, tmp, FILE_MAX);
|
||||||
} else {
|
} else {
|
||||||
strcpy(path, tmp+2);
|
BLI_strncpy(path, tmp+2, FILE_MAX);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
strcpy(path, tmp);
|
BLI_strncpy(path, tmp, FILE_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (path[0]!='\0') {
|
if (path[0]!='\0') {
|
||||||
@ -1162,7 +1162,7 @@ void BLI_make_existing_file(char *name)
|
|||||||
{
|
{
|
||||||
char di[FILE_MAXDIR+FILE_MAXFILE], fi[FILE_MAXFILE];
|
char di[FILE_MAXDIR+FILE_MAXFILE], fi[FILE_MAXFILE];
|
||||||
|
|
||||||
strcpy(di, name);
|
BLI_strncpy(di, name, sizeof(di));
|
||||||
BLI_splitdirstring(di, fi);
|
BLI_splitdirstring(di, fi);
|
||||||
|
|
||||||
/* test exist */
|
/* test exist */
|
||||||
|
@ -237,8 +237,19 @@ void BLI_builddir(char *dirname, char *relname)
|
|||||||
|
|
||||||
if (newnum){
|
if (newnum){
|
||||||
|
|
||||||
if (files) files=(struct direntry *)realloc(files,(totnum+newnum) * sizeof(struct direntry));
|
if(files) {
|
||||||
else files=(struct direntry *)malloc(newnum * sizeof(struct direntry));
|
void *tmp= realloc(files, (totnum+newnum) * sizeof(struct direntry));
|
||||||
|
if(tmp) {
|
||||||
|
files= (struct direntry *)tmp;
|
||||||
|
}
|
||||||
|
else { /* realloc fail */
|
||||||
|
free(files);
|
||||||
|
files= NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(files==NULL)
|
||||||
|
files=(struct direntry *)malloc(newnum * sizeof(struct direntry));
|
||||||
|
|
||||||
if (files){
|
if (files){
|
||||||
dlink = (struct dirlink *) dirbase->first;
|
dlink = (struct dirlink *) dirbase->first;
|
||||||
|
@ -112,38 +112,6 @@ BlendFileData *BLO_read_from_memfile(struct Main *oldmain, const char *filename,
|
|||||||
BLO_blendfiledata_free(
|
BLO_blendfiledata_free(
|
||||||
BlendFileData *bfd);
|
BlendFileData *bfd);
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert an idcode into a name.
|
|
||||||
*
|
|
||||||
* @param code The code to convert.
|
|
||||||
* @return A static string representing the name of
|
|
||||||
* the code.
|
|
||||||
*/
|
|
||||||
char*
|
|
||||||
BLO_idcode_to_name(
|
|
||||||
int code);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert an idcode into a name (plural).
|
|
||||||
*
|
|
||||||
* @param code The code to convert.
|
|
||||||
* @return A static string representing the name of
|
|
||||||
* the code.
|
|
||||||
*/
|
|
||||||
char*
|
|
||||||
BLO_idcode_to_name_plural(
|
|
||||||
int code);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert a name into an idcode (ie. ID_SCE)
|
|
||||||
*
|
|
||||||
* @param name The name to convert.
|
|
||||||
* @return The code for the name, or 0 if invalid.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
BLO_idcode_from_name(
|
|
||||||
char *name);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Open a blendhandle from a file path.
|
* Open a blendhandle from a file path.
|
||||||
*
|
*
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -46,6 +46,7 @@
|
|||||||
|
|
||||||
#include "BKE_main.h"
|
#include "BKE_main.h"
|
||||||
#include "BKE_library.h" // for free_main
|
#include "BKE_library.h" // for free_main
|
||||||
|
#include "BKE_idcode.h"
|
||||||
#include "BKE_report.h"
|
#include "BKE_report.h"
|
||||||
|
|
||||||
#include "BLO_readfile.h"
|
#include "BLO_readfile.h"
|
||||||
@ -61,111 +62,9 @@
|
|||||||
#include "BLI_winstuff.h"
|
#include "BLI_winstuff.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
|
||||||
* IDType stuff, I plan to move this
|
|
||||||
* out into its own file + prefix, and
|
|
||||||
* make sure all IDType handling goes through
|
|
||||||
* these routines.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned short code;
|
|
||||||
char *name, *plural;
|
|
||||||
|
|
||||||
int flags;
|
|
||||||
#define IDTYPE_FLAGS_ISLINKABLE (1<<0)
|
|
||||||
} IDType;
|
|
||||||
|
|
||||||
/* plural need to match rna_main.c's MainCollectionDef */
|
|
||||||
static IDType idtypes[]= {
|
|
||||||
{ ID_AC, "Action", "actions", IDTYPE_FLAGS_ISLINKABLE},
|
|
||||||
{ ID_AR, "Armature", "armatures", IDTYPE_FLAGS_ISLINKABLE},
|
|
||||||
{ ID_BR, "Brush", "brushes", IDTYPE_FLAGS_ISLINKABLE},
|
|
||||||
{ ID_CA, "Camera", "cameras", IDTYPE_FLAGS_ISLINKABLE},
|
|
||||||
{ ID_CU, "Curve", "curves", IDTYPE_FLAGS_ISLINKABLE},
|
|
||||||
{ ID_GD, "GPencil", "gpencil", IDTYPE_FLAGS_ISLINKABLE}, /* rename gpencil */
|
|
||||||
{ ID_GR, "Group", "groups", IDTYPE_FLAGS_ISLINKABLE},
|
|
||||||
{ ID_ID, "ID", "ids", 0}, /* plural is fake */
|
|
||||||
{ ID_IM, "Image", "images", IDTYPE_FLAGS_ISLINKABLE},
|
|
||||||
{ ID_IP, "Ipo", "ipos", IDTYPE_FLAGS_ISLINKABLE}, /* deprecated */
|
|
||||||
{ ID_KE, "Key", "keys", 0},
|
|
||||||
{ ID_LA, "Lamp", "lamps", IDTYPE_FLAGS_ISLINKABLE},
|
|
||||||
{ ID_LI, "Library", "libraries", 0},
|
|
||||||
{ ID_LT, "Lattice", "lattices", IDTYPE_FLAGS_ISLINKABLE},
|
|
||||||
{ ID_MA, "Material", "materials", IDTYPE_FLAGS_ISLINKABLE},
|
|
||||||
{ ID_MB, "Metaball", "metaballs", IDTYPE_FLAGS_ISLINKABLE},
|
|
||||||
{ ID_ME, "Mesh", "meshes", IDTYPE_FLAGS_ISLINKABLE},
|
|
||||||
{ ID_NT, "NodeTree", "node_groups", IDTYPE_FLAGS_ISLINKABLE},
|
|
||||||
{ ID_OB, "Object", "objects", IDTYPE_FLAGS_ISLINKABLE},
|
|
||||||
{ ID_PA, "ParticleSettings", "particles", 0},
|
|
||||||
{ ID_SCE, "Scene", "scenes", IDTYPE_FLAGS_ISLINKABLE},
|
|
||||||
{ ID_SCR, "Screen", "screens", 0},
|
|
||||||
{ ID_SEQ, "Sequence", "sequences", 0}, /* not actually ID data */
|
|
||||||
{ ID_SO, "Sound", "sounds", IDTYPE_FLAGS_ISLINKABLE},
|
|
||||||
{ ID_TE, "Texture", "textures", IDTYPE_FLAGS_ISLINKABLE},
|
|
||||||
{ ID_TXT, "Text", "texts", IDTYPE_FLAGS_ISLINKABLE},
|
|
||||||
{ ID_VF, "VFont", "fonts", IDTYPE_FLAGS_ISLINKABLE},
|
|
||||||
{ ID_WO, "World", "worlds", IDTYPE_FLAGS_ISLINKABLE},
|
|
||||||
{ ID_WM, "WindowManager", "window_managers", 0},
|
|
||||||
};
|
|
||||||
static int nidtypes= sizeof(idtypes)/sizeof(idtypes[0]);
|
|
||||||
|
|
||||||
/* local prototypes --------------------- */
|
/* local prototypes --------------------- */
|
||||||
void BLO_blendhandle_print_sizes(BlendHandle *, void *);
|
void BLO_blendhandle_print_sizes(BlendHandle *, void *);
|
||||||
|
|
||||||
|
|
||||||
static IDType *idtype_from_name(char *str)
|
|
||||||
{
|
|
||||||
int i= nidtypes;
|
|
||||||
|
|
||||||
while (i--)
|
|
||||||
if (BLI_streq(str, idtypes[i].name))
|
|
||||||
return &idtypes[i];
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
static IDType *idtype_from_code(int code)
|
|
||||||
{
|
|
||||||
int i= nidtypes;
|
|
||||||
|
|
||||||
while (i--)
|
|
||||||
if (code==idtypes[i].code)
|
|
||||||
return &idtypes[i];
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int bheadcode_is_idcode(int code)
|
|
||||||
{
|
|
||||||
return idtype_from_code(code)?1:0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int idcode_is_linkable(int code) {
|
|
||||||
IDType *idt= idtype_from_code(code);
|
|
||||||
return idt?(idt->flags&IDTYPE_FLAGS_ISLINKABLE):0;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *BLO_idcode_to_name(int code)
|
|
||||||
{
|
|
||||||
IDType *idt= idtype_from_code(code);
|
|
||||||
|
|
||||||
return idt?idt->name:NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int BLO_idcode_from_name(char *name)
|
|
||||||
{
|
|
||||||
IDType *idt= idtype_from_name(name);
|
|
||||||
|
|
||||||
return idt?idt->code:0;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *BLO_idcode_to_name_plural(int code)
|
|
||||||
{
|
|
||||||
IDType *idt= idtype_from_code(code);
|
|
||||||
|
|
||||||
return idt?idt->plural:NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Access routines used by filesel. */
|
/* Access routines used by filesel. */
|
||||||
|
|
||||||
BlendHandle *BLO_blendhandle_from_file(char *file)
|
BlendHandle *BLO_blendhandle_from_file(char *file)
|
||||||
@ -308,13 +207,13 @@ LinkNode *BLO_blendhandle_get_linkable_groups(BlendHandle *bh)
|
|||||||
for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) {
|
for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) {
|
||||||
if (bhead->code==ENDB) {
|
if (bhead->code==ENDB) {
|
||||||
break;
|
break;
|
||||||
} else if (bheadcode_is_idcode(bhead->code)) {
|
} else if (BKE_idcode_is_valid(bhead->code)) {
|
||||||
if (idcode_is_linkable(bhead->code)) {
|
if (BKE_idcode_is_linkable(bhead->code)) {
|
||||||
char *str= BLO_idcode_to_name(bhead->code);
|
const char *str= BKE_idcode_to_name(bhead->code);
|
||||||
|
|
||||||
if (!BLI_ghash_haskey(gathered, str)) {
|
if (!BLI_ghash_haskey(gathered, (void *)str)) {
|
||||||
BLI_linklist_prepend(&names, strdup(str));
|
BLI_linklist_prepend(&names, strdup(str));
|
||||||
BLI_ghash_insert(gathered, str, NULL);
|
BLI_ghash_insert(gathered, (void *)str, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -105,6 +105,7 @@
|
|||||||
#include "BKE_image.h"
|
#include "BKE_image.h"
|
||||||
#include "BKE_lattice.h"
|
#include "BKE_lattice.h"
|
||||||
#include "BKE_library.h" // for which_libbase
|
#include "BKE_library.h" // for which_libbase
|
||||||
|
#include "BKE_idcode.h"
|
||||||
#include "BKE_main.h" // for Main
|
#include "BKE_main.h" // for Main
|
||||||
#include "BKE_mesh.h" // for ME_ defines (patching)
|
#include "BKE_mesh.h" // for ME_ defines (patching)
|
||||||
#include "BKE_modifier.h"
|
#include "BKE_modifier.h"
|
||||||
@ -4106,8 +4107,9 @@ static void composite_patch(bNodeTree *ntree, Scene *scene)
|
|||||||
|
|
||||||
static void link_paint(FileData *fd, Scene *sce, Paint *p)
|
static void link_paint(FileData *fd, Scene *sce, Paint *p)
|
||||||
{
|
{
|
||||||
if(p && p->brush) {
|
if(p) {
|
||||||
p->brush= newlibadr_us(fd, sce->id.lib, p->brush);
|
p->brush= newlibadr_us(fd, sce->id.lib, p->brush);
|
||||||
|
p->paint_cursor= NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -12592,8 +12594,8 @@ static void read_libraries(FileData *basefd, ListBase *mainlist)
|
|||||||
|
|
||||||
append_id_part(fd, mainptr, id, &realid);
|
append_id_part(fd, mainptr, id, &realid);
|
||||||
if (!realid) {
|
if (!realid) {
|
||||||
BKE_reportf(fd->reports, RPT_ERROR, "LIB ERROR: %s:'%s' missing from '%s'\n", BLO_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath);
|
BKE_reportf(fd->reports, RPT_ERROR, "LIB ERROR: %s:'%s' missing from '%s'\n", BKE_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath);
|
||||||
if(!G.background && basefd->reports) printf("LIB ERROR: %s:'%s' missing from '%s'\n", BLO_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath);
|
if(!G.background && basefd->reports) printf("LIB ERROR: %s:'%s' missing from '%s'\n", BKE_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath);
|
||||||
}
|
}
|
||||||
|
|
||||||
change_idid_adr(mainlist, basefd, id, realid);
|
change_idid_adr(mainlist, basefd, id, realid);
|
||||||
@ -12628,8 +12630,8 @@ static void read_libraries(FileData *basefd, ListBase *mainlist)
|
|||||||
ID *idn= id->next;
|
ID *idn= id->next;
|
||||||
if(id->flag & LIB_READ) {
|
if(id->flag & LIB_READ) {
|
||||||
BLI_remlink(lbarray[a], id);
|
BLI_remlink(lbarray[a], id);
|
||||||
BKE_reportf(basefd->reports, RPT_ERROR, "LIB ERROR: %s:'%s' unread libblock missing from '%s'\n", BLO_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath);
|
BKE_reportf(basefd->reports, RPT_ERROR, "LIB ERROR: %s:'%s' unread libblock missing from '%s'\n", BKE_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath);
|
||||||
if(!G.background && basefd->reports)printf("LIB ERROR: %s:'%s' unread libblock missing from '%s'\n", BLO_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath);
|
if(!G.background && basefd->reports)printf("LIB ERROR: %s:'%s' unread libblock missing from '%s'\n", BKE_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath);
|
||||||
change_idid_adr(mainlist, basefd, id, NULL);
|
change_idid_adr(mainlist, basefd, id, NULL);
|
||||||
|
|
||||||
MEM_freeN(id);
|
MEM_freeN(id);
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2008 Blender Foundation.
|
# The Original Code is Copyright (C) 2008 Blender Foundation.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2006, Blender Foundation
|
# The Original Code is Copyright (C) 2006, Blender Foundation
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) Blender Foundation.
|
# The Original Code is Copyright (C) Blender Foundation.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2007 Blender Foundation
|
# The Original Code is Copyright (C) 2007 Blender Foundation
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2007 Blender Foundation
|
# The Original Code is Copyright (C) 2007 Blender Foundation
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2007 Blender Foundation
|
# The Original Code is Copyright (C) 2007 Blender Foundation
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2007 Blender Foundation
|
# The Original Code is Copyright (C) 2007 Blender Foundation
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2007 Blender Foundation
|
# The Original Code is Copyright (C) 2007 Blender Foundation
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2007 Blender Foundation
|
# The Original Code is Copyright (C) 2007 Blender Foundation
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -1146,7 +1146,7 @@ void ui_draw_but_COLORBAND(uiBut *but, uiWidgetColors *wcol, rcti *rect)
|
|||||||
glColor4fv( &cbd->r );
|
glColor4fv( &cbd->r );
|
||||||
glVertex2fv(v1); glVertex2fv(v2);
|
glVertex2fv(v1); glVertex2fv(v2);
|
||||||
|
|
||||||
for( a = 1; a < sizex; a++ ) {
|
for( a = 1; a <= sizex; a++ ) {
|
||||||
pos = ((float)a) / (sizex-1);
|
pos = ((float)a) / (sizex-1);
|
||||||
do_colorband( coba, pos, colf );
|
do_colorband( coba, pos, colf );
|
||||||
if (but->block->color_profile != BLI_PR_NONE)
|
if (but->block->color_profile != BLI_PR_NONE)
|
||||||
@ -1163,19 +1163,8 @@ void ui_draw_but_COLORBAND(uiBut *but, uiWidgetColors *wcol, rcti *rect)
|
|||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
|
|
||||||
/* outline */
|
/* outline */
|
||||||
v1[0]= x1; v1[1]= y1;
|
glColor4f(0.0, 0.0, 0.0, 1.0);
|
||||||
|
fdrawbox(x1, y1, x1+sizex, y1+sizey);
|
||||||
cpack(0x0);
|
|
||||||
glBegin(GL_LINE_LOOP);
|
|
||||||
glVertex2fv(v1);
|
|
||||||
v1[0]+= sizex;
|
|
||||||
glVertex2fv(v1);
|
|
||||||
v1[1]+= sizey;
|
|
||||||
glVertex2fv(v1);
|
|
||||||
v1[0]-= sizex;
|
|
||||||
glVertex2fv(v1);
|
|
||||||
glEnd();
|
|
||||||
|
|
||||||
|
|
||||||
/* help lines */
|
/* help lines */
|
||||||
v1[0]= v2[0]=v3[0]= x1;
|
v1[0]= v2[0]=v3[0]= x1;
|
||||||
@ -1231,6 +1220,7 @@ void ui_draw_but_COLORBAND(uiBut *but, uiWidgetColors *wcol, rcti *rect)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ui_draw_but_NORMAL(uiBut *but, uiWidgetColors *wcol, rcti *rect)
|
void ui_draw_but_NORMAL(uiBut *but, uiWidgetColors *wcol, rcti *rect)
|
||||||
|
@ -4262,7 +4262,7 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event)
|
|||||||
return WM_UI_HANDLER_BREAK;
|
return WM_UI_HANDLER_BREAK;
|
||||||
}
|
}
|
||||||
/* reset to default */
|
/* reset to default */
|
||||||
else if(event->type == ZEROKEY && event->val == KM_PRESS) {
|
else if(ELEM(event->type, ZEROKEY,PAD0) && event->val == KM_PRESS) {
|
||||||
if (!(ELEM3(but->type, HSVCIRCLE, HSVCUBE, HISTOGRAM)))
|
if (!(ELEM3(but->type, HSVCIRCLE, HSVCUBE, HISTOGRAM)))
|
||||||
ui_set_but_default(C, but);
|
ui_set_but_default(C, but);
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2007 Blender Foundation
|
# The Original Code is Copyright (C) 2007 Blender Foundation
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2007 Blender Foundation
|
# The Original Code is Copyright (C) 2007 Blender Foundation
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2007 Blender Foundation
|
# The Original Code is Copyright (C) 2007 Blender Foundation
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -225,11 +225,11 @@ static void bake_update(void *bkv)
|
|||||||
static void bake_freejob(void *bkv)
|
static void bake_freejob(void *bkv)
|
||||||
{
|
{
|
||||||
BakeRender *bkr= bkv;
|
BakeRender *bkr= bkv;
|
||||||
BLI_end_threads(&bkr->threads);
|
|
||||||
finish_bake_internal(bkr);
|
finish_bake_internal(bkr);
|
||||||
|
|
||||||
if(bkr->tot==0) BKE_report(bkr->reports, RPT_ERROR, "No Images found to bake to");
|
if(bkr->tot==0) BKE_report(bkr->reports, RPT_ERROR, "No Images found to bake to");
|
||||||
MEM_freeN(bkr);
|
MEM_freeN(bkr);
|
||||||
|
G.rendering = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* catch esc */
|
/* catch esc */
|
||||||
@ -269,6 +269,7 @@ static int objects_bake_render_invoke(bContext *C, wmOperator *op, wmEvent *_eve
|
|||||||
WM_jobs_callbacks(steve, bake_startjob, NULL, bake_update, NULL);
|
WM_jobs_callbacks(steve, bake_startjob, NULL, bake_update, NULL);
|
||||||
|
|
||||||
G.afbreek= 0;
|
G.afbreek= 0;
|
||||||
|
G.rendering = 1;
|
||||||
|
|
||||||
WM_jobs_start(CTX_wm_manager(C), steve);
|
WM_jobs_start(CTX_wm_manager(C), steve);
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2007 Blender Foundation
|
# The Original Code is Copyright (C) 2007 Blender Foundation
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software Foundation,
|
# along with this program; if not, write to the Free Software Foundation,
|
||||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
# The Original Code is Copyright (C) 2007 Blender Foundation
|
# The Original Code is Copyright (C) 2007 Blender Foundation
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -791,7 +791,7 @@ void BIF_view3d_previewrender(Main *bmain, Scene *scene, ScrArea *sa)
|
|||||||
lay |= v3d->lay;
|
lay |= v3d->lay;
|
||||||
else lay= v3d->lay;
|
else lay= v3d->lay;
|
||||||
|
|
||||||
RE_Database_FromScene(re, scene, lay, 0); // 0= dont use camera view
|
RE_Database_FromScene(re, bmain, scene, lay, 0); // 0= dont use camera view
|
||||||
|
|
||||||
rstats= RE_GetStats(re);
|
rstats= RE_GetStats(re);
|
||||||
if(rstats->convertdone)
|
if(rstats->convertdone)
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user