missing commits from peter 20942, 21165, 21170, 21174, 21597
these files still need manual merging

source/blender/makesdna/DNA_sequence_types.h
source/blender/src/sequence.c
source/blender/src/seqeffects.c
source/blender/src/editseq.c
source/blender/include/BSE_sequence.h
This commit is contained in:
Campbell Barton 2009-07-25 20:59:09 +00:00
commit 1b14243405
33 changed files with 1086 additions and 463 deletions

@ -69,7 +69,6 @@ IF(UNIX)
bf_blenkernel bf_blenkernel
verse verse
bf_blenkernel bf_blenkernel
bf_decimation
bf_blenloader bf_blenloader
bf_blenpluginapi bf_blenpluginapi
bf_blroutines bf_blroutines

@ -4,6 +4,7 @@ LIBDIR = "${LCGDIR}"
BF_PYTHON = LIBDIR + '/python' BF_PYTHON = LIBDIR + '/python'
BF_PYTHON_VERSION = '3.1' BF_PYTHON_VERSION = '3.1'
#BF_PYTHON_VERSION = '2.6' #BF_PYTHON_VERSION = '2.6'
#BF_PYTHON_VERSION = '2.6'
WITH_BF_STATICPYTHON = False WITH_BF_STATICPYTHON = False
BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}' BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}'
BF_PYTHON_BINARY = 'python' BF_PYTHON_BINARY = 'python'

Binary file not shown.

Before

Width:  |  Height:  |  Size: 192 KiB

After

Width:  |  Height:  |  Size: 192 KiB

@ -277,12 +277,17 @@ def read_bvh(file_path, GLOBAL_SCALE=1.0):
for bvh_node in bvh_nodes.itervalues(): for bvh_node in bvh_nodes.itervalues():
if not bvh_node.rest_tail_world: if not bvh_node.rest_tail_world:
if len(bvh_node.children)==1: if len(bvh_node.children)==0:
# could just fail here, but rare BVH files have childless nodes
bvh_node.rest_tail_world = Vector(bvh_node.rest_head_world)
bvh_node.rest_tail_local = Vector(bvh_node.rest_head_local)
elif len(bvh_node.children)==1:
bvh_node.rest_tail_world= Vector(bvh_node.children[0].rest_head_world) bvh_node.rest_tail_world= Vector(bvh_node.children[0].rest_head_world)
bvh_node.rest_tail_local= Vector(bvh_node.children[0].rest_head_local) bvh_node.rest_tail_local= Vector(bvh_node.children[0].rest_head_local)
else: else:
if not bvh_node.children: # allow this, see above
raise 'error, bvh node has no end and no children. bad file' #if not bvh_node.children:
# raise 'error, bvh node has no end and no children. bad file'
# Removed temp for now # Removed temp for now
rest_tail_world= Vector(0,0,0) rest_tail_world= Vector(0,0,0)

