Sequencer changes from source/blender/src coming next
This commit is contained in:
Campbell Barton 2009-06-16 14:21:58 +00:00
commit a1cf7988c1
28 changed files with 540 additions and 248 deletions

View File

@ -608,6 +608,10 @@
<Filter
Name="TEX_nodes"
>
<File
RelativePath="..\..\..\source\blender\nodes\intern\TEX_nodes\TEX_at.c"
>
</File>
<File
RelativePath="..\..\..\source\blender\nodes\intern\TEX_nodes\TEX_bricks.c"
>

View File

@ -1,6 +1,6 @@
#dxfLibrary.py : provides functions for generating DXF files
# --------------------------------------------------------------------------
__version__ = "v1.32 - 2009.06.06"
__version__ = "v1.33 - 2009.06.16"
__author__ = "Stani Michiels(Stani), Remigiusz Fiedler(migius)"
__license__ = "GPL"
__url__ = "http://wiki.blender.org/index.php/Scripts/Manual/Export/autodesk_dxf"
@ -20,8 +20,14 @@ IDEAs:
TODO:
- add support for DXFr14 (needs extended file header)
- add support for SPLINEs (possible first in DXFr14 version)
- add user preset for floating point precision (3-16?)
History
v1.33 - 2009.06.16 by migius
- modif _point(): converts all coords to floats
- modif LineType class: implement elements
- added VPORT class, incl. defaults
- fix Insert class
v1.32 - 2009.06.06 by migius
- modif Style class: changed defaults to widthFactor=1.0, obliqueAngle=0.0
- modif Text class: alignment parameter reactivated
@ -88,7 +94,7 @@ _HEADER_POINTS=['insbase','extmin','extmax']
def _point(x,index=0):
"""Convert tuple to a dxf point"""
#print 'deb: _point=', x #-------------
return '\n'.join([' %s\n%s'%((i+1)*10+index,x[i]) for i in range(len(x))])
return '\n'.join([' %s\n%s'%((i+1)*10+index,float(x[i])) for i in range(len(x))])
def _points(plist):
"""Convert a list of tuples to dxf points"""
@ -137,8 +143,8 @@ class _Entity(_Call):
if parent.layer!=None: result+=' 8\n%s\n'%parent.layer
if parent.color!=None: result+=' 62\n%s\n'%parent.color
if parent.lineType!=None: result+=' 6\n%s\n'%parent.lineType
#TODO: if parent.lineWeight!=None: result+='370\n%s\n'%parent.lineWeight
#TODO: if parent.visible!=None: result+='60\n%s\n'%parent.visible
# TODO: if parent.lineWeight!=None: result+='370\n%s\n'%parent.lineWeight
# TODO: if parent.visible!=None: result+='60\n%s\n'%parent.visible
if parent.lineTypeScale!=None: result+=' 48\n%s\n'%parent.lineTypeScale
if parent.elevation!=None: result+=' 38\n%s\n'%parent.elevation
if parent.thickness!=None: result+=' 39\n%s\n'%parent.thickness
@ -287,7 +293,7 @@ class Insert(_Entity):
self.rotation=rotation
def __str__(self):
result=' 0\nINSERT\n 2\n%s\n%s\n%s\n'%\
result=' 0\nINSERT\n 2\n%s\n%s%s\n'%\
(self.name,self._common(),_point(self.point))
if self.xscale!=None:result+=' 41\n%s\n'%self.xscale
if self.yscale!=None:result+=' 42\n%s\n'%self.yscale
@ -383,7 +389,7 @@ class Point(_Entity):
def __init__(self,points=None,**common):
_Entity.__init__(self,**common)
self.points=points
def __str__(self): #TODO:
def __str__(self): # TODO:
return ' 0\nPOINT\n%s%s\n' %(self._common(),
_points(self.points)
)
@ -515,7 +521,7 @@ class Block(_Collection):
self.name=name
self.flag=0
self.base=base
def __str__(self): #TODO:
def __str__(self): # TODO:
e=''.join([str(x)for x in self.entities])
return ' 0\nBLOCK\n 8\n%s\n 2\n%s\n 70\n%s\n%s\n 3\n%s\n%s 0\nENDBLK\n'%\
(self.layer,self.name.upper(),self.flag,_point(self.base),self.name.upper(),e)
@ -535,15 +541,22 @@ class Layer(_Call):
#-----------------------------------------------
class LineType(_Call):
"""Custom linetype"""
def __init__(self,name='continuous',description='Solid line',elements=[],flag=64):
# TODO: Implement lineType elements
def __init__(self,name='CONTINUOUS',description='Solid line',elements=[0.0],flag=0):
self.name=name
self.description=description
self.elements=copy.copy(elements)
self.flag=flag
def __str__(self):
return ' 0\nLTYPE\n 2\n%s\n 70\n%s\n 3\n%s\n 72\n65\n 73\n%s\n 40\n0.0\n'%\
(self.name.upper(),self.flag,self.description,len(self.elements))
result = ' 0\nLTYPE\n 2\n%s\n 70\n%s\n 3\n%s\n 72\n65\n'%\
(self.name.upper(),self.flag,self.description)
if self.elements:
elements = ' 73\n%s\n' %(len(self.elements)-1)
elements += ' 40\n%s\n' %(self.elements[0])
for e in self.elements[1:]:
elements += ' 49\n%s\n' %e
result += elements
return result
#-----------------------------------------------
class Style(_Call):
@ -566,27 +579,137 @@ class Style(_Call):
self.font.upper(),self.bigFont.upper())
#-----------------------------------------------
class View(_Call):
def __init__(self,name,flag=0,width=1,height=1,center=(0.5,0.5),
direction=(0,0,1),target=(0,0,0),lens=50,
frontClipping=0,backClipping=0,twist=0,mode=0):
class VPort(_Call):
def __init__(self,name,flag=0,
leftBottom=(0.0,0.0),
rightTop=(1.0,1.0),
center=(0.5,0.5),
snap_base=(0.0,0.0),
snap_spacing=(0.1,0.1),
grid_spacing=(0.1,0.1),
direction=(0.0,0.0,1.0),
target=(0.0,0.0,0.0),
height=1.0,
ratio=1.0,
lens=50,
frontClipping=0,
backClipping=0,
snap_rotation=0,
twist=0,
mode=0,
circle_zoom=100,
fast_zoom=1,
ucsicon=1,
snap_on=0,
grid_on=0,
snap_style=0,
snap_isopair=0
):
self.name=name
self.flag=flag
self.width=width
self.height=height
self.leftBottom=leftBottom
self.rightTop=rightTop
self.center=center
self.snap_base=snap_base
self.snap_spacing=snap_spacing
self.grid_spacing=grid_spacing
self.direction=direction
self.target=target
self.height=float(height)
self.ratio=float(ratio)
self.lens=float(lens)
self.frontClipping=float(frontClipping)
self.backClipping=float(backClipping)
self.snap_rotation=float(snap_rotation)
self.twist=float(twist)
self.mode=mode
self.circle_zoom=circle_zoom
self.fast_zoom=fast_zoom
self.ucsicon=ucsicon
self.snap_on=snap_on
self.grid_on=grid_on
self.snap_style=snap_style
self.snap_isopair=snap_isopair
def __str__(self):
output = [' 0', 'VPORT',
' 2', self.name,
' 70', self.flag,
_point(self.leftBottom),
_point(self.rightTop,1),
_point(self.center,2), # View center point (in DCS)
_point(self.snap_base,3),
_point(self.snap_spacing,4),
_point(self.grid_spacing,5),
_point(self.direction,6), #view direction from target (in WCS)
_point(self.target,7),
' 40', self.height,
' 41', self.ratio,
' 42', self.lens,
' 43', self.frontClipping,
' 44', self.backClipping,
' 50', self.snap_rotation,
' 51', self.twist,
' 71', self.mode,
' 72', self.circle_zoom,
' 73', self.fast_zoom,
' 74', self.ucsicon,
' 75', self.snap_on,
' 76', self.grid_on,
' 77', self.snap_style,
' 78', self.snap_isopair
]
output_str = ''
for s in output:
output_str += '%s\n' %s
return output_str
#-----------------------------------------------
class View(_Call):
def __init__(self,name,flag=0,
width=1,
height=1,
center=(0.5,0.5),
direction=(0,0,1),
target=(0,0,0),
lens=50,
frontClipping=0,
backClipping=0,
twist=0,mode=0
):
self.name=name
self.flag=flag
self.width=float(width)
self.height=float(height)
self.center=center
self.direction=direction
self.target=target
self.lens=lens
self.frontClipping=frontClipping
self.backClipping=backClipping
self.twist=twist
self.lens=float(lens)
self.frontClipping=float(frontClipping)
self.backClipping=float(backClipping)
self.twist=float(twist)
self.mode=mode
def __str__(self):
return ' 0\nVIEW\n 2\n%s\n 70\n%s\n 40\n%s\n%s\n 41\n%s\n%s\n%s\n 42\n%s\n 43\n%s\n 44\n%s\n 50\n%s\n 71\n%s\n'%\
(self.name,self.flag,self.height,_point(self.center),self.width,
_point(self.direction,1),_point(self.target,2),self.lens,
self.frontClipping,self.backClipping,self.twist,self.mode)
output = [' 0', 'VIEW',
' 2', self.name,
' 70', self.flag,
' 40', self.height,
_point(self.center),
' 41', self.width,
_point(self.direction,1),
_point(self.target,2),
' 42', self.lens,
' 43', self.frontClipping,
' 44', self.backClipping,
' 50', self.twist,
' 71', self.mode
]
output_str = ''
for s in output:
output_str += '%s\n' %s
return output_str
#-----------------------------------------------
def ViewByWindow(name,leftBottom=(0,0),rightTop=(1,1),**options):
@ -601,7 +724,7 @@ class Drawing(_Collection):
"""Dxf drawing. Use append or any other list methods to add objects."""
def __init__(self,insbase=(0.0,0.0,0.0),extmin=(0.0,0.0,0.0),extmax=(0.0,0.0,0.0),
layers=[Layer()],linetypes=[LineType()],styles=[Style()],blocks=[],
views=[],entities=None,fileName='test.dxf'):
views=[],vports=[],entities=None,fileName='test.dxf'):
# TODO: replace list with None,arial
if not entities:
entities=[]
@ -613,6 +736,7 @@ class Drawing(_Collection):
self.linetypes=copy.copy(linetypes)
self.styles=copy.copy(styles)
self.views=copy.copy(views)
self.vports=copy.copy(vports)
self.blocks=copy.copy(blocks)
self.fileName=fileName
#private
@ -656,7 +780,8 @@ class Drawing(_Collection):
header=[self.acadver]+[self._point(attr,getattr(self,attr))+'\n' for attr in _HEADER_POINTS]
header=self._section('header',header)
tables=[self._table('ltype',[str(x) for x in self.linetypes]),
tables=[self._table('vport',[str(x) for x in self.vports]),
self._table('ltype',[str(x) for x in self.linetypes]),
self._table('layer',[str(x) for x in self.layers]),
self._table('style',[str(x) for x in self.styles]),
self._table('view',[str(x) for x in self.views]),
@ -740,17 +865,16 @@ def test():
d.append(Line(points=[(0,0,0),(1,1,1)]))
d.append(Mtext('Click on Ads\nmultiple lines with mtext',point=(1,1,1),color=5,rotation=90))
d.append(Text('Please donate!',point=(3,0,1)))
d.append(Rectangle(point=(2,2,2),width=4,height=3,color=6,solid=Solid(color=2)))
#d.append(Rectangle(point=(2,2,2),width=4,height=3,color=6,solid=Solid(color=2)))
d.append(Solid(points=[(4,4,0),(5,4,0),(7,8,0),(9,9,0)],color=3))
d.append(PolyLine(points=[(1,1,1),(2,1,1),(2,2,1),(1,2,1)],closed=1,color=1))
#d.append(PolyLine(points=[(1,1,1),(2,1,1),(2,2,1),(1,2,1)],flag=1,color=1))
#d.saveas('c:\\test.dxf')
d.saveas('test.dxf')
#-----------------------------------------------------
if __name__=='__main__':
if not copy:
Draw.PupMenu('Error%t|This script requires a full python install')
else: main()
else: test()

View File

@ -204,7 +204,7 @@ typedef struct ModifierTypeInfo {
*
* This function is optional.
*/
CustomDataMask (*requiredDataMask)(struct ModifierData *md);
CustomDataMask (*requiredDataMask)(struct Object *ob, struct ModifierData *md);
/* Free internal modifier data variables, this function should
* not free the md variable itself.
@ -272,6 +272,7 @@ int modifier_dependsOnTime(struct ModifierData *md);
int modifier_supportsMapping(struct ModifierData *md);
int modifier_couldBeCage(struct ModifierData *md);
int modifier_isDeformer(struct ModifierData *md);
int modifier_isEnabled(struct ModifierData *md, int required_mode);
void modifier_setError(struct ModifierData *md, char *format, ...);
void modifiers_foreachObjectLink(struct Object *ob,
@ -302,8 +303,10 @@ int modifiers_indexInObject(struct Object *ob, struct ModifierData *md
* evaluation, assuming the data indicated by dataMask is required at the
* end of the stack.
*/
struct LinkNode *modifiers_calcDataMasks(struct ModifierData *md,
CustomDataMask dataMask);
struct LinkNode *modifiers_calcDataMasks(struct Object *ob,
struct ModifierData *md,
CustomDataMask dataMask,
int required_mode);
struct ModifierData *modifiers_getVirtualModifierList(struct Object *ob);
#endif

View File

@ -410,8 +410,9 @@ struct TexResult;
#define TEX_NODE_DECOMPOSE 420
#define TEX_NODE_VALTONOR 421
#define TEX_NODE_SCALE 422
#define TEX_NODE_AT 423
/* 201-299 reserved. Use like this: TEX_NODE_PROC + TEX_CLOUDS, etc */
/* 501-599 reserved. Use like this: TEX_NODE_PROC + TEX_CLOUDS, etc */
#define TEX_NODE_PROC 500
#define TEX_NODE_PROC_MAX 600

View File

@ -191,7 +191,7 @@ static BME_Poly *BME_split_face(BME_Mesh *bm, BME_Poly *f, BME_Vert *v1, BME_Ver
nf = BME_SFME(bm,f,v1,v2,nl);
nf->flag = f->flag;
/* if the edge was selected, select this face, too */
if (example->flag & SELECT) f->flag |= ME_FACE_SEL;
if (example && (example->flag & SELECT)) f->flag |= ME_FACE_SEL;
nf->h = f->h;
nf->mat_nr = f->mat_nr;
if (nl && example) {

View File

@ -1604,18 +1604,18 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
modifiers_clearErrors(ob);
if(useRenderParams) required_mode = eModifierMode_Render;
else required_mode = eModifierMode_Realtime;
/* we always want to keep original indices */
dataMask |= CD_MASK_ORIGINDEX;
datamasks = modifiers_calcDataMasks(md, dataMask);
datamasks = modifiers_calcDataMasks(ob, md, dataMask, required_mode);
curr = datamasks;
if(deform_r) *deform_r = NULL;
*final_r = NULL;
if(useRenderParams) required_mode = eModifierMode_Render;
else required_mode = eModifierMode_Realtime;
if(useDeform) {
if(useDeform > 0 && do_ob_key(scene, ob)) /* shape key makes deform verts */
deformedVerts = mesh_getVertexCos(me, &numVerts);
@ -1628,8 +1628,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
md->scene= scene;
if((md->mode & required_mode) != required_mode) continue;
if(mti->isDisabled && mti->isDisabled(md)) continue;
if(!modifier_isEnabled(md, required_mode)) continue;
if(useDeform < 0 && mti->dependsOnTime && mti->dependsOnTime(md)) continue;
if(mti->type == eModifierTypeType_OnlyDeform) {
@ -1678,19 +1677,18 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
md->scene= scene;
if((md->mode & required_mode) != required_mode) continue;
if(!modifier_isEnabled(md, required_mode)) continue;
if(mti->type == eModifierTypeType_OnlyDeform && !useDeform) continue;
if((mti->flags & eModifierTypeFlag_RequiresOriginalData) && dm) {
modifier_setError(md, "Modifier requires original data, bad stack position.");
continue;
}
if(mti->isDisabled && mti->isDisabled(md)) continue;
if(needMapping && !modifier_supportsMapping(md)) continue;
if(useDeform < 0 && mti->dependsOnTime && mti->dependsOnTime(md)) continue;
/* add an orco layer if needed by this modifier */
if(dm && mti->requiredDataMask) {
mask = mti->requiredDataMask(md);
mask = mti->requiredDataMask(ob, md);
if(mask & CD_MASK_ORCO)
add_orco_dm(ob, NULL, dm, orcodm);
}
@ -1860,14 +1858,11 @@ static int editmesh_modifier_is_enabled(ModifierData *md, DerivedMesh *dm)
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
if((md->mode & required_mode) != required_mode) return 0;
if(!modifier_isEnabled(md, required_mode)) return 0;
if((mti->flags & eModifierTypeFlag_RequiresOriginalData) && dm) {
modifier_setError(md, "Modifier requires original data, bad stack position.");
return 0;
}
if(mti->isDisabled && mti->isDisabled(md)) return 0;
if(!(mti->flags & eModifierTypeFlag_SupportsEditmode)) return 0;
if(md->mode & eModifierMode_DisableTemporary) return 0;
return 1;
}
@ -1882,6 +1877,7 @@ static void editmesh_calc_modifiers(Scene *scene, Object *ob, EditMesh *em, Deri
DerivedMesh *dm, *orcodm = NULL;
int i, numVerts = 0, cageIndex = modifiers_getCageIndex(ob, NULL);
LinkNode *datamasks, *curr;
int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
modifiers_clearErrors(ob);
@ -1895,7 +1891,7 @@ static void editmesh_calc_modifiers(Scene *scene, Object *ob, EditMesh *em, Deri
/* we always want to keep original indices */
dataMask |= CD_MASK_ORIGINDEX;
datamasks = modifiers_calcDataMasks(md, dataMask);
datamasks = modifiers_calcDataMasks(ob, md, dataMask, required_mode);
curr = datamasks;
for(i = 0; md; i++, md = md->next, curr = curr->next) {
@ -1908,7 +1904,7 @@ static void editmesh_calc_modifiers(Scene *scene, Object *ob, EditMesh *em, Deri
/* add an orco layer if needed by this modifier */
if(dm && mti->requiredDataMask) {
mask = mti->requiredDataMask(md);
mask = mti->requiredDataMask(ob, md);
if(mask & CD_MASK_ORCO)
add_orco_dm(ob, em, dm, orcodm);
}

View File

@ -209,7 +209,7 @@ static void curveModifier_copyData(ModifierData *md, ModifierData *target)
strncpy(tcmd->name, cmd->name, 32);
}
CustomDataMask curveModifier_requiredDataMask(ModifierData *md)
CustomDataMask curveModifier_requiredDataMask(Object *ob, ModifierData *md)
{
CurveModifierData *cmd = (CurveModifierData *)md;
CustomDataMask dataMask = 0;
@ -285,7 +285,7 @@ static void latticeModifier_copyData(ModifierData *md, ModifierData *target)
strncpy(tlmd->name, lmd->name, 32);
}
CustomDataMask latticeModifier_requiredDataMask(ModifierData *md)
CustomDataMask latticeModifier_requiredDataMask(Object *ob, ModifierData *md)
{
LatticeModifierData *lmd = (LatticeModifierData *)md;
CustomDataMask dataMask = 0;
@ -668,7 +668,7 @@ static void maskModifier_copyData(ModifierData *md, ModifierData *target)
strcpy(tmmd->vgroup, mmd->vgroup);
}
static CustomDataMask maskModifier_requiredDataMask(ModifierData *md)
static CustomDataMask maskModifier_requiredDataMask(Object *ob, ModifierData *md)
{
return (1 << CD_MDEFORMVERT);
}
@ -3396,7 +3396,7 @@ static void bevelModifier_copyData(ModifierData *md, ModifierData *target)
strncpy(tbmd->defgrp_name, bmd->defgrp_name, 32);
}
CustomDataMask bevelModifier_requiredDataMask(ModifierData *md)
CustomDataMask bevelModifier_requiredDataMask(Object *ob, ModifierData *md)
{
BevelModifierData *bmd = (BevelModifierData *)md;
CustomDataMask dataMask = 0;
@ -3476,7 +3476,7 @@ static void displaceModifier_copyData(ModifierData *md, ModifierData *target)
strncpy(tdmd->uvlayer_name, dmd->uvlayer_name, 32);
}
CustomDataMask displaceModifier_requiredDataMask(ModifierData *md)
CustomDataMask displaceModifier_requiredDataMask(Object *ob, ModifierData *md)
{
DisplaceModifierData *dmd = (DisplaceModifierData *)md;
CustomDataMask dataMask = 0;
@ -3819,7 +3819,7 @@ static void uvprojectModifier_copyData(ModifierData *md, ModifierData *target)
tumd->aspecty = umd->aspecty;
}
CustomDataMask uvprojectModifier_requiredDataMask(ModifierData *md)
CustomDataMask uvprojectModifier_requiredDataMask(Object *ob, ModifierData *md)
{
CustomDataMask dataMask = 0;
@ -4285,7 +4285,7 @@ int smoothModifier_isDisabled(ModifierData *md)
return 0;
}
CustomDataMask smoothModifier_requiredDataMask(ModifierData *md)
CustomDataMask smoothModifier_requiredDataMask(Object *ob, ModifierData *md)
{
SmoothModifierData *smd = (SmoothModifierData *)md;
CustomDataMask dataMask = 0;
@ -4514,7 +4514,7 @@ int castModifier_isDisabled(ModifierData *md)
return 0;
}
CustomDataMask castModifier_requiredDataMask(ModifierData *md)
CustomDataMask castModifier_requiredDataMask(Object *ob, ModifierData *md)
{
CastModifierData *cmd = (CastModifierData *)md;
CustomDataMask dataMask = 0;
@ -5145,7 +5145,7 @@ static void waveModifier_updateDepgraph(
}
}
CustomDataMask waveModifier_requiredDataMask(ModifierData *md)
CustomDataMask waveModifier_requiredDataMask(Object *ob, ModifierData *md)
{
WaveModifierData *wmd = (WaveModifierData *)md;
CustomDataMask dataMask = 0;
@ -5482,7 +5482,7 @@ static void armatureModifier_copyData(ModifierData *md, ModifierData *target)
strncpy(tamd->defgrp_name, amd->defgrp_name, 32);
}
CustomDataMask armatureModifier_requiredDataMask(ModifierData *md)
CustomDataMask armatureModifier_requiredDataMask(Object *ob, ModifierData *md)
{
CustomDataMask dataMask = 0;
@ -5596,7 +5596,7 @@ static void hookModifier_copyData(ModifierData *md, ModifierData *target)
strncpy(thmd->name, hmd->name, 32);
}
CustomDataMask hookModifier_requiredDataMask(ModifierData *md)
CustomDataMask hookModifier_requiredDataMask(Object *ob, ModifierData *md)
{
HookModifierData *hmd = (HookModifierData *)md;
CustomDataMask dataMask = 0;
@ -5855,7 +5855,7 @@ static void clothModifier_updateDepgraph(
}
}
CustomDataMask clothModifier_requiredDataMask(ModifierData *md)
CustomDataMask clothModifier_requiredDataMask(Object *ob, ModifierData *md)
{
CustomDataMask dataMask = 0;
@ -6239,7 +6239,7 @@ static DerivedMesh *booleanModifier_applyModifier(
return derivedData;
}
CustomDataMask booleanModifier_requiredDataMask(ModifierData *md)
CustomDataMask booleanModifier_requiredDataMask(Object *ob, ModifierData *md)
{
CustomDataMask dataMask = (1 << CD_MTFACE) + (1 << CD_MEDGE);
@ -6287,12 +6287,27 @@ static void particleSystemModifier_copyData(ModifierData *md, ModifierData *targ
tpsmd->psys = psmd->psys;
}
CustomDataMask particleSystemModifier_requiredDataMask(ModifierData *md)
CustomDataMask particleSystemModifier_requiredDataMask(Object *ob, ModifierData *md)
{
ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md;
CustomDataMask dataMask = (1 << CD_MTFACE) + (1 << CD_MEDGE);
CustomDataMask dataMask = 0;
Material *ma;
MTex *mtex;
int i;
ma= give_current_material(ob, psmd->psys->part->omat);
if(ma) {
for(i=0; i<MAX_MTEX; i++) {
mtex=ma->mtex[i];
if(mtex && (ma->septex & (1<<i))==0)
if(mtex->pmapto && (mtex->texco & TEXCO_UV))
dataMask |= (1 << CD_MTFACE);
}
}
if(psmd->psys->part->tanfac!=0.0)
dataMask |= (1 << CD_MTFACE);
/* ask for vertexgroups if we need them */
for(i=0; i<PSYS_TOT_VG; i++){
if(psmd->psys->vgroup[i]){
@ -6637,7 +6652,7 @@ static int explodeModifier_dependsOnTime(ModifierData *md)
{
return 1;
}
CustomDataMask explodeModifier_requiredDataMask(ModifierData *md)
CustomDataMask explodeModifier_requiredDataMask(Object *ob, ModifierData *md)
{
ExplodeModifierData *emd= (ExplodeModifierData*) md;
CustomDataMask dataMask = 0;
@ -7551,7 +7566,7 @@ static void meshdeformModifier_copyData(ModifierData *md, ModifierData *target)
tmmd->object = mmd->object;
}
CustomDataMask meshdeformModifier_requiredDataMask(ModifierData *md)
CustomDataMask meshdeformModifier_requiredDataMask(Object *ob, ModifierData *md)
{
MeshDeformModifierData *mmd = (MeshDeformModifierData *)md;
CustomDataMask dataMask = 0;
@ -7815,10 +7830,12 @@ static void meshdeformModifier_deformVerts(
{
DerivedMesh *dm;
if(!derivedData && ob->type==OB_MESH)
dm= CDDM_from_mesh(ob->data, ob);
else
dm= derivedData;
if (!derivedData) {
dm= get_original_dm(md->scene, ob, NULL, 0);
if (dm == NULL) return;
}
else dm= derivedData;
modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */
@ -7930,7 +7947,7 @@ static void shrinkwrapModifier_copyData(ModifierData *md, ModifierData *target)
tsmd->subsurfLevels = smd->subsurfLevels;
}
CustomDataMask shrinkwrapModifier_requiredDataMask(ModifierData *md)
CustomDataMask shrinkwrapModifier_requiredDataMask(Object *ob, ModifierData *md)
{
ShrinkwrapModifierData *smd = (ShrinkwrapModifierData *)md;
CustomDataMask dataMask = 0;
@ -7964,7 +7981,7 @@ static void shrinkwrapModifier_foreachObjectLink(ModifierData *md, Object *ob, O
static void shrinkwrapModifier_deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
{
DerivedMesh *dm = NULL;
CustomDataMask dataMask = shrinkwrapModifier_requiredDataMask(md);
CustomDataMask dataMask = shrinkwrapModifier_requiredDataMask(ob, md);
/* We implement requiredDataMask but thats not really usefull since mesh_calc_modifiers pass a NULL derivedData or without the modified vertexs applied */
if(dataMask)
@ -7990,7 +8007,7 @@ static void shrinkwrapModifier_deformVerts(ModifierData *md, Object *ob, Derived
static void shrinkwrapModifier_deformVertsEM(ModifierData *md, Object *ob, EditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
{
DerivedMesh *dm = NULL;
CustomDataMask dataMask = shrinkwrapModifier_requiredDataMask(md);
CustomDataMask dataMask = shrinkwrapModifier_requiredDataMask(ob, md);
if(dataMask)
{
@ -8049,7 +8066,7 @@ static void simpledeformModifier_copyData(ModifierData *md, ModifierData *target
memcpy(tsmd->limit, smd->limit, sizeof(tsmd->limit));
}
static CustomDataMask simpledeformModifier_requiredDataMask(ModifierData *md)
static CustomDataMask simpledeformModifier_requiredDataMask(Object *ob, ModifierData *md)
{
SimpleDeformModifierData *smd = (SimpleDeformModifierData *)md;
CustomDataMask dataMask = 0;
@ -8078,7 +8095,7 @@ static void simpledeformModifier_updateDepgraph(ModifierData *md, DagForest *for
static void simpledeformModifier_deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
{
DerivedMesh *dm = NULL;
CustomDataMask dataMask = simpledeformModifier_requiredDataMask(md);
CustomDataMask dataMask = simpledeformModifier_requiredDataMask(ob, md);
/* We implement requiredDataMask but thats not really usefull since mesh_calc_modifiers pass a NULL derivedData or without the modified vertexs applied */
if(dataMask)
@ -8105,7 +8122,7 @@ static void simpledeformModifier_deformVerts(ModifierData *md, Object *ob, Deriv
static void simpledeformModifier_deformVertsEM(ModifierData *md, Object *ob, EditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
{
DerivedMesh *dm = NULL;
CustomDataMask dataMask = simpledeformModifier_requiredDataMask(md);
CustomDataMask dataMask = simpledeformModifier_requiredDataMask(ob, md);
/* We implement requiredDataMask but thats not really usefull since mesh_calc_modifiers pass a NULL derivedData or without the modified vertexs applied */
if(dataMask)
@ -8717,7 +8734,20 @@ int modifiers_isParticleEnabled(Object *ob)
return (md && md->mode & (eModifierMode_Realtime | eModifierMode_Render));
}
LinkNode *modifiers_calcDataMasks(ModifierData *md, CustomDataMask dataMask)
int modifier_isEnabled(ModifierData *md, int required_mode)
{
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
if((md->mode & required_mode) != required_mode) return 0;
if(mti->isDisabled && mti->isDisabled(md)) return 0;
if(md->mode & eModifierMode_DisableTemporary) return 0;
if(required_mode & eModifierMode_Editmode)
if(!(mti->flags & eModifierTypeFlag_SupportsEditmode)) return 0;
return 1;
}
LinkNode *modifiers_calcDataMasks(Object *ob, ModifierData *md, CustomDataMask dataMask, int required_mode)
{
LinkNode *dataMasks = NULL;
LinkNode *curr, *prev;
@ -8727,7 +8757,9 @@ LinkNode *modifiers_calcDataMasks(ModifierData *md, CustomDataMask dataMask)
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
CustomDataMask mask = 0;
if(mti->requiredDataMask) mask = mti->requiredDataMask(md);
if(modifier_isEnabled(md, required_mode))
if(mti->requiredDataMask)
mask = mti->requiredDataMask(ob, md);
BLI_linklist_prepend(&dataMasks, SET_INT_IN_POINTER(mask));
}

View File

@ -3050,6 +3050,7 @@ static void registerTextureNodes(ListBase *ntypelist)
nodeRegisterType(ntypelist, &tex_node_rotate);
nodeRegisterType(ntypelist, &tex_node_translate);
nodeRegisterType(ntypelist, &tex_node_scale);
nodeRegisterType(ntypelist, &tex_node_at);
nodeRegisterType(ntypelist, &tex_node_proc_voronoi);
nodeRegisterType(ntypelist, &tex_node_proc_blend);

View File

@ -3169,7 +3169,7 @@ static void get_cpa_texture(DerivedMesh *dm, Material *ma, int face_index, float
if(ma) for(m=0; m<MAX_MTEX; m++){
mtex=ma->mtex[m];
if(mtex && (ma->septex & (1<<m))==0){
if(mtex && (ma->septex & (1<<m))==0 && mtex->pmapto){
float def=mtex->def_var;
float var=mtex->varfac;
short blend=mtex->blendtype;
@ -3218,7 +3218,7 @@ void psys_get_texture(Object *ob, Material *ma, ParticleSystemModifierData *psmd
if(ma) for(m=0; m<MAX_MTEX; m++){
mtex=ma->mtex[m];
if(mtex && (ma->septex & (1<<m))==0){
if(mtex && (ma->septex & (1<<m))==0 && mtex->pmapto){
float var=mtex->varfac;
float def=mtex->def_var;
short blend=mtex->blendtype;

View File

@ -1761,7 +1761,10 @@ void reset_particle(Scene *scene, ParticleData *pa, ParticleSystem *psys, Partic
where_is_object_time(scene, ob,pa->time);
/* get birth location from object */
psys_particle_on_emitter(psmd,part->from,pa->num, pa->num_dmcache, pa->fuv,pa->foffset,loc,nor,utan,vtan,0,0);
if(part->tanfac!=0.0)
psys_particle_on_emitter(psmd,part->from,pa->num, pa->num_dmcache, pa->fuv,pa->foffset,loc,nor,utan,vtan,0,0);
else
psys_particle_on_emitter(psmd,part->from,pa->num, pa->num_dmcache, pa->fuv,pa->foffset,loc,nor,0,0,0,0);
/* save local coordinates for later */
VECCOPY(tloc,loc);

View File

@ -9137,6 +9137,34 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
if (main->versionfile < 249 && main->subversionfile < 2) {
Scene *sce= main->scene.first;
Sequence *seq;
Editing *ed;
while(sce) {
ed= sce->ed;
if(ed) {
SEQP_BEGIN(ed, seq) {
if (seq->strip && seq->strip->proxy){
if (sce->r.size != 100.0) {
seq->strip->proxy->size
= sce->r.size;
} else {
seq->strip->proxy->size
= 25.0;
}
seq->strip->proxy->quality =90;
}
}
SEQ_END
}
sce= sce->id.next;
}
}
/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
/* WATCH IT 2!: Userdef struct init has to be in src/usiblender.c! */

View File

@ -746,7 +746,9 @@ GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, /*GPU
glGetObjectParameterivARB(shader->object, GL_OBJECT_LINK_STATUS_ARB, &status);
if (!status) {
glGetInfoLogARB(shader->object, sizeof(log), &length, log);
shader_print_errors("linking", log, fragcode);
if (fragcode) shader_print_errors("linking", log, fragcode);
else if (vertexcode) shader_print_errors("linking", log, vertexcode);
else if (libcode) shader_print_errors("linking", log, libcode);
GPU_shader_free(shader);
return NULL;

View File

@ -1285,7 +1285,7 @@ void GPU_materials_free()
GPU_material_free(&defmaterial);
for(ob=G.main->object.first; ma; ma=ma->id.next)
for(ob=G.main->object.first; ob; ob=ob->id.next)
GPU_lamp_free(ob);
}

View File

@ -191,7 +191,7 @@ struct ImBuf *imb_loadhdr(unsigned char *mem, int size, int flags)
break;
}
}
if (found) {
if (found && (x<(size + 2))) {
if (sscanf((char *)&mem[x+1], "%79s %d %79s %d", (char*)&oriY, &height,
(char*)&oriX, &width) != 4) return NULL;

View File

@ -80,6 +80,9 @@ typedef struct StripProxy {
char dir[160];
char file[80];
struct anim *anim;
short size;
short quality;
int pad;
} StripProxy;
typedef struct Strip {

View File

@ -59,6 +59,7 @@ extern bNodeType tex_node_distance;
extern bNodeType tex_node_rotate;
extern bNodeType tex_node_translate;
extern bNodeType tex_node_scale;
extern bNodeType tex_node_at;
extern bNodeType tex_node_compose;
extern bNodeType tex_node_decompose;

View File

@ -0,0 +1,70 @@
/**
*
* ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* The Original Code is Copyright (C) 2005 Blender Foundation.
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): R Allen
*
* ***** END GPL LICENSE BLOCK *****
*/
#include "../TEX_util.h"
static bNodeSocketType inputs[]= {
{ SOCK_RGBA, 1, "Texture", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
{ SOCK_VECTOR, 1, "Coordinates", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f },
{ -1, 0, "" }
};
static bNodeSocketType outputs[]= {
{ SOCK_RGBA, 0, "Texture", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
{ -1, 0, "" }
};
static void colorfn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
{
float new_coord[3];
tex_input_vec(new_coord, in[1], coord, thread);
tex_input_rgba(out, in[0], new_coord, thread);
}
static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{
tex_output(node, in, out[0], &colorfn);
}
bNodeType tex_node_at = {
/* *next,*prev */ NULL, NULL,
/* type code */ TEX_NODE_AT,
/* name */ "At",
/* width+range */ 100, 60, 150,
/* class+opts */ NODE_CLASS_DISTORT, 0,
/* input sock */ inputs,
/* output sock */ outputs,
/* storage */ "",
/* execfunc */ exec,
/* butfunc */ NULL,
/* initfunc */ NULL,
/* freestoragefunc */ NULL,
/* copystoragefunc */ NULL,
/* id */ NULL
};

View File

@ -2418,13 +2418,13 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int ef
/* placement */
if(mtex->projx) texvec[0]= mtex->size[0]*(co[mtex->projx-1]+mtex->ofs[0]);
if(mtex->projx && co) texvec[0]= mtex->size[0]*(co[mtex->projx-1]+mtex->ofs[0]);
else texvec[0]= mtex->size[0]*(mtex->ofs[0]);
if(mtex->projy) texvec[1]= mtex->size[1]*(co[mtex->projy-1]+mtex->ofs[1]);
if(mtex->projy && co) texvec[1]= mtex->size[1]*(co[mtex->projy-1]+mtex->ofs[1]);
else texvec[1]= mtex->size[1]*(mtex->ofs[1]);
if(mtex->projz) texvec[2]= mtex->size[2]*(co[mtex->projz-1]+mtex->ofs[2]);
if(mtex->projz && co) texvec[2]= mtex->size[2]*(co[mtex->projz-1]+mtex->ofs[2]);
else texvec[2]= mtex->size[2]*(mtex->ofs[2]);
if(shi->osatex) {

View File

@ -19,6 +19,7 @@ incs += ' #source/gameengine/Physics/Dummy'
incs += ' #source/gameengine/Network/LoopBackNetwork'
incs += ' #source/blender/misc #source/blender/blenloader #source/blender/gpu'
incs += ' #source/blender/windowmanager'
incs += ' #source/blender/makesrna'
if env['WITH_BF_SOLID']:
incs += ' #source/gameengine/Physics/Sumo #source/gameengine/Physics/Sumo/Fuzzics/include'

View File

@ -636,63 +636,3 @@ void CParser::SetContext(CValue* context)
}
m_identifierContext = context;
}
PyObject* CParserPyMake(PyObject* ignored,PyObject* args)
{
char* txt;
if (!PyArg_ParseTuple(args,"s",&txt))
return NULL;
CParser parser;
CExpression* expr = parser.ProcessText(txt);
CValue* val = expr->Calculate();
expr->Release();
return val->GetProxy();
}
static PyMethodDef CParserMethods[] =
{
{ "calc", CParserPyMake , METH_VARARGS},
{ NULL,NULL} // Sentinel
};
#if (PY_VERSION_HEX >= 0x03000000)
static struct PyModuleDef Expression_module_def = {
{}, /* m_base */
"Expression", /* m_name */
0, /* m_doc */
0, /* m_size */
CParserMethods, /* m_methods */
0, /* m_reload */
0, /* m_traverse */
0, /* m_clear */
0, /* m_free */
};
#endif
extern "C" {
void initExpressionModule(void)
{
PyObject *m;
/* Use existing module where possible
* be careful not to init any runtime vars after this */
m = PyImport_ImportModule( "Expression" );
if(m) {
Py_DECREF(m);
//return m;
}
else {
PyErr_Clear();
#if (PY_VERSION_HEX >= 0x03000000)
PyModule_Create(&Expression_module_def);
#else
Py_InitModule("Expression",CParserMethods);
#endif
}
}
}

View File

@ -725,54 +725,6 @@ PyObject* CValue::ConvertKeysToPython( void )
return pylist;
}
/*
PyObject* CValue::PyMake(PyObject* ignored,PyObject* args)
{
//if (!PyArg_ParseTuple(args,"s:make",&name)) return NULL;
Py_RETURN_NONE;//new CValue();
}
*/
#if (PY_VERSION_HEX >= 0x03000000)
static struct PyModuleDef CValue_module_def = {
{}, /* m_base */
"CValue", /* m_name */
0, /* m_doc */
0, /* m_size */
CValueMethods, /* m_methods */
0, /* m_reload */
0, /* m_traverse */
0, /* m_clear */
0, /* m_free */
};
#endif
extern "C" {
void initCValue(void)
{
PyObject *m;
/* Use existing module where possible
* be careful not to init any runtime vars after this */
m = PyImport_ImportModule( "CValue" );
if(m) {
Py_DECREF(m);
//return m;
}
else {
PyErr_Clear();
#if (PY_VERSION_HEX >= 0x03000000)
PyModule_Create(&CValue_module_def);
#else
Py_InitModule("CValue",CValueMethods);
#endif
}
}
}
#endif //NO_EXP_PYTHON_EMBEDDING
///////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -630,6 +630,7 @@ PyObject* initPythonConstraintBinding()
#if (PY_VERSION_HEX >= 0x03000000)
m = PyModule_Create(&PhysicsConstraints_module_def);
PyDict_SetItemString(PySys_GetObject("modules"), PhysicsConstraints_module_def.m_name, m);
#else
m = Py_InitModule4("PhysicsConstraints", physicsconstraints_methods,
PhysicsConstraints_module_documentation,

View File

@ -70,6 +70,7 @@
#include "MT_Vector3.h"
#include "MT_Point3.h"
#include "ListValue.h"
#include "InputParser.h"
#include "KX_Scene.h"
#include "SND_DeviceManager.h"
@ -501,6 +502,32 @@ static PyObject *pyPrintExt(PyObject *,PyObject *,PyObject *)
}
static PyObject *gEvalExpression(PyObject*, PyObject* value)
{
char* txt= PyString_AsString(value);
if (txt==NULL) {
PyErr_SetString(PyExc_TypeError, "Expression.calc(text): expects a single string argument");
return NULL;
}
CParser parser;
CExpression* expr = parser.ProcessText(txt);
CValue* val = expr->Calculate();
expr->Release();
if (val) {
PyObject* pyobj = val->ConvertValueToPython();
if (pyobj)
return pyobj;
else
return val->GetProxy();
}
Py_RETURN_NONE;
}
static struct PyMethodDef game_methods[] = {
{"expandPath", (PyCFunction)gPyExpandPath, METH_VARARGS, (PY_METHODCHAR)gPyExpandPath_doc},
{"sendMessage", (PyCFunction)gPySendMessage, METH_VARARGS, (PY_METHODCHAR)gPySendMessage_doc},
@ -529,6 +556,7 @@ static struct PyMethodDef game_methods[] = {
{"getAverageFrameRate", (PyCFunction) gPyGetAverageFrameRate, METH_NOARGS, (PY_METHODCHAR)"Gets the estimated average frame rate"},
{"getBlendFileList", (PyCFunction)gPyGetBlendFileList, METH_VARARGS, (PY_METHODCHAR)"Gets a list of blend files in the same directory as the current blend file"},
{"PrintGLInfo", (PyCFunction)pyPrintExt, METH_NOARGS, (PY_METHODCHAR)"Prints GL Extension Info"},
{"EvalExpression", (PyCFunction)gEvalExpression, METH_O, (PY_METHODCHAR)"Evaluate a string as a game logic expression"},
{NULL, (PyCFunction) NULL, 0, NULL }
};
@ -1035,6 +1063,7 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack
// Create the module and add the functions
#if (PY_VERSION_HEX >= 0x03000000)
m = PyModule_Create(&GameLogic_module_def);
PyDict_SetItemString(PySys_GetObject("modules"), GameLogic_module_def.m_name, m);
#else
m = Py_InitModule4("GameLogic", game_methods,
GameLogic_module_documentation,
@ -1701,6 +1730,7 @@ PyObject* initRasterizer(RAS_IRasterizer* rasty,RAS_ICanvas* canvas)
// Create the module and add the functions
#if (PY_VERSION_HEX >= 0x03000000)
m = PyModule_Create(&Rasterizer_module_def);
PyDict_SetItemString(PySys_GetObject("modules"), Rasterizer_module_def.m_name, m);
#else
m = Py_InitModule4("Rasterizer", rasterizer_methods,
Rasterizer_module_documentation,
@ -1835,6 +1865,7 @@ PyObject* initGameKeys()
// Create the module and add the functions
#if (PY_VERSION_HEX >= 0x03000000)
m = PyModule_Create(&GameKeys_module_def);
PyDict_SetItemString(PySys_GetObject("modules"), GameKeys_module_def.m_name, m);
#else
m = Py_InitModule4("GameKeys", gamekeys_methods,
GameKeys_module_documentation,
@ -1990,6 +2021,8 @@ PyObject* initGeometry() {Py_INCREF(Py_None);return Py_None;}
PyObject* initBGL() {Py_INCREF(Py_None);return Py_None;}
#endif
void KX_SetActiveScene(class KX_Scene* scene)
{
gp_KetsjiScene = scene;
@ -2021,11 +2054,17 @@ int saveGamePythonConfig( char **marshal_buffer)
if (pyGlobalDictMarshal) {
// for testing only
// PyObject_Print(pyGlobalDictMarshal, stderr, 0);
char *marshal_cstring;
#if PY_VERSION_HEX < 0x03000000
marshal_cstring = PyString_AsString(pyGlobalDictMarshal);
marshal_length= PyString_Size(pyGlobalDictMarshal);
#else // py3 uses byte arrays
marshal_cstring = PyBytes_AsString(pyGlobalDictMarshal);
marshal_length= PyBytes_Size(pyGlobalDictMarshal);
#endif
*marshal_buffer = new char[marshal_length + 1];
memcpy(*marshal_buffer, PyString_AsString(pyGlobalDictMarshal), marshal_length);
memcpy(*marshal_buffer, marshal_cstring, marshal_length);
Py_DECREF(pyGlobalDictMarshal);
} else {
printf("Error, GameLogic.globalDict could not be marshal'd\n");
@ -2102,5 +2141,5 @@ void setGamePythonPath(char *path)
// engine but loading blend files within the BGE wont overwrite gp_GamePythonPathOrig
void resetGamePythonPath()
{
gp_GamePythonPathOrig[0] == '\0';
gp_GamePythonPathOrig[0] = '\0';
}

View File

@ -57,7 +57,7 @@ static Py_ssize_t KX_PythonSeq_len( PyObject * self )
PyObjectPlus *self_plus= BGE_PROXY_REF(((KX_PythonSeq *)self)->base);
if(self_plus==NULL) {
PyErr_SetString(PyExc_SystemError, BGE_PROXY_ERROR_MSG);
PyErr_SetString(PyExc_SystemError, "len(seq): "BGE_PROXY_ERROR_MSG);
return -1;
}
@ -84,7 +84,7 @@ static PyObject *KX_PythonSeq_getIndex(PyObject* self, int index)
PyObjectPlus *self_plus= BGE_PROXY_REF(((KX_PythonSeq *)self)->base);
if(self_plus==NULL) {
PyErr_SetString(PyExc_SystemError, BGE_PROXY_ERROR_MSG);
PyErr_SetString(PyExc_SystemError, "val = seq[i]: "BGE_PROXY_ERROR_MSG);
return NULL;
}
@ -145,25 +145,9 @@ static PyObject *KX_PythonSeq_getIndex(PyObject* self, int index)
return NULL;
}
static PyObject * KX_PythonSeq_subscript(PyObject * self, PyObject *key)
static PyObjectPlus * KX_PythonSeq_subscript__internal(PyObject *self, char *key)
{
PyObjectPlus *self_plus= BGE_PROXY_REF(((KX_PythonSeq *)self)->base);
char *name = NULL;
if(self_plus==NULL) {
PyErr_SetString(PyExc_SystemError, BGE_PROXY_ERROR_MSG);
return NULL;
}
if (PyInt_Check(key)) {
return KX_PythonSeq_getIndex(self, PyInt_AS_LONG( key ));
} else if ( PyString_Check(key) ) {
name = PyString_AsString( key );
} else {
PyErr_SetString( PyExc_TypeError, "expected a string or an index" );
return NULL;
}
switch(((KX_PythonSeq *)self)->type) {
case KX_PYGENSEQ_CONT_TYPE_SENSORS:
@ -172,8 +156,9 @@ static PyObject * KX_PythonSeq_subscript(PyObject * self, PyObject *key)
SCA_ISensor* sensor;
for (unsigned int index=0;index<linkedsensors.size();index++) {
sensor = linkedsensors[index];
if (sensor->GetName() == name)
return sensor->GetProxy();
if (sensor->GetName() == key)
return static_cast<PyObjectPlus *>(sensor);
}
break;
}
@ -183,8 +168,8 @@ static PyObject * KX_PythonSeq_subscript(PyObject * self, PyObject *key)
SCA_IActuator* actuator;
for (unsigned int index=0;index<linkedactuators.size();index++) {
actuator = linkedactuators[index];
if (actuator->GetName() == name)
return actuator->GetProxy();
if (actuator->GetName() == key)
return static_cast<PyObjectPlus *>(actuator);
}
break;
}
@ -194,8 +179,8 @@ static PyObject * KX_PythonSeq_subscript(PyObject * self, PyObject *key)
SCA_ISensor *sensor;
for (unsigned int index=0;index<linkedsensors.size();index++) {
sensor= linkedsensors[index];
if (sensor->GetName() == name)
return sensor->GetProxy();
if (sensor->GetName() == key)
return static_cast<PyObjectPlus *>(sensor);
}
break;
}
@ -205,8 +190,8 @@ static PyObject * KX_PythonSeq_subscript(PyObject * self, PyObject *key)
SCA_IController *controller;
for (unsigned int index=0;index<linkedcontrollers.size();index++) {
controller= linkedcontrollers[index];
if (controller->GetName() == name)
return controller->GetProxy();
if (controller->GetName() == key)
return static_cast<PyObjectPlus *>(controller);
}
break;
}
@ -216,23 +201,105 @@ static PyObject * KX_PythonSeq_subscript(PyObject * self, PyObject *key)
SCA_IActuator *actuator;
for (unsigned int index=0;index<linkedactuators.size();index++) {
actuator= linkedactuators[index];
if (actuator->GetName() == name)
return actuator->GetProxy();
if (actuator->GetName() == key)
return static_cast<PyObjectPlus *>(actuator);
}
break;
}
}
PyErr_Format( PyExc_KeyError, "requested item \"%s\" does not exist", name);
return NULL;
}
static PyObject * KX_PythonSeq_subscript(PyObject * self, PyObject *key)
{
PyObjectPlus *self_plus= BGE_PROXY_REF(((KX_PythonSeq *)self)->base);
if(self_plus==NULL) {
PyErr_SetString(PyExc_SystemError, "val = seq[key], KX_PythonSeq: "BGE_PROXY_ERROR_MSG);
return NULL;
}
if (PyInt_Check(key)) {
return KX_PythonSeq_getIndex(self, PyInt_AS_LONG( key ));
}
else if ( PyString_Check(key) ) {
char *name = PyString_AsString(key);
PyObjectPlus *ret = KX_PythonSeq_subscript__internal(self, name);
if(ret) {
return ret->GetProxy();
} else {
PyErr_Format( PyExc_KeyError, "requested item \"%s\" does not exist", name);
return NULL;
}
}
else {
PyErr_SetString( PyExc_TypeError, "expected a string or an index" );
return NULL;
}
}
static int KX_PythonSeq_contains(PyObject *self, PyObject *key)
{
PyObjectPlus *self_plus= BGE_PROXY_REF(((KX_PythonSeq *)self)->base);
if(self_plus==NULL) {
PyErr_SetString(PyExc_SystemError, "key in seq, KX_PythonSeq: "BGE_PROXY_ERROR_MSG);
return -1;
}
if(!PyString_Check(key)) {
PyErr_SetString(PyExc_SystemError, "key in seq, KX_PythonSeq: key must be a string");
return -1;
}
if(KX_PythonSeq_subscript__internal(self, PyString_AsString(key)))
return 1;
return 0;
}
/* Matches python dict.get(key, [default]) */
PyObject* KX_PythonSeq_get(PyObject * self, PyObject *args)
{
char *key;
PyObject* def = Py_None;
PyObjectPlus* ret_plus;
if (!PyArg_ParseTuple(args, "s|O:get", &key, &def))
return NULL;
if((ret_plus = KX_PythonSeq_subscript__internal(self, key)))
return ret_plus->GetProxy();
Py_INCREF(def);
return def;
}
PySequenceMethods KX_PythonSeq_as_sequence = {
NULL, /* Cant set the len otherwise it can evaluate as false */
NULL, /* sq_concat */
NULL, /* sq_repeat */
NULL, /* sq_item */
NULL, /* sq_slice */
NULL, /* sq_ass_item */
NULL, /* sq_ass_slice */
(objobjproc)KX_PythonSeq_contains, /* sq_contains */
};
static PyMappingMethods KX_PythonSeq_as_mapping = {
KX_PythonSeq_len, /* mp_length */
KX_PythonSeq_subscript, /* mp_subscript */
0, /* mp_ass_subscript */
};
PyMethodDef KX_PythonSeq_methods[] = {
// dict style access for props
{"get",(PyCFunction) KX_PythonSeq_get, METH_VARARGS},
{NULL,NULL} //Sentinel
};
/*
* Initialize the interator index
@ -241,7 +308,7 @@ static PyMappingMethods KX_PythonSeq_as_mapping = {
static PyObject *KX_PythonSeq_getIter(KX_PythonSeq *self)
{
if(BGE_PROXY_REF(self->base)==NULL) {
PyErr_SetString(PyExc_SystemError, BGE_PROXY_ERROR_MSG);
PyErr_SetString(PyExc_SystemError, "for i in seq: "BGE_PROXY_ERROR_MSG);
return NULL;
}
@ -323,7 +390,7 @@ PyTypeObject KX_PythonSeq_Type = {
/* Method suites for standard classes */
NULL, /* PyNumberMethods *tp_as_number; */
NULL, /* PySequenceMethods *tp_as_sequence; */
&KX_PythonSeq_as_sequence, /* PySequenceMethods *tp_as_sequence; */
&KX_PythonSeq_as_mapping, /* PyMappingMethods *tp_as_mapping; */
/* More standard operations (here for binary compatibility) */
@ -361,7 +428,7 @@ PyTypeObject KX_PythonSeq_Type = {
( iternextfunc ) KX_PythonSeq_nextIter, /* iternextfunc tp_iternext; */
/*** Attribute descriptor and subclassing stuff ***/
NULL, /* struct PyMethodDef *tp_methods; */
KX_PythonSeq_methods, /* struct PyMethodDef *tp_methods; */
NULL, /* struct PyMemberDef *tp_members; */
NULL, /* struct PyGetSetDef *tp_getset; */
NULL, /* struct _typeobject *tp_base; */

View File

@ -979,6 +979,7 @@ void CcdPhysicsController::setScaling(float scaleX,float scaleY,float scaleZ)
if (m_object && m_object->getCollisionShape())
{
m_object->activate(true); // without this, sleeping objects scale wont be applied in bullet if python changes the scale - Campbell.
m_object->getCollisionShape()->setLocalScaling(m_cci.m_scaling);
//printf("no inertia recalc for fixed objects with mass=0\n");

View File

@ -6,22 +6,29 @@ The Blender Game Engine Python API Reference
See U{release notes<http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.49/Game_Engine>} for updates, changes and new functionality in the Game Engine Python API.
Top Module:
-----------
- L{GameLogic}
- L{GameKeys}
- L{GameTypes}
- L{Mathutils}
- L{Geometry}
- L{BGL}
Blender Game Engine Modules:
----------------------------
Modules that include methods for accessing GameEngine data and functions.
- L{GameLogic} utility functons for game logic.
- L{GameKeys} keyboard input and event conversion.
- L{Rasterizer} display and rendering.
- L{GameTypes} contains all the python types spesific to the GameEngine.
Undocumented modules:
---------------------
- VideoTexture
- CValue
- Expression
- PhysicsConstraints
Additional Modules:
-------------------
These modules have no GameEngine spesific functionality but are useful in many cases.
- L{Mathutils}
- L{Geometry}
- L{BGL}
Introduction:

View File

@ -271,7 +271,7 @@ Documentation for the GameLogic Module.
@var KX_PARENT_REMOVE:
@var KX_PARENT_SET:
@group Shader: MODELMATRIX*, MODELVIEWMATRIX*, VIEWMATRIX*, CAM_POS, CONSTANT_TIMER
@group Shader: MODELMATRIX*, MODELVIEWMATRIX*, VIEWMATRIX*, CAM_POS, CONSTANT_TIMER, SHD_TANGENT
@var VIEWMATRIX:
@var VIEWMATRIX_INVERSE:
@var VIEWMATRIX_INVERSETRANSPOSE:
@ -285,8 +285,8 @@ Documentation for the GameLogic Module.
@var MODELVIEWMATRIX_INVERSETRANSPOSE:
@var MODELVIEWMATRIX_TRANSPOSE:
@var CAM_POS: Current camera position
@var CONSTANT_TIMER: Current camera position
@var SHD_TANGENT: Current camera position
@var CONSTANT_TIMER: User a timer for the uniform value.
@var SHD_TANGENT: Not yet documented.
@group Blender Material: BL_*
@var BL_DST_ALPHA:
@ -302,6 +302,13 @@ Documentation for the GameLogic Module.
@var BL_ZERO:
@group Deprecated: addActiveActuator
@var globalDict: A dictionary that is saved between loading blend files so you can use
it to store inventory and other variables you want to store between
scenes and blend files. It can also be written to a file and loaded
later on with the game load/save actuators.
note: only python built in types such as int/string/bool/float/tuples/lists
can be saved, GameObjects, Actuators etc will not work as expectred.
"""
import GameTypes
@ -441,6 +448,14 @@ def setPhysicsTicRate(ticrate):
@type ticrate: float
"""
def EvalExpression(text):
"""
Evaluate the string as an expression, similar to the expression controller logic brick.
@param text: The expression to evaluate.
@type text: string
@return: The result of the expression. The type depends on the expression.
"""
#{ Utility functions
def getAverageFrameRate():
"""

View File

@ -204,6 +204,7 @@ PyObject* initVideoTexture(void)
#if (PY_VERSION_HEX >= 0x03000000)
m = PyModule_Create(&VideoTexture_module_def);
PyDict_SetItemString(PySys_GetObject("modules"), VideoTexture_module_def.m_name, m);
#else
m = Py_InitModule4("VideoTexture", moduleMethods,
"Module that allows to play video files on textures in GameBlender.",