void KX_FontObject::AddMeshUser() { m_meshUser = new RAS_TextUser(m_pClient_info); // set the part of the mesh slot that never change float *fl = GetOpenGLMatrixPtr()->getPointer(); m_meshUser->SetMatrix(fl); RAS_BucketManager *bucketManager = GetScene()->GetBucketManager(); bool created = false; RAS_MaterialBucket *bucket = bucketManager->FindBucket(GetTextMaterial(), created); // If the material bucket is just created then we add a new mesh slot. if (created) { RAS_TexVertFormat format; format.uvSize = 1; format.colorSize = 1; bucket->NewMesh(NULL, NULL, format); } /* We copy the original mesh slot which is at the begin of the list, if it's not the case it * doesn't matter as the mesh slot are all similar exepted their mesh user pointer which is * set to NULL in copy. By copying instead of adding a mesh slot we reuse the same display * array bucket. */ RAS_MeshSlot *ms = bucket->CopyMesh(*bucket->msBegin()); ms->SetMeshUser(m_meshUser); ms->SetDeformer(NULL); m_meshUser->AddMeshSlot(ms); }
void KX_LightObject::Update() { GPULamp *lamp; if((lamp = GetGPULamp()) != NULL && GetSGNode()) { float obmat[4][4]; // lights don't get their openGL matrix updated, do it now if (GetSGNode()->IsDirty()) GetOpenGLMatrix(); double *dobmat = GetOpenGLMatrixPtr()->getPointer(); for(int i=0; i<4; i++) for(int j=0; j<4; j++, dobmat++) obmat[i][j] = (float)*dobmat; GPU_lamp_update(lamp, m_lightobj.m_layer, 0, obmat); GPU_lamp_update_colors(lamp, m_lightobj.m_red, m_lightobj.m_green, m_lightobj.m_blue, m_lightobj.m_energy); } }
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; }