@ -1,13 +1,13 @@
#!BPY #!BPY
""" """
Name: 'Autodesk DXF (.dxf)' Name: 'Autodesk DXF (.dxf/dwg)'
Blender: 249 Blender: 249
Group: 'Export' Group: 'Export'
Tooltip: 'Export geometry to DXF/DWG-r12 (Drawing eXchange Format).' Tooltip: 'Export geometry to DXF/DWG-r12 (Drawing eXchange Format).'
""" """
__version__ = "1.34 - 2009.06.08" __version__ = "1.35 - 2009.06.18"
__author__ = "Remigiusz Fiedler (AKA migius)" __author__ = "Remigiusz Fiedler (AKA migius)"
__license__ = "GPL" __license__ = "GPL"
__url__ = "http://wiki.blender.org/index.php/Scripts/Manual/Export/autodesk_dxf" __url__ = "http://wiki.blender.org/index.php/Scripts/Manual/Export/autodesk_dxf"
@ -31,19 +31,27 @@ IDEAs:
- HPGL output, usefull for correct scaled printing of 2d drawings - HPGL output, usefull for correct scaled printing of 2d drawings
TODO: TODO:
- export dupligroups and dupliverts as blocks (option for the user to decide) - export dupligroups and dupliverts as blocks (as option)
- optimize POLYFACE routine: remove double-vertices - optimize POLYFACE routine: remove double-vertices
- more stable support for X,Y-rotated curves(to POLYLINEs): fix blender negative-matrix.invert() - fix support for X,Y-rotated curves(to POLYLINEs): fix blender negative-matrix.invert()
- support hierarchies: groups, instances, parented structures - support hierarchies: groups, instances, parented structures
- support n/f-gons as POLYFACEs with invisible edges - support n/f-gons as POLYFACEs with invisible edges
- mapping materials to DXF-styles - mapping materials to DXF-styles
- ProgressBar - ProgressBar
- export rotation of Camera to VIEW/VPORT
- export parented Cameras to VIEW/VPORT
- wip: write drawing extends for automatic view positioning in CAD - wip: write drawing extends for automatic view positioning in CAD
- wip: correct text-objects in persp-projection - wip: fix text-objects in persp-projection
- wip: translate Camera to VPORT/VIEW
- wip: translate current 3D-View to *ACTIVE-VPORT - wip: translate current 3D-View to *ACTIVE-VPORT
- wip: fix support Include-Duplis, cause not conform with INSERT-method
History History
v1.35 - 2009.06.18 by migius
- export multiple-instances of Curve-Objects as BLOCK/INSERTs
- added export Cameras (ortho and persp) to VPORTs, incl. clipping
- added export Cameras (ortho and persp) to VIEWs, incl. clipping
- export multiple-instances of Mesh-Objects as BLOCK/INSERTs
- on start prints dxfLibrary version
v1.34 - 2009.06.08 by migius v1.34 - 2009.06.08 by migius
- export Lamps and Cameras as POINTs - export Lamps and Cameras as POINTs
- export passepartout for perspective projection - export passepartout for perspective projection
@ -55,7 +63,7 @@ v1.34 - 2009.06.08 by migius
- support XYmirrored 2d-curves to 2dPOLYLINEs - support XYmirrored 2d-curves to 2dPOLYLINEs
- support thickness and elevation for curve-objects - support thickness and elevation for curve-objects
- fix extrusion 210-code (3d orientation vector) - fix extrusion 210-code (3d orientation vector)
- fix POLYFACE export, synchronized with dxfLibrary.py - fix POLYFACE export, synchronized also dxfLibrary.py
- changed to the new 2.49 method Vector.cross() - changed to the new 2.49 method Vector.cross()
- output style manager (first try) - output style manager (first try)
v1.33 - 2009.05.25 by migius v1.33 - 2009.05.25 by migius
@ -139,10 +147,16 @@ from Blender import Registry, Object, Mesh, Curve
import os import os
import subprocess import subprocess
try:
import dxfLibrary as DXF import dxfLibrary as DXF
#reload(DXF) #reload(DXF)
#reload(dxfLibrary) #reload(dxfLibrary)
#from dxfLibrary import * #from dxfLibrary import *
except:
DXF=None
print "DXF-Exporter: error! found no dxfLibrary.py module in Blender script folder"
Draw.PupMenu("Error%t|found no dxfLibrary.py module in script folder")
import math import math
from math import atan, atan2, log10, sin, cos from math import atan, atan2, log10, sin, cos
@ -152,9 +166,8 @@ from math import atan, atan2, log10, sin, cos
r2d = 180.0 / math.pi r2d = 180.0 / math.pi
d2r = math.pi / 180.0 d2r = math.pi / 180.0
#note: d2r * angle == math.radians(angle) #note: d2r * angle == math.radians(angle)
#note: r2d * angle == math.degrees(angle)
print '\n\n\n'
print 'DXF-Exporter v%s *** start ***' %(__version__) #---------------------
#DEBUG = True #activates debug mode #DEBUG = True #activates debug mode
@ -170,6 +183,7 @@ SHADOWS = 0 # sun/shadows simulation
CAMERA = 1 # selected camera index CAMERA = 1 # selected camera index
PERSPECTIVE = 0 # projection (camera) type: perspective, opposite to orthographic PERSPECTIVE = 0 # projection (camera) type: perspective, opposite to orthographic
CAMERAVIEW = 0 # use camera for projection, opposite is 3d-view CAMERAVIEW = 0 # use camera for projection, opposite is 3d-view
INSTANCES = 1 # Export instances of Mesh/Curve as BLOCK/INSERTs on/off
APPLY_MODIFIERS = 1 APPLY_MODIFIERS = 1
INCLUDE_DUPLIS = 0 INCLUDE_DUPLIS = 0
OUTPUT_DWG = 0 #optional save to DWG with extern converter OUTPUT_DWG = 0 #optional save to DWG with extern converter
@ -187,6 +201,7 @@ LAYERLTYPE_DEF = 0 #'CONTINUOUS' - default layer lineType
ENTITYLAYER_DEF = LAYERNAME_DEF #default entity color index ENTITYLAYER_DEF = LAYERNAME_DEF #default entity color index
ENTITYCOLOR_DEF = BYLAYER #default entity color index ENTITYCOLOR_DEF = BYLAYER #default entity color index
ENTITYLTYPE_DEF = BYLAYER #default entity lineType ENTITYLTYPE_DEF = BYLAYER #default entity lineType
E_M = 0 E_M = 0
LAB = "scroll MMB/WHEEL . wip .. todo" #"*) parts under construction" LAB = "scroll MMB/WHEEL . wip .. todo" #"*) parts under construction"
M_OBJ = 0 M_OBJ = 0
@ -198,6 +213,7 @@ INIFILE_EXTENSION = '.ini'
INIFILE_HEADER = '#ExportDXF.py ver.1.0 config data' INIFILE_HEADER = '#ExportDXF.py ver.1.0 config data'
INFFILE_HEADER = '#ExportDXF.py ver.1.0 analyze of DXF-data' INFFILE_HEADER = '#ExportDXF.py ver.1.0 analyze of DXF-data'
BLOCKREGISTRY = {} # registry and map for BLOCKs
SCENE = None SCENE = None
WORLDX = Mathutils.Vector((1,0,0)) WORLDX = Mathutils.Vector((1,0,0))
WORLDY = Mathutils.Vector((0,1,0)) WORLDY = Mathutils.Vector((0,1,0))
@ -496,22 +512,55 @@ def isLeftHand(matrix):
def exportMesh(ob, mx, mx_n, me=None, **common): def exportMesh(ob, mx, mx_n, me=None, **common):
"""converts Mesh-Object to desired projection and representation(DXF-Entity type) """converts Mesh-Object to desired projection and representation(DXF-Entity type)
""" """
global BLOCKREGISTRY
entities = [] entities = []
#print 'deb:exportMesh() common=', common #--------- block = None
#print 'deb:exportMesh() given common=', common #---------
if me==None: if me==None:
me = ob.getData(mesh=1) me = ob.getData(mesh=1)
else: else:
me.getFromObject(ob) me.getFromObject(ob)
# me.transform(mx); get verts data; me.transform(mx_inv)= back to the origin state # idea: me.transform(mx); get verts data; me.transform(mx_inv)= back to the origin state
# above .transform method is faster, but bad, cause invasive: # the .transform-method is fast, but bad, cause invasive:
# it manipulates original geometry and by retransformation lefts back rounding-errors # it manipulates original geometry and by retransformation lefts back rounding-errors
# we dont want to manipulate original data! # we dont want to manipulate original data!
#temp_verts = me.verts[:] #doesn't work on ubuntu(Yorik), bug? #temp_verts = me.verts[:] #doesn't work on ubuntu(Yorik), bug?
if me.verts: if me.verts:
#print 'deb:exportMesh() started' #--------- #print 'deb:exportMesh() started' #---------
#print 'deb:exportMesh() ob.name=', ob.name #---------
#print 'deb:exportMesh() me.name=', me.name #---------
#print 'deb:exportMesh() me.users=', me.users #---------
# check if there are more instances of this mesh (if used by other objects), then write to BLOCK/INSERT
if GUI_A['instances_on'].val and me.users>1 and not PROJECTION:
if me.name in BLOCKREGISTRY.keys():
insert_name = BLOCKREGISTRY[me.name]
# write INSERT to entities
entities = exportInsert(ob, mx,insert_name, **common)
else:
# generate geom_output in ObjectCS
allpoints = [v.co for v in me.verts]
identity_matrix = Mathutils.Matrix().identity()
allpoints = projected_co(allpoints, identity_matrix)
#allpoints = toGlobalOrigin(allpoints)
faces=[]
edges=[]
for e in me.edges: edges.append(e.key)
faces = [[v.index for v in f.verts] for f in me.faces]
entities = writeMeshEntities(allpoints, edges, faces, **common)
if entities: # if not empty block
# write BLOCK definition and INSERT entity
# BLOCKREGISTRY = dictionary 'blender_name':'dxf_name'.append(me.name)
BLOCKREGISTRY[me.name]=validDXFr12name(('ME_'+ me.name))
insert_name = BLOCKREGISTRY[me.name]
block = DXF.Block(insert_name,flag=0,base=(0,0,0),entities=entities)
# write INSERT as entity
entities = exportInsert(ob, mx, insert_name, **common)
else: # no other instances, so go the standard way
allpoints = [v.co for v in me.verts] allpoints = [v.co for v in me.verts]
allpoints = projected_co(allpoints, mx) allpoints = projected_co(allpoints, mx)
allpoints = toNewOrigin(allpoints) allpoints = toGlobalOrigin(allpoints)
faces=[] faces=[]
edges=[] edges=[]
if me.faces and PROJECTION and HIDDEN_LINES: if me.faces and PROJECTION and HIDDEN_LINES:
@ -532,6 +581,16 @@ def exportMesh(ob, mx, mx_n, me=None, **common):
f.reverse() f.reverse()
#f = [f[-1]] + f[:-1] #TODO: might be needed #f = [f[-1]] + f[:-1] #TODO: might be needed
#print 'deb: faces=\n', faces #--------- #print 'deb: faces=\n', faces #---------
entities = writeMeshEntities(allpoints, edges, faces, **common)
return entities, block
#-------------------------------------------------
def writeMeshEntities(allpoints, edges, faces, **common):
"""help routine for exportMesh()
"""
entities = []
c = mesh_as_list[GUI_A['mesh_as'].val] c = mesh_as_list[GUI_A['mesh_as'].val]
if 'POINTs'==c: # export Mesh as multiple POINTs if 'POINTs'==c: # export Mesh as multiple POINTs
@ -582,6 +641,7 @@ def exportMesh(ob, mx, mx_n, me=None, **common):
return entities return entities
#----------------------------------------------------- #-----------------------------------------------------
def mesh_drawBlender(vertList, edgeList, faceList, name="dxfMesh", flatten=False, AT_CUR=True, link=True): def mesh_drawBlender(vertList, edgeList, faceList, name="dxfMesh", flatten=False, AT_CUR=True, link=True):
#print 'deb:mesh_drawBlender started XXXXXXXXXXXXXXXXXX' #--------- #print 'deb:mesh_drawBlender started XXXXXXXXXXXXXXXXXX' #---------
@ -640,7 +700,7 @@ def curve_drawBlender(vertList, org_point=[0.0,0.0,0.0], closed=0, name="dxfCurv
#----------------------------------------------------- #-----------------------------------------------------
def toNewOrigin(points): def toGlobalOrigin(points):
"""relocates points to the new location """relocates points to the new location
needs a list of points [x,y,z] needs a list of points [x,y,z]
""" """
@ -658,7 +718,7 @@ def exportEmpty(ob, mx, mw, **common):
""" """
p = Mathutils.Vector(ob.loc) p = Mathutils.Vector(ob.loc)
[p] = projected_co([p], mx) [p] = projected_co([p], mx)
[p] = toNewOrigin([p]) [p] = toGlobalOrigin([p])
entities = [] entities = []
c = empty_as_list[GUI_A['empty_as'].val] c = empty_as_list[GUI_A['empty_as'].val]
@ -671,16 +731,50 @@ def exportEmpty(ob, mx, mw, **common):
def exportCamera(ob, mx, mw, **common): def exportCamera(ob, mx, mw, **common):
"""converts Camera-Object to desired projection and representation(DXF-Entity type) """converts Camera-Object to desired projection and representation(DXF-Entity type)
""" """
p = Mathutils.Vector(ob.loc) location = Mathutils.Vector(ob.loc)
[p] = projected_co([p], mx) [location] = projected_co([location], mx)
[p] = toNewOrigin([p]) [location] = toGlobalOrigin([location])
view_name=validDXFr12name(('CAM_'+ ob.name))
entities = [] camera = Camera.Get(ob.getData(name_only=True))
#print 'deb: camera=', dir(camera) #------------------
if camera.type=='persp':
mode = 1+2+4+16
# mode flags: 1=persp, 2=frontclip, 4=backclip,16=FrontZ
elif camera.type=='ortho':
mode = 0+2+4+16
leftBottom=(0.0,0.0) # default
rightTop=(1.0,1.0) # default
center=(0.0,0.0) # default
direction = Mathutils.Vector(0.0,0.0,1.0) * mx.rotationPart() # in W-C-S
direction.normalize()
target=Mathutils.Vector(ob.loc) - direction # in W-C-S
#ratio=1.0
width=height= camera.scale # for ortho-camera
lens = camera.lens # for persp-camera
frontClipping = -(camera.clipStart - 1.0)
backClipping = -(camera.clipEnd - 1.0)
entities, vport, view = [], None, None
c = camera_as_list[GUI_A['camera_as'].val] c = camera_as_list[GUI_A['camera_as'].val]
if c=="POINT": # export as POINT if c=="POINT": # export as POINT
dxfPOINT = DXF.Point(points=[p],**common) dxfPOINT = DXF.Point(points=[location],**common)
entities.append(dxfPOINT) entities.append(dxfPOINT)
return entities elif c=="VIEW": # export as VIEW
view = DXF.View(name=view_name,
center=center, width=width, height=height,
frontClipping=frontClipping,backClipping=backClipping,
direction=direction,target=target,lens=lens,mode=mode
)
elif c=="VPORT": # export as VPORT
vport = DXF.VPort(name=view_name,
center=center, ratio=1.0, height=height,
frontClipping=frontClipping,backClipping=backClipping,
direction=direction,target=target,lens=lens,mode=mode
)
return entities, vport, view
#----------------------------------------------------- #-----------------------------------------------------
def exportLamp(ob, mx, mw, **common): def exportLamp(ob, mx, mw, **common):
@ -688,7 +782,7 @@ def exportLamp(ob, mx, mw, **common):
""" """
p = Mathutils.Vector(ob.loc) p = Mathutils.Vector(ob.loc)
[p] = projected_co([p], mx) [p] = projected_co([p], mx)
[p] = toNewOrigin([p]) [p] = toGlobalOrigin([p])
entities = [] entities = []
c = lamp_as_list[GUI_A['lamp_as'].val] c = lamp_as_list[GUI_A['lamp_as'].val]
@ -697,6 +791,75 @@ def exportLamp(ob, mx, mw, **common):
entities.append(dxfPOINT) entities.append(dxfPOINT)
return entities return entities
#-----------------------------------------------------
def exportInsert(ob, mx, insert_name, **common):
"""converts Object to DXF-INSERT in given orientation
"""
WCS_loc = ob.loc # WCS_loc is object location in WorldCoordSystem
sizeX = ob.SizeX
sizeY = ob.SizeY
sizeZ = ob.SizeZ
rotX = ob.RotX
rotY = ob.RotY
rotZ = ob.RotZ
#print 'deb: sizeX=%s, sizeY=%s' %(sizeX, sizeY) #---------
Thickness,Extrusion,ZRotation,Elevation = None,None,None,None
AXaxis = mx[0].copy().resize3D() # = ArbitraryXvector
if not PROJECTION:
#Extrusion, ZRotation, Elevation = getExtrusion(mx)
Extrusion, AXaxis = getExtrusion(mx)
entities = []
if 1:
if not PROJECTION:
ZRotation,Zrotmatrix,OCS_origin,ECS_origin = getTargetOrientation(mx,Extrusion,\
AXaxis,WCS_loc,sizeX,sizeY,sizeZ,rotX,rotY,rotZ)
ZRotation *= r2d
point = ECS_origin
else: #TODO: fails correct location
point1 = Mathutils.Vector(ob.loc)
[point] = projected_co([point1], mx)
if PERSPECTIVE:
clipStart = 10.0
coef = -clipStart / (point1*mx)[2]
#print 'deb: coef=', coef #--------------
#TODO: ? sizeX *= coef
#sizeY *= coef
#sizeZ *= coef
#print 'deb: point=', point #--------------
[point] = toGlobalOrigin([point])
#if DEBUG: text_drawBlender(textstr,points,OCS_origin) #deb: draw to scene
common['extrusion']= Extrusion
#common['elevation']= Elevation
#print 'deb: common=', common #------------------
if 0: #DEBUG
#linepoints = [[0,0,0], [AXaxis[0],AXaxis[1],AXaxis[2]]]
linepoints = [[0,0,0], point]
dxfLINE = DXF.Line(linepoints,**common)
entities.append(dxfLINE)
xscale=sizeX
yscale=sizeY
zscale=sizeZ
cols=None
colspacing=None
rows=None
rowspacing=None
dxfINSERT = DXF.Insert(insert_name,point=point,rotation=ZRotation,\
xscale=xscale,yscale=yscale,zscale=zscale,\
cols=cols,colspacing=colspacing,rows=rows,rowspacing=rowspacing,\
**common)
entities.append(dxfINSERT)
return entities
#----------------------------------------------------- #-----------------------------------------------------
def exportText(ob, mx, mw, **common): def exportText(ob, mx, mw, **common):
"""converts Text-Object to desired projection and representation(DXF-Entity type) """converts Text-Object to desired projection and representation(DXF-Entity type)
@ -755,7 +918,7 @@ def exportText(ob, mx, mw, **common):
#print 'deb: coef=', coef #-------------- #print 'deb: coef=', coef #--------------
#print 'deb: point=', point #-------------- #print 'deb: point=', point #--------------
[point] = toNewOrigin([point]) [point] = toGlobalOrigin([point])
point2 = point point2 = point
#if DEBUG: text_drawBlender(textstr,points,OCS_origin) #deb: draw to scene #if DEBUG: text_drawBlender(textstr,points,OCS_origin) #deb: draw to scene
@ -835,9 +998,55 @@ def exportCurve(ob, mx, mw, **common):
"""converts Curve-Object to desired projection and representation(DXF-Entity type) """converts Curve-Object to desired projection and representation(DXF-Entity type)
""" """
entities = [] entities = []
block = None
curve = ob.getData() curve = ob.getData()
#print 'deb: curve=', dir(curve) #---------
# TODO: should be: if curve.users>1 and not (PERSPECTIVE or (PROJECTION and HIDDEN_MODE):
if GUI_A['instances_on'].val and curve.users>1 and not PROJECTION:
if curve.name in BLOCKREGISTRY.keys():
insert_name = BLOCKREGISTRY[curve.name]
# write INSERT to entities
entities = exportInsert(ob, mx,insert_name, **common)
else:
# generate geom_output in ObjectCS
imx = Mathutils.Matrix().identity()
WCS_loc = [0,0,0] # WCS_loc is object location in WorldCoordSystem
#print 'deb: WCS_loc=', WCS_loc #---------
sizeX = sizeY = sizeZ = 1.0
rotX = rotY = rotZ = 0.0
Thickness,Extrusion,ZRotation,Elevation = None,None,None,None
ZRotation,Zrotmatrix,OCS_origin,ECS_origin = None,None,None,None
AXaxis = imx[0].copy().resize3D() # = ArbitraryXvector
OCS_origin = [0,0,0]
if not PROJECTION:
#Extrusion, ZRotation, Elevation = getExtrusion(mx)
Extrusion, AXaxis = getExtrusion(imx)
# no thickness/width for POLYLINEs converted into Screen-C-S
#print 'deb: curve.ext1=', curve.ext1 #---------
if curve.ext1: Thickness = curve.ext1 * sizeZ
if curve.ext2 and sizeX==sizeY:
Width = curve.ext2 * sizeX
if "POLYLINE"==curve_as_list[GUI_A['curve_as'].val]: # export as POLYLINE
ZRotation,Zrotmatrix,OCS_origin,ECS_origin = getTargetOrientation(imx,Extrusion,\
AXaxis,WCS_loc,sizeX,sizeY,sizeZ,rotX,rotY,rotZ)
entities = writeCurveEntities(curve, imx,
Thickness,Extrusion,ZRotation,Elevation,AXaxis,Zrotmatrix,
WCS_loc,OCS_origin,ECS_origin,sizeX,sizeY,sizeZ,
**common)
if entities: # if not empty block
# write BLOCK definition and INSERT entity
# BLOCKREGISTRY = dictionary 'blender_name':'dxf_name'.append(me.name)
BLOCKREGISTRY[curve.name]=validDXFr12name(('CU_'+ curve.name))
insert_name = BLOCKREGISTRY[curve.name]
block = DXF.Block(insert_name,flag=0,base=(0,0,0),entities=entities)
# write INSERT as entity
entities = exportInsert(ob, mx, insert_name, **common)
else: # no other instances, so go the standard way
WCS_loc = ob.loc # WCS_loc is object location in WorldCoordSystem WCS_loc = ob.loc # WCS_loc is object location in WorldCoordSystem
#WCS_loc = [0.0,0.0,0.0]
#print 'deb: WCS_loc=', WCS_loc #--------- #print 'deb: WCS_loc=', WCS_loc #---------
sizeX = ob.SizeX sizeX = ob.SizeX
sizeY = ob.SizeY sizeY = ob.SizeY
@ -848,13 +1057,14 @@ def exportCurve(ob, mx, mw, **common):
#print 'deb: sizeX=%s, sizeY=%s' %(sizeX, sizeY) #--------- #print 'deb: sizeX=%s, sizeY=%s' %(sizeX, sizeY) #---------
Thickness,Extrusion,ZRotation,Elevation = None,None,None,None Thickness,Extrusion,ZRotation,Elevation = None,None,None,None
ZRotation,Zrotmatrix,OCS_origin,ECS_origin = None,None,None,None
AXaxis = mx[0].copy().resize3D() # = ArbitraryXvector AXaxis = mx[0].copy().resize3D() # = ArbitraryXvector
OCS_origin = [0,0,0] OCS_origin = [0,0,0]
if not PROJECTION: if not PROJECTION:
#Extrusion, ZRotation, Elevation = getExtrusion(mx) #Extrusion, ZRotation, Elevation = getExtrusion(mx)
Extrusion, AXaxis = getExtrusion(mx) Extrusion, AXaxis = getExtrusion(mx)
# no thickness/width for POLYLINEs converted into ScreenCS # no thickness/width for POLYLINEs converted into Screen-C-S
#print 'deb: curve.ext1=', curve.ext1 #--------- #print 'deb: curve.ext1=', curve.ext1 #---------
if curve.ext1: Thickness = curve.ext1 * sizeZ if curve.ext1: Thickness = curve.ext1 * sizeZ
if curve.ext2 and sizeX==sizeY: if curve.ext2 and sizeX==sizeY:
@ -862,7 +1072,24 @@ def exportCurve(ob, mx, mw, **common):
if "POLYLINE"==curve_as_list[GUI_A['curve_as'].val]: # export as POLYLINE if "POLYLINE"==curve_as_list[GUI_A['curve_as'].val]: # export as POLYLINE
ZRotation,Zrotmatrix,OCS_origin,ECS_origin = getTargetOrientation(mx,Extrusion,\ ZRotation,Zrotmatrix,OCS_origin,ECS_origin = getTargetOrientation(mx,Extrusion,\
AXaxis,WCS_loc,sizeX,sizeY,sizeZ,rotX,rotY,rotZ) AXaxis,WCS_loc,sizeX,sizeY,sizeZ,rotX,rotY,rotZ)
entities = writeCurveEntities(curve, mx,
Thickness,Extrusion,ZRotation,Elevation,AXaxis,Zrotmatrix,
WCS_loc,OCS_origin,ECS_origin,sizeX,sizeY,sizeZ,
**common)
return entities, block
#-------------------------------------------------
def writeCurveEntities(curve, mx,
Thickness,Extrusion,ZRotation,Elevation,AXaxis,Zrotmatrix,
WCS_loc,OCS_origin,ECS_origin,sizeX,sizeY,sizeZ,
**common):
"""help routine for exportCurve()
"""
entities = []
if 1:
for cur in curve: for cur in curve:
#print 'deb: START cur=', cur #-------------- #print 'deb: START cur=', cur #--------------
points = [] points = []
@ -903,9 +1130,10 @@ def exportCurve(ob, mx, mw, **common):
if cur.isCyclic(): closed = 1 if cur.isCyclic(): closed = 1
else: closed = 0 else: closed = 0
points = toNewOrigin(points) points = toGlobalOrigin(points)
if DEBUG: curve_drawBlender(points,OCS_origin,closed) #deb: draw to scene if DEBUG: curve_drawBlender(points,OCS_origin,closed) #deb: draw to scene
common['extrusion']= Extrusion common['extrusion']= Extrusion
##common['rotation']= ZRotation ##common['rotation']= ZRotation
##common['elevation']= Elevation ##common['elevation']= Elevation
@ -935,7 +1163,7 @@ def exportCurve(ob, mx, mw, **common):
points = projected_co(points, mx) points = projected_co(points, mx)
if cur.isCyclic(): points.append(points[0]) if cur.isCyclic(): points.append(points[0])
#print 'deb: points', points #-------------- #print 'deb: points', points #--------------
points = toNewOrigin(points) points = toGlobalOrigin(points)
if DEBUG: curve_drawBlender(points,WCS_loc,closed) #deb: draw to scene if DEBUG: curve_drawBlender(points,WCS_loc,closed) #deb: draw to scene
common['extrusion']= Extrusion common['extrusion']= Extrusion
@ -958,9 +1186,9 @@ def exportCurve(ob, mx, mw, **common):
for p in points: for p in points:
dxfPOINT = DXF.Point(points=[p],**common) dxfPOINT = DXF.Point(points=[p],**common)
entities.append(dxfPOINT) entities.append(dxfPOINT)
return entities return entities
#----------------------------------------------------- #-----------------------------------------------------
def getClipBox(camera): def getClipBox(camera):
"""calculates Field-of-View-Clipping-Box of given Camera """calculates Field-of-View-Clipping-Box of given Camera
@ -1075,12 +1303,12 @@ def drawClipBox(clip_box):
verts.append([max_X2, max_Y2, max_Z]) verts.append([max_X2, max_Y2, max_Z])
verts.append([min_X2, max_Y2, max_Z]) verts.append([min_X2, max_Y2, max_Z])
faces = [[0,1,2,3],[4,5,6,7]] faces = [[0,1,2,3],[4,5,6,7]]
nme = Mesh.New() newmesh = Mesh.New()
nme.verts.extend(verts) newmesh.verts.extend(verts)
nme.faces.extend(faces) newmesh.faces.extend(faces)
plan = Object.New('Mesh','clip_box') plan = Object.New('Mesh','clip_box')
plan.link(nme) plan.link(newmesh)
sce = Scene.GetCurrent() sce = Scene.GetCurrent()
sce.objects.link(plan) sce.objects.link(plan)
plan.setMatrix(sce.objects.camera.matrix) plan.setMatrix(sce.objects.camera.matrix)
@ -1170,19 +1398,35 @@ def getCommons(ob):
#----------------------------------------------------- #-----------------------------------------------------
def do_export(export_list, filepath): def do_export(export_list, filepath):
global PERSPECTIVE, CAMERAVIEW global PERSPECTIVE, CAMERAVIEW, BLOCKREGISTRY
Window.WaitCursor(1) Window.WaitCursor(1)
t = Blender.sys.time() t = Blender.sys.time()
# init Drawing --------------------- # init Drawing ---------------------
d=DXF.Drawing() d=DXF.Drawing()
# add Tables ----------------- # add Tables -----------------
#d.blocks.append(b) #table blocks # initialized automatic: d.blocks.append(b) #section BLOCKS
#goes automatic: d.styles.append(DXF.Style()) #table styles # initialized automatic: d.styles.append(DXF.Style()) #table STYLE
#table LTYPE ---------------
#d.linetypes.append(DXF.LineType(name='CONTINUOUS',description='--------',elements=[0.0]))
d.linetypes.append(DXF.LineType(name='DOT',description='. . . . . . .',elements=[0.25, 0.0, -0.25]))
d.linetypes.append(DXF.LineType(name='DASHED',description='__ __ __ __ __',elements=[0.8, 0.5, -0.3]))
d.linetypes.append(DXF.LineType(name='DASHDOT',description='__ . __ . __ .',elements=[1.0, 0.5, -0.25, 0.0, -0.25]))
d.linetypes.append(DXF.LineType(name='DIVIDE',description='____ . . ____ . . ',elements=[1.25, 0.5, -0.25, 0.0, -0.25, 0.0, -0.25]))
d.linetypes.append(DXF.LineType(name='BORDER',description='__ __ . __ __ . ',elements=[1.75, 0.5, -0.25, 0.5, -0.25, 0.0, -0.25]))
d.linetypes.append(DXF.LineType(name='HIDDEN',description='__ __ __ __ __',elements=[0.4, 0.25, -0.25]))
d.linetypes.append(DXF.LineType(name='CENTER',description='____ _ ____ _ __',elements=[2.0, 1.25, -0.25, 0.25, -0.25]))
#d.vports.append(DXF.VPort('*ACTIVE'))
d.vports.append(DXF.VPort('*ACTIVE',center=(-5.0,1.0),height=10.0))
#d.vports.append(DXF.VPort('*ACTIVE',leftBottom=(-100.0,-60.0),rightTop=(100.0,60.0)))
#d.views.append(DXF.View('Normal')) #table view #d.views.append(DXF.View('Normal')) #table view
d.views.append(DXF.ViewByWindow('BF_TOPVIEW',leftBottom=(-100,-60),rightTop=(100,60))) #idem d.views.append(DXF.ViewByWindow('BF_TOPVIEW',leftBottom=(-100,-60),rightTop=(100,60))) #idem
# add Entities -------------------- # add Entities --------------------
BLOCKREGISTRY = {} # registry and map for BLOCKs
PERSPECTIVE = 0
something_ready = 0 something_ready = 0
selected_len = len(export_list) selected_len = len(export_list)
sce = Scene.GetCurrent() sce = Scene.GetCurrent()
@ -1246,9 +1490,10 @@ def do_export(export_list, filepath):
layernames = [] layernames = []
for ob,mx in export_list: for ob,mx in export_list:
entities = [] entities = []
block = None
#mx = ob.matrix.copy() #mx = ob.matrix.copy()
#print 'deb: ob =', ob #--------- #print 'deb: ob =', ob #---------
print 'deb: ob.type =', ob.type #--------- #print 'deb: ob.type =', ob.type #---------
#print 'deb: mx =\n', mx #--------- #print 'deb: mx =\n', mx #---------
#print 'deb: mw0 =\n', mw0 #--------- #print 'deb: mw0 =\n', mw0 #---------
#mx_n is trans-matrix for normal_vectors for front-side faces #mx_n is trans-matrix for normal_vectors for front-side faces
@ -1274,10 +1519,10 @@ def do_export(export_list, filepath):
d.layers.append(DXF.Layer(color=tempcolor, name=elayer)) d.layers.append(DXF.Layer(color=tempcolor, name=elayer))
if (ob.type == 'Mesh') and GUI_B['bmesh'].val: if (ob.type == 'Mesh') and GUI_B['bmesh'].val:
entities = exportMesh(ob, mx, mx_n, tmp_me,\ entities, block = exportMesh(ob, mx, mx_n, tmp_me,\
paperspace=espace, color=ecolor, layer=elayer, lineType=eltype) paperspace=espace, color=ecolor, layer=elayer, lineType=eltype)
elif (ob.type == 'Curve') and GUI_B['bcurve'].val: elif (ob.type == 'Curve') and GUI_B['bcurve'].val:
entities = exportCurve(ob, mx, mw, \ entities, block = exportCurve(ob, mx, mw, \
paperspace=espace, color=ecolor, layer=elayer, lineType=eltype) paperspace=espace, color=ecolor, layer=elayer, lineType=eltype)
elif (ob.type == 'Empty') and GUI_B['empty'].val: elif (ob.type == 'Empty') and GUI_B['empty'].val:
entities = exportEmpty(ob, mx, mw, \ entities = exportEmpty(ob, mx, mw, \
@ -1286,8 +1531,10 @@ def do_export(export_list, filepath):
entities = exportText(ob, mx, mw, \ entities = exportText(ob, mx, mw, \
paperspace=espace, color=ecolor, layer=elayer, lineType=eltype) paperspace=espace, color=ecolor, layer=elayer, lineType=eltype)
elif (ob.type == 'Camera') and GUI_B['camera'].val: elif (ob.type == 'Camera') and GUI_B['camera'].val:
entities = exportCamera(ob, mx, mw, \ entities, vport, view = exportCamera(ob, mx, mw, \
paperspace=espace, color=ecolor, layer=elayer, lineType=eltype) paperspace=espace, color=ecolor, layer=elayer, lineType=eltype)
if vport: d.vports.append(vport)
if view: d.views.append(view)
elif (ob.type == 'Lamp') and GUI_B['lamp'].val: elif (ob.type == 'Lamp') and GUI_B['lamp'].val:
entities = exportLamp(ob, mx, mw, \ entities = exportLamp(ob, mx, mw, \
paperspace=espace, color=ecolor, layer=elayer, lineType=eltype) paperspace=espace, color=ecolor, layer=elayer, lineType=eltype)
@ -1297,13 +1544,23 @@ def do_export(export_list, filepath):
for e in entities: for e in entities:
d.append(e) d.append(e)
if something_ready: if block:
if PERSPECTIVE: # draw view border d.blocks.append(block) #add to BLOCK-section
mw2 = Mathutils.Matrix().identity()
points = projected_co(border, mw2)
closed = 1
points = toNewOrigin(points)
if something_ready:
if PERSPECTIVE: # generate view border - passepartout
identity_matrix = Mathutils.Matrix().identity()
points = projected_co(border, identity_matrix)
closed = 1
points = toGlobalOrigin(points)
c = curve_as_list[GUI_A['curve_as'].val]
if c=="LINEs": # export Curve as multiple LINEs
for i in range(len(points)-1):
linepoints = [points[i], points[i+1]]
dxfLINE = DXF.Line(linepoints,paperspace=espace,color=LAYERCOLOR_DEF)
entities.append(dxfLINE)
else:
dxfPLINE = DXF.PolyLine(points,points[0],closed,\ dxfPLINE = DXF.PolyLine(points,points[0],closed,\
paperspace=espace, color=LAYERCOLOR_DEF) paperspace=espace, color=LAYERCOLOR_DEF)
d.append(dxfPLINE) d.append(dxfPLINE)
@ -1573,7 +1830,7 @@ parent_as_menu = prepareMenu("export to: %t", parent_as_list)
proxy_as_list = ["..BLOCK","..XREF","..ungroup","..POINT"] proxy_as_list = ["..BLOCK","..XREF","..ungroup","..POINT"]
proxy_as_menu = prepareMenu("export to: %t", proxy_as_list) proxy_as_menu = prepareMenu("export to: %t", proxy_as_list)
camera_as_list = ["..BLOCK","..A_CAMERA","..VPORT","..VIEW","POINT"] camera_as_list = ["..BLOCK","..A_CAMERA","VPORT","VIEW","POINT"]
camera_as_menu = prepareMenu("export to: %t", camera_as_list) camera_as_menu = prepareMenu("export to: %t", camera_as_list)
lamp_as_list = ["..BLOCK","..A_LAMP","POINT"] lamp_as_list = ["..BLOCK","..A_LAMP","POINT"]
@ -1655,6 +1912,7 @@ keywords_org = {
'outputDWG_on' : OUTPUT_DWG, 'outputDWG_on' : OUTPUT_DWG,
'to_polyline_on': POLYLINES, 'to_polyline_on': POLYLINES,
'to_polyface_on': POLYFACES, 'to_polyface_on': POLYFACES,
'instances_on': INSTANCES,
'apply_modifiers_on': APPLY_MODIFIERS, 'apply_modifiers_on': APPLY_MODIFIERS,
'include_duplis_on': INCLUDE_DUPLIS, 'include_duplis_on': INCLUDE_DUPLIS,
'camera_selected': CAMERA, 'camera_selected': CAMERA,
@ -1691,7 +1949,7 @@ keywords_org = {
'group_as' : 0, 'group_as' : 0,
'parent_as' : 0, 'parent_as' : 0,
'proxy_as' : 0, 'proxy_as' : 0,
'camera_as': 4, 'camera_as': 3,
'lamp_as' : 2, 'lamp_as' : 2,
} }
@ -2066,7 +2324,7 @@ def draw_UI(): #---------------------------------------------------------------
but_3c = common_column #button 3.column but_3c = common_column #button 3.column
menu_w = (3 * butt_margin) + but_0c + but_1c + but_2c + but_3c #menu width menu_w = (3 * butt_margin) + but_0c + but_1c + but_2c + but_3c #menu width
simple_menu_h = 240 simple_menu_h = 260
extend_menu_h = 345 extend_menu_h = 345
menu_h = simple_menu_h # y is menu upper.y menu_h = simple_menu_h # y is menu upper.y
if config_UI.val: if config_UI.val:
@ -2359,6 +2617,11 @@ def draw_UI(): #---------------------------------------------------------------
GUI_A['to_polyline_on'] = Draw.Toggle('POLYLINE-Mode', EVENT_PRESETPLINE, b0, y, b0_, 20, GUI_A['to_polyline_on'].val, "Export to POLYLINE/POLYFACEs, otherwise to LINEs/3DFACEs on/off") GUI_A['to_polyline_on'] = Draw.Toggle('POLYLINE-Mode', EVENT_PRESETPLINE, b0, y, b0_, 20, GUI_A['to_polyline_on'].val, "Export to POLYLINE/POLYFACEs, otherwise to LINEs/3DFACEs on/off")
#b0, b0_ = but2c, but_2c + butt_margin + but_3c #b0, b0_ = but2c, but_2c + butt_margin + but_3c
y -= 20
b0, b0_ = but0c, but_0c + butt_margin +but_1c
GUI_A['instances_on'] = Draw.Toggle('Instances as BLOCKs', EVENT_NONE, b0, y, b0_, 20, GUI_A['instances_on'].val, "Export instances (multi-users) of Mesh/Curve as BLOCK/INSERTs on/off")
#b0, b0_ = but2c, but_2c + butt_margin + but_3c
y -= 20 y -= 20
b0, b0_ = but0c, but_0c + butt_margin +but_1c b0, b0_ = but0c, but_0c + butt_margin +but_1c
GUI_A['apply_modifiers_on'] = Draw.Toggle('Apply Modifiers', EVENT_NONE, b0, y, b0_, 20, GUI_A['apply_modifiers_on'].val, "Apply modifier stack to mesh objects before export on/off") GUI_A['apply_modifiers_on'] = Draw.Toggle('Apply Modifiers', EVENT_NONE, b0, y, b0_, 20, GUI_A['apply_modifiers_on'].val, "Apply modifier stack to mesh objects before export on/off")
@ -2750,8 +3013,14 @@ def multi_export(DIR): #TODO:
#----------------------------------------------------- #-----------------------------------------------------
if __name__=='__main__': if __name__=='__main__':
if DXF:
print '\n\n\n'
print 'DXF-Exporter v%s *** start ***' %(__version__) #---------------------
print 'with Library %s' %(DXF.__version__) #---------------------
if not DXF.copy: if not DXF.copy:
Draw.PupMenu('Error%t|The dxfLibrary.py script requires a full python install') print "DXF-Exporter: dxfLibrary.py script requires a full Python install"
Draw.PupMenu('Error%t|The dxfLibrary.py script requires a full Python install')
else:
#Window.FileSelector(dxf_export_ui, 'EXPORT DXF', Blender.sys.makename(ext='.dxf')) #Window.FileSelector(dxf_export_ui, 'EXPORT DXF', Blender.sys.makename(ext='.dxf'))
# recall last used DXF-file and INI-file names # recall last used DXF-file and INI-file names
dxffilename = check_RegistryKey('dxfFileName') dxffilename = check_RegistryKey('dxfFileName')

@ -1464,7 +1464,7 @@ def write(filename, batch_objects = None, \
# Write Edge Smoothing # Write Edge Smoothing
file.write(''' file.write('''
LayerElementSmoothing: 0 { LayerElementSmoothing: 1 {
Version: 101 Version: 101
Name: "" Name: ""
MappingInformationType: "ByEdge" MappingInformationType: "ByEdge"

@ -2,14 +2,14 @@
""" """
Name: 'Quake 3 (.map)' Name: 'Quake 3 (.map)'
Blender: 243 Blender: 249
Group: 'Export' Group: 'Export'
Tooltip: 'Export to Quake map format' Tooltip: 'Export to Quake map format'
""" """
__author__ = 'Campbell Barton' __author__ = 'Campbell Barton'
__version__ = '0.1' __version__ = '0.1a'
__email__ = "cbarton@metavr.com" __email__ = "ideasman42@gmail.com"
__bpydoc__ = """\ __bpydoc__ = """\
This script Exports a Quake 3 map format. This script Exports a Quake 3 map format.
@ -234,7 +234,7 @@ def write_node_map(file, ob):
as a MAP node as long as it has the property name - classname as a MAP node as long as it has the property name - classname
returns True/False based on weather a node was written returns True/False based on weather a node was written
''' '''
props= [(p.name, p.data) for p in ob.properties] props= [(p.name, p.data) for p in ob.game_properties]
IS_MAP_NODE= False IS_MAP_NODE= False
for name, value in props: for name, value in props:
@ -287,7 +287,7 @@ def export_map(filepath):
TOTBRUSH= TOTLAMP= TOTNODE= 0 TOTBRUSH= TOTLAMP= TOTNODE= 0
for ob in Object.GetSelected(): for ob in Object.GetSelected():
type= ob.getType() type= ob.type
if type == 'Mesh': obs_mesh.append(ob) if type == 'Mesh': obs_mesh.append(ob)
elif type == 'Surf': obs_surf.append(ob) elif type == 'Surf': obs_surf.append(ob)
elif type == 'Lamp': obs_lamp.append(ob) elif type == 'Lamp': obs_lamp.append(ob)
@ -408,6 +408,7 @@ NULL
print "NOT EXPORTING PATCH", surf_name, u,v, 'Unsupported' print "NOT EXPORTING PATCH", surf_name, u,v, 'Unsupported'
if obs_mesh or obs_surf:
file.write('}\n') # end worldspan file.write('}\n') # end worldspan

@ -2,14 +2,14 @@
""" """
Name: 'Wavefront (.obj)...' Name: 'Wavefront (.obj)...'
Blender: 248 Blender: 249
Group: 'Export' Group: 'Export'
Tooltip: 'Save a Wavefront OBJ File' Tooltip: 'Save a Wavefront OBJ File'
""" """
__author__ = "Campbell Barton, Jiri Hnidek, Paolo Ciccone" __author__ = "Campbell Barton, Jiri Hnidek, Paolo Ciccone"
__url__ = ['http://wiki.blender.org/index.php/Scripts/Manual/Export/wavefront_obj', 'www.blender.org', 'blenderartists.org'] __url__ = ['http://wiki.blender.org/index.php/Scripts/Manual/Export/wavefront_obj', 'www.blender.org', 'blenderartists.org']
__version__ = "1.21" __version__ = "1.22"
__bpydoc__ = """\ __bpydoc__ = """\
This script is an exporter to OBJ file format. This script is an exporter to OBJ file format.
@ -23,11 +23,11 @@ will be exported as mesh data.
""" """
# --------------------------------------------------------------------------
# OBJ Export v1.1 by Campbell Barton (AKA Ideasman)
# --------------------------------------------------------------------------
# ***** BEGIN GPL LICENSE BLOCK ***** # ***** BEGIN GPL LICENSE BLOCK *****
# #
# Script copyright (C) Campbell J Barton 2007-2009
# - V1.22- bspline import/export added (funded by PolyDimensions GmbH)
#
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2 # as published by the Free Software Foundation; either version 2

@ -7,7 +7,7 @@ Group: 'Import'
Tooltip: 'Import for DWG/DXF geometry data.' Tooltip: 'Import for DWG/DXF geometry data.'
""" """
__author__ = 'Kitsu(Ed Blake) & migius(Remigiusz Fiedler)' __author__ = 'Kitsu(Ed Blake) & migius(Remigiusz Fiedler)'
__version__ = '1.12 - 2009.05.27 by migius' __version__ = '1.12 - 2009.06.16 by migius'
__url__ = ["http://blenderartists.org/forum/showthread.php?t=84319", __url__ = ["http://blenderartists.org/forum/showthread.php?t=84319",
"http://wiki.blender.org/index.php/Scripts/Manual/Import/DXF-3D"] "http://wiki.blender.org/index.php/Scripts/Manual/Import/DXF-3D"]
__email__ = ["migius(at)4d-vectors.de","Kitsune_e(at)yahoo.com"] __email__ = ["migius(at)4d-vectors.de","Kitsune_e(at)yahoo.com"]
@ -100,7 +100,7 @@ History:
-- better support for long dxf-layer-names -- better support for long dxf-layer-names
-- add configuration file.ini handles multiple material setups -- add configuration file.ini handles multiple material setups
-- added f_layerFilter -- added f_layerFilter
-- to-check: obj/mat/group/_mapping-idea from ideasman42: -- to-check: obj/mat/group/_mapping-idea from ideasman42
-- curves: added "fill/non-fill" option for closed curves: CIRCLEs,ELLIPSEs,POLYLINEs -- curves: added "fill/non-fill" option for closed curves: CIRCLEs,ELLIPSEs,POLYLINEs
-- "normalize Z" option to correct non-planar figures -- "normalize Z" option to correct non-planar figures
-- LINEs need "width" in 3d-space incl vGroups -- LINEs need "width" in 3d-space incl vGroups
@ -108,11 +108,13 @@ History:
-- add better support for color_index BYLAYER=256, BYBLOCK=0 -- add better support for color_index BYLAYER=256, BYBLOCK=0
-- bug: "oneMesh" produces irregularly errors -- bug: "oneMesh" produces irregularly errors
-- bug: Registry recall from hd_cache ?? only win32 bug?? -- bug: Registry recall from hd_cache ?? only win32 bug??
-- support DXF-definitions of scene, lights and cameras -- support DXF-definitions of autoshade: scene, lights and cameras
-- support ortho mode for VIEWs and VPORTs as cameras -- support ortho mode for VIEWs and VPORTs as cameras
v1.12 - 2009.06.16 by migius
d7 fix for ignored BLOCKs (e.g. *X) which are members of other BLOCKs
v1.12 - 2009.05.27 by migius v1.12 - 2009.05.27 by migius
d6 todo: bugfix negative scaled INSERTs - isLeftHand(Matrix) check d6 bugfix negative scaled INSERTs - isLeftHand(Matrix) check
v1.12 - 2009.05.26 by migius v1.12 - 2009.05.26 by migius
d5 changed to the new 2.49 method Vector.cross() d5 changed to the new 2.49 method Vector.cross()
d5 bugfix WORLDY(1,1,0) to (0,1,0) d5 bugfix WORLDY(1,1,0) to (0,1,0)
@ -161,7 +163,7 @@ History:
a4 added to analyzeTool: report about VIEWs, VPORTs, unused/xref BLOCKs a4 added to analyzeTool: report about VIEWs, VPORTs, unused/xref BLOCKs
a4 bugfix: individual support for 2D/3DPOLYLINE/POLYMESH a4 bugfix: individual support for 2D/3DPOLYLINE/POLYMESH
a4 added to UI: (*wip)BLOCK-(F): name filtering for BLOCKs a4 added to UI: (*wip)BLOCK-(F): name filtering for BLOCKs
a4 added to UI: BLOCK-(n): filter anoname/hatch BLOCKs *X... a4 added to UI: BLOCK-(n): filter noname/hatch BLOCKs *X...
a2 g_scale_as is no more GUI_A-variable a2 g_scale_as is no more GUI_A-variable
a2 bugfix "material": negative sign color_index a2 bugfix "material": negative sign color_index
a2 added support for BLOCKs defined with origin !=(0,0,0) a2 added support for BLOCKs defined with origin !=(0,0,0)
@ -4520,7 +4522,7 @@ def getBlocksmap(drawing, layersmap, layFrozen_on=False): #--------------------
item2str = [item2.name, item2.layer] item2str = [item2.name, item2.layer]
childList.append(item2str) childList.append(item2str)
try: usedblocks[item.name] = [used, childList] try: usedblocks[item.name] = [used, childList]
except KeyError: print 'Cannot map "%s" - "%s" as Block!' %(item.name, item) except KeyError: print 'Cannot find "%s" Block!' %(item.name)
#print 'deb:getBlocksmap: usedblocks=' , usedblocks #------------- #print 'deb:getBlocksmap: usedblocks=' , usedblocks #-------------
#print 'deb:getBlocksmap: layersmap=' , layersmap #------------- #print 'deb:getBlocksmap: layersmap=' , layersmap #-------------
@ -4528,7 +4530,7 @@ def getBlocksmap(drawing, layersmap, layFrozen_on=False): #--------------------
if type(item) != list and item.type == 'insert': if type(item) != list and item.type == 'insert':
if not layersmap or (not layersmap[item.layer].frozen or layFrozen_on): #if insert_layer is not frozen if not layersmap or (not layersmap[item.layer].frozen or layFrozen_on): #if insert_layer is not frozen
try: usedblocks[item.name][0] = True try: usedblocks[item.name][0] = True
except: pass except KeyError: print 'Cannot find "%s" Block!' %(item.name)
key_list = usedblocks.keys() key_list = usedblocks.keys()
key_list.reverse() key_list.reverse()
@ -4536,7 +4538,8 @@ def getBlocksmap(drawing, layersmap, layFrozen_on=False): #--------------------
if usedblocks[key][0]: #if parent used, then set used also all child blocks if usedblocks[key][0]: #if parent used, then set used also all child blocks
for child in usedblocks[key][1]: for child in usedblocks[key][1]:
if not layersmap or (layersmap and not layersmap[child[1]].frozen): #if insert_layer is not frozen if not layersmap or (layersmap and not layersmap[child[1]].frozen): #if insert_layer is not frozen
usedblocks[child[0]][0] = True # marked as used BLOCK try: usedblocks[child[0]][0] = True # marked as used BLOCK
except KeyError: print 'Cannot find "%s" Block!' %(child[0])
usedblocks = [i for i in usedblocks.keys() if usedblocks[i][0]] usedblocks = [i for i in usedblocks.keys() if usedblocks[i][0]]
#print 'deb:getBlocksmap: usedblocks=' , usedblocks #------------- #print 'deb:getBlocksmap: usedblocks=' , usedblocks #-------------

@ -9,7 +9,7 @@ Tooltip: 'Load a Wavefront OBJ File, Shift: batch import all dir.'
__author__= "Campbell Barton", "Jiri Hnidek", "Paolo Ciccone" __author__= "Campbell Barton", "Jiri Hnidek", "Paolo Ciccone"
__url__= ['http://wiki.blender.org/index.php/Scripts/Manual/Import/wavefront_obj', 'blender.org', 'blenderartists.org'] __url__= ['http://wiki.blender.org/index.php/Scripts/Manual/Import/wavefront_obj', 'blender.org', 'blenderartists.org']
__version__= "2.11" __version__= "2.13"
__bpydoc__= """\ __bpydoc__= """\
This script imports a Wavefront OBJ files to Blender. This script imports a Wavefront OBJ files to Blender.
@ -21,7 +21,8 @@ Note, This loads mesh objects and materials only, nurbs and curves are not suppo
# ***** BEGIN GPL LICENSE BLOCK ***** # ***** BEGIN GPL LICENSE BLOCK *****
# #
# Script copyright (C) Campbell J Barton 2007 # Script copyright (C) Campbell J Barton 2007-2009
# - V2.12- bspline import/export added (funded by PolyDimensions GmbH)
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -125,6 +126,16 @@ def create_materials(filepath, material_libs, unique_materials, unique_material_
has_data = image.has_data has_data = image.has_data
texture.image = image texture.image = image
if not has_data:
try:
# first time using this image. We need to load it first
image.glLoad()
except:
# probably the image is crashed
pass
else:
has_data = image.has_data
# Adds textures for materials (rendering) # Adds textures for materials (rendering)
if type == 'Kd': if type == 'Kd':
if has_data and image.depth == 32: if has_data and image.depth == 32:
@ -207,6 +218,7 @@ def create_materials(filepath, material_libs, unique_materials, unique_material_
context_material.setIOR( max(1, min(float(line_split[1]), 3))) # Between 1 and 3 context_material.setIOR( max(1, min(float(line_split[1]), 3))) # Between 1 and 3
elif line_lower.startswith('d') or line_lower.startswith('tr'): elif line_lower.startswith('d') or line_lower.startswith('tr'):
context_material.setAlpha(float(line_split[1])) context_material.setAlpha(float(line_split[1]))
context_material.mode |= Material.Modes.ZTRANSP
elif line_lower.startswith('map_ka'): elif line_lower.startswith('map_ka'):
img_filepath= line_value(line.split()) img_filepath= line_value(line.split())
if img_filepath: if img_filepath:

@ -38,13 +38,13 @@ def my_object_util(sce):
Draw.PupMenu('Error%t|No active object selected') Draw.PupMenu('Error%t|No active object selected')
return return
mats = [ob.matrixWorld for ob in sce.objects.context if ob != ob_act] mats = [(ob, ob.matrixWorld) for ob in sce.objects.context if ob != ob_act]
for m in mats: for ob, m in mats:
ob_copy = ob_act.copy() ob_copy = ob_act.copy()
sce.objects.link(ob_copy) sce.objects.link(ob_copy)
ob_copy.setMatrix(m) ob_copy.setMatrix(m)
ob_copy.Layers = ob.Layers ob_copy.Layers = ob.Layers & (1<<20)-1
def main(): def main():

@ -43,7 +43,7 @@ import bpy
import BPyMesh import BPyMesh
def vertexFakeAO(me, PREF_BLUR_ITERATIONS, PREF_BLUR_RADIUS, PREF_MIN_EDLEN, PREF_CLAMP_CONCAVE, PREF_CLAMP_CONVEX, PREF_SHADOW_ONLY, PREF_SEL_ONLY): def vertexFakeAO(me, PREF_BLUR_ITERATIONS, PREF_BLUR_STRENGTH, PREF_CLAMP_CONCAVE, PREF_CLAMP_CONVEX, PREF_SHADOW_ONLY, PREF_SEL_ONLY):
Window.WaitCursor(1) Window.WaitCursor(1)
Ang= Mathutils.AngleBetweenVecs Ang= Mathutils.AngleBetweenVecs
@ -84,31 +84,33 @@ def vertexFakeAO(me, PREF_BLUR_ITERATIONS, PREF_BLUR_RADIUS, PREF_MIN_EDLEN, PRE
vert_tone[i] = vert_tone[i] / vert_tone_count[i] vert_tone[i] = vert_tone[i] / vert_tone_count[i]
# BLUR TONE # Below we use edges to blur along so the edges need counting, not the faces
edge_lengths= [ ed.length for ed in me.edges] vert_tone_count= [0] * len(me.verts)
for ed in me.edges:
vert_tone_count[ed.v1.index] += 1
vert_tone_count[ed.v2.index] += 1
# Blur tone
blur = PREF_BLUR_STRENGTH
blur_inv = 1.0 - PREF_BLUR_STRENGTH
for i in xrange(PREF_BLUR_ITERATIONS): for i in xrange(PREF_BLUR_ITERATIONS):
# backup the original tones
orig_vert_tone= list(vert_tone) orig_vert_tone= list(vert_tone)
for ii, ed in enumerate(me.edges):
for ed in me.edges:
i1= ed.v1.index i1= ed.v1.index
i2= ed.v2.index i2= ed.v2.index
l= edge_lengths[ii]
f=1.0 val1= (orig_vert_tone[i2]*blur) + (orig_vert_tone[i1]*blur_inv)
if l > PREF_MIN_EDLEN and l < PREF_BLUR_RADIUS: val2= (orig_vert_tone[i1]*blur) + (orig_vert_tone[i2]*blur_inv)
f= l/PREF_BLUR_RADIUS
len_vert_tone_list_i1 = vert_tone_count[i1] # Apply the ton divided by the number of faces connected
len_vert_tone_list_i2 = vert_tone_count[i2] vert_tone[i1]+= val1 / max(vert_tone_count[i1], 1)
vert_tone[i2]+= val2 / max(vert_tone_count[i2], 1)
if not len_vert_tone_list_i1: len_vert_tone_list_i1=1
if not len_vert_tone_list_i2: len_vert_tone_list_i2=1
val1= (orig_vert_tone[i2]/len_vert_tone_list_i1)/ f
val2= (orig_vert_tone[i1]/len_vert_tone_list_i2)/ f
vert_tone[i1]+= val1
vert_tone[i2]+= val2
min_tone= min(vert_tone) min_tone= min(vert_tone)
@ -145,17 +147,15 @@ def main():
me= ob.getData(mesh=1) me= ob.getData(mesh=1)
PREF_BLUR_ITERATIONS= Draw.Create(1) PREF_BLUR_ITERATIONS= Draw.Create(1)
PREF_BLUR_RADIUS= Draw.Create(0.05) PREF_BLUR_STRENGTH= Draw.Create(0.5)
PREF_MIN_EDLEN= Draw.Create(0.01)
PREF_CLAMP_CONCAVE= Draw.Create(90) PREF_CLAMP_CONCAVE= Draw.Create(90)
PREF_CLAMP_CONVEX= Draw.Create(20) PREF_CLAMP_CONVEX= Draw.Create(20)
PREF_SHADOW_ONLY= Draw.Create(0) PREF_SHADOW_ONLY= Draw.Create(0)
PREF_SEL_ONLY= Draw.Create(0) PREF_SEL_ONLY= Draw.Create(0)
pup_block= [\ pup_block= [\
'Post AO Blur',\ 'Post AO Blur',\
('Strength:', PREF_BLUR_STRENGTH, 0, 1, 'Blur strength per iteration'),\
('Iterations:', PREF_BLUR_ITERATIONS, 0, 40, 'Number times to blur the colors. (higher blurs more)'),\ ('Iterations:', PREF_BLUR_ITERATIONS, 0, 40, 'Number times to blur the colors. (higher blurs more)'),\
(' Blur Radius:', PREF_BLUR_RADIUS, 0.01, 40.0, 'How much distance effects blur transfur (higher blurs more).'),\
(' Min EdgeLen:', PREF_MIN_EDLEN, 0.00001, 1.0, 'Minimim edge length to blur (very low values can cause errors).'),\
'Angle Clipping',\ 'Angle Clipping',\
('Highlight Angle:', PREF_CLAMP_CONVEX, 0, 180, 'Less then 180 limits the angle used in the tonal range.'),\ ('Highlight Angle:', PREF_CLAMP_CONVEX, 0, 180, 'Less then 180 limits the angle used in the tonal range.'),\
('Shadow Angle:', PREF_CLAMP_CONCAVE, 0, 180, 'Less then 180 limits the angle used in the tonal range.'),\ ('Shadow Angle:', PREF_CLAMP_CONCAVE, 0, 180, 'Less then 180 limits the angle used in the tonal range.'),\
@ -166,19 +166,16 @@ def main():
if not Draw.PupBlock('SelfShadow...', pup_block): if not Draw.PupBlock('SelfShadow...', pup_block):
return return
PREF_BLUR_ITERATIONS= PREF_BLUR_ITERATIONS.val
PREF_BLUR_RADIUS= PREF_BLUR_RADIUS.val
PREF_MIN_EDLEN= PREF_MIN_EDLEN.val
PREF_CLAMP_CONCAVE= PREF_CLAMP_CONCAVE.val
PREF_CLAMP_CONVEX= PREF_CLAMP_CONVEX.val
PREF_SHADOW_ONLY= PREF_SHADOW_ONLY.val
PREF_SEL_ONLY= PREF_SEL_ONLY.val
if not me.vertexColors: if not me.vertexColors:
me.vertexColors= 1 me.vertexColors= 1
t= sys.time() t= sys.time()
vertexFakeAO(me, PREF_BLUR_ITERATIONS, PREF_BLUR_RADIUS, PREF_MIN_EDLEN, PREF_CLAMP_CONCAVE, PREF_CLAMP_CONVEX, PREF_SHADOW_ONLY, PREF_SEL_ONLY) vertexFakeAO(me, PREF_BLUR_ITERATIONS.val, \
PREF_BLUR_STRENGTH.val, \
PREF_CLAMP_CONCAVE.val, \
PREF_CLAMP_CONVEX.val, \
PREF_SHADOW_ONLY.val, \
PREF_SEL_ONLY.val)
if ob.modifiers: if ob.modifiers:
me.update() me.update()

@ -214,6 +214,7 @@ int AVI_is_avi (char *name) {
AviMovie movie; AviMovie movie;
AviMainHeader header; AviMainHeader header;
AviBitmapInfoHeader bheader; AviBitmapInfoHeader bheader;
int movie_tracks = 0;
DEBUG("opening movie\n"); DEBUG("opening movie\n");
@ -303,6 +304,7 @@ int AVI_is_avi (char *name) {
fclose(movie.fp); fclose(movie.fp);
return 0; return 0;
} }
movie_tracks++;
} }
movie.streams[temp].sh.Flags = GET_FCC (movie.fp); movie.streams[temp].sh.Flags = GET_FCC (movie.fp);
@ -394,7 +396,10 @@ int AVI_is_avi (char *name) {
MEM_freeN(movie.streams); MEM_freeN(movie.streams);
fclose(movie.fp); fclose(movie.fp);
return 1;
/* at least one video track is needed */
return (movie_tracks != 0);
} }
AviError AVI_open_movie (char *name, AviMovie *movie) { AviError AVI_open_movie (char *name, AviMovie *movie) {

@ -44,7 +44,9 @@ typedef struct BodyPoint {
float choke,choke2,frozen; float choke,choke2,frozen;
float colball; float colball;
short flag; short flag;
char octantflag; //char octantflag;
float mass;
float springweight;
} BodyPoint; } BodyPoint;
/* allocates and initializes general main data */ /* allocates and initializes general main data */

@ -795,6 +795,8 @@ void nurbs_to_mesh(Object *ob)
dl= cu->disp.first; dl= cu->disp.first;
while(dl) { while(dl) {
int smooth= dl->rt & CU_SMOOTH ? 1 : 0;
if(dl->type==DL_SEGM) { if(dl->type==DL_SEGM) {
startvert= vertcount; startvert= vertcount;
a= dl->parts*dl->nr; a= dl->parts*dl->nr;
@ -811,6 +813,7 @@ void nurbs_to_mesh(Object *ob)
for(b=1; b<dl->nr; b++) { for(b=1; b<dl->nr; b++) {
mface->v1= startvert+ofs+b-1; mface->v1= startvert+ofs+b-1;
mface->v2= startvert+ofs+b; mface->v2= startvert+ofs+b;
if(smooth) mface->flag |= ME_SMOOTH;
mface++; mface++;
} }
} }
@ -835,6 +838,7 @@ void nurbs_to_mesh(Object *ob)
mface->v1= startvert+ofs+b; mface->v1= startvert+ofs+b;
if(b==dl->nr-1) mface->v2= startvert+ofs; if(b==dl->nr-1) mface->v2= startvert+ofs;
else mface->v2= startvert+ofs+b+1; else mface->v2= startvert+ofs+b+1;
if(smooth) mface->flag |= ME_SMOOTH;
mface++; mface++;
} }
} }
@ -860,6 +864,7 @@ void nurbs_to_mesh(Object *ob)
mface->v4= 0; mface->v4= 0;
test_index_face(mface, NULL, 0, 3); test_index_face(mface, NULL, 0, 3);
if(smooth) mface->flag |= ME_SMOOTH;
mface++; mface++;
index+= 3; index+= 3;
} }
@ -907,6 +912,8 @@ void nurbs_to_mesh(Object *ob)
mface->v4= p2; mface->v4= p2;
mface->mat_nr= (unsigned char)dl->col; mface->mat_nr= (unsigned char)dl->col;
test_index_face(mface, NULL, 0, 4); test_index_face(mface, NULL, 0, 4);
if(smooth) mface->flag |= ME_SMOOTH;
mface++; mface++;
p4= p3; p4= p3;

@ -82,7 +82,7 @@ variables on the UI for now
#include "BKE_DerivedMesh.h" #include "BKE_DerivedMesh.h"
#include "BKE_pointcache.h" #include "BKE_pointcache.h"
#include "BKE_modifier.h" #include "BKE_modifier.h"
#include "BKE_deform.h"
//XXX #include "BIF_editdeform.h" //XXX #include "BIF_editdeform.h"
//XXX #include "BIF_graphics.h" //XXX #include "BIF_graphics.h"
#include "PIL_time.h" #include "PIL_time.h"
@ -2051,7 +2051,7 @@ static void sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float fo
BodyPoint *bp1,*bp2; BodyPoint *bp1,*bp2;
float dir[3],dvel[3]; float dir[3],dvel[3];
float distance,forcefactor,kd,absvel,projvel; float distance,forcefactor,kd,absvel,projvel,kw;
int ia,ic; int ia,ic;
/* prepare depending on which side of the spring we are on */ /* prepare depending on which side of the spring we are on */
if (bpi == bs->v1){ if (bpi == bs->v1){
@ -2085,7 +2085,10 @@ static void sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float fo
forcefactor = iks/bs->len; forcefactor = iks/bs->len;
else else
forcefactor = iks; forcefactor = iks;
forcefactor *= bs->strength; kw = (bp1->springweight+bp2->springweight)/2.0f;
kw = kw * kw;
kw = kw * kw;
forcefactor *= bs->strength * kw;
Vec3PlusStVec(bp1->force,(bs->len - distance)*forcefactor,dir); Vec3PlusStVec(bp1->force,(bs->len - distance)*forcefactor,dir);
/* do bp1 <--> bp2 viscous */ /* do bp1 <--> bp2 viscous */
@ -2185,14 +2188,14 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo
VecMidf(velcenter, bp->vec, obp->vec); VecMidf(velcenter, bp->vec, obp->vec);
VecSubf(dvel,velcenter,bp->vec); VecSubf(dvel,velcenter,bp->vec);
VecMulf(dvel,sb->nodemass); VecMulf(dvel,bp->mass);
Vec3PlusStVec(bp->force,f*(1.0f-sb->balldamp),def); Vec3PlusStVec(bp->force,f*(1.0f-sb->balldamp),def);
Vec3PlusStVec(bp->force,sb->balldamp,dvel); Vec3PlusStVec(bp->force,sb->balldamp,dvel);
/* exploit force(a,b) == -force(b,a) part2/2 */ /* exploit force(a,b) == -force(b,a) part2/2 */
VecSubf(dvel,velcenter,obp->vec); VecSubf(dvel,velcenter,obp->vec);
VecMulf(dvel,sb->nodemass); VecMulf(dvel,bp->mass);
Vec3PlusStVec(obp->force,sb->balldamp,dvel); Vec3PlusStVec(obp->force,sb->balldamp,dvel);
Vec3PlusStVec(obp->force,-f*(1.0f-sb->balldamp),def); Vec3PlusStVec(obp->force,-f*(1.0f-sb->balldamp),def);
@ -2237,7 +2240,7 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo
/* gravitation */ /* gravitation */
if (sb){ if (sb){
float gravity = sb->grav * sb_grav_force_scale(ob); float gravity = sb->grav * sb_grav_force_scale(ob);
bp->force[2]-= gravity*sb->nodemass; /* individual mass of node here */ bp->force[2]-= gravity*bp->mass; /* individual mass of node here */
} }
/* particle field & vortex */ /* particle field & vortex */
@ -2549,7 +2552,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa
VecMidf(velcenter, bp->vec, obp->vec); VecMidf(velcenter, bp->vec, obp->vec);
VecSubf(dvel,velcenter,bp->vec); VecSubf(dvel,velcenter,bp->vec);
VecMulf(dvel,sb->nodemass); VecMulf(dvel,bp->mass);
Vec3PlusStVec(bp->force,f*(1.0f-sb->balldamp),def); Vec3PlusStVec(bp->force,f*(1.0f-sb->balldamp),def);
Vec3PlusStVec(bp->force,sb->balldamp,dvel); Vec3PlusStVec(bp->force,sb->balldamp,dvel);
@ -2580,7 +2583,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa
/* exploit force(a,b) == -force(b,a) part2/2 */ /* exploit force(a,b) == -force(b,a) part2/2 */
VecSubf(dvel,velcenter,obp->vec); VecSubf(dvel,velcenter,obp->vec);
VecMulf(dvel,sb->nodemass); VecMulf(dvel,(bp->mass+obp->mass)/2.0f);
Vec3PlusStVec(obp->force,sb->balldamp,dvel); Vec3PlusStVec(obp->force,sb->balldamp,dvel);
Vec3PlusStVec(obp->force,-f*(1.0f-sb->balldamp),def); Vec3PlusStVec(obp->force,-f*(1.0f-sb->balldamp),def);
@ -2640,8 +2643,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa
/* gravitation */ /* gravitation */
bp->force[2]-= gravity*sb->nodemass; /* individual mass of node here */ bp->force[2]-= gravity*bp->mass; /* individual mass of node here */
//bp->force[1]-= gravity*sb->nodemass; /* individual mass of node here */
/* particle field & vortex */ /* particle field & vortex */
@ -2850,11 +2852,20 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float *
aabbmin[0]=aabbmin[1]=aabbmin[2] = 1e20f; aabbmin[0]=aabbmin[1]=aabbmin[2] = 1e20f;
aabbmax[0]=aabbmax[1]=aabbmax[2] = -1e20f; aabbmax[0]=aabbmax[1]=aabbmax[2] = -1e20f;
/* old one with homogenous masses */
/* claim a minimum mass for vertex */ /* claim a minimum mass for vertex */
/*
if (sb->nodemass > 0.009999f) timeovermass = forcetime/sb->nodemass; if (sb->nodemass > 0.009999f) timeovermass = forcetime/sb->nodemass;
else timeovermass = forcetime/0.009999f; else timeovermass = forcetime/0.009999f;
*/
for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) { for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
/* now we have individual masses */
/* claim a minimum mass for vertex */
if (bp->mass > 0.009999f) timeovermass = forcetime/bp->mass;
else timeovermass = forcetime/0.009999f;
if(bp->goal < SOFTGOALSNAP){ if(bp->goal < SOFTGOALSNAP){
/* this makes t~ = t */ /* this makes t~ = t */
if(mid_flags & MID_PRESERVE) VECCOPY(dx,bp->vec); if(mid_flags & MID_PRESERVE) VECCOPY(dx,bp->vec);
@ -3228,10 +3239,36 @@ static void mesh_to_softbody(Scene *scene, Object *ob)
/* to proove the concept /* to proove the concept
this would enable per vertex *mass painting* this would enable per vertex *mass painting*
strcpy(name,"SOFTMASS");
error = get_scalar_from_named_vertexgroup(ob,name, a,&temp);
if (!error) bp->mass = temp * ob->rangeofmass;
*/ */
/* first set the default */
bp->mass = sb->nodemass;
if (sb->namedVG_Mass[0])
{
int grp= get_named_vertexgroup_num (ob,sb->namedVG_Mass);
/* printf("VGN %s %d \n",sb->namedVG_Mass,grp); */
if(grp > -1){
get_scalar_from_vertexgroup(ob, a,(short) (grp), &bp->mass);
bp->mass = bp->mass * sb->nodemass;
/* printf("bp->mass %f \n",bp->mass); */
}
}
/* first set the default */
bp->springweight = 1.0f;
if (sb->namedVG_Spring_K[0])
{
int grp= get_named_vertexgroup_num (ob,sb->namedVG_Spring_K);
//printf("VGN %s %d \n",sb->namedVG_Spring_K,grp);
if(grp > -1){
get_scalar_from_vertexgroup(ob, a,(short) (grp), &bp->springweight);
//printf("bp->springweight %f \n",bp->springweight);
}
}
} }
/* but we only optionally add body edge springs */ /* but we only optionally add body edge springs */

@ -4126,6 +4126,9 @@ static void direct_link_scene(FileData *fd, Scene *sce)
} else { } else {
seq->strip->color_balance = 0; seq->strip->color_balance = 0;
} }
if (seq->strip->color_balance) {
// seq->strip->color_balance->gui = 0; // XXX - peter, is this relevant in 2.5?
}
} }
} }
SEQ_END SEQ_END

@ -104,7 +104,9 @@ static int writetab(FILE *outf, unsigned int *tab, int len);
static void readtab(FILE *inf, unsigned int *tab, int len); static void readtab(FILE *inf, unsigned int *tab, int len);
static void expandrow(unsigned char *optr, unsigned char *iptr, int z); static void expandrow(unsigned char *optr, unsigned char *iptr, int z);
static void expandrow2(float *optr, unsigned char *iptr, int z);
static void interleaverow(unsigned char *lptr, unsigned char *cptr, int z, int n); static void interleaverow(unsigned char *lptr, unsigned char *cptr, int z, int n);
static void interleaverow2(float *lptr, unsigned char *cptr, int z, int n);
static int compressrow(unsigned char *lbuf, unsigned char *rlebuf, int z, int cnt); static int compressrow(unsigned char *lbuf, unsigned char *rlebuf, int z, int cnt);
static void lumrow(unsigned char *rgbptr, unsigned char *lumptr, int n); static void lumrow(unsigned char *rgbptr, unsigned char *lumptr, int n);
@ -233,6 +235,7 @@ static void test_endian_zbuf(struct ImBuf *ibuf)
struct ImBuf *imb_loadiris(unsigned char *mem, int flags) struct ImBuf *imb_loadiris(unsigned char *mem, int flags)
{ {
unsigned int *base, *lptr = NULL; unsigned int *base, *lptr = NULL;
float *fbase, *fptr = NULL;
unsigned int *zbase, *zptr; unsigned int *zbase, *zptr;
unsigned char *rledat; unsigned char *rledat;
unsigned int *starttab, *lengthtab; unsigned int *starttab, *lengthtab;
@ -242,7 +245,6 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags)
int xsize, ysize, zsize; int xsize, ysize, zsize;
int bpp, rle, cur, badorder; int bpp, rle, cur, badorder;
ImBuf * ibuf; ImBuf * ibuf;
uchar * rect;
/*printf("new iris\n");*/ /*printf("new iris\n");*/
@ -257,8 +259,8 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags)
rle = ISRLE(image.type); rle = ISRLE(image.type);
bpp = BPP(image.type); bpp = BPP(image.type);
if(bpp != 1 ) { if(bpp != 1 && bpp != 2) {
fprintf(stderr,"longimagedata: image must have 1 byte per pix chan\n"); fprintf(stderr,"longimagedata: image must have 1 or 2 byte per pix chan\n");
return(0); return(0);
} }
@ -273,6 +275,7 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags)
} }
if (rle) { if (rle) {
tablen = ysize*zsize*sizeof(int); tablen = ysize*zsize*sizeof(int);
starttab = (unsigned int *)malloc(tablen); starttab = (unsigned int *)malloc(tablen);
lengthtab = (unsigned int *)malloc(tablen); lengthtab = (unsigned int *)malloc(tablen);
@ -296,6 +299,8 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags)
break; break;
} }
if (bpp == 1) {
ibuf = IMB_allocImBuf(xsize, ysize, 8 * zsize, IB_rect, 0); ibuf = IMB_allocImBuf(xsize, ysize, 8 * zsize, IB_rect, 0);
if (ibuf->depth > 32) ibuf->depth = 32; if (ibuf->depth > 32) ibuf->depth = 32;
base = ibuf->rect; base = ibuf->rect;
@ -314,8 +319,7 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags)
lptr += xsize; lptr += xsize;
} }
} }
} } else {
else {
lptr = base; lptr = base;
zptr = zbase; zptr = zbase;
for(y=0; y<ysize; y++) { for(y=0; y<ysize; y++) {
@ -335,10 +339,51 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags)
} }
} }
} else { /* bpp == 2 */
ibuf = IMB_allocImBuf(xsize, ysize, 32, (flags & IB_rect)|IB_rectfloat, 0);
fbase = ibuf->rect_float;
if (badorder) {
for(z=0; z<zsize; z++) {
fptr = fbase;
for(y=0; y<ysize; y++) {
file_offset = starttab[y+z*ysize];
rledat = file_data + file_offset;
file_offset += lengthtab[y+z*ysize];
expandrow2(fptr, rledat, 3-z);
fptr += xsize * 4;
}
}
} else {
fptr = fbase;
for(y=0; y<ysize; y++) {
for(z=0; z<zsize; z++) {
file_offset = starttab[y+z*ysize];
rledat = file_data + file_offset;
file_offset += lengthtab[y+z*ysize];
expandrow2(fptr, rledat, 3-z);
}
fptr += xsize * 4;
}
}
}
free(starttab); free(starttab);
free(lengthtab); free(lengthtab);
}
else { } else {
if (bpp == 1) {
ibuf = IMB_allocImBuf(xsize, ysize, 8 * zsize, IB_rect, 0); ibuf = IMB_allocImBuf(xsize, ysize, 8 * zsize, IB_rect, 0);
if (ibuf->depth > 32) ibuf->depth = 32; if (ibuf->depth > 32) ibuf->depth = 32;
@ -362,7 +407,35 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags)
lptr += xsize; lptr += xsize;
} }
} }
} else { /* bpp == 2 */
ibuf = IMB_allocImBuf(xsize, ysize, 32, (flags & IB_rect)|IB_rectfloat, 0);
fbase = ibuf->rect_float;
file_offset = 512;
rledat = file_data + file_offset;
for(z = 0; z < zsize; z++) {
fptr = fbase;
for(y = 0; y < ysize; y++) {
interleaverow2(fptr, rledat, 3-z, xsize);
rledat += xsize * 2;
fptr += xsize * 4;
} }
}
}
}
if (bpp == 1) {
uchar * rect;
if (image.zsize == 1){ if (image.zsize == 1){
rect = (uchar *) ibuf->rect; rect = (uchar *) ibuf->rect;
@ -388,6 +461,38 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags)
} }
} }
} else { /* bpp == 2 */
if (image.zsize == 1){
fbase = ibuf->rect_float;
for (x = ibuf->x * ibuf->y; x > 0; x--) {
fbase[0] = 1;
fbase[1] = fbase[2] = fbase[3];
fbase += 4;
}
} else if (image.zsize == 2){
/* grayscale with alpha */
fbase = ibuf->rect_float;
for (x = ibuf->x * ibuf->y; x > 0; x--) {
fbase[0] = fbase[2];
fbase[1] = fbase[2] = fbase[3];
fbase += 4;
}
} else if (image.zsize == 3){
/* add alpha */
fbase = ibuf->rect_float;
for (x = ibuf->x * ibuf->y; x > 0; x--) {
fbase[0] = 1;
fbase += 4;
}
}
if (flags & IB_rect) {
IMB_rect_from_float(ibuf);
}
}
ibuf->ftype = IMAGIC; ibuf->ftype = IMAGIC;
if (flags & IB_ttob) IMB_flipy(ibuf); if (flags & IB_ttob) IMB_flipy(ibuf);
@ -412,6 +517,71 @@ static void interleaverow(unsigned char *lptr, unsigned char *cptr, int z, int n
} }
} }
static void interleaverow2(float *lptr, unsigned char *cptr, int z, int n)
{
lptr += z;
while(n--) {
*lptr = ((cptr[0]<<8) | (cptr[1]<<0)) / (float)0xFFFF;
cptr += 2;
lptr += 4;
}
}
static void expandrow2(float *optr, unsigned char *iptr, int z)
{
unsigned short pixel, count;
float pixel_f;
optr += z;
while(1) {
pixel = (iptr[0]<<8) | (iptr[1]<<0);
iptr += 2;
if ( !(count = (pixel & 0x7f)) )
return;
if(pixel & 0x80) {
while(count>=8) {
optr[0*4] = ((iptr[0]<<8) | (iptr[1]<<0))/(float)0xFFFF;
optr[1*4] = ((iptr[2]<<8) | (iptr[3]<<0))/(float)0xFFFF;
optr[2*4] = ((iptr[4]<<8) | (iptr[5]<<0))/(float)0xFFFF;
optr[3*4] = ((iptr[6]<<8) | (iptr[7]<<0))/(float)0xFFFF;
optr[4*4] = ((iptr[8]<<8) | (iptr[9]<<0))/(float)0xFFFF;
optr[5*4] = ((iptr[10]<<8) | (iptr[11]<<0))/(float)0xFFFF;
optr[6*4] = ((iptr[12]<<8) | (iptr[13]<<0))/(float)0xFFFF;
optr[7*4] = ((iptr[14]<<8) | (iptr[15]<<0))/(float)0xFFFF;
optr += 8*4;
iptr += 8*2;
count -= 8;
}
while(count--) {
*optr = ((iptr[0]<<8) | (iptr[1]<<0))/(float)0xFFFF;
iptr+=2;
optr+=4;
}
} else {
pixel_f = ((iptr[0]<<8) | (iptr[1]<<0))/(float)0xFFFF;
iptr += 2;
while(count>=8) {
optr[0*4] = pixel_f;
optr[1*4] = pixel_f;
optr[2*4] = pixel_f;
optr[3*4] = pixel_f;
optr[4*4] = pixel_f;
optr[5*4] = pixel_f;
optr[6*4] = pixel_f;
optr[7*4] = pixel_f;
optr += 8*4;
count -= 8;
}
while(count--) {
*optr = pixel_f;
optr+=4;
}
}
}
}
static void expandrow(unsigned char *optr, unsigned char *iptr, int z) static void expandrow(unsigned char *optr, unsigned char *iptr, int z)
{ {
unsigned char pixel, count; unsigned char pixel, count;

@ -401,8 +401,6 @@ int imb_get_anim_type(char * name) {
if (ib_stat(name,&st) == -1) return(0); if (ib_stat(name,&st) == -1) return(0);
if (((st.st_mode) & S_IFMT) != S_IFREG) return(0); if (((st.st_mode) & S_IFMT) != S_IFREG) return(0);
if (isavi(name)) return (ANIM_AVI);
if (ismovie(name)) return (ANIM_MOVIE); if (ismovie(name)) return (ANIM_MOVIE);
# ifdef WITH_QUICKTIME # ifdef WITH_QUICKTIME
if (isqtime(name)) return (ANIM_QTIME); if (isqtime(name)) return (ANIM_QTIME);
@ -410,6 +408,7 @@ int imb_get_anim_type(char * name) {
# ifdef WITH_FFMPEG # ifdef WITH_FFMPEG
if (isffmpeg(name)) return (ANIM_FFMPEG); if (isffmpeg(name)) return (ANIM_FFMPEG);
# endif # endif
if (isavi(name)) return (ANIM_AVI);
#endif #endif
#ifdef WITH_REDCODE #ifdef WITH_REDCODE
if (isredcode(name)) return (ANIM_REDCODE); if (isredcode(name)) return (ANIM_REDCODE);

@ -165,12 +165,17 @@ typedef struct SoftBody {
int totpoint, totspring; int totpoint, totspring;
struct BodyPoint *bpoint; /* not saved in file */ struct BodyPoint *bpoint; /* not saved in file */
struct BodySpring *bspring; /* not saved in file */ struct BodySpring *bspring; /* not saved in file */
float pad; char pad;
char msg_lock;
short msg_value;
/* part of UI: */ /* part of UI: */
/* general options */ /* general options */
float nodemass; /* softbody mass of *vertex* */ float nodemass; /* softbody mass of *vertex* */
char namedVG_Mass[32]; /* along with it introduce mass painting
starting to fix old bug .. nastyness that VG are indexes
rather find them by name tag to find it -> jow20090613 */
float grav; /* softbody amount of gravitaion to apply */ float grav; /* softbody amount of gravitaion to apply */
float mediafrict; /* friction to env */ float mediafrict; /* friction to env */
float rklimit; /* error limit for ODE solver */ float rklimit; /* error limit for ODE solver */
@ -183,12 +188,17 @@ typedef struct SoftBody {
float maxgoal; float maxgoal;
float defgoal; /* default goal for vertices without vgroup */ float defgoal; /* default goal for vertices without vgroup */
short vertgroup; /* index starting at 1 */ short vertgroup; /* index starting at 1 */
char namedVG_Softgoal[32]; /* starting to fix old bug .. nastyness that VG are indexes
rather find them by name tag to find it -> jow20090613 */
short fuzzyness; /* */ short fuzzyness; /* */
/* springs */ /* springs */
float inspring; /* softbody inner springs */ float inspring; /* softbody inner springs */
float infrict; /* softbody inner springs friction */ float infrict; /* softbody inner springs friction */
char namedVG_Spring_K[32]; /* along with it introduce Spring_K painting
starting to fix old bug .. nastyness that VG are indexes
rather find them by name tag to find it -> jow20090613 */
/* baking */ /* baking */
int sfra, efra; int sfra, efra;
@ -291,7 +301,7 @@ typedef struct SoftBody {
#define OB_SB_FACECOLL 1024 #define OB_SB_FACECOLL 1024
#define OB_SB_EDGECOLL 2048 #define OB_SB_EDGECOLL 2048
#define OB_SB_COLLFINAL 4096 #define OB_SB_COLLFINAL 4096
//#define OB_SB_PROTECT_CACHE 8192 #define OB_SB_BIG_UI 8192
#define OB_SB_AERO_ANGLE 16384 #define OB_SB_AERO_ANGLE 16384
/* sb->solverflags */ /* sb->solverflags */

@ -65,18 +65,48 @@ static void do_mapuv(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *uvbuf, float thr
for(x=0; x<sx; x++, out+=4, uv+=3, uvnext+=3, uvprev+=3) { for(x=0; x<sx; x++, out+=4, uv+=3, uvnext+=3, uvprev+=3) {
if(x>0 && x<sx-1 && y>0 && y<sy-1) { if(x>0 && x<sx-1 && y>0 && y<sy-1) {
if(uv[2]!=0.0f) { if(uv[2]!=0.0f) {
float uv_l, uv_r;
/* adaptive sampling, red (U) channel */ /* adaptive sampling, red (U) channel */
dx= 0.5f*(fabs(uv[0]-uv[-3]) + fabs(uv[0]-uv[3]));
dx+= 0.25f*(fabs(uv[0]-uvprev[-3]) + fabs(uv[0]-uvnext[-3])); /* prevent alpha zero UVs to be used */
dx+= 0.25f*(fabs(uv[0]-uvprev[+3]) + fabs(uv[0]-uvnext[+3])); uv_l= uv[-1]!=0.0f? fabs(uv[0]-uv[-3]) : 0.0f;
uv_r= uv[ 5]!=0.0f? fabs(uv[0]-uv[ 3]) : 0.0f;
//dx= 0.5f*(fabs(uv[0]-uv[-3]) + fabs(uv[0]-uv[3]));
dx= 0.5f*(uv_l + uv_r);
uv_l= uvprev[-1]!=0.0f? fabs(uv[0]-uvprev[-3]) : 0.0f;
uv_r= uvnext[-1]!=0.0f? fabs(uv[0]-uvnext[-3]) : 0.0f;
//dx+= 0.25f*(fabs(uv[0]-uvprev[-3]) + fabs(uv[0]-uvnext[-3]));
dx+= 0.25f*(uv_l + uv_r);
uv_l= uvprev[ 5]!=0.0f? fabs(uv[0]-uvprev[+3]) : 0.0f;
uv_r= uvnext[ 5]!=0.0f? fabs(uv[0]-uvnext[+3]) : 0.0f;
//dx+= 0.25f*(fabs(uv[0]-uvprev[+3]) + fabs(uv[0]-uvnext[+3]));
dx+= 0.25f*(uv_l + uv_r);
/* adaptive sampling, green (V) channel */ /* adaptive sampling, green (V) channel */
dy= 0.5f*(fabs(uv[1]-uv[-row+1]) + fabs(uv[1]-uv[row+1]));
dy+= 0.25f*(fabs(uv[1]-uvprev[+1-3]) + fabs(uv[1]-uvnext[+1-3])); uv_l= uv[-row+2]!=0.0f? fabs(uv[1]-uv[-row+1]) : 0.0f;
dy+= 0.25f*(fabs(uv[1]-uvprev[+1+3]) + fabs(uv[1]-uvnext[+1+3])); uv_r= uv[ row+2]!=0.0f? fabs(uv[1]-uv[ row+1]) : 0.0f;
//dy= 0.5f*(fabs(uv[1]-uv[-row+1]) + fabs(uv[1]-uv[row+1]));
dy= 0.5f*(uv_l + uv_r);
uv_l= uvprev[-1]!=0.0f? fabs(uv[1]-uvprev[+1-3]) : 0.0f;
uv_r= uvnext[-1]!=0.0f? fabs(uv[1]-uvnext[+1-3]) : 0.0f;
//dy+= 0.25f*(fabs(uv[1]-uvprev[+1-3]) + fabs(uv[1]-uvnext[+1-3]));
dy+= 0.25f*(uv_l + uv_r);
uv_l= uvprev[ 5]!=0.0f? fabs(uv[1]-uvprev[+1+3]) : 0.0f;
uv_r= uvnext[ 5]!=0.0f? fabs(uv[1]-uvnext[+1+3]) : 0.0f;
//dy+= 0.25f*(fabs(uv[1]-uvprev[+1+3]) + fabs(uv[1]-uvnext[+1+3]));
dy+= 0.25f*(uv_l + uv_r);
/* UV to alpha threshold */ /* UV to alpha threshold */
alpha= 1.0f - threshold*(dx+dy); alpha= 1.0f - threshold*(dx+dy);

@ -61,11 +61,13 @@ extern struct Render R;
static ListBase *get_lights(ShadeInput *shi) static ListBase *get_lights(ShadeInput *shi)
{ {
if(R.r.scemode & R_PREVIEWBUTS)
return &R.lights;
if(shi->light_override) if(shi->light_override)
return &shi->light_override->gobject; return &shi->light_override->gobject;
else if(shi->mat && shi->mat->group) if(shi->mat && shi->mat->group)
return &shi->mat->group->gobject; return &shi->mat->group->gobject;
else
return &R.lights; return &R.lights;
} }

@ -2571,7 +2571,7 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int ef
TexResult texres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL}; TexResult texres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL};
float *co = NULL, *dx = NULL, *dy = NULL, fact, stencilTin=1.0; float *co = NULL, *dx = NULL, *dy = NULL, fact, stencilTin=1.0;
float texvec[3], dxt[3], dyt[3], tempvec[3]; float texvec[3], dxt[3], dyt[3], tempvec[3];
int tex_nr, rgb= 0; int i, tex_nr, rgb= 0;
if (R.r.scemode & R_NO_TEX) return; if (R.r.scemode & R_NO_TEX) return;
tex_nr= 0; tex_nr= 0;
@ -2647,21 +2647,33 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int ef
else texvec[2]= mtex->size[2]*(mtex->ofs[2]); else texvec[2]= mtex->size[2]*(mtex->ofs[2]);
if(shi->osatex) { if(shi->osatex) {
if (!dx) {
for(i=0;i<2;i++) {
dxt[i] = dyt[i] = 0.0;
}
} else {
if(mtex->projx) { if(mtex->projx) {
dxt[0]= mtex->size[0]*dx[mtex->projx-1]; dxt[0]= mtex->size[0]*dx[mtex->projx-1];
dyt[0]= mtex->size[0]*dy[mtex->projx-1]; dyt[0]= mtex->size[0]*dy[mtex->projx-1];
} else {
dxt[0]= 0.0;
dyt[0]= 0.0;
} }
else dxt[0]= 0.0;
if(mtex->projy) { if(mtex->projy) {
dxt[1]= mtex->size[1]*dx[mtex->projy-1]; dxt[1]= mtex->size[1]*dx[mtex->projy-1];
dyt[1]= mtex->size[1]*dy[mtex->projy-1]; dyt[1]= mtex->size[1]*dy[mtex->projy-1];
} else {
dxt[1]= 0.0;
dyt[1]= 0.0;
} }
else dxt[1]= 0.0; if(mtex->projz) {
if(mtex->projx) {
dxt[2]= mtex->size[2]*dx[mtex->projz-1]; dxt[2]= mtex->size[2]*dx[mtex->projz-1];
dyt[2]= mtex->size[2]*dy[mtex->projz-1]; dyt[2]= mtex->size[2]*dy[mtex->projz-1];
} else {
dxt[2]= 0.0;
dyt[2]= 0.0;
}
} }
else dxt[2]= 0.0;
} }
/* texture */ /* texture */

@ -261,6 +261,12 @@ void KX_BlenderRenderTools::applyTransform(RAS_IRasterizer* rasty,double* oglmat
// couldn't find something to cast the shadow on... // couldn't find something to cast the shadow on...
glMultMatrixd(oglmatrix); glMultMatrixd(oglmatrix);
} }
else
{ // we found the "ground", but the cast matrix doesn't take
// scaling in consideration, so we must apply the object scale
MT_Vector3 size = gameobj->GetSGNode()->GetLocalScale();
glScalef(size[0], size[1], size[2]);
}
} else } else
{ {
@ -385,4 +391,3 @@ void KX_BlenderRenderTools::Render2DFilters(RAS_ICanvas* canvas)
{ {
m_filtermanager.RenderFilters(canvas); m_filtermanager.RenderFilters(canvas);
} }

@ -805,6 +805,10 @@ PyObject* BL_ActionActuator::PyGetChannel(PyObject* value) {
bPoseChannel *pchan; bPoseChannel *pchan;
if(m_userpose==NULL && m_pose==NULL) {
BL_ArmatureObject *obj = (BL_ArmatureObject*)GetParent();
obj->GetPose(&m_pose); /* Get the underlying pose from the armature */
}
// get_pose_channel accounts for NULL pose, run on both incase one exists but // get_pose_channel accounts for NULL pose, run on both incase one exists but
// the channel doesnt // the channel doesnt
@ -950,15 +954,19 @@ KX_PYMETHODDEF_DOC(BL_ActionActuator, setChannel,
obj->GetPose(&m_pose); /* Get the underlying pose from the armature */ obj->GetPose(&m_pose); /* Get the underlying pose from the armature */
if (!m_userpose) { if (!m_userpose) {
if(!m_pose)
obj->GetPose(&m_pose); /* Get the underlying pose from the armature */ obj->GetPose(&m_pose); /* Get the underlying pose from the armature */
game_copy_pose(&m_userpose, m_pose); game_copy_pose(&m_userpose, m_pose);
} }
pchan= verify_pose_channel(m_userpose, string); // adds the channel if its not there. // pchan= verify_pose_channel(m_userpose, string); // adds the channel if its not there.
pchan= get_pose_channel(m_userpose, string); // adds the channel if its not there.
if(pchan) {
VECCOPY (pchan->loc, matrix[3]); VECCOPY (pchan->loc, matrix[3]);
Mat4ToSize(matrix, pchan->size); Mat4ToSize(matrix, pchan->size);
Mat4ToQuat(matrix, pchan->quat); Mat4ToQuat(matrix, pchan->quat);
} }
}
else { else {
MT_Vector3 loc; MT_Vector3 loc;
MT_Vector3 size; MT_Vector3 size;
@ -969,16 +977,25 @@ KX_PYMETHODDEF_DOC(BL_ActionActuator, setChannel,
// same as above // same as above
if (!m_userpose) { if (!m_userpose) {
if(!m_pose)
obj->GetPose(&m_pose); /* Get the underlying pose from the armature */ obj->GetPose(&m_pose); /* Get the underlying pose from the armature */
game_copy_pose(&m_userpose, m_pose); game_copy_pose(&m_userpose, m_pose);
} }
pchan= verify_pose_channel(m_userpose, string); // pchan= verify_pose_channel(m_userpose, string);
pchan= get_pose_channel(m_userpose, string); // adds the channel if its not there.
// for some reason loc.setValue(pchan->loc) fails // for some reason loc.setValue(pchan->loc) fails
if(pchan) {
pchan->loc[0]= loc[0]; pchan->loc[1]= loc[1]; pchan->loc[2]= loc[2]; pchan->loc[0]= loc[0]; pchan->loc[1]= loc[1]; pchan->loc[2]= loc[2];
pchan->size[0]= size[0]; pchan->size[1]= size[1]; pchan->size[2]= size[2]; pchan->size[0]= size[0]; pchan->size[1]= size[1]; pchan->size[2]= size[2];
pchan->quat[0]= quat[3]; pchan->quat[1]= quat[0]; pchan->quat[2]= quat[1]; pchan->quat[3]= quat[2]; /* notice xyzw -> wxyz is intentional */ pchan->quat[0]= quat[3]; pchan->quat[1]= quat[0]; pchan->quat[2]= quat[1]; pchan->quat[3]= quat[2]; /* notice xyzw -> wxyz is intentional */
} }
}
if(pchan==NULL) {
PyErr_SetString(PyExc_ValueError, "Channel could not be found, use the 'channelNames' attribute to get a list of valid channels");
return NULL;
}
pchan->flag |= POSE_ROT|POSE_LOC|POSE_SIZE; pchan->flag |= POSE_ROT|POSE_LOC|POSE_SIZE;
Py_RETURN_NONE; Py_RETURN_NONE;
@ -1051,6 +1068,7 @@ PyAttributeDef BL_ActionActuator::Attributes[] = {
KX_PYATTRIBUTE_FLOAT_RW("frameEnd", 0, MAXFRAMEF, BL_ActionActuator, m_endframe), KX_PYATTRIBUTE_FLOAT_RW("frameEnd", 0, MAXFRAMEF, BL_ActionActuator, m_endframe),
KX_PYATTRIBUTE_FLOAT_RW("blendIn", 0, MAXFRAMEF, BL_ActionActuator, m_blendin), KX_PYATTRIBUTE_FLOAT_RW("blendIn", 0, MAXFRAMEF, BL_ActionActuator, m_blendin),
KX_PYATTRIBUTE_RW_FUNCTION("action", BL_ActionActuator, pyattr_get_action, pyattr_set_action), KX_PYATTRIBUTE_RW_FUNCTION("action", BL_ActionActuator, pyattr_get_action, pyattr_set_action),
KX_PYATTRIBUTE_RO_FUNCTION("channelNames", BL_ActionActuator, pyattr_get_channel_names),
KX_PYATTRIBUTE_SHORT_RW("priority", 0, 100, false, BL_ActionActuator, m_priority), KX_PYATTRIBUTE_SHORT_RW("priority", 0, 100, false, BL_ActionActuator, m_priority),
KX_PYATTRIBUTE_FLOAT_RW_CHECK("frame", 0, MAXFRAMEF, BL_ActionActuator, m_localtime, CheckFrame), KX_PYATTRIBUTE_FLOAT_RW_CHECK("frame", 0, MAXFRAMEF, BL_ActionActuator, m_localtime, CheckFrame),
KX_PYATTRIBUTE_STRING_RW("propName", 0, 31, false, BL_ActionActuator, m_propname), KX_PYATTRIBUTE_STRING_RW("propName", 0, 31, false, BL_ActionActuator, m_propname),
@ -1094,3 +1112,23 @@ int BL_ActionActuator::pyattr_set_action(void *self_v, const KX_PYATTRIBUTE_DEF
return PY_SET_ATTR_SUCCESS; return PY_SET_ATTR_SUCCESS;
} }
PyObject* BL_ActionActuator::pyattr_get_channel_names(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
BL_ActionActuator* self= static_cast<BL_ActionActuator*>(self_v);
PyObject *ret= PyList_New(0);
PyObject *item;
bPose *pose= ((BL_ArmatureObject*)self->GetParent())->GetOrigPose();
if(pose) {
bPoseChannel *pchan;
for(pchan= (bPoseChannel *)pose->chanbase.first; pchan; pchan= (bPoseChannel *)pchan->next) {
item= PyUnicode_FromString(pchan->name);
PyList_Append(ret, item);
Py_DECREF(item);
}
}
return ret;
}

@ -114,7 +114,7 @@ public:
static PyObject* pyattr_get_action(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); static PyObject* pyattr_get_action(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_action(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); static int pyattr_set_action(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_channel_names(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
/* attribute check */ /* attribute check */
static int CheckFrame(void *self, const PyAttributeDef*) static int CheckFrame(void *self, const PyAttributeDef*)
{ {

@ -60,6 +60,7 @@ public:
void GetMRDPose(struct bPose **pose); void GetMRDPose(struct bPose **pose);
void GetPose(struct bPose **pose); void GetPose(struct bPose **pose);
void SetPose (struct bPose *pose); void SetPose (struct bPose *pose);
struct bPose *GetOrigPose() {return m_pose;} // never edit this, only for accessing names
void ApplyPose(); void ApplyPose();
void RestorePose(); void RestorePose();

@ -146,7 +146,7 @@ PyAttributeDef KX_NetworkMessageActuator::Attributes[] = {
KX_PYATTRIBUTE_STRING_RW("propName", 0, 100, false, KX_NetworkMessageActuator, m_toPropName), KX_PYATTRIBUTE_STRING_RW("propName", 0, 100, false, KX_NetworkMessageActuator, m_toPropName),
KX_PYATTRIBUTE_STRING_RW("subject", 0, 100, false, KX_NetworkMessageActuator, m_subject), KX_PYATTRIBUTE_STRING_RW("subject", 0, 100, false, KX_NetworkMessageActuator, m_subject),
KX_PYATTRIBUTE_BOOL_RW("usePropBody", KX_NetworkMessageActuator, m_bPropBody), KX_PYATTRIBUTE_BOOL_RW("usePropBody", KX_NetworkMessageActuator, m_bPropBody),
KX_PYATTRIBUTE_STRING_RW("body", 0, 100, false, KX_NetworkMessageActuator, m_body), KX_PYATTRIBUTE_STRING_RW("body", 0, 16384, false, KX_NetworkMessageActuator, m_body),
{ NULL } //Sentinel { NULL } //Sentinel
}; };

@ -402,6 +402,8 @@ void KX_BulletPhysicsController::RestoreDynamics()
btRigidBody *body = GetRigidBody(); btRigidBody *body = GetRigidBody();
if (body && m_suspended) if (body && m_suspended)
{ {
// before make sure any position change that was done in this logic frame are accounted for
SetTransform();
GetPhysicsEnvironment()->updateCcdPhysicsController(this, GetPhysicsEnvironment()->updateCcdPhysicsController(this,
m_savedMass, m_savedMass,
m_savedCollisionFlags, m_savedCollisionFlags,

@ -328,7 +328,7 @@ bool ConvertPythonToMesh(PyObject * value, RAS_MeshObject **object, bool py_none
KX_MeshProxy *kx_mesh = static_cast<KX_MeshProxy*>BGE_PROXY_REF(value); KX_MeshProxy *kx_mesh = static_cast<KX_MeshProxy*>BGE_PROXY_REF(value);
/* sets the error */ /* sets the error */
if (*object==NULL) { if (kx_mesh==NULL) {
PyErr_Format(PyExc_SystemError, "%s, " BGE_PROXY_ERROR_MSG, error_prefix); PyErr_Format(PyExc_SystemError, "%s, " BGE_PROXY_ERROR_MSG, error_prefix);
return false; return false;
} }

@ -104,6 +104,7 @@ bool KX_SoundActuator::Update(double curtime, bool frame)
// do nothing on negative events, otherwise sounds are played twice! // do nothing on negative events, otherwise sounds are played twice!
bool bNegativeEvent = IsNegativeEvent(); bool bNegativeEvent = IsNegativeEvent();
bool bPositiveEvent = m_posevent;
RemoveAllEvents(); RemoveAllEvents();
@ -153,8 +154,17 @@ bool KX_SoundActuator::Update(double curtime, bool frame)
// remember that we tried to stop the actuator // remember that we tried to stop the actuator
m_isplaying = false; m_isplaying = false;
} }
else
{ #if 1
// Warning: when de-activating the actuator, after a single negative event this runs again with...
// m_posevent==false && m_posevent==false, in this case IsNegativeEvent() returns false
// and assumes this is a positive event.
// check that we actually have a positive event so as not to play sounds when being disabled.
else if(bPositiveEvent) { // <- added since 2.49
#else
else { // <- works in most cases except a loop-end sound will never stop unless
// the negative pulse is done continuesly
#endif
if (!m_isplaying) if (!m_isplaying)
{ {
switch (m_type) switch (m_type)

@ -24,7 +24,7 @@ The Blender Game Engine Python API Reference
Additional Modules: Additional Modules:
------------------- -------------------
These modules have no GameEngine spesific functionality but are useful in many cases. These modules have no GameEngine specific functionality but are useful in many cases.
- L{Mathutils} - L{Mathutils}
- L{Geometry} - L{Geometry}

@ -310,6 +310,8 @@ class BL_ActionActuator(SCA_IActuator):
@ivar action: The name of the action to set as the current action. @ivar action: The name of the action to set as the current action.
@type action: string @type action: string
@ivar channelNames: A list of channel names that may be used with L{setChannel} and L{getChannel}
@type channelNames: list of strings
@ivar frameStart: Specifies the starting frame of the animation. @ivar frameStart: Specifies the starting frame of the animation.
@type frameStart: float @type frameStart: float
@ivar frameEnd: Specifies the ending frame of the animation. @ivar frameEnd: Specifies the ending frame of the animation.
@ -340,7 +342,8 @@ class BL_ActionActuator(SCA_IActuator):
""" """
Alternative to the 2 arguments, 4 arguments (channel, matrix, loc, size, quat) are also supported. Alternative to the 2 arguments, 4 arguments (channel, matrix, loc, size, quat) are also supported.
@param channel: A string specifying the name of the bone channel, created if missing. @note: These values are relative to the bones rest position, currently the api has no way to get this info (which is annoying), but can be worked around by using bones with a rest pose that has no translation.
@param channel: A string specifying the name of the bone channel, error raised if not in L{channelNames}.
@type channel: string @type channel: string
@param matrix: A 4x4 matrix specifying the overriding transformation @param matrix: A 4x4 matrix specifying the overriding transformation
as an offset from the bone's rest position. as an offset from the bone's rest position.
@ -349,7 +352,7 @@ class BL_ActionActuator(SCA_IActuator):
def getChannel(channel): def getChannel(channel):
""" """
@param channel: A string specifying the name of the bone channel. error raised if missing. @param channel: A string specifying the name of the bone channel. error raised if not in L{channelNames}.
@type channel: string @type channel: string
@rtype: tuple @rtype: tuple
@return: (loc, size, quat) @return: (loc, size, quat)