mirror of
https://github.com/Armored-Dragon/overte.git
synced 2025-03-11 16:13:16 +01:00
Move LocalLight to AvatarManager, apply it at the avatar level.
This commit is contained in:
parent
b9ae005e53
commit
c6aad42f21
6 changed files with 57 additions and 60 deletions
|
@ -3800,8 +3800,8 @@ ScriptEngine* Application::loadScript(const QString& scriptFilename, bool isUser
|
||||||
scriptEngine->getEntityScriptingInterface()->setPacketSender(&_entityEditSender);
|
scriptEngine->getEntityScriptingInterface()->setPacketSender(&_entityEditSender);
|
||||||
scriptEngine->getEntityScriptingInterface()->setEntityTree(_entities.getTree());
|
scriptEngine->getEntityScriptingInterface()->setEntityTree(_entities.getTree());
|
||||||
|
|
||||||
// model has some custom types
|
// AvatarManager has some custom types
|
||||||
Model::registerMetaTypes(scriptEngine);
|
AvatarManager::registerMetaTypes(scriptEngine);
|
||||||
|
|
||||||
// hook our avatar object into this script engine
|
// hook our avatar object into this script engine
|
||||||
scriptEngine->setAvatarData(_myAvatar, "MyAvatar"); // leave it as a MyAvatar class to expose thrust features
|
scriptEngine->setAvatarData(_myAvatar, "MyAvatar"); // leave it as a MyAvatar class to expose thrust features
|
||||||
|
|
|
@ -345,17 +345,25 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderMode renderMode) {
|
||||||
? 1.0f
|
? 1.0f
|
||||||
: GLOW_FROM_AVERAGE_LOUDNESS;
|
: GLOW_FROM_AVERAGE_LOUDNESS;
|
||||||
|
|
||||||
|
|
||||||
// local lights directions and colors
|
|
||||||
const QVector<Model::LocalLight>& localLights = Application::getInstance()->getAvatarManager().getLocalLights();
|
|
||||||
_skeletonModel.setLocalLights(localLights);
|
|
||||||
getHead()->getFaceModel().setLocalLights(localLights);
|
|
||||||
|
|
||||||
// render body
|
// render body
|
||||||
if (Menu::getInstance()->isOptionChecked(MenuOption::Avatars)) {
|
if (Menu::getInstance()->isOptionChecked(MenuOption::Avatars)) {
|
||||||
renderBody(renderMode, glowLevel);
|
renderBody(renderMode, glowLevel);
|
||||||
}
|
}
|
||||||
if (renderMode != SHADOW_RENDER_MODE) {
|
if (renderMode != SHADOW_RENDER_MODE) {
|
||||||
|
// add local lights
|
||||||
|
const float BASE_LIGHT_DISTANCE = 2.0f;
|
||||||
|
const float LIGHT_EXPONENT = 1.0f;
|
||||||
|
const float LIGHT_CUTOFF = glm::radians(80.0f);
|
||||||
|
float distance = BASE_LIGHT_DISTANCE * _scale;
|
||||||
|
glm::vec3 position = glm::mix(getPosition(), getHead()->getEyePosition(), 0.75f);
|
||||||
|
glm::quat orientation = getOrientation();
|
||||||
|
foreach (const AvatarManager::LocalLight& light, Application::getInstance()->getAvatarManager().getLocalLights()) {
|
||||||
|
glm::vec3 direction = orientation * light.direction;
|
||||||
|
Application::getInstance()->getDeferredLightingEffect()->addSpotLight(position - direction * distance,
|
||||||
|
distance * 2.0f, glm::vec3(), light.color, light.color, 1.0f, 0.0f, 0.0f, direction,
|
||||||
|
LIGHT_EXPONENT, LIGHT_CUTOFF);
|
||||||
|
}
|
||||||
|
|
||||||
bool renderSkeleton = Menu::getInstance()->isOptionChecked(MenuOption::RenderSkeletonCollisionShapes);
|
bool renderSkeleton = Menu::getInstance()->isOptionChecked(MenuOption::RenderSkeletonCollisionShapes);
|
||||||
bool renderHead = Menu::getInstance()->isOptionChecked(MenuOption::RenderHeadCollisionShapes);
|
bool renderHead = Menu::getInstance()->isOptionChecked(MenuOption::RenderHeadCollisionShapes);
|
||||||
bool renderBounding = Menu::getInstance()->isOptionChecked(MenuOption::RenderBoundingCollisionShapes);
|
bool renderBounding = Menu::getInstance()->isOptionChecked(MenuOption::RenderBoundingCollisionShapes);
|
||||||
|
|
|
@ -11,9 +11,12 @@
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include <QScriptEngine>
|
||||||
|
|
||||||
#include <glm/gtx/string_cast.hpp>
|
#include <glm/gtx/string_cast.hpp>
|
||||||
|
|
||||||
#include <PerfStat.h>
|
#include <PerfStat.h>
|
||||||
|
#include <RegisteredMetaTypes.h>
|
||||||
#include <UUID.h>
|
#include <UUID.h>
|
||||||
|
|
||||||
#include "Application.h"
|
#include "Application.h"
|
||||||
|
@ -26,6 +29,23 @@
|
||||||
// We add _myAvatar into the hash with all the other AvatarData, and we use the default NULL QUid as the key.
|
// We add _myAvatar into the hash with all the other AvatarData, and we use the default NULL QUid as the key.
|
||||||
const QUuid MY_AVATAR_KEY; // NULL key
|
const QUuid MY_AVATAR_KEY; // NULL key
|
||||||
|
|
||||||
|
static QScriptValue localLightToScriptValue(QScriptEngine* engine, const AvatarManager::LocalLight& light) {
|
||||||
|
QScriptValue object = engine->newObject();
|
||||||
|
object.setProperty("direction", vec3toScriptValue(engine, light.direction));
|
||||||
|
object.setProperty("color", vec3toScriptValue(engine, light.color));
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void localLightFromScriptValue(const QScriptValue& value, AvatarManager::LocalLight& light) {
|
||||||
|
vec3FromScriptValue(value.property("direction"), light.direction);
|
||||||
|
vec3FromScriptValue(value.property("color"), light.color);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AvatarManager::registerMetaTypes(QScriptEngine* engine) {
|
||||||
|
qScriptRegisterMetaType(engine, localLightToScriptValue, localLightFromScriptValue);
|
||||||
|
qScriptRegisterSequenceMetaType<QVector<AvatarManager::LocalLight> >(engine);
|
||||||
|
}
|
||||||
|
|
||||||
AvatarManager::AvatarManager(QObject* parent) :
|
AvatarManager::AvatarManager(QObject* parent) :
|
||||||
_avatarFades() {
|
_avatarFades() {
|
||||||
// register a meta type for the weak pointer we'll use for the owning avatar mixer for each avatar
|
// register a meta type for the weak pointer we'll use for the owning avatar mixer for each avatar
|
||||||
|
@ -159,19 +179,19 @@ void AvatarManager::clearOtherAvatars() {
|
||||||
_myAvatar->clearLookAtTargetAvatar();
|
_myAvatar->clearLookAtTargetAvatar();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AvatarManager::setLocalLights(const QVector<Model::LocalLight>& localLights) {
|
void AvatarManager::setLocalLights(const QVector<AvatarManager::LocalLight>& localLights) {
|
||||||
if (QThread::currentThread() != thread()) {
|
if (QThread::currentThread() != thread()) {
|
||||||
QMetaObject::invokeMethod(this, "setLocalLights", Q_ARG(const QVector<Model::LocalLight>&, localLights));
|
QMetaObject::invokeMethod(this, "setLocalLights", Q_ARG(const QVector<AvatarManager::LocalLight>&, localLights));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_localLights = localLights;
|
_localLights = localLights;
|
||||||
}
|
}
|
||||||
|
|
||||||
QVector<Model::LocalLight> AvatarManager::getLocalLights() const {
|
QVector<AvatarManager::LocalLight> AvatarManager::getLocalLights() const {
|
||||||
if (QThread::currentThread() != thread()) {
|
if (QThread::currentThread() != thread()) {
|
||||||
QVector<Model::LocalLight> result;
|
QVector<AvatarManager::LocalLight> result;
|
||||||
QMetaObject::invokeMethod(const_cast<AvatarManager*>(this), "getLocalLights", Qt::BlockingQueuedConnection,
|
QMetaObject::invokeMethod(const_cast<AvatarManager*>(this), "getLocalLights", Qt::BlockingQueuedConnection,
|
||||||
Q_RETURN_ARG(QVector<Model::LocalLight>, result));
|
Q_RETURN_ARG(QVector<AvatarManager::LocalLight>, result));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
return _localLights;
|
return _localLights;
|
||||||
|
|
|
@ -26,6 +26,10 @@ class AvatarManager : public AvatarHashMap {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
/// Registers the script types associated with the avatar manager.
|
||||||
|
static void registerMetaTypes(QScriptEngine* engine);
|
||||||
|
|
||||||
AvatarManager(QObject* parent = 0);
|
AvatarManager(QObject* parent = 0);
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
|
@ -37,8 +41,14 @@ public:
|
||||||
|
|
||||||
void clearOtherAvatars();
|
void clearOtherAvatars();
|
||||||
|
|
||||||
Q_INVOKABLE void setLocalLights(const QVector<Model::LocalLight>& localLights);
|
class LocalLight {
|
||||||
Q_INVOKABLE QVector<Model::LocalLight> getLocalLights() const;
|
public:
|
||||||
|
glm::vec3 color;
|
||||||
|
glm::vec3 direction;
|
||||||
|
};
|
||||||
|
|
||||||
|
Q_INVOKABLE void setLocalLights(const QVector<AvatarManager::LocalLight>& localLights);
|
||||||
|
Q_INVOKABLE QVector<AvatarManager::LocalLight> getLocalLights() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
AvatarManager(const AvatarManager& other);
|
AvatarManager(const AvatarManager& other);
|
||||||
|
@ -54,7 +64,10 @@ private:
|
||||||
QVector<AvatarSharedPointer> _avatarFades;
|
QVector<AvatarSharedPointer> _avatarFades;
|
||||||
QSharedPointer<MyAvatar> _myAvatar;
|
QSharedPointer<MyAvatar> _myAvatar;
|
||||||
|
|
||||||
QVector<Model::LocalLight> _localLights;
|
QVector<AvatarManager::LocalLight> _localLights;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE(AvatarManager::LocalLight)
|
||||||
|
Q_DECLARE_METATYPE(QVector<AvatarManager::LocalLight>)
|
||||||
|
|
||||||
#endif // hifi_AvatarManager_h
|
#endif // hifi_AvatarManager_h
|
||||||
|
|
|
@ -11,7 +11,6 @@
|
||||||
|
|
||||||
#include <QMetaType>
|
#include <QMetaType>
|
||||||
#include <QRunnable>
|
#include <QRunnable>
|
||||||
#include <QScriptEngine>
|
|
||||||
#include <QThreadPool>
|
#include <QThreadPool>
|
||||||
|
|
||||||
#include <glm/gtx/transform.hpp>
|
#include <glm/gtx/transform.hpp>
|
||||||
|
@ -20,7 +19,6 @@
|
||||||
#include <CapsuleShape.h>
|
#include <CapsuleShape.h>
|
||||||
#include <GeometryUtil.h>
|
#include <GeometryUtil.h>
|
||||||
#include <PhysicsEntity.h>
|
#include <PhysicsEntity.h>
|
||||||
#include <RegisteredMetaTypes.h>
|
|
||||||
#include <ShapeCollider.h>
|
#include <ShapeCollider.h>
|
||||||
#include <SphereShape.h>
|
#include <SphereShape.h>
|
||||||
|
|
||||||
|
@ -33,23 +31,6 @@ static int modelPointerTypeId = qRegisterMetaType<QPointer<Model> >();
|
||||||
static int weakNetworkGeometryPointerTypeId = qRegisterMetaType<QWeakPointer<NetworkGeometry> >();
|
static int weakNetworkGeometryPointerTypeId = qRegisterMetaType<QWeakPointer<NetworkGeometry> >();
|
||||||
static int vec3VectorTypeId = qRegisterMetaType<QVector<glm::vec3> >();
|
static int vec3VectorTypeId = qRegisterMetaType<QVector<glm::vec3> >();
|
||||||
|
|
||||||
static QScriptValue localLightToScriptValue(QScriptEngine* engine, const Model::LocalLight& light) {
|
|
||||||
QScriptValue object = engine->newObject();
|
|
||||||
object.setProperty("direction", vec3toScriptValue(engine, light.direction));
|
|
||||||
object.setProperty("color", vec3toScriptValue(engine, light.color));
|
|
||||||
return object;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void localLightFromScriptValue(const QScriptValue& value, Model::LocalLight& light) {
|
|
||||||
vec3FromScriptValue(value.property("direction"), light.direction);
|
|
||||||
vec3FromScriptValue(value.property("color"), light.color);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Model::registerMetaTypes(QScriptEngine* engine) {
|
|
||||||
qScriptRegisterMetaType(engine, localLightToScriptValue, localLightFromScriptValue);
|
|
||||||
qScriptRegisterSequenceMetaType<QVector<Model::LocalLight> >(engine);
|
|
||||||
}
|
|
||||||
|
|
||||||
Model::Model(QObject* parent) :
|
Model::Model(QObject* parent) :
|
||||||
QObject(parent),
|
QObject(parent),
|
||||||
_scale(1.0f, 1.0f, 1.0f),
|
_scale(1.0f, 1.0f, 1.0f),
|
||||||
|
@ -412,13 +393,6 @@ bool Model::render(float alpha, RenderMode mode) {
|
||||||
glEnable(GL_CULL_FACE);
|
glEnable(GL_CULL_FACE);
|
||||||
if (mode == SHADOW_RENDER_MODE) {
|
if (mode == SHADOW_RENDER_MODE) {
|
||||||
glCullFace(GL_FRONT);
|
glCullFace(GL_FRONT);
|
||||||
|
|
||||||
} else if (mode == DEFAULT_RENDER_MODE) {
|
|
||||||
// add the local lights
|
|
||||||
foreach (const LocalLight& light, _localLights) {
|
|
||||||
Application::getInstance()->getDeferredLightingEffect()->addSpotLight(glm::vec3(), 1.0f, glm::vec3(),
|
|
||||||
light.color, light.color, 1.0f, 0.0f, 0.0f);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,17 +34,12 @@ class Shape;
|
||||||
typedef QSharedPointer<AnimationHandle> AnimationHandlePointer;
|
typedef QSharedPointer<AnimationHandle> AnimationHandlePointer;
|
||||||
typedef QWeakPointer<AnimationHandle> WeakAnimationHandlePointer;
|
typedef QWeakPointer<AnimationHandle> WeakAnimationHandlePointer;
|
||||||
|
|
||||||
const int MAX_LOCAL_LIGHTS = 2;
|
|
||||||
|
|
||||||
/// A generic 3D model displaying geometry loaded from a URL.
|
/// A generic 3D model displaying geometry loaded from a URL.
|
||||||
class Model : public QObject, public PhysicsEntity {
|
class Model : public QObject, public PhysicsEntity {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/// Registers the script types associated with models.
|
|
||||||
static void registerMetaTypes(QScriptEngine* engine);
|
|
||||||
|
|
||||||
Model(QObject* parent = NULL);
|
Model(QObject* parent = NULL);
|
||||||
virtual ~Model();
|
virtual ~Model();
|
||||||
|
|
||||||
|
@ -171,15 +166,6 @@ public:
|
||||||
void setBlendedVertices(int blendNumber, const QWeakPointer<NetworkGeometry>& geometry,
|
void setBlendedVertices(int blendNumber, const QWeakPointer<NetworkGeometry>& geometry,
|
||||||
const QVector<glm::vec3>& vertices, const QVector<glm::vec3>& normals);
|
const QVector<glm::vec3>& vertices, const QVector<glm::vec3>& normals);
|
||||||
|
|
||||||
class LocalLight {
|
|
||||||
public:
|
|
||||||
glm::vec3 color;
|
|
||||||
glm::vec3 direction;
|
|
||||||
};
|
|
||||||
|
|
||||||
void setLocalLights(const QVector<LocalLight>& localLights) { _localLights = localLights; }
|
|
||||||
const QVector<LocalLight>& getLocalLights() const { return _localLights; }
|
|
||||||
|
|
||||||
void setShowTrueJointTransforms(bool show) { _showTrueJointTransforms = show; }
|
void setShowTrueJointTransforms(bool show) { _showTrueJointTransforms = show; }
|
||||||
|
|
||||||
QVector<JointState>& getJointStates() { return _jointStates; }
|
QVector<JointState>& getJointStates() { return _jointStates; }
|
||||||
|
@ -203,8 +189,6 @@ protected:
|
||||||
|
|
||||||
bool _showTrueJointTransforms;
|
bool _showTrueJointTransforms;
|
||||||
|
|
||||||
QVector<LocalLight> _localLights;
|
|
||||||
|
|
||||||
QVector<JointState> _jointStates;
|
QVector<JointState> _jointStates;
|
||||||
|
|
||||||
class MeshState {
|
class MeshState {
|
||||||
|
@ -336,8 +320,6 @@ private:
|
||||||
Q_DECLARE_METATYPE(QPointer<Model>)
|
Q_DECLARE_METATYPE(QPointer<Model>)
|
||||||
Q_DECLARE_METATYPE(QWeakPointer<NetworkGeometry>)
|
Q_DECLARE_METATYPE(QWeakPointer<NetworkGeometry>)
|
||||||
Q_DECLARE_METATYPE(QVector<glm::vec3>)
|
Q_DECLARE_METATYPE(QVector<glm::vec3>)
|
||||||
Q_DECLARE_METATYPE(Model::LocalLight)
|
|
||||||
Q_DECLARE_METATYPE(QVector<Model::LocalLight>)
|
|
||||||
|
|
||||||
/// Represents a handle to a model animation.
|
/// Represents a handle to a model animation.
|
||||||
class AnimationHandle : public QObject {
|
class AnimationHandle : public QObject {
|
||||||
|
|
Loading…
Reference in a new issue