merged from trunk 20741:20848
* Missing changes to release/windows/installer * Sequencer fixes in source/blender/src/seqaudio.c dont apply to 2.5 * brechts fix for #18855 r20763 wasnt merged, does this apply to 2.5?
This commit is contained in:
@@ -87,7 +87,7 @@ extern void count_displist(struct ListBase *lb, int *totvert, int *totface);
|
||||
extern void freedisplist(struct ListBase *lb);
|
||||
extern int displist_has_faces(struct ListBase *lb);
|
||||
|
||||
extern void makeDispListSurf(struct Scene *scene, struct Object *ob, struct ListBase *dispbase, int forRender);
|
||||
extern void makeDispListSurf(struct Scene *scene, struct Object *ob, struct ListBase *dispbase, int forRender, int forOrco);
|
||||
extern void makeDispListCurveTypes(struct Scene *scene, struct Object *ob, int forOrco);
|
||||
extern void makeDispListMBall(struct Scene *scene, struct Object *ob);
|
||||
extern void shadeDispList(struct Scene *scene, struct Base *base);
|
||||
|
||||
@@ -161,6 +161,7 @@ typedef struct {
|
||||
DerivedMesh *dm;
|
||||
int pos;
|
||||
int offset;
|
||||
int flip;
|
||||
} FaceIt;
|
||||
|
||||
static void FaceIt_Destruct(CSG_FaceIteratorDescriptor * iterator)
|
||||
@@ -187,9 +188,15 @@ static void FaceIt_Fill(CSG_IteratorPtr it, CSG_IFace *face)
|
||||
MFace *mfaces = face_it->dm->getFaceArray(face_it->dm);
|
||||
MFace *mface = &mfaces[face_it->pos];
|
||||
|
||||
face->vertex_index[0] = mface->v1;
|
||||
/* reverse face vertices if necessary */
|
||||
face->vertex_index[1] = mface->v2;
|
||||
if( face_it->flip == 0 ) {
|
||||
face->vertex_index[0] = mface->v1;
|
||||
face->vertex_index[2] = mface->v3;
|
||||
} else {
|
||||
face->vertex_index[2] = mface->v1;
|
||||
face->vertex_index[0] = mface->v3;
|
||||
}
|
||||
if (mface->v4) {
|
||||
face->vertex_index[3] = mface->v4;
|
||||
face->vertex_number = 4;
|
||||
@@ -213,7 +220,7 @@ static void FaceIt_Reset(CSG_IteratorPtr it)
|
||||
}
|
||||
|
||||
static void FaceIt_Construct(
|
||||
CSG_FaceIteratorDescriptor *output, DerivedMesh *dm, int offset)
|
||||
CSG_FaceIteratorDescriptor *output, DerivedMesh *dm, int offset, Object *ob)
|
||||
{
|
||||
FaceIt *it;
|
||||
if (output == 0) return;
|
||||
@@ -228,6 +235,25 @@ static void FaceIt_Construct(
|
||||
it->offset = offset;
|
||||
it->pos = 0;
|
||||
|
||||
/* determine if we will need to reverse order of face vertices */
|
||||
if (ob->size[0] < 0.0f) {
|
||||
if (ob->size[1] < 0.0f && ob->size[2] < 0.0f) {
|
||||
it->flip = 1;
|
||||
} else if (ob->size[1] >= 0.0f && ob->size[2] >= 0.0f) {
|
||||
it->flip = 1;
|
||||
} else {
|
||||
it->flip = 0;
|
||||
}
|
||||
} else {
|
||||
if (ob->size[1] < 0.0f && ob->size[2] < 0.0f) {
|
||||
it->flip = 0;
|
||||
} else if (ob->size[1] >= 0.0f && ob->size[2] >= 0.0f) {
|
||||
it->flip = 0;
|
||||
} else {
|
||||
it->flip = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// assign iterator function pointers.
|
||||
output->Step = FaceIt_Step;
|
||||
output->Fill = FaceIt_Fill;
|
||||
@@ -425,7 +451,7 @@ static void BuildMeshDescriptors(
|
||||
struct CSG_VertexIteratorDescriptor * vertex_it)
|
||||
{
|
||||
VertexIt_Construct(vertex_it,dm, ob);
|
||||
FaceIt_Construct(face_it,dm,face_offset);
|
||||
FaceIt_Construct(face_it,dm,face_offset,ob);
|
||||
}
|
||||
|
||||
static void FreeMeshDescriptors(
|
||||
|
||||
@@ -1371,7 +1371,7 @@ static void displist_surf_indices(DispList *dl)
|
||||
|
||||
}
|
||||
|
||||
void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase, int forRender)
|
||||
void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase, int forRender, int forOrco)
|
||||
{
|
||||
ListBase *nubase;
|
||||
Nurb *nu;
|
||||
@@ -1388,7 +1388,8 @@ void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase, int forRende
|
||||
else
|
||||
nubase= &cu->nurb;
|
||||
|
||||
curve_calc_modifiers_pre(scene, ob, forRender, &originalVerts, &deformedVerts, &numVerts);
|
||||
if(!forOrco)
|
||||
curve_calc_modifiers_pre(scene, ob, forRender, &originalVerts, &deformedVerts, &numVerts);
|
||||
|
||||
for (nu=nubase->first; nu; nu=nu->next) {
|
||||
if(forRender || nu->hide==0) {
|
||||
@@ -1442,7 +1443,8 @@ void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase, int forRende
|
||||
tex_space_curve(cu);
|
||||
}
|
||||
|
||||
curve_calc_modifiers_post(scene, ob, dispbase, forRender, originalVerts, deformedVerts);
|
||||
if(!forOrco)
|
||||
curve_calc_modifiers_post(scene, ob, dispbase, forRender, originalVerts, deformedVerts);
|
||||
}
|
||||
|
||||
void makeDispListCurveTypes(Scene *scene, Object *ob, int forOrco)
|
||||
@@ -1458,7 +1460,7 @@ void makeDispListCurveTypes(Scene *scene, Object *ob, int forOrco)
|
||||
freedisplist(dispbase);
|
||||
|
||||
if(ob->type==OB_SURF) {
|
||||
makeDispListSurf(scene, ob, dispbase, 0);
|
||||
makeDispListSurf(scene, ob, dispbase, 0, forOrco);
|
||||
}
|
||||
else if (ELEM(ob->type, OB_CURVE, OB_FONT)) {
|
||||
ListBase dlbev;
|
||||
|
||||
@@ -117,6 +117,72 @@ static struct DerivedMesh *NewBooleanDerivedMesh() {return NULL;}
|
||||
|
||||
//XXX #include "BIF_meshlaplacian.h"
|
||||
|
||||
/* Utility */
|
||||
|
||||
static int is_last_displist(Object *ob)
|
||||
{
|
||||
Curve *cu = ob->data;
|
||||
static int curvecount=0, totcurve=0;
|
||||
|
||||
if(curvecount == 0){
|
||||
DispList *dl;
|
||||
|
||||
totcurve = 0;
|
||||
for(dl=cu->disp.first; dl; dl=dl->next)
|
||||
totcurve++;
|
||||
}
|
||||
|
||||
curvecount++;
|
||||
|
||||
if(curvecount == totcurve){
|
||||
curvecount = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static DerivedMesh *get_original_dm(Scene *scene, Object *ob, float (*vertexCos)[3], int orco)
|
||||
{
|
||||
DerivedMesh *dm= NULL;
|
||||
|
||||
if(ob->type==OB_MESH) {
|
||||
dm = CDDM_from_mesh((Mesh*)(ob->data), ob);
|
||||
|
||||
if(vertexCos) {
|
||||
CDDM_apply_vert_coords(dm, vertexCos);
|
||||
//CDDM_calc_normals(dm);
|
||||
}
|
||||
|
||||
if(orco)
|
||||
DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, get_mesh_orco_verts(ob));
|
||||
}
|
||||
else if(ELEM3(ob->type,OB_FONT,OB_CURVE,OB_SURF)) {
|
||||
Object *tmpobj;
|
||||
Curve *tmpcu;
|
||||
|
||||
if(is_last_displist(ob)) {
|
||||
/* copies object and modifiers (but not the data) */
|
||||
tmpobj= copy_object(ob);
|
||||
tmpcu = (Curve *)tmpobj->data;
|
||||
tmpcu->id.us--;
|
||||
|
||||
/* copies the data */
|
||||
tmpobj->data = copy_curve((Curve *) ob->data);
|
||||
|
||||
makeDispListCurveTypes(scene, tmpobj, 1);
|
||||
nurbs_to_mesh(tmpobj);
|
||||
|
||||
dm = CDDM_from_mesh((Mesh*)(tmpobj->data), tmpobj);
|
||||
//CDDM_calc_normals(dm);
|
||||
|
||||
free_libblock_us(&G.main->object, tmpobj);
|
||||
}
|
||||
}
|
||||
|
||||
return dm;
|
||||
}
|
||||
|
||||
/***/
|
||||
|
||||
static int noneModifier_isDisabled(ModifierData *md)
|
||||
@@ -6046,7 +6112,8 @@ static void surfaceModifier_freeData(ModifierData *md)
|
||||
MEM_freeN(surmd->bvhtree);
|
||||
}
|
||||
|
||||
surmd->dm->release(surmd->dm);
|
||||
if(surmd->dm)
|
||||
surmd->dm->release(surmd->dm);
|
||||
|
||||
surmd->bvhtree = NULL;
|
||||
surmd->dm = NULL;
|
||||
@@ -6070,7 +6137,7 @@ static void surfaceModifier_deformVerts(
|
||||
|
||||
/* if possible use/create DerivedMesh */
|
||||
if(derivedData) surmd->dm = CDDM_copy(derivedData);
|
||||
else if(ob->type==OB_MESH) surmd->dm = CDDM_from_mesh(ob->data, ob);
|
||||
else surmd->dm = get_original_dm(md->scene, ob, NULL, 0);
|
||||
|
||||
if(!ob->pd)
|
||||
{
|
||||
@@ -6242,70 +6309,6 @@ CustomDataMask particleSystemModifier_requiredDataMask(ModifierData *md)
|
||||
|
||||
return dataMask;
|
||||
}
|
||||
static int is_last_displist(Object *ob)
|
||||
{
|
||||
Curve *cu = ob->data;
|
||||
static int curvecount=0, totcurve=0;
|
||||
|
||||
if(curvecount==0){
|
||||
DispList *dl;
|
||||
|
||||
totcurve=0;
|
||||
for(dl=cu->disp.first; dl; dl=dl->next){
|
||||
totcurve++;
|
||||
}
|
||||
}
|
||||
|
||||
curvecount++;
|
||||
|
||||
if(curvecount==totcurve){
|
||||
curvecount=0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static DerivedMesh *get_original_dm(Scene *scene, Object *ob, float (*vertexCos)[3], int orco)
|
||||
{
|
||||
DerivedMesh *dm= NULL;
|
||||
|
||||
if(ob->type==OB_MESH) {
|
||||
dm = CDDM_from_mesh((Mesh*)(ob->data), ob);
|
||||
|
||||
if(vertexCos) {
|
||||
CDDM_apply_vert_coords(dm, vertexCos);
|
||||
//CDDM_calc_normals(dm);
|
||||
}
|
||||
|
||||
if(orco)
|
||||
DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, get_mesh_orco_verts(ob));
|
||||
}
|
||||
else if(ELEM3(ob->type,OB_FONT,OB_CURVE,OB_SURF)) {
|
||||
Object *tmpobj;
|
||||
Curve *tmpcu;
|
||||
|
||||
if(is_last_displist(ob)) {
|
||||
/* copies object and modifiers (but not the data) */
|
||||
tmpobj= copy_object(ob);
|
||||
tmpcu = (Curve *)tmpobj->data;
|
||||
tmpcu->id.us--;
|
||||
|
||||
/* copies the data */
|
||||
tmpobj->data = copy_curve((Curve *) ob->data);
|
||||
|
||||
makeDispListCurveTypes(scene, tmpobj, 1);
|
||||
nurbs_to_mesh(tmpobj);
|
||||
|
||||
dm = CDDM_from_mesh((Mesh*)(tmpobj->data), tmpobj);
|
||||
//CDDM_calc_normals(dm);
|
||||
|
||||
free_libblock_us(&G.main->object, tmpobj);
|
||||
}
|
||||
}
|
||||
|
||||
return dm;
|
||||
}
|
||||
|
||||
/* saves the current emitter state for a particle system and calculates particles */
|
||||
static void particleSystemModifier_deformVerts(
|
||||
|
||||
@@ -1300,9 +1300,23 @@ int psys_threads_init_distribution(ParticleThread *threads, Scene *scene, Derive
|
||||
/* for hair, sort by origindex, allows optimizations in rendering */
|
||||
/* however with virtual parents the children need to be in random order */
|
||||
if(part->type == PART_HAIR && !(part->childtype==PART_CHILD_FACES && part->parents!=0.0)) {
|
||||
COMPARE_ORIG_INDEX= dm->getFaceDataArray(dm, CD_ORIGINDEX);
|
||||
if(COMPARE_ORIG_INDEX)
|
||||
qsort(index, totpart, sizeof(int), compare_orig_index);
|
||||
if(from != PART_FROM_PARTICLE) {
|
||||
COMPARE_ORIG_INDEX = NULL;
|
||||
|
||||
if(from == PART_FROM_VERT) {
|
||||
if(dm->numVertData)
|
||||
COMPARE_ORIG_INDEX= dm->getVertDataArray(dm, CD_ORIGINDEX);
|
||||
}
|
||||
else {
|
||||
if(dm->numFaceData)
|
||||
COMPARE_ORIG_INDEX= dm->getFaceDataArray(dm, CD_ORIGINDEX);
|
||||
}
|
||||
|
||||
if(COMPARE_ORIG_INDEX) {
|
||||
qsort(index, totpart, sizeof(int), compare_orig_index);
|
||||
COMPARE_ORIG_INDEX = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* weights are no longer used except for FROM_PARTICLE, which needs them zeroed for indexing */
|
||||
|
||||
@@ -294,9 +294,12 @@ int objchr_to_ftvfontdata(VFont *vfont, FT_ULong charcode)
|
||||
tf->pf->size,
|
||||
0,
|
||||
&face);
|
||||
if (err) return FALSE;
|
||||
}
|
||||
else {
|
||||
err = TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
err= TRUE;
|
||||
|
||||
// Read the char
|
||||
freetypechar_to_vchar(face, charcode, vfont->data);
|
||||
|
||||
@@ -159,7 +159,7 @@ typedef struct Sequence {
|
||||
struct bSound *sound; /* the linked "bSound" object */
|
||||
struct hdaudio *hdaudio; /* external hdaudio object */
|
||||
float level, pan; /* level in dB (0=full), pan -1..1 */
|
||||
int curpos; /* last sample position in audio_fill() */
|
||||
int scenenr; /* for scene selection */
|
||||
float strobe;
|
||||
|
||||
void *effectdata; /* Struct pointer for effect settings */
|
||||
@@ -170,8 +170,6 @@ typedef struct Sequence {
|
||||
int blend_mode;
|
||||
float blend_opacity;
|
||||
|
||||
int scenenr; /* for scene selection */
|
||||
int pad;
|
||||
} Sequence;
|
||||
|
||||
typedef struct MetaStack {
|
||||
|
||||
@@ -1857,8 +1857,6 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
|
||||
strand->totvert++;
|
||||
}
|
||||
else{
|
||||
sd.first = 0;
|
||||
sd.time = time;
|
||||
sd.size = hasize;
|
||||
|
||||
if(k==1){
|
||||
@@ -1866,8 +1864,13 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
|
||||
sd.time = 0.0f;
|
||||
VECSUB(loc0,loc1,loc);
|
||||
VECADD(loc0,loc1,loc0);
|
||||
|
||||
render_new_particle(re, obr, psmd->dm, ma, &sd, loc1, loc0, seed);
|
||||
}
|
||||
|
||||
sd.first = 0;
|
||||
sd.time = time;
|
||||
|
||||
if(k)
|
||||
render_new_particle(re, obr, psmd->dm, ma, &sd, loc, loc1, seed);
|
||||
|
||||
@@ -2558,7 +2561,7 @@ static void init_render_surf(Render *re, ObjectRen *obr)
|
||||
if(need_orco) orcobase= orco= get_object_orco(re, ob);
|
||||
|
||||
displist.first= displist.last= 0;
|
||||
makeDispListSurf(re->scene, ob, &displist, 1);
|
||||
makeDispListSurf(re->scene, ob, &displist, 1, 0);
|
||||
|
||||
dl= displist.first;
|
||||
/* walk along displaylist and create rendervertices/-faces */
|
||||
|
||||
@@ -868,7 +868,7 @@ static void error_cb(char *err)
|
||||
|
||||
static void mem_error_cb(char *errorStr)
|
||||
{
|
||||
fprintf(stderr, "%s", errorStr);
|
||||
fputs(errorStr, stderr);
|
||||
fflush(stderr);
|
||||
}
|
||||
|
||||
|
||||
@@ -338,6 +338,7 @@ extern "C" void StartKetsjiShell(struct ScrArea *area,
|
||||
ketsjiengine->SetCameraOverrideProjectionMatrix(projmat);
|
||||
ketsjiengine->SetCameraOverrideViewMatrix(viewmat);
|
||||
ketsjiengine->SetCameraOverrideClipping(v3d->near, v3d->far);
|
||||
ketsjiengine->SetCameraOverrideLens(v3d->lens);
|
||||
}
|
||||
|
||||
// create a scene converter, create and convert the startingscene
|
||||
|
||||
@@ -28,8 +28,6 @@
|
||||
|
||||
#include "GL/glew.h"
|
||||
|
||||
#include "DNA_scene_types.h"
|
||||
|
||||
#include "RAS_IRenderTools.h"
|
||||
#include "RAS_IRasterizer.h"
|
||||
#include "RAS_LightObject.h"
|
||||
@@ -41,6 +39,7 @@
|
||||
#include "KX_BlenderMaterial.h"
|
||||
#include "KX_RayCast.h"
|
||||
#include "KX_IPhysicsController.h"
|
||||
#include "KX_Light.h"
|
||||
|
||||
#include "PHY_IPhysicsEnvironment.h"
|
||||
|
||||
@@ -330,21 +329,12 @@ int KX_BlenderRenderTools::applyLights(int objectlayer, const MT_Transform& view
|
||||
{
|
||||
// taken from blender source, incompatibility between Blender Object / GameObject
|
||||
KX_Scene* kxscene = (KX_Scene*)m_auxilaryClientInfo;
|
||||
int scenelayer = ~0;
|
||||
float glviewmat[16];
|
||||
unsigned int count;
|
||||
float vec[4];
|
||||
std::vector<struct RAS_LightObject*>::iterator lit = m_lights.begin();
|
||||
|
||||
vec[3]= 1.0;
|
||||
|
||||
if(kxscene && kxscene->GetBlenderScene())
|
||||
scenelayer = kxscene->GetBlenderScene()->lay;
|
||||
|
||||
for(count=0; count<m_numgllights; count++)
|
||||
glDisable((GLenum)(GL_LIGHT0+count));
|
||||
|
||||
//std::vector<struct RAS_LightObject*> m_lights;
|
||||
std::vector<struct RAS_LightObject*>::iterator lit = m_lights.begin();
|
||||
|
||||
viewmat.getValue(glviewmat);
|
||||
|
||||
@@ -353,82 +343,14 @@ int KX_BlenderRenderTools::applyLights(int objectlayer, const MT_Transform& view
|
||||
for (lit = m_lights.begin(), count = 0; !(lit==m_lights.end()) && count < m_numgllights; ++lit)
|
||||
{
|
||||
RAS_LightObject* lightdata = (*lit);
|
||||
KX_Scene* lightscene = (KX_Scene*)lightdata->m_scene;
|
||||
KX_LightObject *kxlight = (KX_LightObject*)lightdata->m_light;
|
||||
|
||||
/* only use lights in the same layer as the object */
|
||||
if(!(lightdata->m_layer & objectlayer))
|
||||
continue;
|
||||
/* only use lights in the same scene, and in a visible layer */
|
||||
if(kxscene != lightscene || !(lightdata->m_layer & scenelayer))
|
||||
continue;
|
||||
|
||||
vec[0] = (*(lightdata->m_worldmatrix))(0,3);
|
||||
vec[1] = (*(lightdata->m_worldmatrix))(1,3);
|
||||
vec[2] = (*(lightdata->m_worldmatrix))(2,3);
|
||||
vec[3] = 1;
|
||||
|
||||
if(lightdata->m_type==RAS_LightObject::LIGHT_SUN) {
|
||||
|
||||
vec[0] = (*(lightdata->m_worldmatrix))(0,2);
|
||||
vec[1] = (*(lightdata->m_worldmatrix))(1,2);
|
||||
vec[2] = (*(lightdata->m_worldmatrix))(2,2);
|
||||
//vec[0]= base->object->obmat[2][0];
|
||||
//vec[1]= base->object->obmat[2][1];
|
||||
//vec[2]= base->object->obmat[2][2];
|
||||
vec[3]= 0.0;
|
||||
glLightfv((GLenum)(GL_LIGHT0+count), GL_POSITION, vec);
|
||||
}
|
||||
else {
|
||||
//vec[3]= 1.0;
|
||||
glLightfv((GLenum)(GL_LIGHT0+count), GL_POSITION, vec);
|
||||
glLightf((GLenum)(GL_LIGHT0+count), GL_CONSTANT_ATTENUATION, 1.0);
|
||||
glLightf((GLenum)(GL_LIGHT0+count), GL_LINEAR_ATTENUATION, lightdata->m_att1/lightdata->m_distance);
|
||||
// without this next line it looks backward compatible.
|
||||
//attennuation still is acceptable
|
||||
glLightf((GLenum)(GL_LIGHT0+count), GL_QUADRATIC_ATTENUATION, lightdata->m_att2/(lightdata->m_distance*lightdata->m_distance));
|
||||
|
||||
if(lightdata->m_type==RAS_LightObject::LIGHT_SPOT) {
|
||||
vec[0] = -(*(lightdata->m_worldmatrix))(0,2);
|
||||
vec[1] = -(*(lightdata->m_worldmatrix))(1,2);
|
||||
vec[2] = -(*(lightdata->m_worldmatrix))(2,2);
|
||||
//vec[0]= -base->object->obmat[2][0];
|
||||
//vec[1]= -base->object->obmat[2][1];
|
||||
//vec[2]= -base->object->obmat[2][2];
|
||||
glLightfv((GLenum)(GL_LIGHT0+count), GL_SPOT_DIRECTION, vec);
|
||||
glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_CUTOFF, lightdata->m_spotsize/2.0);
|
||||
glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_EXPONENT, 128.0*lightdata->m_spotblend);
|
||||
}
|
||||
else glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_CUTOFF, 180.0);
|
||||
}
|
||||
|
||||
if (lightdata->m_nodiffuse)
|
||||
{
|
||||
vec[0] = vec[1] = vec[2] = vec[3] = 0.0;
|
||||
} else {
|
||||
vec[0]= lightdata->m_energy*lightdata->m_red;
|
||||
vec[1]= lightdata->m_energy*lightdata->m_green;
|
||||
vec[2]= lightdata->m_energy*lightdata->m_blue;
|
||||
vec[3]= 1.0;
|
||||
}
|
||||
glLightfv((GLenum)(GL_LIGHT0+count), GL_DIFFUSE, vec);
|
||||
if (lightdata->m_nospecular)
|
||||
{
|
||||
vec[0] = vec[1] = vec[2] = vec[3] = 0.0;
|
||||
} else if (lightdata->m_nodiffuse) {
|
||||
vec[0]= lightdata->m_energy*lightdata->m_red;
|
||||
vec[1]= lightdata->m_energy*lightdata->m_green;
|
||||
vec[2]= lightdata->m_energy*lightdata->m_blue;
|
||||
vec[3]= 1.0;
|
||||
}
|
||||
glLightfv((GLenum)(GL_LIGHT0+count), GL_SPECULAR, vec);
|
||||
glEnable((GLenum)(GL_LIGHT0+count));
|
||||
|
||||
count++;
|
||||
if(kxlight->ApplyLight(kxscene, objectlayer, count))
|
||||
count++;
|
||||
}
|
||||
glPopMatrix();
|
||||
|
||||
return count;
|
||||
|
||||
}
|
||||
|
||||
void KX_BlenderRenderTools::MotionBlur(RAS_IRasterizer* rasterizer)
|
||||
|
||||
@@ -209,6 +209,30 @@ static PyObject *listvalue_buffer_concat(PyObject * self, PyObject * other)
|
||||
return listval_new->NewProxy(true); /* python owns this list */
|
||||
}
|
||||
|
||||
static int listvalue_buffer_contains(PyObject *self_v, PyObject *value)
|
||||
{
|
||||
CListValue *self= static_cast<CListValue *>(BGE_PROXY_REF(self_v));
|
||||
|
||||
if (self==NULL) {
|
||||
PyErr_SetString(PyExc_SystemError, "val in CList, "BGE_PROXY_ERROR_MSG);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (PyString_Check(value)) {
|
||||
if (self->FindValue((const char *)PyString_AsString(value))) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (BGE_PROXY_CHECK_TYPE(value)) { /* not dict like at all but this worked before __contains__ was used */
|
||||
CValue *item= static_cast<CValue *>(BGE_PROXY_REF(value));
|
||||
for (int i=0; i < self->GetCount(); i++)
|
||||
if (self->GetValue(i) == item) // Com
|
||||
return 1;
|
||||
|
||||
} // not using CheckEqual
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static PySequenceMethods listvalue_as_sequence = {
|
||||
@@ -225,6 +249,7 @@ static PySequenceMethods listvalue_as_sequence = {
|
||||
NULL, /*sq_ass_item*/
|
||||
NULL, /*sq_ass_slice*/
|
||||
#endif
|
||||
(objobjproc)listvalue_buffer_contains, /* sq_contains */
|
||||
};
|
||||
|
||||
|
||||
@@ -264,7 +289,9 @@ PyTypeObject CListValue::Type = {
|
||||
0,
|
||||
py_base_getattro,
|
||||
py_base_setattro,
|
||||
0,0,0,0,0,0,0,0,0,
|
||||
0,
|
||||
Py_TPFLAGS_DEFAULT,
|
||||
0,0,0,0,0,0,0,
|
||||
Methods
|
||||
};
|
||||
|
||||
@@ -499,7 +526,7 @@ PyObject* CListValue::Pyreverse()
|
||||
bool CListValue::CheckEqual(CValue* first,CValue* second)
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
|
||||
CValue* eqval = ((CValue*)first)->Calc(VALUE_EQL_OPERATOR,(CValue*)second);
|
||||
|
||||
if (eqval==NULL)
|
||||
@@ -528,7 +555,7 @@ PyObject* CListValue::Pyindex(PyObject *value)
|
||||
for (int i=0;i<numelem;i++)
|
||||
{
|
||||
CValue* elem = GetValue(i);
|
||||
if (CheckEqual(checkobj,elem))
|
||||
if (checkobj==elem || CheckEqual(checkobj,elem))
|
||||
{
|
||||
result = PyInt_FromLong(i);
|
||||
break;
|
||||
@@ -560,7 +587,7 @@ PyObject* CListValue::Pycount(PyObject* value)
|
||||
for (int i=0;i<numelem;i++)
|
||||
{
|
||||
CValue* elem = GetValue(i);
|
||||
if (CheckEqual(checkobj,elem))
|
||||
if (checkobj==elem || CheckEqual(checkobj,elem))
|
||||
{
|
||||
numfound ++;
|
||||
}
|
||||
|
||||
@@ -113,8 +113,8 @@ typedef struct {
|
||||
if ((m_ignore_deprecation_warnings || wlink.warn_done)==0) \
|
||||
{ \
|
||||
ShowDeprecationWarning_func(old_way, new_way); \
|
||||
\
|
||||
WarnLink *wlink_last= GetDeprecationWarningLinkLast(); \
|
||||
ShowDeprecationWarning_func(old_way, new_way); \
|
||||
wlink.warn_done = true; \
|
||||
wlink.link = NULL; \
|
||||
\
|
||||
|
||||
@@ -29,8 +29,6 @@
|
||||
|
||||
#include "GL/glew.h"
|
||||
|
||||
#include "DNA_scene_types.h"
|
||||
|
||||
#include "RAS_IRenderTools.h"
|
||||
#include "RAS_IRasterizer.h"
|
||||
#include "RAS_LightObject.h"
|
||||
@@ -42,6 +40,7 @@
|
||||
#include "KX_BlenderMaterial.h"
|
||||
#include "KX_RayCast.h"
|
||||
#include "KX_IPhysicsController.h"
|
||||
#include "KX_Light.h"
|
||||
|
||||
#include "PHY_IPhysicsEnvironment.h"
|
||||
|
||||
@@ -387,21 +386,12 @@ int GPC_RenderTools::applyLights(int objectlayer, const MT_Transform& viewmat)
|
||||
{
|
||||
// taken from blender source, incompatibility between Blender Object / GameObject
|
||||
KX_Scene* kxscene = (KX_Scene*)m_auxilaryClientInfo;
|
||||
int scenelayer = ~0;
|
||||
float glviewmat[16];
|
||||
unsigned int count;
|
||||
float vec[4];
|
||||
std::vector<struct RAS_LightObject*>::iterator lit = m_lights.begin();
|
||||
|
||||
vec[3]= 1.0;
|
||||
|
||||
if(kxscene && kxscene->GetBlenderScene())
|
||||
scenelayer = kxscene->GetBlenderScene()->lay;
|
||||
|
||||
for(count=0; count<m_numgllights; count++)
|
||||
glDisable((GLenum)(GL_LIGHT0+count));
|
||||
|
||||
//std::vector<struct RAS_LightObject*> m_lights;
|
||||
std::vector<struct RAS_LightObject*>::iterator lit = m_lights.begin();
|
||||
|
||||
viewmat.getValue(glviewmat);
|
||||
|
||||
@@ -410,82 +400,14 @@ int GPC_RenderTools::applyLights(int objectlayer, const MT_Transform& viewmat)
|
||||
for (lit = m_lights.begin(), count = 0; !(lit==m_lights.end()) && count < m_numgllights; ++lit)
|
||||
{
|
||||
RAS_LightObject* lightdata = (*lit);
|
||||
KX_Scene* lightscene = (KX_Scene*)lightdata->m_scene;
|
||||
KX_LightObject *kxlight = (KX_LightObject*)lightdata->m_light;
|
||||
|
||||
/* only use lights in the same layer as the object */
|
||||
if(!(lightdata->m_layer & objectlayer))
|
||||
continue;
|
||||
/* only use lights in the same scene, and in a visible layer */
|
||||
if(kxscene != lightscene || !(lightdata->m_layer & scenelayer))
|
||||
continue;
|
||||
|
||||
vec[0] = (*(lightdata->m_worldmatrix))(0,3);
|
||||
vec[1] = (*(lightdata->m_worldmatrix))(1,3);
|
||||
vec[2] = (*(lightdata->m_worldmatrix))(2,3);
|
||||
vec[3] = 1;
|
||||
|
||||
if(lightdata->m_type==RAS_LightObject::LIGHT_SUN) {
|
||||
|
||||
vec[0] = (*(lightdata->m_worldmatrix))(0,2);
|
||||
vec[1] = (*(lightdata->m_worldmatrix))(1,2);
|
||||
vec[2] = (*(lightdata->m_worldmatrix))(2,2);
|
||||
//vec[0]= base->object->obmat[2][0];
|
||||
//vec[1]= base->object->obmat[2][1];
|
||||
//vec[2]= base->object->obmat[2][2];
|
||||
vec[3]= 0.0;
|
||||
glLightfv((GLenum)(GL_LIGHT0+count), GL_POSITION, vec);
|
||||
}
|
||||
else {
|
||||
//vec[3]= 1.0;
|
||||
glLightfv((GLenum)(GL_LIGHT0+count), GL_POSITION, vec);
|
||||
glLightf((GLenum)(GL_LIGHT0+count), GL_CONSTANT_ATTENUATION, 1.0);
|
||||
glLightf((GLenum)(GL_LIGHT0+count), GL_LINEAR_ATTENUATION, lightdata->m_att1/lightdata->m_distance);
|
||||
// without this next line it looks backward compatible.
|
||||
//attennuation still is acceptable
|
||||
glLightf((GLenum)(GL_LIGHT0+count), GL_QUADRATIC_ATTENUATION, lightdata->m_att2/(lightdata->m_distance*lightdata->m_distance));
|
||||
|
||||
if(lightdata->m_type==RAS_LightObject::LIGHT_SPOT) {
|
||||
vec[0] = -(*(lightdata->m_worldmatrix))(0,2);
|
||||
vec[1] = -(*(lightdata->m_worldmatrix))(1,2);
|
||||
vec[2] = -(*(lightdata->m_worldmatrix))(2,2);
|
||||
//vec[0]= -base->object->obmat[2][0];
|
||||
//vec[1]= -base->object->obmat[2][1];
|
||||
//vec[2]= -base->object->obmat[2][2];
|
||||
glLightfv((GLenum)(GL_LIGHT0+count), GL_SPOT_DIRECTION, vec);
|
||||
glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_CUTOFF, lightdata->m_spotsize/2.0);
|
||||
glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_EXPONENT, 128.0*lightdata->m_spotblend);
|
||||
}
|
||||
else glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_CUTOFF, 180.0);
|
||||
}
|
||||
|
||||
if (lightdata->m_nodiffuse)
|
||||
{
|
||||
vec[0] = vec[1] = vec[2] = vec[3] = 0.0;
|
||||
} else {
|
||||
vec[0]= lightdata->m_energy*lightdata->m_red;
|
||||
vec[1]= lightdata->m_energy*lightdata->m_green;
|
||||
vec[2]= lightdata->m_energy*lightdata->m_blue;
|
||||
vec[3]= 1.0;
|
||||
}
|
||||
glLightfv((GLenum)(GL_LIGHT0+count), GL_DIFFUSE, vec);
|
||||
if (lightdata->m_nospecular)
|
||||
{
|
||||
vec[0] = vec[1] = vec[2] = vec[3] = 0.0;
|
||||
} else if (lightdata->m_nodiffuse) {
|
||||
vec[0]= lightdata->m_energy*lightdata->m_red;
|
||||
vec[1]= lightdata->m_energy*lightdata->m_green;
|
||||
vec[2]= lightdata->m_energy*lightdata->m_blue;
|
||||
vec[3]= 1.0;
|
||||
}
|
||||
glLightfv((GLenum)(GL_LIGHT0+count), GL_SPECULAR, vec);
|
||||
glEnable((GLenum)(GL_LIGHT0+count));
|
||||
|
||||
count++;
|
||||
if(kxlight->ApplyLight(kxscene, objectlayer, count))
|
||||
count++;
|
||||
}
|
||||
glPopMatrix();
|
||||
|
||||
return count;
|
||||
|
||||
}
|
||||
|
||||
void GPC_RenderTools::MotionBlur(RAS_IRasterizer* rasterizer)
|
||||
|
||||
@@ -547,12 +547,15 @@ PyTypeObject KX_Camera::Type = {
|
||||
0,
|
||||
0,
|
||||
py_base_repr,
|
||||
0,0,
|
||||
0,
|
||||
&KX_GameObject::Sequence,
|
||||
&KX_GameObject::Mapping,
|
||||
0,0,0,
|
||||
py_base_getattro,
|
||||
py_base_setattro,
|
||||
0,0,0,0,0,0,0,0,0,
|
||||
0,
|
||||
Py_TPFLAGS_DEFAULT,
|
||||
0,0,0,0,0,0,0,
|
||||
Methods
|
||||
};
|
||||
|
||||
|
||||
@@ -1287,7 +1287,7 @@ PyObject* KX_GameObject::PyGetPosition()
|
||||
return PyObjectFrom(NodeGetWorldPosition());
|
||||
}
|
||||
|
||||
PyObject *KX_GameObject::Map_GetItem(PyObject *self_v, PyObject *item)
|
||||
static PyObject *Map_GetItem(PyObject *self_v, PyObject *item)
|
||||
{
|
||||
KX_GameObject* self= static_cast<KX_GameObject*>BGE_PROXY_REF(self_v);
|
||||
const char *attr_str= PyString_AsString(item);
|
||||
@@ -1295,7 +1295,7 @@ PyObject *KX_GameObject::Map_GetItem(PyObject *self_v, PyObject *item)
|
||||
PyObject* pyconvert;
|
||||
|
||||
if (self==NULL) {
|
||||
PyErr_SetString(PyExc_SystemError, BGE_PROXY_ERROR_MSG);
|
||||
PyErr_SetString(PyExc_SystemError, "val = gameOb[key]: KX_GameObject, "BGE_PROXY_ERROR_MSG);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1321,7 +1321,7 @@ PyObject *KX_GameObject::Map_GetItem(PyObject *self_v, PyObject *item)
|
||||
}
|
||||
|
||||
|
||||
int KX_GameObject::Map_SetItem(PyObject *self_v, PyObject *key, PyObject *val)
|
||||
static int Map_SetItem(PyObject *self_v, PyObject *key, PyObject *val)
|
||||
{
|
||||
KX_GameObject* self= static_cast<KX_GameObject*>BGE_PROXY_REF(self_v);
|
||||
const char *attr_str= PyString_AsString(key);
|
||||
@@ -1329,7 +1329,7 @@ int KX_GameObject::Map_SetItem(PyObject *self_v, PyObject *key, PyObject *val)
|
||||
PyErr_Clear();
|
||||
|
||||
if (self==NULL) {
|
||||
PyErr_SetString(PyExc_SystemError, BGE_PROXY_ERROR_MSG);
|
||||
PyErr_SetString(PyExc_SystemError, "gameOb[key] = value: KX_GameObject, "BGE_PROXY_ERROR_MSG);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -1409,11 +1409,40 @@ int KX_GameObject::Map_SetItem(PyObject *self_v, PyObject *key, PyObject *val)
|
||||
return 0; /* success */
|
||||
}
|
||||
|
||||
/* Cant set the len otherwise it can evaluate as false */
|
||||
static int Seq_Contains(PyObject *self_v, PyObject *value)
|
||||
{
|
||||
KX_GameObject* self= static_cast<KX_GameObject*>BGE_PROXY_REF(self_v);
|
||||
|
||||
if (self==NULL) {
|
||||
PyErr_SetString(PyExc_SystemError, "val in gameOb: KX_GameObject, "BGE_PROXY_ERROR_MSG);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(PyString_Check(value) && self->GetProperty(PyString_AsString(value)))
|
||||
return 1;
|
||||
|
||||
if (self->m_attr_dict && PyDict_GetItem(self->m_attr_dict, value))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
PyMappingMethods KX_GameObject::Mapping = {
|
||||
(lenfunc)NULL , /*inquiry mp_length */
|
||||
(binaryfunc)KX_GameObject::Map_GetItem, /*binaryfunc mp_subscript */
|
||||
(objobjargproc)KX_GameObject::Map_SetItem, /*objobjargproc mp_ass_subscript */
|
||||
(binaryfunc)Map_GetItem, /*binaryfunc mp_subscript */
|
||||
(objobjargproc)Map_SetItem, /*objobjargproc mp_ass_subscript */
|
||||
};
|
||||
|
||||
PySequenceMethods KX_GameObject::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)Seq_Contains, /* sq_contains */
|
||||
};
|
||||
|
||||
PyTypeObject KX_GameObject::Type = {
|
||||
@@ -1433,12 +1462,15 @@ PyTypeObject KX_GameObject::Type = {
|
||||
0,
|
||||
0,
|
||||
py_base_repr,
|
||||
0,0,
|
||||
0,
|
||||
&Sequence,
|
||||
&Mapping,
|
||||
0,0,0,
|
||||
py_base_getattro,
|
||||
py_base_setattro,
|
||||
0,0,0,0,0,0,0,0,0,
|
||||
0,
|
||||
Py_TPFLAGS_DEFAULT,
|
||||
0,0,0,0,0,0,0,
|
||||
Methods
|
||||
};
|
||||
|
||||
@@ -2207,7 +2239,7 @@ PyObject* KX_GameObject::PyGetChildrenRecursive()
|
||||
|
||||
PyObject* KX_GameObject::PyGetMesh(PyObject* args)
|
||||
{
|
||||
ShowDeprecationWarning("getMesh()", "the meshes property");
|
||||
ShowDeprecationWarning("getMesh()", "the meshes property (now a list of meshes)");
|
||||
|
||||
int mesh = 0;
|
||||
|
||||
@@ -2779,16 +2811,11 @@ PyObject* KX_GameObject::Pyget(PyObject *args)
|
||||
/* Matches python dict.has_key() */
|
||||
PyObject* KX_GameObject::Pyhas_key(PyObject* value)
|
||||
{
|
||||
if(PyString_Check(value) && GetProperty(PyString_AsString(value)))
|
||||
Py_RETURN_TRUE;
|
||||
|
||||
if (m_attr_dict && PyDict_GetItem(m_attr_dict, value))
|
||||
Py_RETURN_TRUE;
|
||||
|
||||
Py_RETURN_FALSE;
|
||||
// the ONLY error case is invalid data, this is checked by the macro'd static function
|
||||
// that calls this one. but make sure Seq_Contains doesnt add extra errors later on.
|
||||
return PyBool_FromLong(Seq_Contains((PyObject *)this, value));
|
||||
}
|
||||
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
* Some stuff taken from the header
|
||||
* --------------------------------------------------------------------- */
|
||||
|
||||
@@ -917,10 +917,8 @@ public:
|
||||
static PyObject* pyattr_get_actuators(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
|
||||
|
||||
/* getitem/setitem */
|
||||
static Py_ssize_t Map_Len(PyObject* self);
|
||||
static PyMappingMethods Mapping;
|
||||
static PyObject* Map_GetItem(PyObject *self_v, PyObject *item);
|
||||
static int Map_SetItem(PyObject *self_v, PyObject *key, PyObject *val);
|
||||
static PySequenceMethods Sequence;
|
||||
|
||||
private :
|
||||
|
||||
|
||||
@@ -1078,6 +1078,11 @@ void KX_KetsjiEngine::SetCameraOverrideClipping(float near, float far)
|
||||
m_overrideCamFar = far;
|
||||
}
|
||||
|
||||
void KX_KetsjiEngine::SetCameraOverrideLens(float lens)
|
||||
{
|
||||
m_overrideCamLens = lens;
|
||||
}
|
||||
|
||||
void KX_KetsjiEngine::GetSceneViewport(KX_Scene *scene, KX_Camera* cam, RAS_Rect& area, RAS_Rect& viewport)
|
||||
{
|
||||
// In this function we make sure the rasterizer settings are upto
|
||||
@@ -1351,6 +1356,8 @@ void KX_KetsjiEngine::PostProcessScene(KX_Scene* scene)
|
||||
KX_Camera* activecam = NULL;
|
||||
|
||||
RAS_CameraData camdata = RAS_CameraData();
|
||||
if (override_camera) camdata.m_lens = m_overrideCamLens;
|
||||
|
||||
activecam = new KX_Camera(scene,KX_Scene::m_callbacks,camdata);
|
||||
activecam->SetName("__default__cam__");
|
||||
|
||||
|
||||
@@ -129,6 +129,7 @@ private:
|
||||
MT_CmMatrix4x4 m_overrideCamViewMat;
|
||||
float m_overrideCamNear;
|
||||
float m_overrideCamFar;
|
||||
float m_overrideCamLens;
|
||||
|
||||
bool m_stereo;
|
||||
int m_curreye;
|
||||
@@ -253,6 +254,7 @@ public:
|
||||
void SetCameraOverrideProjectionMatrix(const MT_CmMatrix4x4& mat);
|
||||
void SetCameraOverrideViewMatrix(const MT_CmMatrix4x4& mat);
|
||||
void SetCameraOverrideClipping(float near, float far);
|
||||
void SetCameraOverrideLens(float lens);
|
||||
|
||||
/**
|
||||
* Sets display of all frames.
|
||||
|
||||
@@ -35,6 +35,8 @@
|
||||
#pragma warning (disable : 4786)
|
||||
#endif
|
||||
|
||||
#include "GL/glew.h"
|
||||
|
||||
#include "KX_Light.h"
|
||||
#include "KX_Camera.h"
|
||||
#include "RAS_IRasterizer.h"
|
||||
@@ -43,6 +45,7 @@
|
||||
#include "KX_PyMath.h"
|
||||
|
||||
#include "DNA_object_types.h"
|
||||
#include "DNA_scene_types.h"
|
||||
#include "GPU_material.h"
|
||||
|
||||
KX_LightObject::KX_LightObject(void* sgReplicationInfo,SG_Callbacks callbacks,
|
||||
@@ -56,8 +59,8 @@ KX_LightObject::KX_LightObject(void* sgReplicationInfo,SG_Callbacks callbacks,
|
||||
m_rendertools(rendertools)
|
||||
{
|
||||
m_lightobj = lightobj;
|
||||
m_lightobj.m_worldmatrix = GetOpenGLMatrixPtr();
|
||||
m_lightobj.m_scene = sgReplicationInfo;
|
||||
m_lightobj.m_light = this;
|
||||
m_rendertools->AddLight(&m_lightobj);
|
||||
m_glsl = glsl;
|
||||
m_blenderscene = ((KX_Scene*)sgReplicationInfo)->GetBlenderScene();
|
||||
@@ -84,12 +87,102 @@ CValue* KX_LightObject::GetReplica()
|
||||
|
||||
replica->ProcessReplica();
|
||||
|
||||
replica->m_lightobj.m_worldmatrix = replica->GetOpenGLMatrixPtr();
|
||||
replica->m_lightobj.m_light = replica;
|
||||
m_rendertools->AddLight(&replica->m_lightobj);
|
||||
|
||||
return replica;
|
||||
}
|
||||
|
||||
bool KX_LightObject::ApplyLight(KX_Scene *kxscene, int oblayer, int slot)
|
||||
{
|
||||
KX_Scene* lightscene = (KX_Scene*)m_lightobj.m_scene;
|
||||
float vec[4];
|
||||
int scenelayer = ~0;
|
||||
|
||||
if(kxscene && kxscene->GetBlenderScene())
|
||||
scenelayer = kxscene->GetBlenderScene()->lay;
|
||||
|
||||
/* only use lights in the same layer as the object */
|
||||
if(!(m_lightobj.m_layer & oblayer))
|
||||
return false;
|
||||
/* only use lights in the same scene, and in a visible layer */
|
||||
if(kxscene != lightscene || !(m_lightobj.m_layer & scenelayer))
|
||||
return false;
|
||||
|
||||
// lights don't get their openGL matrix updated, do it now
|
||||
if(GetSGNode()->IsDirty())
|
||||
GetOpenGLMatrix();
|
||||
|
||||
MT_CmMatrix4x4& worldmatrix= *GetOpenGLMatrixPtr();
|
||||
|
||||
vec[0] = worldmatrix(0,3);
|
||||
vec[1] = worldmatrix(1,3);
|
||||
vec[2] = worldmatrix(2,3);
|
||||
vec[3] = 1.0f;
|
||||
|
||||
if(m_lightobj.m_type==RAS_LightObject::LIGHT_SUN) {
|
||||
|
||||
vec[0] = worldmatrix(0,2);
|
||||
vec[1] = worldmatrix(1,2);
|
||||
vec[2] = worldmatrix(2,2);
|
||||
//vec[0]= base->object->obmat[2][0];
|
||||
//vec[1]= base->object->obmat[2][1];
|
||||
//vec[2]= base->object->obmat[2][2];
|
||||
vec[3]= 0.0;
|
||||
glLightfv((GLenum)(GL_LIGHT0+slot), GL_POSITION, vec);
|
||||
}
|
||||
else {
|
||||
//vec[3]= 1.0;
|
||||
glLightfv((GLenum)(GL_LIGHT0+slot), GL_POSITION, vec);
|
||||
glLightf((GLenum)(GL_LIGHT0+slot), GL_CONSTANT_ATTENUATION, 1.0);
|
||||
glLightf((GLenum)(GL_LIGHT0+slot), GL_LINEAR_ATTENUATION, m_lightobj.m_att1/m_lightobj.m_distance);
|
||||
// without this next line it looks backward compatible.
|
||||
//attennuation still is acceptable
|
||||
glLightf((GLenum)(GL_LIGHT0+slot), GL_QUADRATIC_ATTENUATION, m_lightobj.m_att2/(m_lightobj.m_distance*m_lightobj.m_distance));
|
||||
|
||||
if(m_lightobj.m_type==RAS_LightObject::LIGHT_SPOT) {
|
||||
vec[0] = -worldmatrix(0,2);
|
||||
vec[1] = -worldmatrix(1,2);
|
||||
vec[2] = -worldmatrix(2,2);
|
||||
//vec[0]= -base->object->obmat[2][0];
|
||||
//vec[1]= -base->object->obmat[2][1];
|
||||
//vec[2]= -base->object->obmat[2][2];
|
||||
glLightfv((GLenum)(GL_LIGHT0+slot), GL_SPOT_DIRECTION, vec);
|
||||
glLightf((GLenum)(GL_LIGHT0+slot), GL_SPOT_CUTOFF, m_lightobj.m_spotsize/2.0);
|
||||
glLightf((GLenum)(GL_LIGHT0+slot), GL_SPOT_EXPONENT, 128.0*m_lightobj.m_spotblend);
|
||||
}
|
||||
else
|
||||
glLightf((GLenum)(GL_LIGHT0+slot), GL_SPOT_CUTOFF, 180.0);
|
||||
}
|
||||
|
||||
if (m_lightobj.m_nodiffuse) {
|
||||
vec[0] = vec[1] = vec[2] = vec[3] = 0.0;
|
||||
}
|
||||
else {
|
||||
vec[0]= m_lightobj.m_energy*m_lightobj.m_red;
|
||||
vec[1]= m_lightobj.m_energy*m_lightobj.m_green;
|
||||
vec[2]= m_lightobj.m_energy*m_lightobj.m_blue;
|
||||
vec[3]= 1.0;
|
||||
}
|
||||
|
||||
glLightfv((GLenum)(GL_LIGHT0+slot), GL_DIFFUSE, vec);
|
||||
if(m_lightobj.m_nospecular)
|
||||
{
|
||||
vec[0] = vec[1] = vec[2] = vec[3] = 0.0;
|
||||
}
|
||||
else if (m_lightobj.m_nodiffuse) {
|
||||
vec[0]= m_lightobj.m_energy*m_lightobj.m_red;
|
||||
vec[1]= m_lightobj.m_energy*m_lightobj.m_green;
|
||||
vec[2]= m_lightobj.m_energy*m_lightobj.m_blue;
|
||||
vec[3]= 1.0;
|
||||
}
|
||||
|
||||
glLightfv((GLenum)(GL_LIGHT0+slot), GL_SPECULAR, vec);
|
||||
glEnable((GLenum)(GL_LIGHT0+slot));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
GPULamp *KX_LightObject::GetGPULamp()
|
||||
{
|
||||
if(m_glsl)
|
||||
@@ -200,12 +293,15 @@ PyTypeObject KX_LightObject::Type = {
|
||||
0,
|
||||
0,
|
||||
py_base_repr,
|
||||
0,0,
|
||||
0,
|
||||
&KX_GameObject::Sequence,
|
||||
&KX_GameObject::Mapping,
|
||||
0,0,0,
|
||||
py_base_getattro,
|
||||
py_base_setattro,
|
||||
0,0,0,0,0,0,0,0,0,
|
||||
0,
|
||||
Py_TPFLAGS_DEFAULT,
|
||||
0,0,0,0,0,0,0,
|
||||
Methods
|
||||
};
|
||||
|
||||
|
||||
@@ -54,7 +54,10 @@ public:
|
||||
virtual CValue* GetReplica();
|
||||
RAS_LightObject* GetLightData() { return &m_lightobj;}
|
||||
|
||||
/* GLSL shadow */
|
||||
/* OpenGL Light */
|
||||
bool ApplyLight(KX_Scene *kxscene, int oblayer, int slot);
|
||||
|
||||
/* GLSL Light */
|
||||
struct GPULamp *GetGPULamp();
|
||||
bool HasShadowBuffer();
|
||||
int GetShadowLayer();
|
||||
|
||||
@@ -112,7 +112,7 @@ bool KX_SoundActuator::Update(double curtime, bool frame)
|
||||
return false;
|
||||
|
||||
// actual audio device playing state
|
||||
bool isplaying = (m_soundObject->GetPlaystate() != SND_STOPPED) ? true : false;
|
||||
bool isplaying = (m_soundObject->GetPlaystate() != SND_STOPPED && m_soundObject->GetPlaystate() != SND_INITIAL) ? true : false;
|
||||
|
||||
if (m_pino)
|
||||
{
|
||||
@@ -194,7 +194,7 @@ bool KX_SoundActuator::Update(double curtime, bool frame)
|
||||
}
|
||||
}
|
||||
// verify that the sound is still playing
|
||||
isplaying = (m_soundObject->GetPlaystate() != SND_STOPPED) ? true : false;
|
||||
isplaying = (m_soundObject->GetPlaystate() != SND_STOPPED && m_soundObject->GetPlaystate() != SND_INITIAL) ? true : false;
|
||||
|
||||
if (isplaying)
|
||||
{
|
||||
|
||||
@@ -1016,14 +1016,21 @@ void CcdPhysicsController::ApplyTorque(float torqueX,float torqueY,float torque
|
||||
}
|
||||
if (body)
|
||||
{
|
||||
//workaround for incompatibility between 'DYNAMIC' game object, and angular factor
|
||||
//a DYNAMIC object has some inconsistency: it has no angular effect due to collisions, but still has torque
|
||||
const btVector3& angFac = body->getAngularFactor();
|
||||
btVector3 tmpFac(0,0,1);
|
||||
body->setAngularFactor(tmpFac);
|
||||
body->applyTorque(torque);
|
||||
body->setAngularFactor(angFac);
|
||||
}
|
||||
if (m_cci.m_bRigid)
|
||||
{
|
||||
body->applyTorque(torque);
|
||||
}
|
||||
else
|
||||
{
|
||||
//workaround for incompatibility between 'DYNAMIC' game object, and angular factor
|
||||
//a DYNAMIC object has some inconsistency: it has no angular effect due to collisions, but still has torque
|
||||
const btVector3& angFac = body->getAngularFactor();
|
||||
btVector3 tmpFac(0,0,1);
|
||||
body->setAngularFactor(tmpFac);
|
||||
body->applyTorque(torque);
|
||||
body->setAngularFactor(angFac);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -39,8 +39,9 @@ struct RAS_LightObject
|
||||
LIGHT_NORMAL
|
||||
};
|
||||
bool m_modified;
|
||||
int m_layer;
|
||||
int m_layer;
|
||||
void *m_scene;
|
||||
void *m_light;
|
||||
|
||||
float m_energy;
|
||||
float m_distance;
|
||||
@@ -55,7 +56,6 @@ struct RAS_LightObject
|
||||
float m_spotblend;
|
||||
|
||||
LightType m_type;
|
||||
MT_CmMatrix4x4* m_worldmatrix;
|
||||
|
||||
bool m_nodiffuse;
|
||||
bool m_nospecular;
|
||||
|
||||
Reference in New Issue
Block a user