mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 18:00:41 +02:00
Move avatar renedering to Scene
This commit is contained in:
parent
389d5556f5
commit
f972e84d6c
7 changed files with 64 additions and 69 deletions
|
@ -3027,11 +3027,6 @@ void Application::updateShadowMap(RenderArgs* renderArgs) {
|
||||||
glEnable(GL_POLYGON_OFFSET_FILL);
|
glEnable(GL_POLYGON_OFFSET_FILL);
|
||||||
glPolygonOffset(1.1f, 4.0f); // magic numbers courtesy http://www.eecs.berkeley.edu/~ravir/6160/papers/shadowmaps.ppt
|
glPolygonOffset(1.1f, 4.0f); // magic numbers courtesy http://www.eecs.berkeley.edu/~ravir/6160/papers/shadowmaps.ppt
|
||||||
|
|
||||||
{
|
|
||||||
PerformanceTimer perfTimer("avatarManager");
|
|
||||||
DependencyManager::get<AvatarManager>()->renderAvatars(renderArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
{
|
||||||
PerformanceTimer perfTimer("entities");
|
PerformanceTimer perfTimer("entities");
|
||||||
_entities.render(renderArgs);
|
_entities.render(renderArgs);
|
||||||
|
@ -3404,15 +3399,6 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool mirrorMode = (theCamera.getMode() == CAMERA_MODE_MIRROR);
|
|
||||||
|
|
||||||
{
|
|
||||||
PerformanceTimer perfTimer("avatars");
|
|
||||||
renderArgs->_renderMode = mirrorMode ? RenderArgs::MIRROR_RENDER_MODE : RenderArgs::NORMAL_RENDER_MODE;
|
|
||||||
DependencyManager::get<AvatarManager>()->renderAvatars(renderArgs, false, selfAvatarOnly);
|
|
||||||
renderArgs->_renderMode = RenderArgs::NORMAL_RENDER_MODE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static render::ItemID myFirstRenderItem = 0;
|
static render::ItemID myFirstRenderItem = 0;
|
||||||
|
|
||||||
if (myFirstRenderItem == 0) {
|
if (myFirstRenderItem == 0) {
|
||||||
|
@ -3443,13 +3429,6 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se
|
||||||
PerformanceTimer perfTimer("lighting");
|
PerformanceTimer perfTimer("lighting");
|
||||||
DependencyManager::get<DeferredLightingEffect>()->render();
|
DependencyManager::get<DeferredLightingEffect>()->render();
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
PerformanceTimer perfTimer("avatarsPostLighting");
|
|
||||||
renderArgs->_renderMode = mirrorMode ? RenderArgs::MIRROR_RENDER_MODE : RenderArgs::NORMAL_RENDER_MODE;
|
|
||||||
DependencyManager::get<AvatarManager>()->renderAvatars(renderArgs, true, selfAvatarOnly);
|
|
||||||
renderArgs->_renderMode = RenderArgs::NORMAL_RENDER_MODE;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Render the sixense lasers
|
//Render the sixense lasers
|
||||||
if (Menu::getInstance()->isOptionChecked(MenuOption::SixenseLasers)) {
|
if (Menu::getInstance()->isOptionChecked(MenuOption::SixenseLasers)) {
|
||||||
|
|
|
@ -349,6 +349,8 @@ public:
|
||||||
void setMaxOctreePacketsPerSecond(int maxOctreePPS);
|
void setMaxOctreePacketsPerSecond(int maxOctreePPS);
|
||||||
int getMaxOctreePacketsPerSecond();
|
int getMaxOctreePacketsPerSecond();
|
||||||
|
|
||||||
|
render::ScenePointer getMain3DScene() const { return _main3DScene; }
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
/// Fired when we're simulating; allows external parties to hook in.
|
/// Fired when we're simulating; allows external parties to hook in.
|
||||||
|
|
|
@ -60,6 +60,21 @@ const float DISPLAYNAME_FADE_FACTOR = pow(0.01f, 1.0f / DISPLAYNAME_FADE_TIME);
|
||||||
const float DISPLAYNAME_ALPHA = 0.95f;
|
const float DISPLAYNAME_ALPHA = 0.95f;
|
||||||
const float DISPLAYNAME_BACKGROUND_ALPHA = 0.4f;
|
const float DISPLAYNAME_BACKGROUND_ALPHA = 0.4f;
|
||||||
|
|
||||||
|
namespace render {
|
||||||
|
template <> const ItemKey payloadGetKey(const AvatarSharedPointer& avatar) {
|
||||||
|
return ItemKey::Builder::opaqueShape();
|
||||||
|
}
|
||||||
|
template <> const Item::Bound payloadGetBound(const AvatarSharedPointer& avatar) {
|
||||||
|
return static_cast<Avatar*>(avatar.get())->getBounds();
|
||||||
|
}
|
||||||
|
template <> void payloadRender(const AvatarSharedPointer& avatar, RenderArgs* args) {
|
||||||
|
if (static_cast<Avatar*>(avatar.get())->isInitialized() && args) {
|
||||||
|
static_cast<Avatar*>(avatar.get())->render(args, Application::getInstance()->getCamera()->getPosition());
|
||||||
|
args->_elementsTouched++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Avatar::Avatar() :
|
Avatar::Avatar() :
|
||||||
AvatarData(),
|
AvatarData(),
|
||||||
_skeletonModel(this),
|
_skeletonModel(this),
|
||||||
|
@ -116,6 +131,10 @@ glm::quat Avatar::getWorldAlignedOrientation () const {
|
||||||
return computeRotationFromBodyToWorldUp() * getOrientation();
|
return computeRotationFromBodyToWorldUp() * getOrientation();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AABox Avatar::getBounds() const {
|
||||||
|
return AABox();
|
||||||
|
}
|
||||||
|
|
||||||
float Avatar::getLODDistance() const {
|
float Avatar::getLODDistance() const {
|
||||||
return DependencyManager::get<LODManager>()->getAvatarLODDistanceMultiplier() *
|
return DependencyManager::get<LODManager>()->getAvatarLODDistanceMultiplier() *
|
||||||
glm::distance(qApp->getCamera()->getPosition(), _position) / _scale;
|
glm::distance(qApp->getCamera()->getPosition(), _position) / _scale;
|
||||||
|
|
|
@ -20,6 +20,8 @@
|
||||||
#include <AvatarData.h>
|
#include <AvatarData.h>
|
||||||
#include <ShapeInfo.h>
|
#include <ShapeInfo.h>
|
||||||
|
|
||||||
|
#include <render/Scene.h>
|
||||||
|
|
||||||
#include "Hand.h"
|
#include "Hand.h"
|
||||||
#include "Head.h"
|
#include "Head.h"
|
||||||
#include "InterfaceConfig.h"
|
#include "InterfaceConfig.h"
|
||||||
|
@ -66,6 +68,10 @@ public:
|
||||||
Avatar();
|
Avatar();
|
||||||
~Avatar();
|
~Avatar();
|
||||||
|
|
||||||
|
typedef render::Payload<AvatarData> Payload;
|
||||||
|
typedef std::shared_ptr<render::Item::PayloadInterface> PayloadPointer;
|
||||||
|
typedef Payload::DataPointer Pointer;
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
void simulate(float deltaTime);
|
void simulate(float deltaTime);
|
||||||
|
|
||||||
|
@ -87,6 +93,8 @@ public:
|
||||||
Hand* getHand() { return static_cast<Hand*>(_handData); }
|
Hand* getHand() { return static_cast<Hand*>(_handData); }
|
||||||
glm::quat getWorldAlignedOrientation() const;
|
glm::quat getWorldAlignedOrientation() const;
|
||||||
|
|
||||||
|
AABox getBounds() const;
|
||||||
|
|
||||||
/// Returns the distance to use as a LOD parameter.
|
/// Returns the distance to use as a LOD parameter.
|
||||||
float getLODDistance() const;
|
float getLODDistance() const;
|
||||||
|
|
||||||
|
@ -220,9 +228,10 @@ protected:
|
||||||
virtual void renderAttachments(RenderArgs* args);
|
virtual void renderAttachments(RenderArgs* args);
|
||||||
|
|
||||||
virtual void updateJointMappings();
|
virtual void updateJointMappings();
|
||||||
|
|
||||||
|
render::ItemID _renderItemID;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
bool _initialized;
|
bool _initialized;
|
||||||
NetworkTexturePointer _billboardTexture;
|
NetworkTexturePointer _billboardTexture;
|
||||||
bool _shouldRenderBillboard;
|
bool _shouldRenderBillboard;
|
||||||
|
|
|
@ -55,12 +55,22 @@ 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
|
||||||
qRegisterMetaType<QWeakPointer<Node> >("NodeWeakPointer");
|
qRegisterMetaType<QWeakPointer<Node> >("NodeWeakPointer");
|
||||||
_myAvatar = QSharedPointer<MyAvatar>(new MyAvatar());
|
_myAvatar = std::shared_ptr<MyAvatar>(new MyAvatar());
|
||||||
}
|
}
|
||||||
|
|
||||||
void AvatarManager::init() {
|
void AvatarManager::init() {
|
||||||
_myAvatar->init();
|
_myAvatar->init();
|
||||||
_avatarHash.insert(MY_AVATAR_KEY, _myAvatar);
|
_avatarHash.insert(MY_AVATAR_KEY, _myAvatar);
|
||||||
|
|
||||||
|
render::ScenePointer scene = Application::getInstance()->getMain3DScene();
|
||||||
|
auto avatarPayload = new render::Payload<AvatarData>(_myAvatar);
|
||||||
|
auto avatarPayloadPointer = Avatar::PayloadPointer(avatarPayload);
|
||||||
|
static_cast<Avatar*>(_myAvatar.get())->_renderItemID = scene->allocateID();
|
||||||
|
|
||||||
|
render::Scene::PendingChanges pendingChanges;
|
||||||
|
pendingChanges.resetItem(static_cast<Avatar*>(_myAvatar.get())->_renderItemID, avatarPayloadPointer);
|
||||||
|
|
||||||
|
scene->enqueuePendingChanges(pendingChanges);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AvatarManager::updateMyAvatar(float deltaTime) {
|
void AvatarManager::updateMyAvatar(float deltaTime) {
|
||||||
|
@ -92,9 +102,9 @@ void AvatarManager::updateOtherAvatars(float deltaTime) {
|
||||||
// simulate avatars
|
// simulate avatars
|
||||||
AvatarHash::iterator avatarIterator = _avatarHash.begin();
|
AvatarHash::iterator avatarIterator = _avatarHash.begin();
|
||||||
while (avatarIterator != _avatarHash.end()) {
|
while (avatarIterator != _avatarHash.end()) {
|
||||||
Avatar* avatar = reinterpret_cast<Avatar*>(avatarIterator.value().data());
|
Avatar* avatar = reinterpret_cast<Avatar*>(avatarIterator.value().get());
|
||||||
|
|
||||||
if (avatar == _myAvatar || !avatar->isInitialized()) {
|
if (avatar == _myAvatar.get() || !avatar->isInitialized()) {
|
||||||
// DO NOT update _myAvatar! Its update has already been done earlier in the main loop.
|
// DO NOT update _myAvatar! Its update has already been done earlier in the main loop.
|
||||||
// DO NOT update or fade out uninitialized Avatars
|
// DO NOT update or fade out uninitialized Avatars
|
||||||
++avatarIterator;
|
++avatarIterator;
|
||||||
|
@ -111,32 +121,6 @@ void AvatarManager::updateOtherAvatars(float deltaTime) {
|
||||||
simulateAvatarFades(deltaTime);
|
simulateAvatarFades(deltaTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AvatarManager::renderAvatars(RenderArgs* renderArgs, bool postLighting, bool selfAvatarOnly) {
|
|
||||||
PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings),
|
|
||||||
"Application::renderAvatars()");
|
|
||||||
bool renderLookAtVectors = Menu::getInstance()->isOptionChecked(MenuOption::RenderLookAtVectors);
|
|
||||||
|
|
||||||
glm::vec3 cameraPosition = Application::getInstance()->getCamera()->getPosition();
|
|
||||||
|
|
||||||
if (!selfAvatarOnly) {
|
|
||||||
if (DependencyManager::get<SceneScriptingInterface>()->shouldRenderAvatars()) {
|
|
||||||
foreach (const AvatarSharedPointer& avatarPointer, _avatarHash) {
|
|
||||||
Avatar* avatar = static_cast<Avatar*>(avatarPointer.data());
|
|
||||||
if (!avatar->isInitialized()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
avatar->render(renderArgs, cameraPosition, postLighting);
|
|
||||||
avatar->setDisplayingLookatVectors(renderLookAtVectors);
|
|
||||||
}
|
|
||||||
renderAvatarFades(renderArgs, cameraPosition);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// just render myAvatar
|
|
||||||
_myAvatar->render(renderArgs, cameraPosition, postLighting);
|
|
||||||
_myAvatar->setDisplayingLookatVectors(renderLookAtVectors);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AvatarManager::simulateAvatarFades(float deltaTime) {
|
void AvatarManager::simulateAvatarFades(float deltaTime) {
|
||||||
QVector<AvatarSharedPointer>::iterator fadingIterator = _avatarFades.begin();
|
QVector<AvatarSharedPointer>::iterator fadingIterator = _avatarFades.begin();
|
||||||
|
|
||||||
|
@ -155,18 +139,6 @@ void AvatarManager::simulateAvatarFades(float deltaTime) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AvatarManager::renderAvatarFades(RenderArgs* renderArgs, const glm::vec3& cameraPosition) {
|
|
||||||
// render avatar fades
|
|
||||||
Glower glower(renderArgs, renderArgs->_renderMode == RenderArgs::NORMAL_RENDER_MODE ? 1.0f : 0.0f);
|
|
||||||
|
|
||||||
foreach(const AvatarSharedPointer& fadingAvatar, _avatarFades) {
|
|
||||||
avatar->render(renderArgs, cameraPosition);
|
|
||||||
Avatar* avatar = static_cast<Avatar*>(fadingAvatar.get());
|
|
||||||
if (avatar != static_cast<Avatar*>(_myAvatar.get()) && avatar->isInitialized()) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AvatarSharedPointer AvatarManager::newSharedAvatar() {
|
AvatarSharedPointer AvatarManager::newSharedAvatar() {
|
||||||
return AvatarSharedPointer(new Avatar());
|
return AvatarSharedPointer(new Avatar());
|
||||||
}
|
}
|
||||||
|
@ -174,6 +146,17 @@ AvatarSharedPointer AvatarManager::newSharedAvatar() {
|
||||||
// virtual
|
// virtual
|
||||||
AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWeakPointer<Node>& mixerWeakPointer) {
|
AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWeakPointer<Node>& mixerWeakPointer) {
|
||||||
AvatarSharedPointer avatar = AvatarHashMap::addAvatar(sessionUUID, mixerWeakPointer);
|
AvatarSharedPointer avatar = AvatarHashMap::addAvatar(sessionUUID, mixerWeakPointer);
|
||||||
|
|
||||||
|
render::ScenePointer scene = Application::getInstance()->getMain3DScene();
|
||||||
|
auto avatarPayload = new render::Payload<AvatarData>(avatar);
|
||||||
|
auto avatarPayloadPointer = Avatar::PayloadPointer(avatarPayload);
|
||||||
|
static_cast<Avatar*>(avatar.get())->_renderItemID = scene->allocateID();
|
||||||
|
|
||||||
|
render::Scene::PendingChanges pendingChanges;
|
||||||
|
pendingChanges.resetItem(static_cast<Avatar*>(avatar.get())->_renderItemID, avatarPayloadPointer);
|
||||||
|
|
||||||
|
scene->enqueuePendingChanges(pendingChanges);
|
||||||
|
|
||||||
return avatar;
|
return avatar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,6 +184,11 @@ void AvatarManager::removeAvatar(const QUuid& sessionUUID) {
|
||||||
_avatarFades.push_back(avatarIterator.value());
|
_avatarFades.push_back(avatarIterator.value());
|
||||||
_avatarHash.erase(avatarIterator);
|
_avatarHash.erase(avatarIterator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
render::ScenePointer scene = Application::getInstance()->getMain3DScene();
|
||||||
|
render::Scene::PendingChanges pendingChanges;
|
||||||
|
pendingChanges.removeItem(avatar->_renderItemID);
|
||||||
|
scene->enqueuePendingChanges(pendingChanges);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,6 @@ public:
|
||||||
|
|
||||||
void updateMyAvatar(float deltaTime);
|
void updateMyAvatar(float deltaTime);
|
||||||
void updateOtherAvatars(float deltaTime);
|
void updateOtherAvatars(float deltaTime);
|
||||||
void renderAvatars(RenderArgs* renderArgs, bool postLighting = false, bool selfAvatarOnly = false);
|
|
||||||
|
|
||||||
void clearOtherAvatars();
|
void clearOtherAvatars();
|
||||||
|
|
||||||
|
@ -70,7 +69,6 @@ private:
|
||||||
AvatarManager(const AvatarManager& other);
|
AvatarManager(const AvatarManager& other);
|
||||||
|
|
||||||
void simulateAvatarFades(float deltaTime);
|
void simulateAvatarFades(float deltaTime);
|
||||||
void renderAvatarFades(RenderArgs* renderArgs, const glm::vec3& cameraPosition);
|
|
||||||
|
|
||||||
// virtual overrides
|
// virtual overrides
|
||||||
virtual AvatarSharedPointer newSharedAvatar();
|
virtual AvatarSharedPointer newSharedAvatar();
|
||||||
|
|
|
@ -37,10 +37,10 @@ public:
|
||||||
void simulate(float deltaTime);
|
void simulate(float deltaTime);
|
||||||
void updateFromTrackers(float deltaTime);
|
void updateFromTrackers(float deltaTime);
|
||||||
|
|
||||||
void render(RenderArgs* renderArgs, const glm::vec3& cameraPosition, bool postLighting = false);
|
virtual void render(RenderArgs* renderArgs, const glm::vec3& cameraPosition, bool postLighting = false);
|
||||||
void renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, bool postLighting, float glowLevel = 0.0f);
|
virtual void renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, bool postLighting, float glowLevel = 0.0f);
|
||||||
bool shouldRenderHead(const RenderArgs* renderArgs, const glm::vec3& cameraPosition) const override;
|
virtual bool shouldRenderHead(const RenderArgs* renderArgs, const glm::vec3& cameraPosition) const override;
|
||||||
void renderDebugBodyPoints();
|
virtual void renderDebugBodyPoints();
|
||||||
|
|
||||||
// setters
|
// setters
|
||||||
void setLeanScale(float scale) { _leanScale = scale; }
|
void setLeanScale(float scale) { _leanScale = scale; }
|
||||||
|
|
Loading…
Reference in a new issue