void KX_FontObject::UpdateBuckets() { // Update datas and add mesh slot to be rendered only if the object is not culled. if (m_bVisible && m_meshUser) { if (m_pSGNode->IsDirty()) { GetOpenGLMatrix(); } // Allow for some logic brick control if (GetProperty("Text")) { m_text = split_string(GetProperty("Text")->GetText()); } // update the animated color GetObjectColor().getValue(m_color); // Font Objects don't use the glsl shader, this color management code is copied from gpu_shader_material.glsl float color[4]; if (m_do_color_management) { linearrgb_to_srgb_v4(color, m_color); } else { copy_v4_v4(color, m_color); } // HARDCODED MULTIPLICATION FACTOR - this will affect the render resolution directly const float RES = BGE_FONT_RES * m_resolution; const float size = m_fsize * NodeGetWorldScaling()[0] * RES; const float aspect = m_fsize / size; // Account for offset MT_Vector3 offset = NodeGetWorldOrientation() * m_offset * NodeGetWorldScaling(); // Orient the spacing vector MT_Vector3 spacing = NodeGetWorldOrientation() * MT_Vector3(0.0f, m_fsize * m_line_spacing, 0.0f) * NodeGetWorldScaling()[1]; RAS_TextUser *textUser = (RAS_TextUser *)m_meshUser; textUser->SetColor(MT_Vector4(color)); textUser->SetFrontFace(!m_bIsNegativeScaling); textUser->SetFontId(m_fontid); textUser->SetSize(size); textUser->SetDpi(m_dpi); textUser->SetAspect(aspect); textUser->SetOffset(offset); textUser->SetSpacing(spacing); textUser->SetTexts(m_text); textUser->ActivateMeshSlots(); } }
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; }