コード例 #1
0
ファイル: KX_FontObject.cpp プロジェクト: UPBGE/blender
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();
	}
}
コード例 #2
0
ファイル: KX_Light.cpp プロジェクト: BHCLL/blendocv
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);
	}
}
コード例 #3
0
ファイル: KX_Light.cpp プロジェクト: BHCLL/blendocv
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;
}