101 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "ogl.h"
 | 
						|
 | 
						|
#include <Kore/Graphics3/Graphics.h>
 | 
						|
#include <Kore/Graphics3/Light.h>
 | 
						|
#include <Kore/Math/Core.h>
 | 
						|
 | 
						|
using namespace Kore;
 | 
						|
 | 
						|
// OpenGL man pages for "glLight" function:
 | 
						|
// see https://www.opengl.org/sdk/docs/man2/xhtml/glLight.xml
 | 
						|
 | 
						|
LightImpl::LightImpl()
 | 
						|
    : myType(DirectionalLight), myAmbient(0, 0, 0, 1), myDiffuse(1, 1, 1, 1), mySpecular(1, 1, 1, 1), myPositionOrDirection(0, 0, 1, 0),
 | 
						|
      mySpotDirection(0, 0, 1), // default point in +Z direction
 | 
						|
      mySpotExponent(0.0f), mySpotCutoff(180.0f), myConstAttn(1.0f), myLinearAttn(0.0f), myQuadricAttn(0.0f) {}
 | 
						|
 | 
						|
LightImpl::~LightImpl() {}
 | 
						|
 | 
						|
void Light::setType(LightType type) {
 | 
						|
	// Set new light type
 | 
						|
	myType = type;
 | 
						|
 | 
						|
	// Update position/directior vector
 | 
						|
	myPositionOrDirection[3] = (myType == DirectionalLight ? 0.0f : 1.0f);
 | 
						|
}
 | 
						|
 | 
						|
void Light::setColors(const vec4 &ambient, const vec4 &diffuse, const vec4 &specular) {
 | 
						|
	// Store light colors
 | 
						|
	myAmbient = ambient;
 | 
						|
	myDiffuse = diffuse;
 | 
						|
	mySpecular = specular;
 | 
						|
}
 | 
						|
 | 
						|
void Light::setPosition(const vec3 &position) {
 | 
						|
	// Store position point (x, y, z, 1)
 | 
						|
	myPositionOrDirection = vec4(position, 1);
 | 
						|
}
 | 
						|
 | 
						|
void Light::setDirection(const vec3 &direction) {
 | 
						|
	if (myType == SpotLight) {
 | 
						|
		// Store spot direction vector (x, y, z)
 | 
						|
		mySpotDirection = direction;
 | 
						|
	}
 | 
						|
	else {
 | 
						|
		// Store direction vector (x, y, z, 0)
 | 
						|
		myPositionOrDirection = vec4(direction, 0);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
void Light::setSpot(float exponent, float cutoff) {
 | 
						|
	mySpotExponent = exponent;
 | 
						|
	mySpotCutoff = cutoff;
 | 
						|
}
 | 
						|
 | 
						|
void Light::setAttenuation(float constAttn, float linearAttn, float quadricAttn) {
 | 
						|
	myConstAttn = constAttn;
 | 
						|
	myLinearAttn = linearAttn;
 | 
						|
	myQuadricAttn = quadricAttn;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
                                    1
 | 
						|
GL Light Intensity = -----------------------------------
 | 
						|
                     constant + d*linear + d^2*quadratic
 | 
						|
*/
 | 
						|
void Light::setAttenuationRadius(float radius) {
 | 
						|
	setAttenuation(1.0f, 1.0f / radius, 1.0f / radius);
 | 
						|
}
 | 
						|
 | 
						|
void LightImpl::submitLightParamsToGL(GLenum lightID) const {
 | 
						|
	// Submit colors
 | 
						|
	glLightfv(lightID, GL_AMBIENT, myAmbient.values);
 | 
						|
	glLightfv(lightID, GL_DIFFUSE, myDiffuse.values);
 | 
						|
	glLightfv(lightID, GL_SPECULAR, mySpecular.values);
 | 
						|
 | 
						|
	// Submit attenuation
 | 
						|
	glLightf(lightID, GL_CONSTANT_ATTENUATION, myConstAttn);
 | 
						|
	glLightf(lightID, GL_LINEAR_ATTENUATION, myLinearAttn);
 | 
						|
	glLightf(lightID, GL_QUADRATIC_ATTENUATION, myQuadricAttn);
 | 
						|
 | 
						|
	// Submit spot parameters
 | 
						|
	glLightfv(lightID, GL_SPOT_DIRECTION, mySpotDirection.values);
 | 
						|
	glLightf(lightID, GL_SPOT_EXPONENT, mySpotExponent);
 | 
						|
	glLightf(lightID, GL_SPOT_CUTOFF, mySpotCutoff);
 | 
						|
}
 | 
						|
 | 
						|
void LightImpl::submitLightTransformToGL(GLenum lightID) const {
 | 
						|
	glLightfv(lightID, GL_POSITION, myPositionOrDirection.values);
 | 
						|
}
 | 
						|
 | 
						|
Light::Light(LightType type) : LightImpl() {
 | 
						|
	setType(type);
 | 
						|
}
 | 
						|
 | 
						|
void Light::_set(int num) {
 | 
						|
	GLenum lightID = GL_LIGHT0 + num;
 | 
						|
	glEnable(lightID);
 | 
						|
	submitLightParamsToGL(lightID);
 | 
						|
	submitLightTransformToGL(lightID);
 | 
						|
}
 |