nuclear@0: #include "lights.h" nuclear@0: #include nuclear@0: nuclear@0: Light::Light() { nuclear@0: intensity = 1.0f; nuclear@0: ambient_color = 0.0f; nuclear@0: diffuse_color = specular_color = 1.0f; nuclear@0: CastShadows = false; nuclear@0: } nuclear@0: nuclear@0: void Light::SetIntensity(float intensity) { nuclear@0: this->intensity = intensity; nuclear@0: } nuclear@0: nuclear@0: float Light::GetIntensity() const { nuclear@0: return intensity; nuclear@0: } nuclear@0: nuclear@0: void Light::SetColor(const Color &color, PhongComponent comp) { nuclear@0: if(comp == (PhongComponent)-1) { nuclear@0: diffuse_color = specular_color = color; nuclear@0: } else { nuclear@0: switch(comp) { nuclear@0: case Ambient: nuclear@0: ambient_color = color; nuclear@0: break; nuclear@0: case Diffuse: nuclear@0: diffuse_color = color; nuclear@0: break; nuclear@0: case Specular: nuclear@0: specular_color = color; nuclear@0: break; nuclear@0: } nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: const Color &Light::GetColor(PhongComponent comp) const { nuclear@0: switch(comp) { nuclear@0: case Ambient: nuclear@0: return ambient_color; nuclear@0: case Diffuse: nuclear@0: return diffuse_color; nuclear@0: case Specular: nuclear@0: return specular_color; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: void Light::SetShadowCasting(bool enable) { nuclear@0: CastShadows = enable; nuclear@0: } nuclear@0: nuclear@0: bool Light::GetShadowCasting() const { nuclear@0: return CastShadows; nuclear@0: } nuclear@0: nuclear@0: ////////// Directional Light /////////// nuclear@0: nuclear@0: // Non-Applicable functions for this type of light nuclear@0: void DirLight::SetPosition(const Vector3 &pos) {} nuclear@0: void DirLight::SetRange(float range) {} nuclear@0: void DirLight::SetAttenuation(float att0, float att1, float att2) {} nuclear@0: Vector3 DirLight::GetPosition() const {return Direction;} nuclear@0: float DirLight::GetRange() const {return 0.0f;} nuclear@0: float DirLight::GetAttenuation(int degree) const {return 0.0f;} nuclear@0: void DirLight::ResetTransform() {} nuclear@0: void DirLight::ResetTranslation() {} nuclear@0: void DirLight::ResetRotation() {} nuclear@0: void DirLight::Transform(const Matrix4x4 &matrix) {} nuclear@0: void DirLight::Translate(float x, float y, float z) {} nuclear@0: void DirLight::Rotate(float x, float y, float z) {} nuclear@0: void DirLight::Rotate(const Vector3 &axis, float angle) {} nuclear@0: void DirLight::SetCone(float InnerCone, float OuterCone) {} nuclear@0: float DirLight::GetInnerCone() const {return 0.0f;} nuclear@0: float DirLight::GetOuterCone() const {return 0.0f;} nuclear@0: void DirLight::SetFalloff(float falloff) {} nuclear@0: float DirLight::GetFalloff() const {return 0.0f;} nuclear@0: void DirLight::ResetTargetTransform() {} nuclear@0: void DirLight::ResetTargetTranslation() {} nuclear@0: void DirLight::ResetTargetRotation() {} nuclear@0: void DirLight::TargetTransform(const Matrix4x4 &matrix) {} nuclear@0: void DirLight::TargetTranslate(float x, float y, float z) {} nuclear@0: void DirLight::TargetRotate(float x, float y, float z) {} nuclear@0: void DirLight::TargetRotate(const Vector3 &axis, float angle) {} nuclear@0: nuclear@0: nuclear@0: nuclear@0: DirLight::DirLight() { nuclear@0: Direction = Vector3(0, -1, 0); nuclear@0: } nuclear@0: nuclear@0: DirLight::DirLight(const Vector3 &dir) { nuclear@0: Direction = dir; nuclear@0: } nuclear@0: nuclear@0: nuclear@0: void DirLight::SetDirection(const Vector3 &dir) { nuclear@0: Direction = dir; nuclear@0: } nuclear@0: nuclear@0: Vector3 DirLight::GetDirection() const { nuclear@0: Vector3 dir = Direction; nuclear@0: dir.Transform(DirRot); nuclear@0: return dir; nuclear@0: } nuclear@0: nuclear@0: LightType DirLight::GetType() const { nuclear@0: return LTDir; nuclear@0: } nuclear@0: nuclear@0: // direction transformations nuclear@0: void DirLight::ResetDirTransform() { nuclear@0: DirRot.ResetIdentity(); nuclear@0: } nuclear@0: nuclear@0: void DirLight::ResetDirRotation() { nuclear@0: DirRot.ResetIdentity(); nuclear@0: } nuclear@0: nuclear@0: void DirLight::TransformDir(const Matrix4x4 &matrix) { nuclear@0: DirRot *= matrix; nuclear@0: } nuclear@0: nuclear@0: void DirLight::RotateDir(float x, float y, float z) { nuclear@0: DirRot.Rotate(x, y, z); nuclear@0: } nuclear@0: nuclear@0: void DirLight::RotateDir(const Vector3 &axis, float angle) { nuclear@0: DirRot.Rotate(axis, angle); nuclear@0: } nuclear@0: nuclear@0: nuclear@0: void DirLight::SetLight(dword index, GraphicsContext *gc) const { nuclear@0: nuclear@0: Vector3 dir = Direction; nuclear@0: dir.Transform(DirRot); nuclear@0: nuclear@0: D3DLIGHT8 light; nuclear@0: memset(&light, 0, sizeof(D3DLIGHT8)); nuclear@0: light.Ambient.r = ambient_color.r * intensity; nuclear@0: light.Diffuse.r = diffuse_color.r * intensity; nuclear@0: light.Specular.r = specular_color.r * intensity; nuclear@0: light.Ambient.g = ambient_color.g * intensity; nuclear@0: light.Diffuse.g = diffuse_color.g * intensity; nuclear@0: light.Specular.g = specular_color.g * intensity; nuclear@0: light.Ambient.b = ambient_color.b * intensity; nuclear@0: light.Diffuse.b = diffuse_color.b * intensity; nuclear@0: light.Specular.b = specular_color.b * intensity; nuclear@0: light.Direction = dir; nuclear@0: light.Type = (D3DLIGHTTYPE)LTDir; nuclear@0: nuclear@0: gc->D3DDevice->SetLight(index, &light); nuclear@0: gc->D3DDevice->LightEnable(index, true); nuclear@0: } nuclear@0: nuclear@0: Vertex DirLightVisVertices[] = { nuclear@0: Vertex(Vector3(0.0f, 0.0f, 0.1f), 0.0f, 0.0f, 0x00ff0000), nuclear@0: Vertex(Vector3(0.03f, 0.03f, 0.0f), 0.0f, 0.0f, 0x000000ff), nuclear@0: Vertex(Vector3(-0.03f, 0.03f, 0.0f), 0.0f, 0.0f, 0x000000ff), nuclear@0: Vertex(Vector3(0.0f, -0.03f, 0.0f), 0.0f, 0.0f, 0x000000ff) nuclear@0: }; nuclear@0: nuclear@0: Index DirLightVisIndices[] = { nuclear@0: 0, 1, 2, nuclear@0: 0, 2, 3, nuclear@0: 0, 3, 1, nuclear@0: 1, 3, 2 nuclear@0: }; nuclear@0: nuclear@0: nuclear@0: void DirLight::Draw(GraphicsContext *gc, float size) { nuclear@0: nuclear@0: Material mat(0.9f, 0.8f, 0.3f); nuclear@0: gc->SetMaterial(mat); nuclear@0: gc->SetTexture(0, 0); nuclear@0: gc->SetColorVertex(true); nuclear@0: gc->SetLighting(false); nuclear@0: gc->SetZBuffering(false); nuclear@0: nuclear@0: Matrix4x4 WorldMat = (Matrix4x4)Base(Direction).CreateRotationMatrix() * DirRot; nuclear@0: gc->SetWorldMatrix(WorldMat); nuclear@0: nuclear@0: Matrix4x4 ViewMat = gc->GetViewMatrix(); nuclear@0: Matrix4x4 AugViewMat; nuclear@0: nuclear@0: for(int i=0; i<4; i++) { nuclear@0: AugViewMat.SetRowVector(ViewMat.GetRowVector(i).Normalized(), i); nuclear@0: } nuclear@0: nuclear@0: gc->SetViewMatrix(AugViewMat); nuclear@0: nuclear@0: gc->Draw(DirLightVisVertices, DirLightVisIndices, 4, 12); nuclear@0: nuclear@0: gc->SetViewMatrix(ViewMat); nuclear@0: nuclear@0: gc->SetZBuffering(true); nuclear@0: gc->SetLighting(true); nuclear@0: gc->SetColorVertex(false); nuclear@0: nuclear@0: } nuclear@0: nuclear@0: /////////// Point Light ////////////// nuclear@0: nuclear@0: // Non-Applicable member functions nuclear@0: void PointLight::SetDirection(const Vector3 &dir) {} nuclear@0: Vector3 PointLight::GetDirection() const {return Position;} nuclear@0: void PointLight::ResetDirTransform() {} nuclear@0: void PointLight::ResetDirRotation() {} nuclear@0: void PointLight::TransformDir(const Matrix4x4 &matrix) {} nuclear@0: void PointLight::RotateDir(float x, float y, float z) {} nuclear@0: void PointLight::RotateDir(const Vector3 &axis, float angle) {} nuclear@0: void PointLight::SetCone(float InnerCone, float OuterCone) {} nuclear@0: float PointLight::GetInnerCone() const {return 0.0f;} nuclear@0: float PointLight::GetOuterCone() const {return 0.0f;} nuclear@0: void PointLight::SetFalloff(float falloff) {} nuclear@0: float PointLight::GetFalloff() const {return 0.0f;} nuclear@0: void PointLight::ResetTargetTransform() {} nuclear@0: void PointLight::ResetTargetTranslation() {} nuclear@0: void PointLight::ResetTargetRotation() {} nuclear@0: void PointLight::TargetTransform(const Matrix4x4 &matrix) {} nuclear@0: void PointLight::TargetTranslate(float x, float y, float z) {} nuclear@0: void PointLight::TargetRotate(float x, float y, float z) {} nuclear@0: void PointLight::TargetRotate(const Vector3 &axis, float angle) {} nuclear@0: nuclear@0: nuclear@0: nuclear@0: PointLight::PointLight() { nuclear@0: Position = Vector3(0, 100, 0); nuclear@0: Range = 300.0f; nuclear@0: Attenuation[0] = 1.0f; nuclear@0: Attenuation[1] = 0.0f; nuclear@0: Attenuation[2] = 0.0f; nuclear@0: } nuclear@0: nuclear@0: PointLight::PointLight(const Vector3 &pos, float range, float att0, float att1, float att2) { nuclear@0: Position = pos; nuclear@0: Range = range; nuclear@0: Attenuation[0] = att0; nuclear@0: Attenuation[1] = att1; nuclear@0: Attenuation[2] = att2; nuclear@0: } nuclear@0: nuclear@0: Matrix4x4 PointLight::GetTransform() const { nuclear@0: return PosXForm * PosRot * PosTrans; nuclear@0: } nuclear@0: nuclear@0: void PointLight::SetPosition(const Vector3 &pos) { nuclear@0: Position = pos; nuclear@0: } nuclear@0: nuclear@0: void PointLight::SetRange(float range) { nuclear@0: Range = range; nuclear@0: } nuclear@0: nuclear@0: void PointLight::SetAttenuation(float att0, float att1, float att2) { nuclear@0: Attenuation[0] = att0; nuclear@0: Attenuation[1] = att1; nuclear@0: Attenuation[2] = att2; nuclear@0: } nuclear@0: nuclear@0: Vector3 PointLight::GetPosition() const { nuclear@0: Vector3 pos = Position; nuclear@0: pos.Transform(GetTransform()); nuclear@0: return pos; nuclear@0: } nuclear@0: nuclear@0: float PointLight::GetRange() const { nuclear@0: return Range; nuclear@0: } nuclear@0: nuclear@0: float PointLight::GetAttenuation(int degree) const { nuclear@0: return Attenuation[degree]; nuclear@0: } nuclear@0: nuclear@0: LightType PointLight::GetType() const { nuclear@0: return LTPoint; nuclear@0: } nuclear@0: nuclear@0: // position transformations nuclear@0: void PointLight::ResetTransform() { nuclear@0: PosRot.ResetIdentity(); nuclear@0: PosTrans.ResetIdentity(); nuclear@0: PosXForm.ResetIdentity(); nuclear@0: } nuclear@0: nuclear@0: void PointLight::ResetTranslation() { nuclear@0: PosTrans.ResetIdentity(); nuclear@0: } nuclear@0: nuclear@0: void PointLight::ResetRotation() { nuclear@0: PosRot.ResetIdentity(); nuclear@0: } nuclear@0: nuclear@0: void PointLight::Transform(const Matrix4x4 &matrix) { nuclear@0: PosXForm *= matrix; nuclear@0: } nuclear@0: nuclear@0: void PointLight::Translate(float x, float y, float z) { nuclear@0: PosTrans.Translate(x, y, z); nuclear@0: } nuclear@0: nuclear@0: void PointLight::Rotate(float x, float y, float z) { nuclear@0: PosRot.Rotate(x, y, z); nuclear@0: } nuclear@0: nuclear@0: void PointLight::Rotate(const Vector3 &axis, float angle) { nuclear@0: PosRot.Rotate(axis, angle); nuclear@0: } nuclear@0: nuclear@0: nuclear@0: void PointLight::SetLight(dword index, GraphicsContext *gc) const { nuclear@0: nuclear@0: Vector3 pos = Position; nuclear@0: pos.Transform(GetTransform()); nuclear@0: nuclear@0: D3DLIGHT8 light; nuclear@0: memset(&light, 0, sizeof(D3DLIGHT8)); nuclear@0: light.Ambient.r = ambient_color.r * intensity; nuclear@0: light.Diffuse.r = diffuse_color.r * intensity; nuclear@0: light.Specular.r = specular_color.r * intensity; nuclear@0: light.Ambient.g = ambient_color.g * intensity; nuclear@0: light.Diffuse.g = diffuse_color.g * intensity; nuclear@0: light.Specular.g = specular_color.g * intensity; nuclear@0: light.Ambient.b = ambient_color.b * intensity; nuclear@0: light.Diffuse.b = diffuse_color.b * intensity; nuclear@0: light.Specular.b = specular_color.b * intensity; nuclear@0: light.Position = pos; nuclear@0: light.Range = Range; nuclear@0: light.Attenuation0 = Attenuation[0]; nuclear@0: light.Attenuation1 = Attenuation[1]; nuclear@0: light.Attenuation2 = Attenuation[2]; nuclear@0: light.Type = (D3DLIGHTTYPE)LTPoint; nuclear@0: nuclear@0: gc->D3DDevice->SetLight(index, &light); nuclear@0: gc->D3DDevice->LightEnable(index, true); nuclear@0: } nuclear@0: nuclear@0: nuclear@0: nuclear@0: Index PointLightVisIndices[] = {0, 2, 1, 0, 3, 2}; nuclear@0: nuclear@0: void PointLight::Draw(GraphicsContext *gc, float size) { nuclear@0: nuclear@0: dword color = (diffuse_color * intensity).GetPacked32(); nuclear@0: nuclear@0: float PtHalfSz = size / 2.0f; nuclear@0: Vertex PointLightVisVertices[] = { nuclear@0: Vertex(Vector3(-PtHalfSz, PtHalfSz, 0.0f), 0.0f, 0.0f, color), nuclear@0: Vertex(Vector3(PtHalfSz, PtHalfSz, 0.0f), 1.0f, 0.0f, color), nuclear@0: Vertex(Vector3(PtHalfSz, -PtHalfSz, 0.0f), 1.0f, 1.0f, color), nuclear@0: Vertex(Vector3(-PtHalfSz, -PtHalfSz, 0.0f), 0.0f, 1.0f, color) nuclear@0: }; nuclear@0: nuclear@0: Texture *tex = gc->texman->LoadTexture("STOCKTEX_BLOB"); nuclear@0: gc->SetTexture(0, tex); nuclear@0: gc->SetTextureStageColor(0, TexBlendModulate, TexArgTexture, TexArgCurrent); nuclear@0: gc->SetTexture(1, 0); nuclear@0: nuclear@0: gc->SetAlphaBlending(true); nuclear@0: gc->SetBlendFunc(BLEND_ONE, BLEND_ONE); nuclear@0: nuclear@0: gc->SetColorVertex(true); nuclear@0: gc->SetLighting(false); nuclear@0: nuclear@0: Matrix4x4 InvPos; nuclear@0: InvPos.Translate(Position.x, Position.y, Position.z); nuclear@0: gc->SetWorldMatrix(InvPos * GetTransform()); nuclear@0: nuclear@0: gc->SetZWrite(false); nuclear@0: gc->SetBillboarding(true); nuclear@0: gc->Draw(PointLightVisVertices, PointLightVisIndices, 4, 6); nuclear@0: gc->SetBillboarding(false); nuclear@0: gc->SetZWrite(true); nuclear@0: nuclear@0: gc->SetAlphaBlending(false); nuclear@0: gc->SetLighting(true); nuclear@0: gc->SetColorVertex(false); nuclear@0: gc->SetTexture(0, 0); nuclear@0: } nuclear@0: nuclear@0: nuclear@0: ////////////// Spot Light //////////////// nuclear@0: void SpotLight::ResetTargetTransform() {} nuclear@0: void SpotLight::ResetTargetTranslation() {} nuclear@0: void SpotLight::ResetTargetRotation() {} nuclear@0: void SpotLight::TargetTransform(const Matrix4x4 &matrix) {} nuclear@0: void SpotLight::TargetTranslate(float x, float y, float z) {} nuclear@0: void SpotLight::TargetRotate(float x, float y, float z) {} nuclear@0: void SpotLight::TargetRotate(const Vector3 &axis, float angle) {} nuclear@0: nuclear@0: SpotLight::SpotLight() { nuclear@0: Position = Vector3(0, 100, 0); nuclear@0: Direction = Vector3(0, -1, 0); nuclear@0: Falloff = 1.0f; nuclear@0: Phi = QuarterPi; nuclear@0: Theta = Phi - (Phi / 9.0f); nuclear@0: } nuclear@0: nuclear@0: SpotLight::SpotLight(const Vector3 &pos, const Vector3 &dir, float InnerCone, float OuterCone, float range, float att0, float att1, float att2) { nuclear@0: Position = pos; nuclear@0: Direction = dir; nuclear@0: SetCone(InnerCone, OuterCone); nuclear@0: Range = range; nuclear@0: Attenuation[0] = att0; nuclear@0: Attenuation[1] = att1; nuclear@0: Attenuation[2] = att2; nuclear@0: Falloff = 1.0f; nuclear@0: } nuclear@0: nuclear@0: void SpotLight::SetDirection(const Vector3 &dir) { nuclear@0: Direction = dir; nuclear@0: } nuclear@0: nuclear@0: Vector3 SpotLight::GetDirection() const { nuclear@0: Vector3 dir = Direction; nuclear@0: dir.Transform(DirRot); nuclear@0: return dir; nuclear@0: } nuclear@0: nuclear@0: // direction transformations nuclear@0: void SpotLight::ResetDirTransform() { nuclear@0: DirRot.ResetIdentity(); nuclear@0: } nuclear@0: nuclear@0: void SpotLight::ResetDirRotation() { nuclear@0: DirRot.ResetIdentity(); nuclear@0: } nuclear@0: nuclear@0: void SpotLight::TransformDir(const Matrix4x4 &matrix) { nuclear@0: DirRot *= matrix; nuclear@0: } nuclear@0: nuclear@0: void SpotLight::RotateDir(float x, float y, float z) { nuclear@0: DirRot.Rotate(x, y, z); nuclear@0: } nuclear@0: nuclear@0: void SpotLight::RotateDir(const Vector3 &axis, float angle) { nuclear@0: DirRot.Rotate(axis, angle); nuclear@0: } nuclear@0: nuclear@0: nuclear@0: LightType SpotLight::GetType() const { nuclear@0: return LTSpot; nuclear@0: } nuclear@0: nuclear@0: void SpotLight::SetCone(float InnerCone, float OuterCone) { nuclear@0: Theta = InnerCone; nuclear@0: Phi = OuterCone; nuclear@0: } nuclear@0: nuclear@0: float SpotLight::GetInnerCone() const { nuclear@0: return Theta; nuclear@0: } nuclear@0: nuclear@0: float SpotLight::GetOuterCone() const { nuclear@0: return Phi; nuclear@0: } nuclear@0: nuclear@0: void SpotLight::SetFalloff(float falloff) { nuclear@0: Falloff = falloff; nuclear@0: } nuclear@0: nuclear@0: float SpotLight::GetFalloff() const { nuclear@0: return Falloff; nuclear@0: } nuclear@0: nuclear@0: nuclear@0: void SpotLight::SetLight(dword index, GraphicsContext *gc) const { nuclear@0: nuclear@0: Vector3 pos = Position; nuclear@0: pos.Transform(GetTransform()); nuclear@0: nuclear@0: Vector3 dir = Direction; nuclear@0: dir.Transform(DirRot); nuclear@0: nuclear@0: D3DLIGHT8 light; nuclear@0: memset(&light, 0, sizeof(D3DLIGHT8)); nuclear@0: light.Ambient.r = ambient_color.r * intensity; nuclear@0: light.Diffuse.r = diffuse_color.r * intensity; nuclear@0: light.Specular.r = specular_color.r * intensity; nuclear@0: light.Ambient.g = ambient_color.g * intensity; nuclear@0: light.Diffuse.g = diffuse_color.g * intensity; nuclear@0: light.Specular.g = specular_color.g * intensity; nuclear@0: light.Ambient.b = ambient_color.b * intensity; nuclear@0: light.Diffuse.b = diffuse_color.b * intensity; nuclear@0: light.Specular.b = specular_color.b * intensity; nuclear@0: light.Position = pos; nuclear@0: light.Direction = dir; nuclear@0: light.Range = Range; nuclear@0: light.Attenuation0 = Attenuation[0]; nuclear@0: light.Attenuation1 = Attenuation[1]; nuclear@0: light.Attenuation2 = Attenuation[2]; nuclear@0: light.Falloff = Falloff; nuclear@0: light.Theta = Theta; nuclear@0: light.Phi = Phi; nuclear@0: light.Type = (D3DLIGHTTYPE)LTSpot; nuclear@0: nuclear@0: gc->D3DDevice->SetLight(index, &light); nuclear@0: gc->D3DDevice->LightEnable(index, true); nuclear@0: } nuclear@0: nuclear@0: void SpotLight::Draw(GraphicsContext *gc, float size) { nuclear@0: PointLight::Draw(gc, size); nuclear@0: } nuclear@0: nuclear@0: //////////////// Target Spot Light //////////////////// nuclear@0: void TargetSpotLight::SetDirection(const Vector3 &dir) {} nuclear@0: Vector3 TargetSpotLight::GetDirection() const {return Vector3();} nuclear@0: void TargetSpotLight::ResetDirTransform() {} nuclear@0: void TargetSpotLight::ResetDirRotation() {} nuclear@0: void TargetSpotLight::TransformDir(const Matrix4x4 &matrix) {} nuclear@0: void TargetSpotLight::RotateDir(float x, float y, float z) {} nuclear@0: void TargetSpotLight::RotateDir(const Vector3 &axis, float angle) {} nuclear@0: nuclear@0: TargetSpotLight::TargetSpotLight() { nuclear@0: Target = Vector3(0.0f, 0.0f, 0.0f); nuclear@0: } nuclear@0: nuclear@0: TargetSpotLight::TargetSpotLight(const Vector3 &pos, const Vector3 &target, float InnerCone, float OuterCone, float range, float att0, float att1, float att2) { nuclear@0: Position = pos; nuclear@0: Target = target; nuclear@0: SetCone(InnerCone, OuterCone); nuclear@0: Range = range; nuclear@0: Attenuation[0] = att0; nuclear@0: Attenuation[1] = att1; nuclear@0: Attenuation[2] = att2; nuclear@0: Falloff = 1.0f; nuclear@0: } nuclear@0: nuclear@0: Matrix4x4 TargetSpotLight::GetTargetTransform() const { nuclear@0: return TargXForm * TargRot * TargTrans; nuclear@0: } nuclear@0: nuclear@0: void TargetSpotLight::ResetTargetTransform() { nuclear@0: TargRot.ResetIdentity(); nuclear@0: TargTrans.ResetIdentity(); nuclear@0: TargXForm.ResetIdentity(); nuclear@0: } nuclear@0: nuclear@0: void TargetSpotLight::ResetTargetTranslation() { nuclear@0: TargTrans.ResetIdentity(); nuclear@0: } nuclear@0: nuclear@0: void TargetSpotLight::ResetTargetRotation() { nuclear@0: TargRot.ResetIdentity(); nuclear@0: } nuclear@0: nuclear@0: void TargetSpotLight::TargetTransform(const Matrix4x4 &matrix) { nuclear@0: TargXForm *= matrix; nuclear@0: } nuclear@0: nuclear@0: void TargetSpotLight::TargetTranslate(float x, float y, float z) { nuclear@0: TargTrans.Translate(x, y, z); nuclear@0: } nuclear@0: nuclear@0: void TargetSpotLight::TargetRotate(float x, float y, float z) { nuclear@0: TargRot.Rotate(x, y, z); nuclear@0: } nuclear@0: nuclear@0: void TargetSpotLight::TargetRotate(const Vector3 &axis, float angle) { nuclear@0: TargRot.Rotate(axis, angle); nuclear@0: } nuclear@0: nuclear@0: nuclear@0: void TargetSpotLight::SetLight(dword index, GraphicsContext *gc) const { nuclear@0: Vector3 targ = Target; nuclear@0: targ.Transform(GetTargetTransform()); nuclear@0: nuclear@0: Vector3 pos = Position; nuclear@0: pos.Transform(GetTransform()); nuclear@0: nuclear@0: Vector3 *dir = const_cast(&Direction); nuclear@0: *dir = (targ - pos).Normalized(); nuclear@0: nuclear@0: SpotLight::SetLight(index, gc); nuclear@0: } nuclear@0: nuclear@0: void TargetSpotLight::Draw(GraphicsContext *gc, float size) { nuclear@0: Vector3 targ = Target; nuclear@0: targ.Transform(GetTargetTransform()); nuclear@0: nuclear@0: Vector3 pos = Position; nuclear@0: pos.Transform(GetTransform()); nuclear@0: nuclear@0: Direction = (targ - pos).Normalized(); nuclear@0: SpotLight::Draw(gc, size); nuclear@0: }