예제 #1
0
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);
}
예제 #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;
}