Replaced KRReverbZone with KRAmbientSphere, to support Siren audio engine reverb zones

This commit is contained in:
2013-02-28 12:04:52 -08:00
parent fa86f007c1
commit 652bd59882
6 changed files with 246 additions and 191 deletions

View File

@@ -168,10 +168,10 @@
E4924C2715EE95E800B965C6 /* KROctree.h in Headers */ = {isa = PBXBuildFile; fileRef = E4924C2515EE95E800B965C6 /* KROctree.h */; settings = {ATTRIBUTES = (Public, ); }; };
E4924C2B15EE96AB00B965C6 /* KROctreeNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4924C2915EE96AA00B965C6 /* KROctreeNode.cpp */; };
E4924C2C15EE96AB00B965C6 /* KROctreeNode.h in Headers */ = {isa = PBXBuildFile; fileRef = E4924C2A15EE96AA00B965C6 /* KROctreeNode.h */; settings = {ATTRIBUTES = (Public, ); }; };
E4943231169E08D200BCB891 /* KRReverbZone.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E494322F169E08D200BCB891 /* KRReverbZone.cpp */; };
E4943232169E08D200BCB891 /* KRReverbZone.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E494322F169E08D200BCB891 /* KRReverbZone.cpp */; };
E4943233169E08D200BCB891 /* KRReverbZone.h in Headers */ = {isa = PBXBuildFile; fileRef = E4943230169E08D200BCB891 /* KRReverbZone.h */; settings = {ATTRIBUTES = (Public, ); }; };
E4943234169E08D200BCB891 /* KRReverbZone.h in Headers */ = {isa = PBXBuildFile; fileRef = E4943230169E08D200BCB891 /* KRReverbZone.h */; settings = {ATTRIBUTES = (Public, ); }; };
E4943231169E08D200BCB891 /* KRAmbientSphere.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E494322F169E08D200BCB891 /* KRAmbientSphere.cpp */; };
E4943232169E08D200BCB891 /* KRAmbientSphere.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E494322F169E08D200BCB891 /* KRAmbientSphere.cpp */; };
E4943233169E08D200BCB891 /* KRAmbientSphere.h in Headers */ = {isa = PBXBuildFile; fileRef = E4943230169E08D200BCB891 /* KRAmbientSphere.h */; settings = {ATTRIBUTES = (Public, ); }; };
E4943234169E08D200BCB891 /* KRAmbientSphere.h in Headers */ = {isa = PBXBuildFile; fileRef = E4943230169E08D200BCB891 /* KRAmbientSphere.h */; settings = {ATTRIBUTES = (Public, ); }; };
E497B946151BA99500D3DC67 /* KRVector2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E497B945151BA99400D3DC67 /* KRVector2.cpp */; };
E497B947151BA99500D3DC67 /* KRVector2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E497B945151BA99400D3DC67 /* KRVector2.cpp */; };
E497B948151BB89D00D3DC67 /* KRVector2.h in Headers */ = {isa = PBXBuildFile; fileRef = E497B943151BA93400D3DC67 /* KRVector2.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -467,8 +467,8 @@
E4924C2515EE95E800B965C6 /* KROctree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KROctree.h; sourceTree = "<group>"; };
E4924C2915EE96AA00B965C6 /* KROctreeNode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = KROctreeNode.cpp; sourceTree = "<group>"; };
E4924C2A15EE96AA00B965C6 /* KROctreeNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KROctreeNode.h; sourceTree = "<group>"; };
E494322F169E08D200BCB891 /* KRReverbZone.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = KRReverbZone.cpp; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };
E4943230169E08D200BCB891 /* KRReverbZone.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KRReverbZone.h; sourceTree = "<group>"; };
E494322F169E08D200BCB891 /* KRAmbientSphere.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = KRAmbientSphere.cpp; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };
E4943230169E08D200BCB891 /* KRAmbientSphere.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = KRAmbientSphere.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
E497B943151BA93400D3DC67 /* KRVector2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = KRVector2.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
E497B945151BA99400D3DC67 /* KRVector2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = KRVector2.cpp; sourceTree = "<group>"; };
E497B949151BCEE900D3DC67 /* KRResource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KRResource.h; sourceTree = "<group>"; };
@@ -891,8 +891,8 @@
children = (
E48B68131697794F00D99917 /* KRAudioSource.cpp */,
E48B68141697794F00D99917 /* KRAudioSource.h */,
E494322F169E08D200BCB891 /* KRReverbZone.cpp */,
E4943230169E08D200BCB891 /* KRReverbZone.h */,
E494322F169E08D200BCB891 /* KRAmbientSphere.cpp */,
E4943230169E08D200BCB891 /* KRAmbientSphere.h */,
);
name = Audio;
sourceTree = "<group>";
@@ -1197,7 +1197,7 @@
E4F027C916979CCD00D4427D /* KRAudioManager.h in Headers */,
E4F027D016979CE200D4427D /* KRAudioSample.h in Headers */,
E4F027E01697BFFF00D4427D /* KRAudioBuffer.h in Headers */,
E4943233169E08D200BCB891 /* KRReverbZone.h in Headers */,
E4943233169E08D200BCB891 /* KRAmbientSphere.h in Headers */,
E499BF1B16AE747C007FCDBE /* KRVector2.h in Headers */,
E499BF1E16AE751E007FCDBE /* KRSceneManager.h in Headers */,
E499BF2016AE755B007FCDBE /* KRPointLight.h in Headers */,
@@ -1268,7 +1268,7 @@
E4F027CA16979CCD00D4427D /* KRAudioManager.h in Headers */,
E4F027D116979CE200D4427D /* KRAudioSample.h in Headers */,
E4F027E11697BFFF00D4427D /* KRAudioBuffer.h in Headers */,
E4943234169E08D200BCB891 /* KRReverbZone.h in Headers */,
E4943234169E08D200BCB891 /* KRAmbientSphere.h in Headers */,
E414F9AF1694DA37000B3D58 /* KRUnknown.h in Headers */,
E499BF2216AE760F007FCDBE /* krengine_osx.h in Headers */,
E4FE6AA916B21D660058B8CE /* forsyth.h in Headers */,
@@ -1535,7 +1535,7 @@
E4F027C716979CCD00D4427D /* KRAudioManager.cpp in Sources */,
E4F027CE16979CE200D4427D /* KRAudioSample.cpp in Sources */,
E4F027DE1697BFFF00D4427D /* KRAudioBuffer.cpp in Sources */,
E4943231169E08D200BCB891 /* KRReverbZone.cpp in Sources */,
E4943231169E08D200BCB891 /* KRAmbientSphere.cpp in Sources */,
E4FE6AAB16B21D7E0058B8CE /* forsyth.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -1606,7 +1606,7 @@
E4F027C816979CCD00D4427D /* KRAudioManager.cpp in Sources */,
E4F027CF16979CE200D4427D /* KRAudioSample.cpp in Sources */,
E4F027DF1697BFFF00D4427D /* KRAudioBuffer.cpp in Sources */,
E4943232169E08D200BCB891 /* KRReverbZone.cpp in Sources */,
E4943232169E08D200BCB891 /* KRAmbientSphere.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

View File

@@ -0,0 +1,172 @@
//
// KRAmbientSphere.cpp
// KREngine
//
// Created by Kearwood Gilbert on 2012-12-06.
// Copyright (c) 2012 Kearwood Software. All rights reserved.
//
#include "KRAmbientSphere.h"
#include "KRContext.h"
KRAmbientSphere::KRAmbientSphere(KRScene &scene, std::string name) : KRNode(scene, name)
{
m_ambient = "";
m_reverb = "";
m_ambient_gain = 1.0f;
m_reverb_gain = 1.0f;
m_gradient_distance = 1.0f;
}
KRAmbientSphere::~KRAmbientSphere()
{
}
std::string KRAmbientSphere::getElementName() {
return "ambient_sphere";
}
tinyxml2::XMLElement *KRAmbientSphere::saveXML( tinyxml2::XMLNode *parent)
{
tinyxml2::XMLElement *e = KRNode::saveXML(parent);
e->SetAttribute("zone", m_zone.c_str());
e->SetAttribute("ambient", m_ambient.c_str());
e->SetAttribute("ambient_gain", m_ambient_gain);
e->SetAttribute("reverb", m_reverb.c_str());
e->SetAttribute("reverb_gain", m_reverb_gain);
e->SetAttribute("gradient", m_gradient_distance);
return e;
}
void KRAmbientSphere::loadXML(tinyxml2::XMLElement *e)
{
KRNode::loadXML(e);
m_zone = e->Attribute("zone");
m_gradient_distance = 1.0f;
if(e->QueryFloatAttribute("gradient", &m_gradient_distance) != tinyxml2::XML_SUCCESS) {
m_gradient_distance = 1.0f;
}
m_reverb = e->Attribute("reverb");
m_reverb_gain = 1.0f;
if(e->QueryFloatAttribute("reverb_gain", &m_reverb_gain) != tinyxml2::XML_SUCCESS) {
m_reverb_gain = 1.0f;
}
m_ambient = e->Attribute("ambient");
m_ambient_gain = 1.0f;
if(e->QueryFloatAttribute("ambient_gain", &m_ambient_gain) != tinyxml2::XML_SUCCESS) {
m_ambient_gain = 1.0f;
}
}
std::string KRAmbientSphere::getReverb()
{
return m_reverb;
}
void KRAmbientSphere::setReverb(const std::string &reverb)
{
m_reverb = reverb;
}
float KRAmbientSphere::getReverbGain()
{
return m_reverb_gain;
}
void KRAmbientSphere::setReverbGain(float reverb_gain)
{
m_reverb_gain = reverb_gain;
}
std::string KRAmbientSphere::getAmbient()
{
return m_ambient;
}
void KRAmbientSphere::setAmbient(const std::string &ambient)
{
m_ambient = ambient;
}
float KRAmbientSphere::getAmbientGain()
{
return m_ambient_gain;
}
void KRAmbientSphere::setAmbientGain(float ambient_gain)
{
m_ambient_gain = ambient_gain;
}
std::string KRAmbientSphere::getZone()
{
return m_zone;
}
void KRAmbientSphere::setZone(const std::string &zone)
{
m_zone = zone;
}
void KRAmbientSphere::render(KRCamera *pCamera, std::vector<KRLight *> &lights, const KRViewport &viewport, KRNode::RenderPass renderPass)
{
KRNode::render(pCamera, lights, viewport, renderPass);
bool bVisualize = false;
if(renderPass == KRNode::RENDER_PASS_FORWARD_TRANSPARENT && bVisualize) {
KRMat4 sphereModelMatrix = getModelMatrix();
KRShader *pShader = getContext().getShaderManager()->getShader("visualize_overlay", pCamera, lights, 0, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, renderPass);
if(getContext().getShaderManager()->selectShader(*pCamera, pShader, viewport, sphereModelMatrix, lights, 0, renderPass)) {
// Enable additive blending
GLDEBUG(glEnable(GL_BLEND));
GLDEBUG(glBlendFunc(GL_ONE, GL_ONE));
// Disable z-buffer write
GLDEBUG(glDepthMask(GL_FALSE));
// Enable z-buffer test
GLDEBUG(glEnable(GL_DEPTH_TEST));
GLDEBUG(glDepthFunc(GL_LEQUAL));
GLDEBUG(glDepthRangef(0.0, 1.0));
std::vector<KRMesh *> sphereModels = getContext().getModelManager()->getModel("__sphere");
if(sphereModels.size()) {
for(int i=0; i < sphereModels[0]->getSubmeshCount(); i++) {
sphereModels[0]->renderSubmesh(i);
}
}
// Enable alpha blending
GLDEBUG(glEnable(GL_BLEND));
GLDEBUG(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
}
}
}
float KRAmbientSphere::getGradientDistance()
{
return m_gradient_distance;
}
void KRAmbientSphere::setGradientDistance(float gradient_distance)
{
m_gradient_distance = gradient_distance;
}
KRAABB KRAmbientSphere::getBounds() {
// Reverb zones always have a -1, -1, -1 to 1, 1, 1 bounding box
return KRAABB(-KRVector3::One(), KRVector3::One(), getModelMatrix());
}

View File

@@ -0,0 +1,59 @@
//
// KRAmbientSphere.h
// KREngine
//
// Created by Kearwood Gilbert on 2012-12-06.
// Copyright (c) 2012 Kearwood Software. All rights reserved.
//
#ifndef KRAMBIENT_ZONE_H
#define KRAMBIENT_ZONE_H
#include "KRResource.h"
#include "KRNode.h"
#include "KRTexture.h"
class KRAmbientSphere : public KRNode {
public:
KRAmbientSphere(KRScene &scene, std::string name);
virtual ~KRAmbientSphere();
virtual std::string getElementName();
virtual tinyxml2::XMLElement *saveXML( tinyxml2::XMLNode *parent);
virtual void loadXML(tinyxml2::XMLElement *e);
void render(KRCamera *pCamera, std::vector<KRLight *> &lights, const KRViewport &viewport, KRNode::RenderPass renderPass);
std::string getZone();
void setZone(const std::string &zone);
float getGradientDistance();
void setGradientDistance(float gradient_distance);
std::string getReverb();
void setReverb(const std::string &reverb);
float getReverbGain();
void setReverbGain(float reverb_gain);
std::string getAmbient();
void setAmbient(const std::string &ambient);
float getAmbientGain();
void setAmbientGain(float ambient_gain);
virtual KRAABB getBounds();
private:
std::string m_zone;
float m_gradient_distance;
std::string m_reverb;
float m_reverb_gain;
std::string m_ambient;
float m_ambient_gain;
};
#endif

View File

@@ -20,7 +20,7 @@
#include "KRQuaternion.h"
#include "KRBone.h"
#include "KRAudioSource.h"
#include "KRReverbZone.h"
#include "KRAmbientSphere.h"
KRNode::KRNode(KRScene &scene, std::string name) : KRContextObject(scene.getContext())
@@ -241,8 +241,8 @@ KRNode *KRNode::LoadXML(KRScene &scene, tinyxml2::XMLElement *e) {
new_node = new KRBone(scene, szName);
} else if(strcmp(szElementName, "audio_source") == 0) {
new_node = new KRAudioSource(scene, szName);
} else if(strcmp(szElementName, "reverb_zone") == 0) {
new_node = new KRReverbZone(scene, szName);
} else if(strcmp(szElementName, "ambient_sphere") == 0) {
new_node = new KRAmbientSphere(scene, szName);
}
if(new_node) {

View File

@@ -1,134 +0,0 @@
//
// KRReverbZone.cpp
// KREngine
//
// Created by Kearwood Gilbert on 2012-12-06.
// Copyright (c) 2012 Kearwood Software. All rights reserved.
//
#include "KRReverbZone.h"
#include "KRContext.h"
KRReverbZone::KRReverbZone(KRScene &scene, std::string name) : KRNode(scene, name)
{
}
KRReverbZone::~KRReverbZone()
{
}
std::string KRReverbZone::getElementName() {
return "reverb_zone";
}
tinyxml2::XMLElement *KRReverbZone::saveXML( tinyxml2::XMLNode *parent)
{
tinyxml2::XMLElement *e = KRNode::saveXML(parent);
return e;
}
void KRReverbZone::loadXML(tinyxml2::XMLElement *e)
{
KRNode::loadXML(e);
}
std::string KRReverbZone::getReverbPreset()
{
return m_reverb_preset_name;
}
void KRReverbZone::setReverbPreset(const std::string &reverb_preset_name)
{
m_reverb_preset_name = reverb_preset_name;
}
unsigned int KRReverbZone::getReverbSettingId()
{
if(m_reverb_preset_name.compare("small_room") == 0) {
return ALC_ASA_REVERB_ROOM_TYPE_SmallRoom;
} else if(m_reverb_preset_name.compare("medium_room") == 0) {
return ALC_ASA_REVERB_ROOM_TYPE_MediumRoom;
} else if(m_reverb_preset_name.compare("large_room") == 0) {
return ALC_ASA_REVERB_ROOM_TYPE_LargeRoom;
} else if(m_reverb_preset_name.compare("medium_hall") == 0) {
return ALC_ASA_REVERB_ROOM_TYPE_MediumHall;
} else if(m_reverb_preset_name.compare("large_hall") == 0) {
return ALC_ASA_REVERB_ROOM_TYPE_LargeHall;
} else if(m_reverb_preset_name.compare("plate") == 0) {
return ALC_ASA_REVERB_ROOM_TYPE_Plate;
} else if(m_reverb_preset_name.compare("medium_chamber") == 0) {
return ALC_ASA_REVERB_ROOM_TYPE_MediumChamber;
} else if(m_reverb_preset_name.compare("large_chamber") == 0) {
return ALC_ASA_REVERB_ROOM_TYPE_LargeChamber;
} else if(m_reverb_preset_name.compare("cathedral") == 0) {
return ALC_ASA_REVERB_ROOM_TYPE_Cathedral;
} else if(m_reverb_preset_name.compare("large_room2") == 0) {
return ALC_ASA_REVERB_ROOM_TYPE_LargeRoom2;
} else if(m_reverb_preset_name.compare("medium_hall2") == 0) {
return ALC_ASA_REVERB_ROOM_TYPE_MediumHall2;
} else if(m_reverb_preset_name.compare("medium_hall3") == 0) {
return ALC_ASA_REVERB_ROOM_TYPE_MediumHall3;
} else if(m_reverb_preset_name.compare("large_hall2") == 0) {
return ALC_ASA_REVERB_ROOM_TYPE_LargeHall2;
} else {
return ALC_ASA_REVERB_ROOM_TYPE_SmallRoom;
}
}
void KRReverbZone::render(KRCamera *pCamera, std::vector<KRLight *> &lights, const KRViewport &viewport, KRNode::RenderPass renderPass)
{
KRNode::render(pCamera, lights, viewport, renderPass);
bool bVisualize = false;
if(renderPass == KRNode::RENDER_PASS_FORWARD_TRANSPARENT && bVisualize) {
KRMat4 sphereModelMatrix = getModelMatrix();
KRShader *pShader = getContext().getShaderManager()->getShader("visualize_overlay", pCamera, lights, 0, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, renderPass);
if(getContext().getShaderManager()->selectShader(*pCamera, pShader, viewport, sphereModelMatrix, lights, 0, renderPass)) {
// Enable additive blending
GLDEBUG(glEnable(GL_BLEND));
GLDEBUG(glBlendFunc(GL_ONE, GL_ONE));
// Disable z-buffer write
GLDEBUG(glDepthMask(GL_FALSE));
// Enable z-buffer test
GLDEBUG(glEnable(GL_DEPTH_TEST));
GLDEBUG(glDepthFunc(GL_LEQUAL));
GLDEBUG(glDepthRangef(0.0, 1.0));
std::vector<KRMesh *> sphereModels = getContext().getModelManager()->getModel("__sphere");
if(sphereModels.size()) {
for(int i=0; i < sphereModels[0]->getSubmeshCount(); i++) {
sphereModels[0]->renderSubmesh(i);
}
}
// Enable alpha blending
GLDEBUG(glEnable(GL_BLEND));
GLDEBUG(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
}
}
}
float KRReverbZone::getGradientDistance()
{
return m_gradient_distance;
}
void KRReverbZone::setGradientDistance(float gradient_distance)
{
m_gradient_distance = gradient_distance;
}
KRAABB KRReverbZone::getBounds() {
// Reverb zones always have a -1, -1, -1 to 1, 1, 1 bounding box
return KRAABB(-KRVector3::One(), KRVector3::One(), getModelMatrix());
}

View File

@@ -1,42 +0,0 @@
//
// KRReverbZone.h
// KREngine
//
// Created by Kearwood Gilbert on 2012-12-06.
// Copyright (c) 2012 Kearwood Software. All rights reserved.
//
#ifndef KRREVERB_ZONE_H
#define KRREVERB_ZONE_H
#include "KRResource.h"
#include "KRNode.h"
#include "KRTexture.h"
class KRReverbZone : public KRNode {
public:
KRReverbZone(KRScene &scene, std::string name);
virtual ~KRReverbZone();
virtual std::string getElementName();
virtual tinyxml2::XMLElement *saveXML( tinyxml2::XMLNode *parent);
virtual void loadXML(tinyxml2::XMLElement *e);
void render(KRCamera *pCamera, std::vector<KRLight *> &lights, const KRViewport &viewport, KRNode::RenderPass renderPass);
float getGradientDistance();
void setGradientDistance(float gradient_distance);
std::string getReverbPreset();
void setReverbPreset(const std::string &reverb_preset_name);
unsigned int getReverbSettingId();
virtual KRAABB getBounds();
private:
float m_gradient_distance;
std::string m_reverb_preset_name;
};
#endif