From f3c5e2f3210847d259c4c68a62b6bf4bfab894cb Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Mon, 22 Jun 2015 11:13:34 -0700 Subject: [PATCH 01/61] adding quad entity --- .../entities/src/EntityItemProperties.cpp | 10 ++ libraries/entities/src/EntityItemProperties.h | 1 + libraries/entities/src/EntityTypes.cpp | 2 + libraries/entities/src/EntityTypes.h | 3 +- libraries/entities/src/QuadEntityItem.cpp | 166 +++++++++++++++++- libraries/entities/src/QuadEntityItem.h | 79 ++++++++- 6 files changed, 252 insertions(+), 9 deletions(-) diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index cbb3b1dc31..4660472fc3 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -801,6 +801,11 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, properties.getLinePoints()); } + if (properties.getType() == EntityTypes::Quad) { + APPEND_ENTITY_PROPERTY(PROP_LINE_WIDTH, properties.getLineWidth()); + APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, properties.getLinePoints()); + } + APPEND_ENTITY_PROPERTY(PROP_MARKETPLACE_ID, properties.getMarketplaceID()); APPEND_ENTITY_PROPERTY(PROP_NAME, properties.getName()); APPEND_ENTITY_PROPERTY(PROP_COLLISION_SOUND_URL, properties.getCollisionSoundURL()); @@ -1048,6 +1053,11 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector, setLinePoints); } + + if (properties.getType() == EntityTypes::Quad) { + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_WIDTH, float, setLineWidth); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector, setLinePoints); + } READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MARKETPLACE_ID, QString, setMarketplaceID); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NAME, QString, setName); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLLISION_SOUND_URL, QString, setCollisionSoundURL); diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 5f33da52f8..09f47b609d 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -55,6 +55,7 @@ class EntityItemProperties { friend class WebEntityItem; // TODO: consider removing this friend relationship and use public methods friend class LineEntityItem; // TODO: consider removing this friend relationship and use public methods friend class PolyVoxEntityItem; // TODO: consider removing this friend relationship and use public methods + friend class QuadEntityItem; // TODO: consider removing this friend relationship and use public methods public: EntityItemProperties(); virtual ~EntityItemProperties(); diff --git a/libraries/entities/src/EntityTypes.cpp b/libraries/entities/src/EntityTypes.cpp index a41cc22d2e..798c16db1f 100644 --- a/libraries/entities/src/EntityTypes.cpp +++ b/libraries/entities/src/EntityTypes.cpp @@ -28,6 +28,7 @@ #include "ZoneEntityItem.h" #include "LineEntityItem.h" #include "PolyVoxEntityItem.h" +#include "QuadEntityItem.h" QMap EntityTypes::_typeToNameMap; QMap EntityTypes::_nameToTypeMap; @@ -47,6 +48,7 @@ REGISTER_ENTITY_TYPE(ParticleEffect) REGISTER_ENTITY_TYPE(Zone) REGISTER_ENTITY_TYPE(Line) REGISTER_ENTITY_TYPE(PolyVox) +REGISTER_ENTITY_TYPE(Quad); const QString& EntityTypes::getEntityTypeName(EntityType entityType) { QMap::iterator matchedTypeName = _typeToNameMap.find(entityType); diff --git a/libraries/entities/src/EntityTypes.h b/libraries/entities/src/EntityTypes.h index 323a4eb92b..d51fbdce5d 100644 --- a/libraries/entities/src/EntityTypes.h +++ b/libraries/entities/src/EntityTypes.h @@ -46,7 +46,8 @@ public: Web, Line, PolyVox, - LAST = PolyVox + Quad, + LAST = Quad } EntityType; static const QString& getEntityTypeName(EntityType entityType); diff --git a/libraries/entities/src/QuadEntityItem.cpp b/libraries/entities/src/QuadEntityItem.cpp index 0ac04129be..a72251efb1 100644 --- a/libraries/entities/src/QuadEntityItem.cpp +++ b/libraries/entities/src/QuadEntityItem.cpp @@ -1,9 +1,171 @@ // // QuadEntityItem.cpp -// hifi +// libraries/entities/src // -// Created by eric levin on 6/22/15. +// Created by Eric Levin on 6/22/15. +// Copyright 2015 High Fidelity, Inc. // +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // + +#include + +#include + #include "QuadEntityItem.h" +#include "EntityTree.h" +#include "EntitiesLogging.h" +#include "EntityTreeElement.h" +#include "OctreeConstants.h" + + + +const float QuadEntityItem::DEFAULT_LINE_WIDTH = 2.0f; +const int QuadEntityItem::MAX_POINTS_PER_LINE = 70; + + +EntityItemPointer QuadEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { + EntityItemPointer result { new QuadEntityItem(entityID, properties) }; + return result; +} + +QuadEntityItem::QuadEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : +EntityItem(entityItemID) , +_lineWidth(DEFAULT_LINE_WIDTH), +_pointsChanged(true), +_points(QVector(0)) +{ + _type = EntityTypes::Line; + _created = properties.getCreated(); + setProperties(properties); + + +} + +EntityItemProperties QuadEntityItem::getProperties() const { + + EntityItemProperties properties = EntityItem::getProperties(); // get the properties from our base class + + + properties._color = getXColor(); + properties._colorChanged = false; + + + COPY_ENTITY_PROPERTY_TO_PROPERTIES(lineWidth, getLineWidth); + + COPY_ENTITY_PROPERTY_TO_PROPERTIES(linePoints, getLinePoints); + + + properties._glowLevel = getGlowLevel(); + properties._glowLevelChanged = false; + + return properties; +} + +bool QuadEntityItem::setProperties(const EntityItemProperties& properties) { + bool somethingChanged = false; + somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class + + SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(lineWidth, setLineWidth); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(linePoints, setLinePoints); + + + if (somethingChanged) { + bool wantDebug = false; + if (wantDebug) { + uint64_t now = usecTimestampNow(); + int elapsed = now - getLastEdited(); + qCDebug(entities) << "QuadEntityItem::setProperties() AFTER update... edited AGO=" << elapsed << + "now=" << now << " getLastEdited()=" << getLastEdited(); + } + setLastEdited(properties._lastEdited); + } + return somethingChanged; +} + +bool QuadEntityItem::appendPoint(const glm::vec3& point) { + if (_points.size() > MAX_POINTS_PER_LINE - 1) { + qDebug() << "MAX POINTS REACHED!"; + return false; + } + glm::vec3 halfBox = getDimensions() * 0.5f; + if ( (point.x < - halfBox.x || point.x > halfBox.x) || (point.y < -halfBox.y || point.y > halfBox.y) || (point.z < - halfBox.z || point.z > halfBox.z) ) { + qDebug() << "Point is outside entity's bounding box"; + return false; + } + _points << point; + _pointsChanged = true; + return true; +} + +bool QuadEntityItem::setLinePoints(const QVector& points) { + if (points.size() > MAX_POINTS_PER_LINE) { + return false; + } + for (int i = 0; i < points.size(); i++) { + glm::vec3 point = points.at(i); + glm::vec3 pos = getPosition(); + glm::vec3 halfBox = getDimensions() * 0.5f; + if ( (point.x < - halfBox.x || point.x > halfBox.x) || (point.y < -halfBox.y || point.y > halfBox.y) || (point.z < - halfBox.z || point.z > halfBox.z) ) { + qDebug() << "Point is outside entity's bounding box"; + return false; + } + + } + _points = points; + _pointsChanged = true; + return true; +} + +int QuadEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, + ReadBitstreamToTreeParams& args, + EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { + + int bytesRead = 0; + const unsigned char* dataAt = data; + + READ_ENTITY_PROPERTY(PROP_COLOR, rgbColor, setColor); + READ_ENTITY_PROPERTY(PROP_LINE_WIDTH, float, setLineWidth); + READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector, setLinePoints); + + + return bytesRead; +} + + +// TODO: eventually only include properties changed since the params.lastViewFrustumSent time +EntityPropertyFlags QuadEntityItem::getEntityProperties(EncodeBitstreamParams& params) const { + EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params); + requestedProperties += PROP_COLOR; + requestedProperties += PROP_LINE_WIDTH; + requestedProperties += PROP_LINE_POINTS; + return requestedProperties; +} + +void QuadEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, + EntityTreeElementExtraEncodeData* modelTreeElementExtraEncodeData, + EntityPropertyFlags& requestedProperties, + EntityPropertyFlags& propertyFlags, + EntityPropertyFlags& propertiesDidntFit, + int& propertyCount, + OctreeElement::AppendState& appendState) const { + + bool successPropertyFits = true; + + APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor()); + APPEND_ENTITY_PROPERTY(PROP_LINE_WIDTH, getLineWidth()); + APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, getLinePoints()); +} + +void QuadEntityItem::debugDump() const { + quint64 now = usecTimestampNow(); + qCDebug(entities) << " QUAD EntityItem id:" << getEntityItemID() << "---------------------------------------------"; + qCDebug(entities) << " color:" << _color[0] << "," << _color[1] << "," << _color[2]; + qCDebug(entities) << " position:" << debugTreeVector(getPosition()); + qCDebug(entities) << " dimensions:" << debugTreeVector(getDimensions()); + qCDebug(entities) << " getLastEdited:" << debugTime(getLastEdited(), now); +} + diff --git a/libraries/entities/src/QuadEntityItem.h b/libraries/entities/src/QuadEntityItem.h index 64f733d6b5..2e52811463 100644 --- a/libraries/entities/src/QuadEntityItem.h +++ b/libraries/entities/src/QuadEntityItem.h @@ -1,14 +1,81 @@ // // QuadEntityItem.h -// hifi +// libraries/entities/src // -// Created by eric levin on 6/22/15. +// Created by Seth Alves on 5/11/15. +// Copyright 2015 High Fidelity, Inc. // +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#ifndef __hifi__QuadEntityItem__ -#define __hifi__QuadEntityItem__ +#ifndef hifi_QuadEntityItem_h +#define hifi_QuadEntityItem_h -#include +#include "EntityItem.h" -#endif /* defined(__hifi__QuadEntityItem__) */ +class QuadEntityItem : public EntityItem { + public: + static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); + + QuadEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties); + + ALLOW_INSTANTIATION // This class can be instantiated + + // methods for getting/setting all properties of an entity + virtual EntityItemProperties getProperties() const; + virtual bool setProperties(const EntityItemProperties& properties); + + // TODO: eventually only include properties changed since the params.lastViewFrustumSent time + virtual EntityPropertyFlags getEntityProperties(EncodeBitstreamParams& params) const; + + virtual void appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, + EntityTreeElementExtraEncodeData* modelTreeElementExtraEncodeData, + EntityPropertyFlags& requestedProperties, + EntityPropertyFlags& propertyFlags, + EntityPropertyFlags& propertiesDidntFit, + int& propertyCount, + OctreeElement::AppendState& appendState) const; + + virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, + ReadBitstreamToTreeParams& args, + EntityPropertyFlags& propertyFlags, bool overwriteLocalData); + + const rgbColor& getColor() const { return _color; } + xColor getXColor() const { xColor color = { _color[RED_INDEX], _color[GREEN_INDEX], _color[BLUE_INDEX] }; return color; } + + void setColor(const rgbColor& value) { memcpy(_color, value, sizeof(_color)); } + void setColor(const xColor& value) { + _color[RED_INDEX] = value.red; + _color[GREEN_INDEX] = value.green; + _color[BLUE_INDEX] = value.blue; + } + + void setLineWidth(float lineWidth){ _lineWidth = lineWidth; } + float getLineWidth() const{ return _lineWidth; } + + bool setLinePoints(const QVector& points); + bool appendPoint(const glm::vec3& point); + + const QVector& getLinePoints() const{ return _points; } + + virtual ShapeType getShapeType() const { return SHAPE_TYPE_LINE; } + + // never have a ray intersection pick a QuadEntityItem. + virtual bool supportsDetailedRayIntersection() const { return true; } + virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, + bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, + void** intersectedObject, bool precisionPicking) const { return false; } + + virtual void debugDump() const; + static const float DEFAULT_LINE_WIDTH; + static const int MAX_POINTS_PER_LINE; + + protected: + rgbColor _color; + float _lineWidth; + bool _pointsChanged; + QVector _points; +}; + +#endif // hifi_QuadEntityItem_h From 9dc6846ebad12fd58817c63bb275afd254f4cfd0 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Mon, 22 Jun 2015 15:12:35 -0700 Subject: [PATCH 02/61] rendering wad entity --- .../src/EntityTreeRenderer.cpp | 2 + .../src/RenderableQuadEntityItem.cpp | 58 ++++++++++++ .../src/RenderableQuadEntityItem.h | 40 ++++++++ .../entities/src/EntityScriptingInterface.cpp | 93 ++++++++++++++----- .../entities/src/EntityScriptingInterface.h | 4 +- libraries/entities/src/QuadEntityItem.cpp | 4 +- 6 files changed, 178 insertions(+), 23 deletions(-) create mode 100644 libraries/entities-renderer/src/RenderableQuadEntityItem.cpp create mode 100644 libraries/entities-renderer/src/RenderableQuadEntityItem.h diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index e1bd01547e..a981e54259 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -46,6 +46,7 @@ #include "RenderableZoneEntityItem.h" #include "RenderableLineEntityItem.h" #include "RenderablePolyVoxEntityItem.h" +#include "RenderableQuadEntityItem.h" #include "EntitiesRendererLogging.h" #include "DependencyManager.h" @@ -76,6 +77,7 @@ EntityTreeRenderer::EntityTreeRenderer(bool wantScripts, AbstractViewStateInterf REGISTER_ENTITY_TYPE_WITH_FACTORY(Zone, RenderableZoneEntityItem::factory) REGISTER_ENTITY_TYPE_WITH_FACTORY(Line, RenderableLineEntityItem::factory) REGISTER_ENTITY_TYPE_WITH_FACTORY(PolyVox, RenderablePolyVoxEntityItem::factory) + REGISTER_ENTITY_TYPE_WITH_FACTORY(Quad, RenderableQuadEntityItem::factory) _currentHoverOverEntityID = UNKNOWN_ENTITY_ID; _currentClickingOnEntityID = UNKNOWN_ENTITY_ID; diff --git a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp new file mode 100644 index 0000000000..904b7a9d22 --- /dev/null +++ b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp @@ -0,0 +1,58 @@ +// +// RenderableQuadEntityItem.cpp +// libraries/entities-renderer/src/ +// +// Created by Eric Levin on 6/22/15 +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include + +#include +#include +#include + +#include +#include + +#include "RenderableQuadEntityItem.h" + +EntityItemPointer RenderableQuadEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { + return EntityItemPointer(new RenderableQuadEntityItem(entityID, properties)); +} + +void RenderableQuadEntityItem::updateGeometry() { + auto geometryCache = DependencyManager::get(); + if (_lineVerticesID == GeometryCache::UNKNOWN_ID) { + _lineVerticesID = geometryCache ->allocateID(); + } + if (_pointsChanged) { + glm::vec4 lineColor(toGlm(getXColor()), getLocalRenderAlpha()); + geometryCache->updateVertices(_lineVerticesID, getLinePoints(), lineColor); + _pointsChanged = false; + } +} + +void RenderableQuadEntityItem::render(RenderArgs* args) { + PerformanceTimer perfTimer("RenderableQuadEntityItem::render"); + Q_ASSERT(getType() == EntityTypes::Quad); + updateGeometry(); + + Q_ASSERT(args->_batch); + gpu::Batch& batch = *args->_batch; + Transform transform = Transform(); + transform.setTranslation(getPosition()); + batch.setModelTransform(transform); + + batch._glLineWidth(getLineWidth()); + if (getLinePoints().size() > 1) { + DependencyManager::get()->bindSimpleProgram(batch); + DependencyManager::get()->renderVertices(batch, gpu::LINE_STRIP, _lineVerticesID); + } + batch._glLineWidth(1.0f); + + RenderableDebugableEntityItem::render(this, args); +}; diff --git a/libraries/entities-renderer/src/RenderableQuadEntityItem.h b/libraries/entities-renderer/src/RenderableQuadEntityItem.h new file mode 100644 index 0000000000..2d5d3f8282 --- /dev/null +++ b/libraries/entities-renderer/src/RenderableQuadEntityItem.h @@ -0,0 +1,40 @@ +// +// RenderableLineEntityItem.h +// libraries/entities-renderer/src/ +// +// Created by Seth Alves on 5/11/15. +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_RenderableQuadEntityItem_h +#define hifi_RenderableQuadEntityItem_h + +#include +#include "RenderableDebugableEntityItem.h" +#include "RenderableEntityItem.h" +#include + +class RenderableQuadEntityItem : public QuadEntityItem { +public: + static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); + + RenderableQuadEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : + QuadEntityItem(entityItemID, properties), + _lineVerticesID(GeometryCache::UNKNOWN_ID) + { } + + virtual void render(RenderArgs* args); + + SIMPLE_RENDERABLE(); + +protected: + void updateGeometry(); + + int _lineVerticesID; +}; + + +#endif // hifi_RenderableQuadEntityItem_h diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index c9f7378bc8..f01620d4d8 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -442,22 +442,11 @@ bool EntityScriptingInterface::setVoxels(QUuid entityID, return true; } -bool EntityScriptingInterface::setPoints(QUuid entityID, std::function actor) { +bool EntityScriptingInterface::setPoints(EntityItemPointer entity, std::function actor) { if (!_entityTree) { return false; } - EntityItemPointer entity = static_cast(_entityTree->findEntityByEntityItemID(entityID)); - if (!entity) { - qCDebug(entities) << "EntityScriptingInterface::setPoints no entity with ID" << entityID; - } - - EntityTypes::EntityType entityType = entity->getType(); - - if (entityType != EntityTypes::Line) { - return false; - } - auto now = usecTimestampNow(); LineEntityItem* lineEntity = static_cast(entity.get()); @@ -475,7 +464,33 @@ bool EntityScriptingInterface::setPoints(QUuid entityID, std::functiongetID(), properties); + return success; +} + +bool EntityScriptingInterface::setPoints(EntityItemPointer entity, std::function actor) { + if (!_entityTree) { + return false; + } + + auto now = usecTimestampNow(); + + QuadEntityItem* quadEntity = static_cast(entity.get()); + _entityTree->lockForWrite(); + bool success = actor(*quadEntity); + entity->setLastEdited(now); + entity->setLastBroadcast(now); + _entityTree->unlock(); + + _entityTree->lockForRead(); + EntityItemProperties properties = entity->getProperties(); + _entityTree->unlock(); + + properties.setLinePointsDirty(); + properties.setLastEdited(now); + + + queueEntityMessage(PacketTypeEntityEdit, entity->getID(), properties); return success; } @@ -498,17 +513,53 @@ bool EntityScriptingInterface::setAllVoxels(QUuid entityID, int value) { } bool EntityScriptingInterface::setAllPoints(QUuid entityID, const QVector& points) { - return setPoints(entityID, [points](LineEntityItem& lineEntity) -> bool - { - return lineEntity.setLinePoints(points); - }); + EntityItemPointer entity = static_cast(_entityTree->findEntityByEntityItemID(entityID)); + if (!entity) { + qCDebug(entities) << "EntityScriptingInterface::setPoints no entity with ID" << entityID; + } + + EntityTypes::EntityType entityType = entity->getType(); + + if (entityType == EntityTypes::Line) { + return setPoints(entity, [points](LineEntityItem& lineEntity) -> bool + { + return lineEntity.setLinePoints(points); + }); + } + + if (entityType == EntityTypes::Quad) { + return setPoints(entity, [points](QuadEntityItem& quadEntity) -> bool + { + return quadEntity.setLinePoints(points); + }); + } + + return false; } bool EntityScriptingInterface::appendPoint(QUuid entityID, const glm::vec3& point) { - return setPoints(entityID, [point](LineEntityItem& lineEntity) -> bool - { - return lineEntity.appendPoint(point); - }); + EntityItemPointer entity = static_cast(_entityTree->findEntityByEntityItemID(entityID)); + if (!entity) { + qCDebug(entities) << "EntityScriptingInterface::setPoints no entity with ID" << entityID; + } + + EntityTypes::EntityType entityType = entity->getType(); + + if (entityType == EntityTypes::Line) { + return setPoints(entity, [point](LineEntityItem& lineEntity) -> bool + { + return lineEntity.appendPoint(point); + }); + } + + if (entityType == EntityTypes::Quad) { + return setPoints(entity, [point](QuadEntityItem& quadEntity) -> bool + { + return quadEntity.appendPoint(point); + }); + } + + return false; } diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 12c8688816..64388f1aa9 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -23,6 +23,7 @@ #include #include "PolyVoxEntityItem.h" #include "LineEntityItem.h" +#include "QuadEntityItem.h" #include "EntityEditPacketSender.h" @@ -161,7 +162,8 @@ signals: private: bool actionWorker(const QUuid& entityID, std::function actor); bool setVoxels(QUuid entityID, std::function actor); - bool setPoints(QUuid entityID, std::function actor); + bool setPoints(EntityItemPointer entity, std::function actor); + bool setPoints(EntityItemPointer entity, std::function actor); void queueEntityMessage(PacketType packetType, EntityItemID entityID, const EntityItemProperties& properties); /// actually does the work of finding the ray intersection, can be called in locking mode or tryLock mode diff --git a/libraries/entities/src/QuadEntityItem.cpp b/libraries/entities/src/QuadEntityItem.cpp index a72251efb1..a0a0fd688f 100644 --- a/libraries/entities/src/QuadEntityItem.cpp +++ b/libraries/entities/src/QuadEntityItem.cpp @@ -37,7 +37,7 @@ _lineWidth(DEFAULT_LINE_WIDTH), _pointsChanged(true), _points(QVector(0)) { - _type = EntityTypes::Line; + _type = EntityTypes::Quad; _created = properties.getCreated(); setProperties(properties); @@ -97,6 +97,7 @@ bool QuadEntityItem::appendPoint(const glm::vec3& point) { return false; } _points << point; + qDebug()<<"points: " << point; _pointsChanged = true; return true; } @@ -115,6 +116,7 @@ bool QuadEntityItem::setLinePoints(const QVector& points) { } } + _points = points; _pointsChanged = true; return true; From 32eade9eadcf006cd7162175779e8be993101603 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Mon, 22 Jun 2015 16:15:29 -0700 Subject: [PATCH 03/61] adding normals --- examples/paint.js | 2 +- libraries/entities-renderer/src/RenderableLineEntityItem.cpp | 2 +- libraries/entities/src/QuadEntityItem.cpp | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/examples/paint.js b/examples/paint.js index 20196601df..31ffd02506 100644 --- a/examples/paint.js +++ b/examples/paint.js @@ -11,7 +11,7 @@ // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -var LINE_DIMENSIONS = 1; +var LINE_DIMENSIONS = 5; var LIFETIME = 6000; var colorPalette = [{ diff --git a/libraries/entities-renderer/src/RenderableLineEntityItem.cpp b/libraries/entities-renderer/src/RenderableLineEntityItem.cpp index 4b94992d59..5c6f0b0d34 100644 --- a/libraries/entities-renderer/src/RenderableLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableLineEntityItem.cpp @@ -39,7 +39,7 @@ void RenderableLineEntityItem::updateGeometry() { void RenderableLineEntityItem::render(RenderArgs* args) { PerformanceTimer perfTimer("RenderableLineEntityItem::render"); Q_ASSERT(getType() == EntityTypes::Line); - updateGeometry(); + updateGeometry();  Q_ASSERT(args->_batch); gpu::Batch& batch = *args->_batch; diff --git a/libraries/entities/src/QuadEntityItem.cpp b/libraries/entities/src/QuadEntityItem.cpp index a0a0fd688f..5b01ec8594 100644 --- a/libraries/entities/src/QuadEntityItem.cpp +++ b/libraries/entities/src/QuadEntityItem.cpp @@ -97,7 +97,6 @@ bool QuadEntityItem::appendPoint(const glm::vec3& point) { return false; } _points << point; - qDebug()<<"points: " << point; _pointsChanged = true; return true; } From 101400809a3c72b2736fbb8d9be032f56ae35e46 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Tue, 23 Jun 2015 16:20:29 -0700 Subject: [PATCH 04/61] quads painting --- .../src/RenderableLineEntityItem.cpp | 2 +- .../src/RenderableQuadEntityItem.cpp | 6 ++-- libraries/entities/src/QuadEntityItem.cpp | 32 ++++++++++++++++--- libraries/entities/src/QuadEntityItem.h | 4 +++ 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableLineEntityItem.cpp b/libraries/entities-renderer/src/RenderableLineEntityItem.cpp index 5c6f0b0d34..4b94992d59 100644 --- a/libraries/entities-renderer/src/RenderableLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableLineEntityItem.cpp @@ -39,7 +39,7 @@ void RenderableLineEntityItem::updateGeometry() { void RenderableLineEntityItem::render(RenderArgs* args) { PerformanceTimer perfTimer("RenderableLineEntityItem::render"); Q_ASSERT(getType() == EntityTypes::Line); - updateGeometry();  + updateGeometry(); Q_ASSERT(args->_batch); gpu::Batch& batch = *args->_batch; diff --git a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp index 904b7a9d22..f5c853886c 100644 --- a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp @@ -31,7 +31,7 @@ void RenderableQuadEntityItem::updateGeometry() { } if (_pointsChanged) { glm::vec4 lineColor(toGlm(getXColor()), getLocalRenderAlpha()); - geometryCache->updateVertices(_lineVerticesID, getLinePoints(), lineColor); + geometryCache->updateVertices(_lineVerticesID, getQuadVertices(), lineColor); _pointsChanged = false; } } @@ -48,9 +48,9 @@ void RenderableQuadEntityItem::render(RenderArgs* args) { batch.setModelTransform(transform); batch._glLineWidth(getLineWidth()); - if (getLinePoints().size() > 1) { + if (getLinePoints().size() > 3) { DependencyManager::get()->bindSimpleProgram(batch); - DependencyManager::get()->renderVertices(batch, gpu::LINE_STRIP, _lineVerticesID); + DependencyManager::get()->renderVertices(batch, gpu::QUAD_STRIP, _lineVerticesID); } batch._glLineWidth(1.0f); diff --git a/libraries/entities/src/QuadEntityItem.cpp b/libraries/entities/src/QuadEntityItem.cpp index 5b01ec8594..d2f9276bb4 100644 --- a/libraries/entities/src/QuadEntityItem.cpp +++ b/libraries/entities/src/QuadEntityItem.cpp @@ -22,7 +22,7 @@ -const float QuadEntityItem::DEFAULT_LINE_WIDTH = 2.0f; +const float QuadEntityItem::DEFAULT_LINE_WIDTH = 0.1f; const int QuadEntityItem::MAX_POINTS_PER_LINE = 70; @@ -35,7 +35,8 @@ QuadEntityItem::QuadEntityItem(const EntityItemID& entityItemID, const EntityIte EntityItem(entityItemID) , _lineWidth(DEFAULT_LINE_WIDTH), _pointsChanged(true), -_points(QVector(0)) +_points(QVector(0)), +_quadVertices(QVector(0)) { _type = EntityTypes::Quad; _created = properties.getCreated(); @@ -105,6 +106,20 @@ bool QuadEntityItem::setLinePoints(const QVector& points) { if (points.size() > MAX_POINTS_PER_LINE) { return false; } + //Check to see if points actually changed. If they haven't, return before doing anything else + if (points.size() == _points.size()) { + //same number of points, so now compare every point + for (int i = 0; i < points.size(); i++ ) { + if (points.at(i) != _points.at(i)){ + _pointsChanged = true; + break; + } + } + } + if (!_pointsChanged) { + return false; + } + for (int i = 0; i < points.size(); i++) { glm::vec3 point = points.at(i); glm::vec3 pos = getPosition(); @@ -115,9 +130,18 @@ bool QuadEntityItem::setLinePoints(const QVector& points) { } } - _points = points; - _pointsChanged = true; + //All our points are valid and at least one point has changed, now create quads from points + _quadVertices.clear(); + for (int i = 0; i < points.size(); i++) { + glm::vec3 point = points.at(i); + + glm::vec3 p1 = glm::vec3(point.x - _lineWidth, point.y - _lineWidth, point.z); + glm::vec3 p2 = glm::vec3(point.x + _lineWidth, point.y - _lineWidth, point.z); + glm::vec3 p3 = glm::vec3(point.x + _lineWidth, point.y + _lineWidth, point.z); + glm::vec3 p4 = glm::vec3(point.x - _lineWidth, point.y + _lineWidth, point.z); + _quadVertices << p1 << p2 << p3 << p4; + } return true; } diff --git a/libraries/entities/src/QuadEntityItem.h b/libraries/entities/src/QuadEntityItem.h index 2e52811463..045b297785 100644 --- a/libraries/entities/src/QuadEntityItem.h +++ b/libraries/entities/src/QuadEntityItem.h @@ -57,6 +57,9 @@ class QuadEntityItem : public EntityItem { bool setLinePoints(const QVector& points); bool appendPoint(const glm::vec3& point); + const QVector& getQuadVertices() const{ return _quadVertices; } + + const QVector& getLinePoints() const{ return _points; } virtual ShapeType getShapeType() const { return SHAPE_TYPE_LINE; } @@ -76,6 +79,7 @@ class QuadEntityItem : public EntityItem { float _lineWidth; bool _pointsChanged; QVector _points; + QVector _quadVertices; }; #endif // hifi_QuadEntityItem_h From 2c395b8fb43a87c8039bbc882fe0da247a830693 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Tue, 23 Jun 2015 18:22:31 -0700 Subject: [PATCH 05/61] changed winding order to allow quad from triangle strip --- .../entities-renderer/src/RenderableQuadEntityItem.cpp | 10 ++++------ libraries/entities/src/QuadEntityItem.cpp | 8 +++++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp index f5c853886c..6ab6054a86 100644 --- a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp @@ -47,12 +47,10 @@ void RenderableQuadEntityItem::render(RenderArgs* args) { transform.setTranslation(getPosition()); batch.setModelTransform(transform); - batch._glLineWidth(getLineWidth()); - if (getLinePoints().size() > 3) { - DependencyManager::get()->bindSimpleProgram(batch); - DependencyManager::get()->renderVertices(batch, gpu::QUAD_STRIP, _lineVerticesID); - } - batch._glLineWidth(1.0f); + + DependencyManager::get()->bindSimpleProgram(batch); + DependencyManager::get()->renderVertices(batch, gpu::TRIANGLE_STRIP, _lineVerticesID); + RenderableDebugableEntityItem::render(this, args); }; diff --git a/libraries/entities/src/QuadEntityItem.cpp b/libraries/entities/src/QuadEntityItem.cpp index d2f9276bb4..32aba03985 100644 --- a/libraries/entities/src/QuadEntityItem.cpp +++ b/libraries/entities/src/QuadEntityItem.cpp @@ -137,10 +137,12 @@ bool QuadEntityItem::setLinePoints(const QVector& points) { glm::vec3 point = points.at(i); glm::vec3 p1 = glm::vec3(point.x - _lineWidth, point.y - _lineWidth, point.z); - glm::vec3 p2 = glm::vec3(point.x + _lineWidth, point.y - _lineWidth, point.z); - glm::vec3 p3 = glm::vec3(point.x + _lineWidth, point.y + _lineWidth, point.z); - glm::vec3 p4 = glm::vec3(point.x - _lineWidth, point.y + _lineWidth, point.z); + glm::vec3 p2 = glm::vec3(point.x - _lineWidth, point.y + _lineWidth, point.z); + glm::vec3 p3 = glm::vec3(point.x + _lineWidth, point.y - _lineWidth, point.z); + glm::vec3 p4 = glm::vec3(point.x + _lineWidth, point.y + _lineWidth, point.z); _quadVertices << p1 << p2 << p3 << p4; + + } return true; } From c6baca35b9dc2781c6acdbd979e828fb7fd9a06e Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Thu, 25 Jun 2015 09:30:32 -0700 Subject: [PATCH 06/61] points being updated at correct time; --- .../src/RenderableQuadEntityItem.cpp | 39 +++++++++++++++---- .../src/RenderableQuadEntityItem.h | 11 +++--- libraries/entities/src/QuadEntityItem.cpp | 16 +++++--- 3 files changed, 47 insertions(+), 19 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp index 6ab6054a86..67ea11fda9 100644 --- a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp @@ -12,7 +12,6 @@ #include #include -#include #include #include @@ -20,28 +19,49 @@ #include "RenderableQuadEntityItem.h" + EntityItemPointer RenderableQuadEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { return EntityItemPointer(new RenderableQuadEntityItem(entityID, properties)); } +RenderableQuadEntityItem::RenderableQuadEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : +QuadEntityItem(entityItemID, properties) { + _format.reset(new gpu::Stream::Format()); + _format->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), 0); + _numVertices = 0; +} + + void RenderableQuadEntityItem::updateGeometry() { - auto geometryCache = DependencyManager::get(); - if (_lineVerticesID == GeometryCache::UNKNOWN_ID) { - _lineVerticesID = geometryCache ->allocateID(); + if(_quadVertices.size() < 4) { + return; } +// qDebug() << "num points: " << _points.size(); +// qDebug() << "num quad vertices" << _quadVertices.size(); if (_pointsChanged) { - glm::vec4 lineColor(toGlm(getXColor()), getLocalRenderAlpha()); - geometryCache->updateVertices(_lineVerticesID, getQuadVertices(), lineColor); + _verticesBuffer.reset(new gpu::Buffer()); + _numVertices = 0; + for (int i = 0; i < _quadVertices.size(); i+=4) { + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(i)); + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(i + 1)); + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(i + 2)); + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(i + 3)); + _numVertices += 4; + } _pointsChanged = false; } } void RenderableQuadEntityItem::render(RenderArgs* args) { + if (_quadVertices.size() < 4 ) { + return; + } PerformanceTimer perfTimer("RenderableQuadEntityItem::render"); Q_ASSERT(getType() == EntityTypes::Quad); - updateGeometry(); Q_ASSERT(args->_batch); + updateGeometry(); + gpu::Batch& batch = *args->_batch; Transform transform = Transform(); transform.setTranslation(getPosition()); @@ -49,7 +69,10 @@ void RenderableQuadEntityItem::render(RenderArgs* args) { DependencyManager::get()->bindSimpleProgram(batch); - DependencyManager::get()->renderVertices(batch, gpu::TRIANGLE_STRIP, _lineVerticesID); + batch.setInputFormat(_format); + batch.setInputBuffer(0, _verticesBuffer, 0, _format->getChannels().at(0)._stride); + batch.draw(gpu::TRIANGLE_STRIP, _numVertices, 0); + RenderableDebugableEntityItem::render(this, args); diff --git a/libraries/entities-renderer/src/RenderableQuadEntityItem.h b/libraries/entities-renderer/src/RenderableQuadEntityItem.h index 2d5d3f8282..733de44fd4 100644 --- a/libraries/entities-renderer/src/RenderableQuadEntityItem.h +++ b/libraries/entities-renderer/src/RenderableQuadEntityItem.h @@ -12,6 +12,7 @@ #ifndef hifi_RenderableQuadEntityItem_h #define hifi_RenderableQuadEntityItem_h +#include #include #include "RenderableDebugableEntityItem.h" #include "RenderableEntityItem.h" @@ -21,10 +22,7 @@ class RenderableQuadEntityItem : public QuadEntityItem { public: static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); - RenderableQuadEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : - QuadEntityItem(entityItemID, properties), - _lineVerticesID(GeometryCache::UNKNOWN_ID) - { } + RenderableQuadEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties); virtual void render(RenderArgs* args); @@ -32,8 +30,9 @@ public: protected: void updateGeometry(); - - int _lineVerticesID; + gpu::Stream::FormatPointer _format; + gpu::BufferPointer _verticesBuffer; + unsigned int _numVertices; }; diff --git a/libraries/entities/src/QuadEntityItem.cpp b/libraries/entities/src/QuadEntityItem.cpp index 32aba03985..2b964606f8 100644 --- a/libraries/entities/src/QuadEntityItem.cpp +++ b/libraries/entities/src/QuadEntityItem.cpp @@ -106,8 +106,11 @@ bool QuadEntityItem::setLinePoints(const QVector& points) { if (points.size() > MAX_POINTS_PER_LINE) { return false; } + if (points.size() != _points.size()) { + _pointsChanged = true; + } //Check to see if points actually changed. If they haven't, return before doing anything else - if (points.size() == _points.size()) { + else if (points.size() == _points.size()) { //same number of points, so now compare every point for (int i = 0; i < points.size(); i++ ) { if (points.at(i) != _points.at(i)){ @@ -119,6 +122,8 @@ bool QuadEntityItem::setLinePoints(const QVector& points) { if (!_pointsChanged) { return false; } + + qDebug() << "POINTS CHANGED"; for (int i = 0; i < points.size(); i++) { glm::vec3 point = points.at(i); @@ -136,10 +141,11 @@ bool QuadEntityItem::setLinePoints(const QVector& points) { for (int i = 0; i < points.size(); i++) { glm::vec3 point = points.at(i); - glm::vec3 p1 = glm::vec3(point.x - _lineWidth, point.y - _lineWidth, point.z); - glm::vec3 p2 = glm::vec3(point.x - _lineWidth, point.y + _lineWidth, point.z); - glm::vec3 p3 = glm::vec3(point.x + _lineWidth, point.y - _lineWidth, point.z); - glm::vec3 p4 = glm::vec3(point.x + _lineWidth, point.y + _lineWidth, point.z); + glm::vec3 p1 = glm::vec3(point.x - _lineWidth, point.y + _lineWidth, point.z); + glm::vec3 p2 = glm::vec3(point.x - _lineWidth, point.y - _lineWidth, point.z); + glm::vec3 p3 = glm::vec3(point.x + _lineWidth, point.y + _lineWidth, point.z); + glm::vec3 p4 = glm::vec3(point.x + _lineWidth, point.y - _lineWidth, point.z); + _quadVertices << p1 << p2 << p3 << p4; From e6f9d49eb74b8a5fdbe4554fadf98679c2ee275d Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Thu, 25 Jun 2015 11:56:51 -0700 Subject: [PATCH 07/61] just adding one triangle per point now --- .../src/RenderableQuadEntityItem.cpp | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp index 67ea11fda9..f2faf6ee05 100644 --- a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp @@ -33,20 +33,30 @@ QuadEntityItem(entityItemID, properties) { void RenderableQuadEntityItem::updateGeometry() { - if(_quadVertices.size() < 4) { + if(_quadVertices.size() < 1) { return; } // qDebug() << "num points: " << _points.size(); // qDebug() << "num quad vertices" << _quadVertices.size(); if (_pointsChanged) { - _verticesBuffer.reset(new gpu::Buffer()); _numVertices = 0; - for (int i = 0; i < _quadVertices.size(); i+=4) { - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(i)); - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(i + 1)); - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(i + 2)); - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(i + 3)); - _numVertices += 4; + _verticesBuffer.reset(new gpu::Buffer()); + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(0)); + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(1)); + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(2)); + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(3)); + _numVertices = 4; + glm::vec3 point, v1; + for (int i = 1; i < _points.size(); i++) { + point = _points.at(i); + if(i % 2 == 0) { + v1 = {point.x - _lineWidth, point.y, point.z}; + } else { + v1 = {point.x + _lineWidth, point.y, point.z}; + } + + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&v1); + _numVertices ++; } _pointsChanged = false; } From 0a7c787109c064a36a87f482669b776840fec86e Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Fri, 26 Jun 2015 13:44:54 -0700 Subject: [PATCH 08/61] created a custom pipeline that is a static class variable for renderable quad entity item --- interface/src/Application.cpp | 2 +- .../src/RenderableQuadEntityItem.cpp | 36 ++++++++++++++++--- .../src/RenderableQuadEntityItem.h | 4 ++- .../src/DeferredLightingEffect.cpp | 16 +++++++++ .../render-utils/src/DeferredLightingEffect.h | 4 +++ 5 files changed, 56 insertions(+), 6 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 9e29791a05..e974a06f02 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -797,7 +797,7 @@ void Application::initializeGL() { init(); qCDebug(interfaceapp, "init() complete."); - // create thread for parsing of octee data independent of the main network and rendering threads + // create thread for parsing of octree data independent of the main network and rendering threads _octreeProcessor.initialize(_enableProcessOctreeThread); connect(&_octreeProcessor, &OctreePacketProcessor::packetVersionMismatch, this, &Application::notifyPacketVersionMismatch); _entityEditSender.initialize(_enableProcessOctreeThread); diff --git a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp index f2faf6ee05..ca6c968c71 100644 --- a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp @@ -20,6 +20,9 @@ #include "RenderableQuadEntityItem.h" + + + EntityItemPointer RenderableQuadEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { return EntityItemPointer(new RenderableQuadEntityItem(entityID, properties)); } @@ -29,6 +32,27 @@ QuadEntityItem(entityItemID, properties) { _format.reset(new gpu::Stream::Format()); _format->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), 0); _numVertices = 0; + + +} + +gpu::PipelinePointer RenderableQuadEntityItem::_pipeline; + +void RenderableQuadEntityItem::createPipeline() { + auto VS = DependencyManager::get()->getSimpleVertexShader(); + auto PS = DependencyManager::get()->getSimplePixelShader(); + gpu::ShaderPointer program = gpu::ShaderPointer(gpu::Shader::createProgram(VS, PS)); + + gpu::Shader::BindingSet slotBindings; + gpu::Shader::makeProgram(*program, slotBindings); + + gpu::StatePointer state = gpu::StatePointer(new gpu::State()); + //state->setCullMode(gpu::State::CULL_BACK); + state->setDepthTest(true, true, gpu::LESS_EQUAL); + state->setBlendFunction(false, + gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, + gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); + _pipeline = gpu::PipelinePointer(gpu::Pipeline::create(program, state)); } @@ -66,6 +90,11 @@ void RenderableQuadEntityItem::render(RenderArgs* args) { if (_quadVertices.size() < 4 ) { return; } + if (!_pipeline) { + createPipeline(); + } + + PerformanceTimer perfTimer("RenderableQuadEntityItem::render"); Q_ASSERT(getType() == EntityTypes::Quad); @@ -76,14 +105,13 @@ void RenderableQuadEntityItem::render(RenderArgs* args) { Transform transform = Transform(); transform.setTranslation(getPosition()); batch.setModelTransform(transform); - - DependencyManager::get()->bindSimpleProgram(batch); + batch.setPipeline(_pipeline); + batch.setInputFormat(_format); batch.setInputBuffer(0, _verticesBuffer, 0, _format->getChannels().at(0)._stride); - batch.draw(gpu::TRIANGLE_STRIP, _numVertices, 0); - + batch.draw(gpu::TRIANGLE_STRIP, _numVertices, 0); RenderableDebugableEntityItem::render(this, args); }; diff --git a/libraries/entities-renderer/src/RenderableQuadEntityItem.h b/libraries/entities-renderer/src/RenderableQuadEntityItem.h index 733de44fd4..36354d45c8 100644 --- a/libraries/entities-renderer/src/RenderableQuadEntityItem.h +++ b/libraries/entities-renderer/src/RenderableQuadEntityItem.h @@ -21,13 +21,15 @@ class RenderableQuadEntityItem : public QuadEntityItem { public: static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); - + static void createPipeline(); RenderableQuadEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties); virtual void render(RenderArgs* args); SIMPLE_RENDERABLE(); + static gpu::PipelinePointer _pipeline; + protected: void updateGeometry(); gpu::Stream::FormatPointer _format; diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index f0a52af086..56c80f8958 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -116,6 +116,22 @@ void DeferredLightingEffect::bindSimpleProgram(gpu::Batch& batch, bool textured) } } +gpu::ShaderPointer DeferredLightingEffect::getSimpleVertexShader() const { + if (_simpleProgram) { + return _simpleProgram->getProgram()->getShaders()[gpu::Shader::VERTEX]; + } else { + return gpu::ShaderPointer(); + } +} + +gpu::ShaderPointer DeferredLightingEffect::getSimplePixelShader() const { + if (_simpleProgram) { + return _simpleProgram->getProgram()->getShaders()[gpu::Shader::PIXEL]; + } else { + return gpu::ShaderPointer(); + } +} + void DeferredLightingEffect::releaseSimpleProgram(gpu::Batch& batch) { // DependencyManager::get()->setPrimaryDrawBuffers(batch, true, false, false); } diff --git a/libraries/render-utils/src/DeferredLightingEffect.h b/libraries/render-utils/src/DeferredLightingEffect.h index bd7fcb286b..386bbd3cd7 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.h +++ b/libraries/render-utils/src/DeferredLightingEffect.h @@ -78,6 +78,10 @@ public: void setGlobalAtmosphere(const model::AtmospherePointer& atmosphere) { _atmosphere = atmosphere; } void setGlobalSkybox(const model::SkyboxPointer& skybox); + + gpu::ShaderPointer getSimpleVertexShader() const; + gpu::ShaderPointer getSimplePixelShader() const; + private: DeferredLightingEffect() {} virtual ~DeferredLightingEffect() { } From 994f050581c4614b89eec63a8cf73c8d3d8fdc41 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Fri, 26 Jun 2015 15:15:28 -0700 Subject: [PATCH 09/61] can now have colors in buffer --- .../src/RenderableQuadEntityItem.cpp | 24 ++++++++++++------- .../src/RenderableQuadEntityItem.h | 2 +- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp index ca6c968c71..0caca8f4b2 100644 --- a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp @@ -29,16 +29,19 @@ EntityItemPointer RenderableQuadEntityItem::factory(const EntityItemID& entityID RenderableQuadEntityItem::RenderableQuadEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : QuadEntityItem(entityItemID, properties) { - _format.reset(new gpu::Stream::Format()); - _format->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), 0); _numVertices = 0; - } gpu::PipelinePointer RenderableQuadEntityItem::_pipeline; +gpu::Stream::FormatPointer RenderableQuadEntityItem::_format; void RenderableQuadEntityItem::createPipeline() { + static const int COLOR_OFFSET = 12; + _format.reset(new gpu::Stream::Format()); + _format->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), 0); + _format->setAttribute(gpu::Stream::COLOR, 0, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA), COLOR_OFFSET); + auto VS = DependencyManager::get()->getSimpleVertexShader(); auto PS = DependencyManager::get()->getSimplePixelShader(); gpu::ShaderPointer program = gpu::ShaderPointer(gpu::Shader::createProgram(VS, PS)); @@ -62,14 +65,18 @@ void RenderableQuadEntityItem::updateGeometry() { } // qDebug() << "num points: " << _points.size(); // qDebug() << "num quad vertices" << _quadVertices.size(); + int compactColor = ((int(.7 * 255.0f) & 0xFF)) | + ((int(0.1 * 255.0f) & 0xFF) << 8) | + ((int(0.9 * 255.0f) & 0xFF) << 16) | + ((int(1.0 * 255.0f) & 0xFF) << 24); if (_pointsChanged) { _numVertices = 0; _verticesBuffer.reset(new gpu::Buffer()); - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(0)); - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(1)); - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(2)); - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(3)); - _numVertices = 4; +// _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(0)); +// _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(1)); +// _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(2)); +// _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(3)); +// _numVertices = 4; glm::vec3 point, v1; for (int i = 1; i < _points.size(); i++) { point = _points.at(i); @@ -80,6 +87,7 @@ void RenderableQuadEntityItem::updateGeometry() { } _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&v1); + _verticesBuffer->append(sizeof(int), (gpu::Byte*)&compactColor); _numVertices ++; } _pointsChanged = false; diff --git a/libraries/entities-renderer/src/RenderableQuadEntityItem.h b/libraries/entities-renderer/src/RenderableQuadEntityItem.h index 36354d45c8..36cf33f4c0 100644 --- a/libraries/entities-renderer/src/RenderableQuadEntityItem.h +++ b/libraries/entities-renderer/src/RenderableQuadEntityItem.h @@ -29,10 +29,10 @@ public: SIMPLE_RENDERABLE(); static gpu::PipelinePointer _pipeline; + static gpu::Stream::FormatPointer _format; protected: void updateGeometry(); - gpu::Stream::FormatPointer _format; gpu::BufferPointer _verticesBuffer; unsigned int _numVertices; }; From acfd5fd0cbacf0d6da81bd5dc0dc51620428ea4c Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Fri, 26 Jun 2015 15:43:29 -0700 Subject: [PATCH 10/61] vertex-colors for quads --- .../src/RenderableQuadEntityItem.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp index 0caca8f4b2..4cba03b2f7 100644 --- a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp @@ -65,10 +65,7 @@ void RenderableQuadEntityItem::updateGeometry() { } // qDebug() << "num points: " << _points.size(); // qDebug() << "num quad vertices" << _quadVertices.size(); - int compactColor = ((int(.7 * 255.0f) & 0xFF)) | - ((int(0.1 * 255.0f) & 0xFF) << 8) | - ((int(0.9 * 255.0f) & 0xFF) << 16) | - ((int(1.0 * 255.0f) & 0xFF) << 24); + if (_pointsChanged) { _numVertices = 0; _verticesBuffer.reset(new gpu::Buffer()); @@ -79,6 +76,14 @@ void RenderableQuadEntityItem::updateGeometry() { // _numVertices = 4; glm::vec3 point, v1; for (int i = 1; i < _points.size(); i++) { + float c1 = static_cast (rand()) / static_cast (RAND_MAX); + float c2 = static_cast (rand()) / static_cast (RAND_MAX); + float c3 = static_cast (rand()) / static_cast (RAND_MAX); + + int compactColor = ((int(c1 * 255.0f) & 0xFF)) | + ((int(c2 * 255.0f) & 0xFF) << 8) | + ((int(c3 * 255.0f) & 0xFF) << 16) | + ((int(255.0f) & 0xFF) << 24); point = _points.at(i); if(i % 2 == 0) { v1 = {point.x - _lineWidth, point.y, point.z}; From 10cefe03b58914a3647380471bd75e399cc6ea0e Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Fri, 26 Jun 2015 17:58:04 -0700 Subject: [PATCH 11/61] face colors --- .../src/RenderableLineEntityItem.cpp | 3 ++ .../src/RenderableQuadEntityItem.cpp | 51 +++++++++---------- libraries/entities/src/QuadEntityItem.cpp | 20 +------- libraries/entities/src/QuadEntityItem.h | 3 -- 4 files changed, 30 insertions(+), 47 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableLineEntityItem.cpp b/libraries/entities-renderer/src/RenderableLineEntityItem.cpp index 4b94992d59..b4df0f4f6d 100644 --- a/libraries/entities-renderer/src/RenderableLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableLineEntityItem.cpp @@ -36,6 +36,9 @@ void RenderableLineEntityItem::updateGeometry() { } } + + + void RenderableLineEntityItem::render(RenderArgs* args) { PerformanceTimer perfTimer("RenderableLineEntityItem::render"); Q_ASSERT(getType() == EntityTypes::Line); diff --git a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp index 4cba03b2f7..742c4e68cd 100644 --- a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp @@ -57,50 +57,49 @@ void RenderableQuadEntityItem::createPipeline() { gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); _pipeline = gpu::PipelinePointer(gpu::Pipeline::create(program, state)); } - +int generateColor() { + float c1 = static_cast (rand()) / static_cast (RAND_MAX); + float c2 = static_cast (rand()) / static_cast (RAND_MAX); + float c3 = static_cast (rand()) / static_cast (RAND_MAX); + return ((int(c1 * 255.0f) & 0xFF)) | + ((int(c2 * 255.0f) & 0xFF) << 8) | + ((int(c3 * 255.0f) & 0xFF) << 16) | + ((int(255.0f) & 0xFF) << 24); +} void RenderableQuadEntityItem::updateGeometry() { - if(_quadVertices.size() < 1) { + if(_points.size() < 1) { return; } -// qDebug() << "num points: " << _points.size(); -// qDebug() << "num quad vertices" << _quadVertices.size(); - + int compactColor = generateColor(); if (_pointsChanged) { _numVertices = 0; _verticesBuffer.reset(new gpu::Buffer()); -// _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(0)); -// _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(1)); -// _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(2)); -// _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_quadVertices.at(3)); -// _numVertices = 4; - glm::vec3 point, v1; - for (int i = 1; i < _points.size(); i++) { - float c1 = static_cast (rand()) / static_cast (RAND_MAX); - float c2 = static_cast (rand()) / static_cast (RAND_MAX); - float c3 = static_cast (rand()) / static_cast (RAND_MAX); + glm::vec3 point, v1, v2; + for (int i = 0; i < _points.size(); i++) { + - int compactColor = ((int(c1 * 255.0f) & 0xFF)) | - ((int(c2 * 255.0f) & 0xFF) << 8) | - ((int(c3 * 255.0f) & 0xFF) << 16) | - ((int(255.0f) & 0xFF) << 24); - point = _points.at(i); if(i % 2 == 0) { - v1 = {point.x - _lineWidth, point.y, point.z}; - } else { - v1 = {point.x + _lineWidth, point.y, point.z}; + compactColor = generateColor(); } - + point = _points.at(i); + v1 = {point.x - _lineWidth, point.y, point.z}; + v2 = {point.x + _lineWidth, point.y, point.z}; + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&v1); _verticesBuffer->append(sizeof(int), (gpu::Byte*)&compactColor); - _numVertices ++; + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&v2); + _verticesBuffer->append(sizeof(int), (gpu::Byte*)&compactColor); + _numVertices +=2; } _pointsChanged = false; } } + + void RenderableQuadEntityItem::render(RenderArgs* args) { - if (_quadVertices.size() < 4 ) { + if (_points.size() < 2 ) { return; } if (!_pipeline) { diff --git a/libraries/entities/src/QuadEntityItem.cpp b/libraries/entities/src/QuadEntityItem.cpp index 2b964606f8..0fb9352edb 100644 --- a/libraries/entities/src/QuadEntityItem.cpp +++ b/libraries/entities/src/QuadEntityItem.cpp @@ -35,14 +35,11 @@ QuadEntityItem::QuadEntityItem(const EntityItemID& entityItemID, const EntityIte EntityItem(entityItemID) , _lineWidth(DEFAULT_LINE_WIDTH), _pointsChanged(true), -_points(QVector(0)), -_quadVertices(QVector(0)) +_points(QVector(0)) { _type = EntityTypes::Quad; _created = properties.getCreated(); setProperties(properties); - - } EntityItemProperties QuadEntityItem::getProperties() const { @@ -122,8 +119,7 @@ bool QuadEntityItem::setLinePoints(const QVector& points) { if (!_pointsChanged) { return false; } - - qDebug() << "POINTS CHANGED"; + for (int i = 0; i < points.size(); i++) { glm::vec3 point = points.at(i); @@ -137,19 +133,7 @@ bool QuadEntityItem::setLinePoints(const QVector& points) { } _points = points; //All our points are valid and at least one point has changed, now create quads from points - _quadVertices.clear(); - for (int i = 0; i < points.size(); i++) { - glm::vec3 point = points.at(i); - - glm::vec3 p1 = glm::vec3(point.x - _lineWidth, point.y + _lineWidth, point.z); - glm::vec3 p2 = glm::vec3(point.x - _lineWidth, point.y - _lineWidth, point.z); - glm::vec3 p3 = glm::vec3(point.x + _lineWidth, point.y + _lineWidth, point.z); - glm::vec3 p4 = glm::vec3(point.x + _lineWidth, point.y - _lineWidth, point.z); - _quadVertices << p1 << p2 << p3 << p4; - - - } return true; } diff --git a/libraries/entities/src/QuadEntityItem.h b/libraries/entities/src/QuadEntityItem.h index 045b297785..0813a7a370 100644 --- a/libraries/entities/src/QuadEntityItem.h +++ b/libraries/entities/src/QuadEntityItem.h @@ -57,8 +57,6 @@ class QuadEntityItem : public EntityItem { bool setLinePoints(const QVector& points); bool appendPoint(const glm::vec3& point); - const QVector& getQuadVertices() const{ return _quadVertices; } - const QVector& getLinePoints() const{ return _points; } @@ -79,7 +77,6 @@ class QuadEntityItem : public EntityItem { float _lineWidth; bool _pointsChanged; QVector _points; - QVector _quadVertices; }; #endif // hifi_QuadEntityItem_h From 9fd30581d1b22551d2a5109aa3629ec034cf35fe Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Mon, 29 Jun 2015 15:56:40 -0700 Subject: [PATCH 12/61] support for painting with quads, including per-vertex normals and colors --- .../src/RenderableLineEntityItem.cpp | 1 + .../src/RenderableQuadEntityItem.cpp | 36 ++++++++--------- .../entities/src/EntityItemProperties.cpp | 9 +++++ libraries/entities/src/EntityItemProperties.h | 1 + libraries/entities/src/EntityPropertyFlags.h | 2 + libraries/entities/src/QuadEntityItem.cpp | 39 ++++++++++++++++++- libraries/entities/src/QuadEntityItem.h | 8 +++- libraries/networking/src/PacketHeaders.h | 1 + 8 files changed, 74 insertions(+), 23 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableLineEntityItem.cpp b/libraries/entities-renderer/src/RenderableLineEntityItem.cpp index b4df0f4f6d..4cd5ed82ca 100644 --- a/libraries/entities-renderer/src/RenderableLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableLineEntityItem.cpp @@ -48,6 +48,7 @@ void RenderableLineEntityItem::render(RenderArgs* args) { gpu::Batch& batch = *args->_batch; Transform transform = Transform(); transform.setTranslation(getPosition()); + transform.setRotation(getRotation()); batch.setModelTransform(transform); batch._glLineWidth(getLineWidth()); diff --git a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp index 742c4e68cd..dcc6682456 100644 --- a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp @@ -37,9 +37,11 @@ gpu::PipelinePointer RenderableQuadEntityItem::_pipeline; gpu::Stream::FormatPointer RenderableQuadEntityItem::_format; void RenderableQuadEntityItem::createPipeline() { - static const int COLOR_OFFSET = 12; + static const int NORMAL_OFFSET = 12; + static const int COLOR_OFFSET = 24; _format.reset(new gpu::Stream::Format()); _format->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), 0); + _format->setAttribute(gpu::Stream::NORMAL, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), NORMAL_OFFSET); _format->setAttribute(gpu::Stream::COLOR, 0, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA), COLOR_OFFSET); auto VS = DependencyManager::get()->getSimpleVertexShader(); @@ -68,28 +70,21 @@ int generateColor() { } void RenderableQuadEntityItem::updateGeometry() { - if(_points.size() < 1) { - return; - } - int compactColor = generateColor(); if (_pointsChanged) { + int compactColor = generateColor(); _numVertices = 0; _verticesBuffer.reset(new gpu::Buffer()); - glm::vec3 point, v1, v2; - for (int i = 0; i < _points.size(); i++) { - - - if(i % 2 == 0) { - compactColor = generateColor(); - } - point = _points.at(i); - v1 = {point.x - _lineWidth, point.y, point.z}; - v2 = {point.x + _lineWidth, point.y, point.z}; - - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&v1); + int vertexIndex = 0; + for (int i = 0; i < _normals.size(); i++) { + compactColor = generateColor(); + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex++)); + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); _verticesBuffer->append(sizeof(int), (gpu::Byte*)&compactColor); - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&v2); + + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex++)); + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); _verticesBuffer->append(sizeof(int), (gpu::Byte*)&compactColor); + _numVertices +=2; } _pointsChanged = false; @@ -99,9 +94,10 @@ void RenderableQuadEntityItem::updateGeometry() { void RenderableQuadEntityItem::render(RenderArgs* args) { - if (_points.size() < 2 ) { + if (_points.size() < 2 || _vertices.size() != _normals.size() * 2) { return; } + if (!_pipeline) { createPipeline(); } @@ -116,8 +112,10 @@ void RenderableQuadEntityItem::render(RenderArgs* args) { gpu::Batch& batch = *args->_batch; Transform transform = Transform(); transform.setTranslation(getPosition()); + transform.setRotation(getRotation()); batch.setModelTransform(transform); + batch.setPipeline(_pipeline); batch.setInputFormat(_format); diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index b13fdf1f2b..75fb58d6a3 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -28,6 +28,7 @@ #include "ZoneEntityItem.h" #include "PolyVoxEntityItem.h" #include "LineEntityItem.h" +#include "QuadEntityItem.h" AtmospherePropertyGroup EntityItemProperties::_staticAtmosphere; SkyboxPropertyGroup EntityItemProperties::_staticSkybox; @@ -100,6 +101,7 @@ CONSTRUCT_PROPERTY(sourceUrl, ""), CONSTRUCT_PROPERTY(lineWidth, LineEntityItem::DEFAULT_LINE_WIDTH), CONSTRUCT_PROPERTY(linePoints, QVector()), CONSTRUCT_PROPERTY(faceCamera, TextEntityItem::DEFAULT_FACE_CAMERA), +CONSTRUCT_PROPERTY(normals, QVector()), _id(UNKNOWN_ENTITY_ID), @@ -353,6 +355,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_HREF, href); CHECK_PROPERTY_CHANGE(PROP_DESCRIPTION, description); CHECK_PROPERTY_CHANGE(PROP_FACE_CAMERA, faceCamera); + CHECK_PROPERTY_CHANGE(PROP_NORMALS, normals); changedProperties += _stage.getChangedProperties(); changedProperties += _atmosphere.getChangedProperties(); @@ -450,6 +453,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(href); COPY_PROPERTY_TO_QSCRIPTVALUE(description); COPY_PROPERTY_TO_QSCRIPTVALUE(faceCamera); + COPY_PROPERTY_TO_QSCRIPTVALUE(normals); // Sitting properties support if (!skipDefaults) { @@ -563,6 +567,7 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(href, QString, setHref); COPY_PROPERTY_FROM_QSCRIPTVALUE(description, QString, setDescription); COPY_PROPERTY_FROM_QSCRIPTVALUE(faceCamera, bool, setFaceCamera); + COPY_PROPERTY_FROM_QSCRIPTVALUE(normals, qVectorVec3, setNormals); if (!honorReadOnly) { // this is used by the json reader to set things that we don't want javascript to able to affect. @@ -814,6 +819,7 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem if (properties.getType() == EntityTypes::Quad) { APPEND_ENTITY_PROPERTY(PROP_LINE_WIDTH, properties.getLineWidth()); APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, properties.getLinePoints()); + APPEND_ENTITY_PROPERTY(PROP_NORMALS, properties.getNormals()); } APPEND_ENTITY_PROPERTY(PROP_MARKETPLACE_ID, properties.getMarketplaceID()); @@ -1070,6 +1076,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int if (properties.getType() == EntityTypes::Quad) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_WIDTH, float, setLineWidth); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector, setLinePoints); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NORMALS, QVector, setNormals); } READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MARKETPLACE_ID, QString, setMarketplaceID); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NAME, QString, setName); @@ -1188,6 +1195,8 @@ void EntityItemProperties::markAllChanged() { _faceCameraChanged = true; + _normalsChanged = true; + } /// The maximum bounding cube for the entity, independent of it's rotation. diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 21043ebcc5..1104883b0d 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -153,6 +153,7 @@ public: DEFINE_PROPERTY_REF(PROP_HREF, Href, href, QString); DEFINE_PROPERTY_REF(PROP_DESCRIPTION, Description, description, QString); DEFINE_PROPERTY(PROP_FACE_CAMERA, FaceCamera, faceCamera, bool); + DEFINE_PROPERTY(PROP_NORMALS, Normals, normals, QVector); static QString getBackgroundModeString(BackgroundMode mode); diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h index 0a52897efd..2899855a95 100644 --- a/libraries/entities/src/EntityPropertyFlags.h +++ b/libraries/entities/src/EntityPropertyFlags.h @@ -125,6 +125,8 @@ enum EntityPropertyList { PROP_FACE_CAMERA, PROP_SCRIPT_TIMESTAMP, + //Used by quad entity + PROP_NORMALS, //////////////////////////////////////////////////////////////////////////////////////////////////// // ATTENTION: add new properties to end of list just ABOVE this line PROP_AFTER_LAST_ITEM, diff --git a/libraries/entities/src/QuadEntityItem.cpp b/libraries/entities/src/QuadEntityItem.cpp index 0fb9352edb..dab16c0606 100644 --- a/libraries/entities/src/QuadEntityItem.cpp +++ b/libraries/entities/src/QuadEntityItem.cpp @@ -35,7 +35,8 @@ QuadEntityItem::QuadEntityItem(const EntityItemID& entityItemID, const EntityIte EntityItem(entityItemID) , _lineWidth(DEFAULT_LINE_WIDTH), _pointsChanged(true), -_points(QVector(0)) +_points(QVector(0)), +_vertices(QVector(0)) { _type = EntityTypes::Quad; _created = properties.getCreated(); @@ -52,8 +53,8 @@ EntityItemProperties QuadEntityItem::getProperties() const { COPY_ENTITY_PROPERTY_TO_PROPERTIES(lineWidth, getLineWidth); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(linePoints, getLinePoints); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(normals, getNormals); properties._glowLevel = getGlowLevel(); @@ -69,6 +70,7 @@ bool QuadEntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(color, setColor); SET_ENTITY_PROPERTY_FROM_PROPERTIES(lineWidth, setLineWidth); SET_ENTITY_PROPERTY_FROM_PROPERTIES(linePoints, setLinePoints); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(normals, setNormals); if (somethingChanged) { @@ -99,6 +101,36 @@ bool QuadEntityItem::appendPoint(const glm::vec3& point) { return true; } +bool QuadEntityItem::setNormals(const QVector &normals) { + if (_points.size () < 2) { + return false; + } + _normals = normals; + qDebug() << "NORMALS: " << normals; + _vertices.clear(); + //Go through and create vertices for triangle strip based on normals + if (_normals.size() != _points.size()) { + return false; + } + glm::vec3 v1, v2, tangent, binormal, point; + for (int i = 0; i < _points.size()-1; i++) { + point = _points.at(i); + //Get tangent + tangent = _points.at(i+1) - point; + binormal = glm::normalize(glm::cross(tangent, normals.at(i))) * _lineWidth; + v1 = point + binormal; + v2 = point - binormal; + _vertices << v1 << v2; + } + //for last point we can just assume binormals are same since it represents last two vertices of quad + point = _points.at(_points.size() - 1); + v1 = point + binormal; + v2 = point - binormal; + _vertices << v1 << v2; + + return true; +} + bool QuadEntityItem::setLinePoints(const QVector& points) { if (points.size() > MAX_POINTS_PER_LINE) { return false; @@ -147,6 +179,7 @@ int QuadEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_COLOR, rgbColor, setColor); READ_ENTITY_PROPERTY(PROP_LINE_WIDTH, float, setLineWidth); READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector, setLinePoints); + READ_ENTITY_PROPERTY(PROP_NORMALS, QVector, setNormals); return bytesRead; @@ -159,6 +192,7 @@ EntityPropertyFlags QuadEntityItem::getEntityProperties(EncodeBitstreamParams& p requestedProperties += PROP_COLOR; requestedProperties += PROP_LINE_WIDTH; requestedProperties += PROP_LINE_POINTS; + requestedProperties += PROP_NORMALS; return requestedProperties; } @@ -175,6 +209,7 @@ void QuadEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor()); APPEND_ENTITY_PROPERTY(PROP_LINE_WIDTH, getLineWidth()); APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, getLinePoints()); + APPEND_ENTITY_PROPERTY(PROP_NORMALS, getNormals()); } void QuadEntityItem::debugDump() const { diff --git a/libraries/entities/src/QuadEntityItem.h b/libraries/entities/src/QuadEntityItem.h index 0813a7a370..3fa0651f58 100644 --- a/libraries/entities/src/QuadEntityItem.h +++ b/libraries/entities/src/QuadEntityItem.h @@ -56,10 +56,12 @@ class QuadEntityItem : public EntityItem { bool setLinePoints(const QVector& points); bool appendPoint(const glm::vec3& point); - - const QVector& getLinePoints() const{ return _points; } + bool setNormals(const QVector& normals); + const QVector& getNormals() const{ return _normals; } + + virtual ShapeType getShapeType() const { return SHAPE_TYPE_LINE; } // never have a ray intersection pick a QuadEntityItem. @@ -77,6 +79,8 @@ class QuadEntityItem : public EntityItem { float _lineWidth; bool _pointsChanged; QVector _points; + QVector _vertices; + QVector _normals; }; #endif // hifi_QuadEntityItem_h diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index 789675ec00..14f36a9b17 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -186,5 +186,6 @@ const PacketVersion VERSION_ENTITIES_LINE_POINTS = 29; const PacketVersion VERSION_ENTITIES_FACE_CAMERA = 30; const PacketVersion VERSION_ENTITIES_SCRIPT_TIMESTAMP = 31; const PacketVersion VERSION_ENTITIES_SCRIPT_TIMESTAMP_FIX = 32; +const PacketVersion VERSION_ENTITIES_NORMALS = 33; #endif // hifi_PacketHeaders_h From 0131a502cc509e46ba52f32cf9f65c71931a7966 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Tue, 30 Jun 2015 15:01:19 -0700 Subject: [PATCH 13/61] adding locking to updateGeometry method to prevent race conditions --- .../src/RenderableQuadEntityItem.cpp | 49 +++++++++++-------- .../src/RenderableQuadEntityItem.h | 2 + libraries/entities/src/QuadEntityItem.cpp | 16 +++--- libraries/entities/src/QuadEntityItem.h | 1 + 4 files changed, 41 insertions(+), 27 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp index dcc6682456..45b4c23b92 100644 --- a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp @@ -23,6 +23,8 @@ + + EntityItemPointer RenderableQuadEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { return EntityItemPointer(new RenderableQuadEntityItem(entityID, properties)); } @@ -70,25 +72,28 @@ int generateColor() { } void RenderableQuadEntityItem::updateGeometry() { - if (_pointsChanged) { - int compactColor = generateColor(); - _numVertices = 0; - _verticesBuffer.reset(new gpu::Buffer()); - int vertexIndex = 0; - for (int i = 0; i < _normals.size(); i++) { - compactColor = generateColor(); - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex++)); - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); - _verticesBuffer->append(sizeof(int), (gpu::Byte*)&compactColor); - - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex++)); - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); - _verticesBuffer->append(sizeof(int), (gpu::Byte*)&compactColor); - - _numVertices +=2; - } - _pointsChanged = false; + + int compactColor = generateColor(); + _numVertices = 0; + _verticesBuffer.reset(new gpu::Buffer()); + int vertexIndex = 0; + for (int i = 0; i < _normals.size(); i++) { + compactColor = generateColor(); + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); + vertexIndex++; + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); + _verticesBuffer->append(sizeof(int), (gpu::Byte*)&compactColor); + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); + vertexIndex++; + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); + _verticesBuffer->append(sizeof(int), (gpu::Byte*)&compactColor); + + _numVertices +=2; } + _pointsChanged = false; + + + } @@ -101,13 +106,15 @@ void RenderableQuadEntityItem::render(RenderArgs* args) { if (!_pipeline) { createPipeline(); } - PerformanceTimer perfTimer("RenderableQuadEntityItem::render"); Q_ASSERT(getType() == EntityTypes::Quad); Q_ASSERT(args->_batch); - updateGeometry(); + if (_pointsChanged) { + updateGeometry(); + } + gpu::Batch& batch = *args->_batch; Transform transform = Transform(); @@ -120,7 +127,7 @@ void RenderableQuadEntityItem::render(RenderArgs* args) { batch.setInputFormat(_format); batch.setInputBuffer(0, _verticesBuffer, 0, _format->getChannels().at(0)._stride); - + batch.draw(gpu::TRIANGLE_STRIP, _numVertices, 0); RenderableDebugableEntityItem::render(this, args); diff --git a/libraries/entities-renderer/src/RenderableQuadEntityItem.h b/libraries/entities-renderer/src/RenderableQuadEntityItem.h index 36cf33f4c0..f4708a2f64 100644 --- a/libraries/entities-renderer/src/RenderableQuadEntityItem.h +++ b/libraries/entities-renderer/src/RenderableQuadEntityItem.h @@ -17,6 +17,7 @@ #include "RenderableDebugableEntityItem.h" #include "RenderableEntityItem.h" #include +#include class RenderableQuadEntityItem : public QuadEntityItem { public: @@ -35,6 +36,7 @@ protected: void updateGeometry(); gpu::BufferPointer _verticesBuffer; unsigned int _numVertices; + }; diff --git a/libraries/entities/src/QuadEntityItem.cpp b/libraries/entities/src/QuadEntityItem.cpp index dab16c0606..e0066f9b92 100644 --- a/libraries/entities/src/QuadEntityItem.cpp +++ b/libraries/entities/src/QuadEntityItem.cpp @@ -44,7 +44,7 @@ _vertices(QVector(0)) } EntityItemProperties QuadEntityItem::getProperties() const { - + _quadReadWriteLock.lockForWrite(); EntityItemProperties properties = EntityItem::getProperties(); // get the properties from our base class @@ -59,11 +59,12 @@ EntityItemProperties QuadEntityItem::getProperties() const { properties._glowLevel = getGlowLevel(); properties._glowLevelChanged = false; - + _quadReadWriteLock.unlock(); return properties; } bool QuadEntityItem::setProperties(const EntityItemProperties& properties) { + _quadReadWriteLock.lockForWrite(); bool somethingChanged = false; somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class @@ -83,7 +84,10 @@ bool QuadEntityItem::setProperties(const EntityItemProperties& properties) { } setLastEdited(properties._lastEdited); } + + _quadReadWriteLock.unlock(); return somethingChanged; + } bool QuadEntityItem::appendPoint(const glm::vec3& point) { @@ -106,7 +110,6 @@ bool QuadEntityItem::setNormals(const QVector &normals) { return false; } _normals = normals; - qDebug() << "NORMALS: " << normals; _vertices.clear(); //Go through and create vertices for triangle strip based on normals if (_normals.size() != _points.size()) { @@ -114,10 +117,11 @@ bool QuadEntityItem::setNormals(const QVector &normals) { } glm::vec3 v1, v2, tangent, binormal, point; for (int i = 0; i < _points.size()-1; i++) { + float width = (static_cast (rand()) / static_cast (RAND_MAX) * .1) + .02; point = _points.at(i); //Get tangent tangent = _points.at(i+1) - point; - binormal = glm::normalize(glm::cross(tangent, normals.at(i))) * _lineWidth; + binormal = glm::normalize(glm::cross(tangent, normals.at(i))) * width; v1 = point + binormal; v2 = point - binormal; _vertices << v1 << v2; @@ -172,7 +176,7 @@ bool QuadEntityItem::setLinePoints(const QVector& points) { int QuadEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { - + _quadReadWriteLock.lockForWrite(); int bytesRead = 0; const unsigned char* dataAt = data; @@ -181,7 +185,7 @@ int QuadEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector, setLinePoints); READ_ENTITY_PROPERTY(PROP_NORMALS, QVector, setNormals); - + _quadReadWriteLock.unlock(); return bytesRead; } diff --git a/libraries/entities/src/QuadEntityItem.h b/libraries/entities/src/QuadEntityItem.h index 3fa0651f58..341dbb9c2e 100644 --- a/libraries/entities/src/QuadEntityItem.h +++ b/libraries/entities/src/QuadEntityItem.h @@ -81,6 +81,7 @@ class QuadEntityItem : public EntityItem { QVector _points; QVector _vertices; QVector _normals; + mutable QReadWriteLock _quadReadWriteLock; }; #endif // hifi_QuadEntityItem_h From 55508aa3a47efe32c0ee346754c763302db143bd Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Tue, 30 Jun 2015 15:44:19 -0700 Subject: [PATCH 14/61] in process of adding support for a property which is a QVector of floats" --- .../entities/src/EntityItemProperties.cpp | 4 +++- libraries/entities/src/EntityItemProperties.h | 1 + libraries/entities/src/EntityPropertyFlags.h | 1 + libraries/octree/src/OctreePacketData.cpp | 22 +++++++++++++++++++ libraries/octree/src/OctreePacketData.h | 4 ++++ 5 files changed, 31 insertions(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 75fb58d6a3..147e313768 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -102,7 +102,7 @@ CONSTRUCT_PROPERTY(lineWidth, LineEntityItem::DEFAULT_LINE_WIDTH), CONSTRUCT_PROPERTY(linePoints, QVector()), CONSTRUCT_PROPERTY(faceCamera, TextEntityItem::DEFAULT_FACE_CAMERA), CONSTRUCT_PROPERTY(normals, QVector()), - +CONSTRUCT_PROPERTY(strokeWidths, QVector()), _id(UNKNOWN_ENTITY_ID), _idSet(false), @@ -1077,6 +1077,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_WIDTH, float, setLineWidth); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector, setLinePoints); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NORMALS, QVector, setNormals); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STROKE_WIDTHS, QVector, setStrokeWidths); } READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MARKETPLACE_ID, QString, setMarketplaceID); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NAME, QString, setName); @@ -1196,6 +1197,7 @@ void EntityItemProperties::markAllChanged() { _faceCameraChanged = true; _normalsChanged = true; + _strokeWidthsChanged = true; } diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 1104883b0d..6ce5e29889 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -154,6 +154,7 @@ public: DEFINE_PROPERTY_REF(PROP_DESCRIPTION, Description, description, QString); DEFINE_PROPERTY(PROP_FACE_CAMERA, FaceCamera, faceCamera, bool); DEFINE_PROPERTY(PROP_NORMALS, Normals, normals, QVector); + DEFINE_PROPERTY(PROP_STROKE_WIDTHS, StrokeWidths, strokeWidths, QVector); static QString getBackgroundModeString(BackgroundMode mode); diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h index 2899855a95..c8c4e45f30 100644 --- a/libraries/entities/src/EntityPropertyFlags.h +++ b/libraries/entities/src/EntityPropertyFlags.h @@ -127,6 +127,7 @@ enum EntityPropertyList { //Used by quad entity PROP_NORMALS, + PROP_STROKE_WIDTHS, //////////////////////////////////////////////////////////////////////////////////////////////////// // ATTENTION: add new properties to end of list just ABOVE this line PROP_AFTER_LAST_ITEM, diff --git a/libraries/octree/src/OctreePacketData.cpp b/libraries/octree/src/OctreePacketData.cpp index db2e2953c0..5c0a872a71 100644 --- a/libraries/octree/src/OctreePacketData.cpp +++ b/libraries/octree/src/OctreePacketData.cpp @@ -394,6 +394,19 @@ bool OctreePacketData::appendValue(const QVector& value) { return success; } +bool OctreePacketData::appendValue(const QVector& value) { + uint16_t qVecSize = value.size(); + bool success = appendValue(qVecSize); + if (success) { + success = append((const unsigned char*)value.constData(), qVecSize * sizeof(float)); + if (success) { + _bytesOfValues += qVecSize * sizeof(float); + _totalBytesOfValues += qVecSize * sizeof(float); + } + } + return success; +} + bool OctreePacketData::appendValue(const glm::quat& value) { const size_t VALUES_PER_QUAT = 4; const size_t PACKED_QUAT_SIZE = sizeof(uint16_t) * VALUES_PER_QUAT; @@ -609,6 +622,15 @@ int OctreePacketData::unpackDataFromBytes(const unsigned char *dataBytes, QVecto memcpy(result.data(), dataBytes, length * sizeof(glm::vec3)); return sizeof(uint16_t) + length * sizeof(glm::vec3); } + +int OctreePacketData::unpackDataFromBytes(const unsigned char *dataBytes, QVector& result) { + uint16_t length; + memcpy(&length, dataBytes, sizeof(uint16_t)); + dataBytes += sizeof(length); + result.resize(length); + memcpy(result.data(), dataBytes, length * sizeof(float)); +} + int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, QByteArray& result) { uint16_t length; memcpy(&length, dataBytes, sizeof(length)); diff --git a/libraries/octree/src/OctreePacketData.h b/libraries/octree/src/OctreePacketData.h index 9476fe024e..a441a0b584 100644 --- a/libraries/octree/src/OctreePacketData.h +++ b/libraries/octree/src/OctreePacketData.h @@ -165,6 +165,9 @@ public: //appends a QVector of vec3's to the end of the stream, may fail if new data stream is too long to fit in packet bool appendValue(const QVector& value); + + //appends a QVector of floats to the end of the stream, may fail if new data stream is too long to fit in packet + bool appendValue(const QVector& value); /// appends a packed quat to the end of the stream, may fail if new data stream is too long to fit in packet bool appendValue(const glm::quat& value); @@ -245,6 +248,7 @@ public: static int unpackDataFromBytes(const unsigned char* dataBytes, QUuid& result); static int unpackDataFromBytes(const unsigned char* dataBytes, xColor& result); static int unpackDataFromBytes(const unsigned char* dataBytes, QVector& result); + static int unpackDataFromBytes(const unsigned char* dataBytes, QVector& result); static int unpackDataFromBytes(const unsigned char* dataBytes, QByteArray& result); From ff77c3e0d8aab5a9f61a1694c8af3f41bd027769 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Tue, 30 Jun 2015 18:38:40 -0700 Subject: [PATCH 15/61] added stroke width entity --- .../src/RenderableQuadEntityItem.cpp | 2 +- .../entities/src/EntityItemProperties.cpp | 3 ++ .../entities/src/EntityItemPropertiesMacros.h | 9 ++++- libraries/entities/src/QuadEntityItem.cpp | 16 +++++++-- libraries/entities/src/QuadEntityItem.h | 4 +++ libraries/networking/src/PacketHeaders.h | 1 + libraries/shared/src/RegisteredMetaTypes.cpp | 35 ++++++++++++++++++- libraries/shared/src/RegisteredMetaTypes.h | 5 +++ 8 files changed, 70 insertions(+), 5 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp index 45b4c23b92..e60be82770 100644 --- a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp @@ -72,7 +72,7 @@ int generateColor() { } void RenderableQuadEntityItem::updateGeometry() { - + QReadLocker lock(&_quadReadWriteLock); int compactColor = generateColor(); _numVertices = 0; _verticesBuffer.reset(new gpu::Buffer()); diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 147e313768..13086a86b9 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -356,6 +356,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_DESCRIPTION, description); CHECK_PROPERTY_CHANGE(PROP_FACE_CAMERA, faceCamera); CHECK_PROPERTY_CHANGE(PROP_NORMALS, normals); + CHECK_PROPERTY_CHANGE(PROP_STROKE_WIDTHS, strokeWidths); changedProperties += _stage.getChangedProperties(); changedProperties += _atmosphere.getChangedProperties(); @@ -454,6 +455,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(description); COPY_PROPERTY_TO_QSCRIPTVALUE(faceCamera); COPY_PROPERTY_TO_QSCRIPTVALUE(normals); + COPY_PROPERTY_TO_QSCRIPTVALUE(strokeWidths); // Sitting properties support if (!skipDefaults) { @@ -568,6 +570,7 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(description, QString, setDescription); COPY_PROPERTY_FROM_QSCRIPTVALUE(faceCamera, bool, setFaceCamera); COPY_PROPERTY_FROM_QSCRIPTVALUE(normals, qVectorVec3, setNormals); + COPY_PROPERTY_FROM_QSCRIPTVALUE(strokeWidths,qVectorFloat, setStrokeWidths); if (!honorReadOnly) { // this is used by the json reader to set things that we don't want javascript to able to affect. diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index d4fcfa8cab..e48be1da8c 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -98,7 +98,8 @@ inline QScriptValue convertScriptValue(QScriptEngine* e, const QString& v) { ret inline QScriptValue convertScriptValue(QScriptEngine* e, const xColor& v) { return xColorToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, const glm::quat& v) { return quatToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, const QScriptValue& v) { return v; } -inline QScriptValue convertScriptValue(QScriptEngine* e, const QVector& v) {return qVectorVec3ToScriptValue(e, v); } +inline QScriptValue convertScriptValue(QScriptEngine* e, const QVector& v) {return qVectorVec3ToScriptValue(e, v); } +inline QScriptValue convertScriptValue(QScriptEngine* e, const QVector& v) { return qVectorFloatToScriptValue(e, v); } inline QScriptValue convertScriptValue(QScriptEngine* e, const QByteArray& v) { QByteArray b64 = v.toBase64(); @@ -134,6 +135,7 @@ inline QScriptValue convertScriptValue(QScriptEngine* e, const QByteArray& v) { typedef glm::vec3 glmVec3; typedef glm::quat glmQuat; typedef QVector qVectorVec3; +typedef QVector qVectorFloat; inline float float_convertFromScriptValue(const QScriptValue& v, bool& isValid) { return v.toVariant().toFloat(&isValid); } inline quint64 quint64_convertFromScriptValue(const QScriptValue& v, bool& isValid) { return v.toVariant().toULongLong(&isValid); } inline uint16_t uint16_t_convertFromScriptValue(const QScriptValue& v, bool& isValid) { return v.toVariant().toInt(&isValid); } @@ -177,6 +179,11 @@ inline glmVec3 glmVec3_convertFromScriptValue(const QScriptValue& v, bool& isVal return glm::vec3(0); } +inline qVectorFloat qVectorFloat_convertFromScriptValue(const QScriptValue& v, bool& isValid) { + isValid = true; + return qVectorFloatFromScriptValue(v); +} + inline qVectorVec3 qVectorVec3_convertFromScriptValue(const QScriptValue& v, bool& isValid) { isValid = true; return qVectorVec3FromScriptValue(v); diff --git a/libraries/entities/src/QuadEntityItem.cpp b/libraries/entities/src/QuadEntityItem.cpp index e0066f9b92..100d195212 100644 --- a/libraries/entities/src/QuadEntityItem.cpp +++ b/libraries/entities/src/QuadEntityItem.cpp @@ -36,7 +36,9 @@ EntityItem(entityItemID) , _lineWidth(DEFAULT_LINE_WIDTH), _pointsChanged(true), _points(QVector(0)), -_vertices(QVector(0)) +_vertices(QVector(0)), +_normals(QVector(0)), +_strokeWidths(QVector(0)) { _type = EntityTypes::Quad; _created = properties.getCreated(); @@ -55,6 +57,7 @@ EntityItemProperties QuadEntityItem::getProperties() const { COPY_ENTITY_PROPERTY_TO_PROPERTIES(lineWidth, getLineWidth); COPY_ENTITY_PROPERTY_TO_PROPERTIES(linePoints, getLinePoints); COPY_ENTITY_PROPERTY_TO_PROPERTIES(normals, getNormals); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(strokeWidths, getStrokeWidths); properties._glowLevel = getGlowLevel(); @@ -72,6 +75,8 @@ bool QuadEntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(lineWidth, setLineWidth); SET_ENTITY_PROPERTY_FROM_PROPERTIES(linePoints, setLinePoints); SET_ENTITY_PROPERTY_FROM_PROPERTIES(normals, setNormals); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(strokeWidths, setStrokeWidths); + if (somethingChanged) { @@ -105,7 +110,12 @@ bool QuadEntityItem::appendPoint(const glm::vec3& point) { return true; } -bool QuadEntityItem::setNormals(const QVector &normals) { +bool QuadEntityItem::setStrokeWidths(const QVector& strokeWidths ) { + _strokeWidths = strokeWidths; + return true; +} + +bool QuadEntityItem::setNormals(const QVector& normals) { if (_points.size () < 2) { return false; } @@ -184,6 +194,7 @@ int QuadEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_LINE_WIDTH, float, setLineWidth); READ_ENTITY_PROPERTY(PROP_LINE_POINTS, QVector, setLinePoints); READ_ENTITY_PROPERTY(PROP_NORMALS, QVector, setNormals); + READ_ENTITY_PROPERTY(PROP_STROKE_WIDTHS, QVector, setStrokeWidths); _quadReadWriteLock.unlock(); return bytesRead; @@ -214,6 +225,7 @@ void QuadEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits APPEND_ENTITY_PROPERTY(PROP_LINE_WIDTH, getLineWidth()); APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, getLinePoints()); APPEND_ENTITY_PROPERTY(PROP_NORMALS, getNormals()); + APPEND_ENTITY_PROPERTY(PROP_STROKE_WIDTHS, getStrokeWidths()); } void QuadEntityItem::debugDump() const { diff --git a/libraries/entities/src/QuadEntityItem.h b/libraries/entities/src/QuadEntityItem.h index 341dbb9c2e..ae7cac4e52 100644 --- a/libraries/entities/src/QuadEntityItem.h +++ b/libraries/entities/src/QuadEntityItem.h @@ -61,6 +61,9 @@ class QuadEntityItem : public EntityItem { bool setNormals(const QVector& normals); const QVector& getNormals() const{ return _normals; } + bool setStrokeWidths(const QVector& strokeWidths); + const QVector& getStrokeWidths() const{ return _strokeWidths; } + virtual ShapeType getShapeType() const { return SHAPE_TYPE_LINE; } @@ -81,6 +84,7 @@ class QuadEntityItem : public EntityItem { QVector _points; QVector _vertices; QVector _normals; + QVector _strokeWidths; mutable QReadWriteLock _quadReadWriteLock; }; diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index 14f36a9b17..4e7ce261bc 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -187,5 +187,6 @@ const PacketVersion VERSION_ENTITIES_FACE_CAMERA = 30; const PacketVersion VERSION_ENTITIES_SCRIPT_TIMESTAMP = 31; const PacketVersion VERSION_ENTITIES_SCRIPT_TIMESTAMP_FIX = 32; const PacketVersion VERSION_ENTITIES_NORMALS = 33; +const PacketVersion VERSION_ENTITIES_STROKE_WIDTHS = 34; #endif // hifi_PacketHeaders_h diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index 62f2be0512..3674e09dae 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -33,6 +33,7 @@ void registerMetaTypes(QScriptEngine* engine) { qScriptRegisterMetaType(engine, vec4toScriptValue, vec4FromScriptValue); qScriptRegisterMetaType(engine, vec3toScriptValue, vec3FromScriptValue); qScriptRegisterMetaType(engine, qVectorVec3ToScriptValue, qVectorVec3FromScriptValue); + qScriptRegisterMetaType(engine, qVectorFloatToScriptValue, qVectorFloatFromScriptValue); qScriptRegisterMetaType(engine, vec2toScriptValue, vec2FromScriptValue); qScriptRegisterMetaType(engine, quatToScriptValue, quatFromScriptValue); qScriptRegisterMetaType(engine, qRectToScriptValue, qRectFromScriptValue); @@ -43,6 +44,7 @@ void registerMetaTypes(QScriptEngine* engine) { qScriptRegisterMetaType(engine, collisionToScriptValue, collisionFromScriptValue); qScriptRegisterMetaType(engine, quuidToScriptValue, quuidFromScriptValue); qScriptRegisterMetaType(engine, qSizeFToScriptValue, qSizeFFromScriptValue); + } QScriptValue vec4toScriptValue(QScriptEngine* engine, const glm::vec4& vec4) { @@ -79,7 +81,7 @@ void vec3FromScriptValue(const QScriptValue &object, glm::vec3 &vec3) { vec3.z = object.property("z").toVariant().toFloat(); } -QScriptValue qVectorVec3ToScriptValue(QScriptEngine* engine, const QVector& vector){ +QScriptValue qVectorVec3ToScriptValue(QScriptEngine* engine, const QVector& vector) { QScriptValue array = engine->newArray(); for (int i = 0; i < vector.size(); i++) { array.setProperty(i, vec3toScriptValue(engine, vector.at(i))); @@ -87,6 +89,37 @@ QScriptValue qVectorVec3ToScriptValue(QScriptEngine* engine, const QVector qVectorFloatFromScriptValue(const QScriptValue& array) { + QVector newVector; + int length = array.property("length").toInteger(); + for (int i = 0; i < length; i++) { + newVector << array.property(i).toVariant().toFloat(); + } + + return newVector; +} + +QScriptValue qVectorFloatToScriptValue(QScriptEngine* engine, const QVector& vector) { + QScriptValue array = engine->newArray(); + for (int i = 0; i < vector.size(); i++) { + float num = vector.at(i); + if(num != num) { + //if num is NaN don't convert it + return array; + } + array.setProperty(i, QScriptValue(num)); + } + return array; +} + +void qVectorFloatFromScriptValue(const QScriptValue& array, QVector& vector) { + int length = array.property("length").toInteger(); + + for (int i = 0; i < length; i++) { + vector << array.property(i).toVariant().toFloat(); + } +} +// QVector qVectorVec3FromScriptValue(const QScriptValue& array){ QVector newVector; int length = array.property("length").toInteger(); diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index f5f39cd3f6..31f1da8a40 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -29,6 +29,7 @@ Q_DECLARE_METATYPE(glm::vec2) Q_DECLARE_METATYPE(glm::quat) Q_DECLARE_METATYPE(xColor) Q_DECLARE_METATYPE(QVector) +Q_DECLARE_METATYPE(QVector) void registerMetaTypes(QScriptEngine* engine); @@ -60,6 +61,10 @@ QScriptValue qVectorVec3ToScriptValue(QScriptEngine* engine, const QVector& vector); QVector qVectorVec3FromScriptValue( const QScriptValue& array); +QScriptValue qVectorFloatToScriptValue(QScriptEngine* engine, const QVector& vector); +void qVectorFloatFromScriptValue(const QScriptValue& array, QVector& vector); +QVector qVectorFloatFromScriptValue(const QScriptValue& array); + class PickRay { public: PickRay() : origin(0.0f), direction(0.0f) { } From a117a7aa3be5fe91e9fa9d1a4a020596bbe039cc Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Tue, 30 Jun 2015 18:47:43 -0700 Subject: [PATCH 16/61] widths are changing --- libraries/entities/src/QuadEntityItem.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/entities/src/QuadEntityItem.cpp b/libraries/entities/src/QuadEntityItem.cpp index 100d195212..e2aec360bf 100644 --- a/libraries/entities/src/QuadEntityItem.cpp +++ b/libraries/entities/src/QuadEntityItem.cpp @@ -116,7 +116,7 @@ bool QuadEntityItem::setStrokeWidths(const QVector& strokeWidths ) { } bool QuadEntityItem::setNormals(const QVector& normals) { - if (_points.size () < 2) { + if (_points.size () < 2 || _strokeWidths.size() < 2) { return false; } _normals = normals; @@ -127,7 +127,7 @@ bool QuadEntityItem::setNormals(const QVector& normals) { } glm::vec3 v1, v2, tangent, binormal, point; for (int i = 0; i < _points.size()-1; i++) { - float width = (static_cast (rand()) / static_cast (RAND_MAX) * .1) + .02; + float width = _strokeWidths.at(i); point = _points.at(i); //Get tangent tangent = _points.at(i+1) - point; From ad54b4c0b0a31aa4feffcf5b063f1762b1faaf26 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Wed, 1 Jul 2015 17:18:36 -0700 Subject: [PATCH 17/61] changed quad entity to PolyLine --- .../src/EntityTreeRenderer.cpp | 4 +- ...m.cpp => RenderablePolyLineEntityItem.cpp} | 26 ++++++------- ...yItem.h => RenderablePolyLineEntityItem.h} | 12 +++--- .../entities/src/EntityItemProperties.cpp | 6 +-- libraries/entities/src/EntityItemProperties.h | 2 +- .../entities/src/EntityScriptingInterface.cpp | 18 ++++----- .../entities/src/EntityScriptingInterface.h | 4 +- libraries/entities/src/EntityTypes.cpp | 4 +- libraries/entities/src/EntityTypes.h | 4 +- ...dEntityItem.cpp => PolyLineEntityItem.cpp} | 38 +++++++++---------- ...{QuadEntityItem.h => PolyLineEntityItem.h} | 14 +++---- 11 files changed, 66 insertions(+), 66 deletions(-) rename libraries/entities-renderer/src/{RenderableQuadEntityItem.cpp => RenderablePolyLineEntityItem.cpp} (81%) rename libraries/entities-renderer/src/{RenderableQuadEntityItem.h => RenderablePolyLineEntityItem.h} (72%) rename libraries/entities/src/{QuadEntityItem.cpp => PolyLineEntityItem.cpp} (84%) rename libraries/entities/src/{QuadEntityItem.h => PolyLineEntityItem.h} (91%) diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 0f204601cc..a7570c739c 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -42,7 +42,7 @@ #include "RenderableZoneEntityItem.h" #include "RenderableLineEntityItem.h" #include "RenderablePolyVoxEntityItem.h" -#include "RenderableQuadEntityItem.h" +#include "RenderablePolyLineEntityItem.h" #include "EntitiesRendererLogging.h" #include "AddressManager.h" @@ -70,7 +70,7 @@ EntityTreeRenderer::EntityTreeRenderer(bool wantScripts, AbstractViewStateInterf REGISTER_ENTITY_TYPE_WITH_FACTORY(Zone, RenderableZoneEntityItem::factory) REGISTER_ENTITY_TYPE_WITH_FACTORY(Line, RenderableLineEntityItem::factory) REGISTER_ENTITY_TYPE_WITH_FACTORY(PolyVox, RenderablePolyVoxEntityItem::factory) - REGISTER_ENTITY_TYPE_WITH_FACTORY(Quad, RenderableQuadEntityItem::factory) + REGISTER_ENTITY_TYPE_WITH_FACTORY(PolyLine, RenderablePolyLineEntityItem::factory) _currentHoverOverEntityID = UNKNOWN_ENTITY_ID; _currentClickingOnEntityID = UNKNOWN_ENTITY_ID; diff --git a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp similarity index 81% rename from libraries/entities-renderer/src/RenderableQuadEntityItem.cpp rename to libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index e60be82770..a447d69d70 100644 --- a/libraries/entities-renderer/src/RenderableQuadEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -1,5 +1,5 @@ // -// RenderableQuadEntityItem.cpp +// RenderablePolyLineEntityItem.cpp // libraries/entities-renderer/src/ // // Created by Eric Levin on 6/22/15 @@ -17,7 +17,7 @@ #include #include -#include "RenderableQuadEntityItem.h" +#include "RenderablePolyLineEntityItem.h" @@ -25,20 +25,20 @@ -EntityItemPointer RenderableQuadEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { - return EntityItemPointer(new RenderableQuadEntityItem(entityID, properties)); +EntityItemPointer RenderablePolyLineEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { + return EntityItemPointer(new RenderablePolyLineEntityItem(entityID, properties)); } -RenderableQuadEntityItem::RenderableQuadEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : -QuadEntityItem(entityItemID, properties) { +RenderablePolyLineEntityItem::RenderablePolyLineEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : +PolyLineEntityItem(entityItemID, properties) { _numVertices = 0; } -gpu::PipelinePointer RenderableQuadEntityItem::_pipeline; -gpu::Stream::FormatPointer RenderableQuadEntityItem::_format; +gpu::PipelinePointer RenderablePolyLineEntityItem::_pipeline; +gpu::Stream::FormatPointer RenderablePolyLineEntityItem::_format; -void RenderableQuadEntityItem::createPipeline() { +void RenderablePolyLineEntityItem::createPipeline() { static const int NORMAL_OFFSET = 12; static const int COLOR_OFFSET = 24; _format.reset(new gpu::Stream::Format()); @@ -71,7 +71,7 @@ int generateColor() { ((int(255.0f) & 0xFF) << 24); } -void RenderableQuadEntityItem::updateGeometry() { +void RenderablePolyLineEntityItem::updateGeometry() { QReadLocker lock(&_quadReadWriteLock); int compactColor = generateColor(); _numVertices = 0; @@ -98,7 +98,7 @@ void RenderableQuadEntityItem::updateGeometry() { -void RenderableQuadEntityItem::render(RenderArgs* args) { +void RenderablePolyLineEntityItem::render(RenderArgs* args) { if (_points.size() < 2 || _vertices.size() != _normals.size() * 2) { return; } @@ -107,8 +107,8 @@ void RenderableQuadEntityItem::render(RenderArgs* args) { createPipeline(); } - PerformanceTimer perfTimer("RenderableQuadEntityItem::render"); - Q_ASSERT(getType() == EntityTypes::Quad); + PerformanceTimer perfTimer("RenderablePolyLineEntityItem::render"); + Q_ASSERT(getType() == EntityTypes::PolyLine); Q_ASSERT(args->_batch); if (_pointsChanged) { diff --git a/libraries/entities-renderer/src/RenderableQuadEntityItem.h b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h similarity index 72% rename from libraries/entities-renderer/src/RenderableQuadEntityItem.h rename to libraries/entities-renderer/src/RenderablePolyLineEntityItem.h index f4708a2f64..ae92f47ae0 100644 --- a/libraries/entities-renderer/src/RenderableQuadEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h @@ -9,21 +9,21 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#ifndef hifi_RenderableQuadEntityItem_h -#define hifi_RenderableQuadEntityItem_h +#ifndef hifi_RenderablePolyLineEntityItem_h +#define hifi_RenderablePolyLineEntityItem_h #include -#include +#include #include "RenderableDebugableEntityItem.h" #include "RenderableEntityItem.h" #include #include -class RenderableQuadEntityItem : public QuadEntityItem { +class RenderablePolyLineEntityItem : public PolyLineEntityItem { public: static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); static void createPipeline(); - RenderableQuadEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties); + RenderablePolyLineEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties); virtual void render(RenderArgs* args); @@ -40,4 +40,4 @@ protected: }; -#endif // hifi_RenderableQuadEntityItem_h +#endif // hifi_RenderablePolyLineEntityItem_h diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 13086a86b9..538175cba2 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -28,7 +28,7 @@ #include "ZoneEntityItem.h" #include "PolyVoxEntityItem.h" #include "LineEntityItem.h" -#include "QuadEntityItem.h" +#include "PolyLineEntityItem.h" AtmospherePropertyGroup EntityItemProperties::_staticAtmosphere; SkyboxPropertyGroup EntityItemProperties::_staticSkybox; @@ -819,7 +819,7 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, properties.getLinePoints()); } - if (properties.getType() == EntityTypes::Quad) { + if (properties.getType() == EntityTypes::PolyLine) { APPEND_ENTITY_PROPERTY(PROP_LINE_WIDTH, properties.getLineWidth()); APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, properties.getLinePoints()); APPEND_ENTITY_PROPERTY(PROP_NORMALS, properties.getNormals()); @@ -1076,7 +1076,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int } - if (properties.getType() == EntityTypes::Quad) { + if (properties.getType() == EntityTypes::PolyLine) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_WIDTH, float, setLineWidth); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector, setLinePoints); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NORMALS, QVector, setNormals); diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 6ce5e29889..bd8d894457 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -55,7 +55,7 @@ class EntityItemProperties { friend class WebEntityItem; // TODO: consider removing this friend relationship and use public methods friend class LineEntityItem; // TODO: consider removing this friend relationship and use public methods friend class PolyVoxEntityItem; // TODO: consider removing this friend relationship and use public methods - friend class QuadEntityItem; // TODO: consider removing this friend relationship and use public methods + friend class PolyLineEntityItem; // TODO: consider removing this friend relationship and use public methods public: EntityItemProperties(); virtual ~EntityItemProperties(); diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index f01620d4d8..558df93f5c 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -468,16 +468,16 @@ bool EntityScriptingInterface::setPoints(EntityItemPointer entity, std::function return success; } -bool EntityScriptingInterface::setPoints(EntityItemPointer entity, std::function actor) { +bool EntityScriptingInterface::setPoints(EntityItemPointer entity, std::function actor) { if (!_entityTree) { return false; } auto now = usecTimestampNow(); - QuadEntityItem* quadEntity = static_cast(entity.get()); + PolyLineEntityItem* PolyLineEntity = static_cast(entity.get()); _entityTree->lockForWrite(); - bool success = actor(*quadEntity); + bool success = actor(*PolyLineEntity); entity->setLastEdited(now); entity->setLastBroadcast(now); _entityTree->unlock(); @@ -527,10 +527,10 @@ bool EntityScriptingInterface::setAllPoints(QUuid entityID, const QVector bool + if (entityType == EntityTypes::PolyLine) { + return setPoints(entity, [points](PolyLineEntityItem& PolyLineEntity) -> bool { - return quadEntity.setLinePoints(points); + return PolyLineEntity.setLinePoints(points); }); } @@ -552,10 +552,10 @@ bool EntityScriptingInterface::appendPoint(QUuid entityID, const glm::vec3& poin }); } - if (entityType == EntityTypes::Quad) { - return setPoints(entity, [point](QuadEntityItem& quadEntity) -> bool + if (entityType == EntityTypes::PolyLine) { + return setPoints(entity, [point](PolyLineEntityItem& PolyLineEntity) -> bool { - return quadEntity.appendPoint(point); + return PolyLineEntity.appendPoint(point); }); } diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 64388f1aa9..318672eb54 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -23,7 +23,7 @@ #include #include "PolyVoxEntityItem.h" #include "LineEntityItem.h" -#include "QuadEntityItem.h" +#include "PolyLineEntityItem.h" #include "EntityEditPacketSender.h" @@ -163,7 +163,7 @@ private: bool actionWorker(const QUuid& entityID, std::function actor); bool setVoxels(QUuid entityID, std::function actor); bool setPoints(EntityItemPointer entity, std::function actor); - bool setPoints(EntityItemPointer entity, std::function actor); + bool setPoints(EntityItemPointer entity, std::function actor); void queueEntityMessage(PacketType packetType, EntityItemID entityID, const EntityItemProperties& properties); /// actually does the work of finding the ray intersection, can be called in locking mode or tryLock mode diff --git a/libraries/entities/src/EntityTypes.cpp b/libraries/entities/src/EntityTypes.cpp index 798c16db1f..2ed52a9e62 100644 --- a/libraries/entities/src/EntityTypes.cpp +++ b/libraries/entities/src/EntityTypes.cpp @@ -28,7 +28,7 @@ #include "ZoneEntityItem.h" #include "LineEntityItem.h" #include "PolyVoxEntityItem.h" -#include "QuadEntityItem.h" +#include "PolyLineEntityItem.h" QMap EntityTypes::_typeToNameMap; QMap EntityTypes::_nameToTypeMap; @@ -48,7 +48,7 @@ REGISTER_ENTITY_TYPE(ParticleEffect) REGISTER_ENTITY_TYPE(Zone) REGISTER_ENTITY_TYPE(Line) REGISTER_ENTITY_TYPE(PolyVox) -REGISTER_ENTITY_TYPE(Quad); +REGISTER_ENTITY_TYPE(PolyLine); const QString& EntityTypes::getEntityTypeName(EntityType entityType) { QMap::iterator matchedTypeName = _typeToNameMap.find(entityType); diff --git a/libraries/entities/src/EntityTypes.h b/libraries/entities/src/EntityTypes.h index d51fbdce5d..1a823d952a 100644 --- a/libraries/entities/src/EntityTypes.h +++ b/libraries/entities/src/EntityTypes.h @@ -46,8 +46,8 @@ public: Web, Line, PolyVox, - Quad, - LAST = Quad + PolyLine, + LAST = PolyLine } EntityType; static const QString& getEntityTypeName(EntityType entityType); diff --git a/libraries/entities/src/QuadEntityItem.cpp b/libraries/entities/src/PolyLineEntityItem.cpp similarity index 84% rename from libraries/entities/src/QuadEntityItem.cpp rename to libraries/entities/src/PolyLineEntityItem.cpp index e2aec360bf..fb01f341a7 100644 --- a/libraries/entities/src/QuadEntityItem.cpp +++ b/libraries/entities/src/PolyLineEntityItem.cpp @@ -1,5 +1,5 @@ // -// QuadEntityItem.cpp +// PolyLineEntityItem.cpp // libraries/entities/src // // Created by Eric Levin on 6/22/15. @@ -14,7 +14,7 @@ #include -#include "QuadEntityItem.h" +#include "PolyLineEntityItem.h" #include "EntityTree.h" #include "EntitiesLogging.h" #include "EntityTreeElement.h" @@ -22,16 +22,16 @@ -const float QuadEntityItem::DEFAULT_LINE_WIDTH = 0.1f; -const int QuadEntityItem::MAX_POINTS_PER_LINE = 70; +const float PolyLineEntityItem::DEFAULT_LINE_WIDTH = 0.1f; +const int PolyLineEntityItem::MAX_POINTS_PER_LINE = 70; -EntityItemPointer QuadEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { - EntityItemPointer result { new QuadEntityItem(entityID, properties) }; +EntityItemPointer PolyLineEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { + EntityItemPointer result { new PolyLineEntityItem(entityID, properties) }; return result; } -QuadEntityItem::QuadEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : +PolyLineEntityItem::PolyLineEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : EntityItem(entityItemID) , _lineWidth(DEFAULT_LINE_WIDTH), _pointsChanged(true), @@ -40,12 +40,12 @@ _vertices(QVector(0)), _normals(QVector(0)), _strokeWidths(QVector(0)) { - _type = EntityTypes::Quad; + _type = EntityTypes::PolyLine; _created = properties.getCreated(); setProperties(properties); } -EntityItemProperties QuadEntityItem::getProperties() const { +EntityItemProperties PolyLineEntityItem::getProperties() const { _quadReadWriteLock.lockForWrite(); EntityItemProperties properties = EntityItem::getProperties(); // get the properties from our base class @@ -66,7 +66,7 @@ EntityItemProperties QuadEntityItem::getProperties() const { return properties; } -bool QuadEntityItem::setProperties(const EntityItemProperties& properties) { +bool PolyLineEntityItem::setProperties(const EntityItemProperties& properties) { _quadReadWriteLock.lockForWrite(); bool somethingChanged = false; somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class @@ -84,7 +84,7 @@ bool QuadEntityItem::setProperties(const EntityItemProperties& properties) { if (wantDebug) { uint64_t now = usecTimestampNow(); int elapsed = now - getLastEdited(); - qCDebug(entities) << "QuadEntityItem::setProperties() AFTER update... edited AGO=" << elapsed << + qCDebug(entities) << "PolyLineEntityItem::setProperties() AFTER update... edited AGO=" << elapsed << "now=" << now << " getLastEdited()=" << getLastEdited(); } setLastEdited(properties._lastEdited); @@ -95,7 +95,7 @@ bool QuadEntityItem::setProperties(const EntityItemProperties& properties) { } -bool QuadEntityItem::appendPoint(const glm::vec3& point) { +bool PolyLineEntityItem::appendPoint(const glm::vec3& point) { if (_points.size() > MAX_POINTS_PER_LINE - 1) { qDebug() << "MAX POINTS REACHED!"; return false; @@ -110,12 +110,12 @@ bool QuadEntityItem::appendPoint(const glm::vec3& point) { return true; } -bool QuadEntityItem::setStrokeWidths(const QVector& strokeWidths ) { +bool PolyLineEntityItem::setStrokeWidths(const QVector& strokeWidths ) { _strokeWidths = strokeWidths; return true; } -bool QuadEntityItem::setNormals(const QVector& normals) { +bool PolyLineEntityItem::setNormals(const QVector& normals) { if (_points.size () < 2 || _strokeWidths.size() < 2) { return false; } @@ -145,7 +145,7 @@ bool QuadEntityItem::setNormals(const QVector& normals) { return true; } -bool QuadEntityItem::setLinePoints(const QVector& points) { +bool PolyLineEntityItem::setLinePoints(const QVector& points) { if (points.size() > MAX_POINTS_PER_LINE) { return false; } @@ -183,7 +183,7 @@ bool QuadEntityItem::setLinePoints(const QVector& points) { return true; } -int QuadEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, +int PolyLineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { _quadReadWriteLock.lockForWrite(); @@ -202,7 +202,7 @@ int QuadEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, // TODO: eventually only include properties changed since the params.lastViewFrustumSent time -EntityPropertyFlags QuadEntityItem::getEntityProperties(EncodeBitstreamParams& params) const { +EntityPropertyFlags PolyLineEntityItem::getEntityProperties(EncodeBitstreamParams& params) const { EntityPropertyFlags requestedProperties = EntityItem::getEntityProperties(params); requestedProperties += PROP_COLOR; requestedProperties += PROP_LINE_WIDTH; @@ -211,7 +211,7 @@ EntityPropertyFlags QuadEntityItem::getEntityProperties(EncodeBitstreamParams& p return requestedProperties; } -void QuadEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, +void PolyLineEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, EntityTreeElementExtraEncodeData* modelTreeElementExtraEncodeData, EntityPropertyFlags& requestedProperties, EntityPropertyFlags& propertyFlags, @@ -228,7 +228,7 @@ void QuadEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits APPEND_ENTITY_PROPERTY(PROP_STROKE_WIDTHS, getStrokeWidths()); } -void QuadEntityItem::debugDump() const { +void PolyLineEntityItem::debugDump() const { quint64 now = usecTimestampNow(); qCDebug(entities) << " QUAD EntityItem id:" << getEntityItemID() << "---------------------------------------------"; qCDebug(entities) << " color:" << _color[0] << "," << _color[1] << "," << _color[2]; diff --git a/libraries/entities/src/QuadEntityItem.h b/libraries/entities/src/PolyLineEntityItem.h similarity index 91% rename from libraries/entities/src/QuadEntityItem.h rename to libraries/entities/src/PolyLineEntityItem.h index ae7cac4e52..dad7569efb 100644 --- a/libraries/entities/src/QuadEntityItem.h +++ b/libraries/entities/src/PolyLineEntityItem.h @@ -1,5 +1,5 @@ // -// QuadEntityItem.h +// PolyLineEntityItem.h // libraries/entities/src // // Created by Seth Alves on 5/11/15. @@ -9,16 +9,16 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#ifndef hifi_QuadEntityItem_h -#define hifi_QuadEntityItem_h +#ifndef hifi_PolyLineEntityItem_h +#define hifi_PolyLineEntityItem_h #include "EntityItem.h" -class QuadEntityItem : public EntityItem { +class PolyLineEntityItem : public EntityItem { public: static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); - QuadEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties); + PolyLineEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties); ALLOW_INSTANTIATION // This class can be instantiated @@ -67,7 +67,7 @@ class QuadEntityItem : public EntityItem { virtual ShapeType getShapeType() const { return SHAPE_TYPE_LINE; } - // never have a ray intersection pick a QuadEntityItem. + // never have a ray intersection pick a PolyLineEntityItem. virtual bool supportsDetailedRayIntersection() const { return true; } virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, @@ -88,4 +88,4 @@ class QuadEntityItem : public EntityItem { mutable QReadWriteLock _quadReadWriteLock; }; -#endif // hifi_QuadEntityItem_h +#endif // hifi_PolyLineEntityItem_h From 43b1751db3b3a165c6a68e37c27fe08e42d89070 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Wed, 1 Jul 2015 18:33:42 -0700 Subject: [PATCH 18/61] fixed network bug for polylines --- .../src/RenderablePolyLineEntityItem.cpp | 16 +++------------- libraries/octree/src/OctreePacketData.cpp | 1 + 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index a447d69d70..17c97a5e9e 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -20,11 +20,6 @@ #include "RenderablePolyLineEntityItem.h" - - - - - EntityItemPointer RenderablePolyLineEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { return EntityItemPointer(new RenderablePolyLineEntityItem(entityID, properties)); } @@ -65,9 +60,9 @@ int generateColor() { float c1 = static_cast (rand()) / static_cast (RAND_MAX); float c2 = static_cast (rand()) / static_cast (RAND_MAX); float c3 = static_cast (rand()) / static_cast (RAND_MAX); - return ((int(c1 * 255.0f) & 0xFF)) | - ((int(c2 * 255.0f) & 0xFF) << 8) | - ((int(c3 * 255.0f) & 0xFF) << 16) | + return ((int(0.7 * 255.0f) & 0xFF)) | + ((int(0.3 * 255.0f) & 0xFF) << 8) | + ((int(0.6 * 255.0f) & 0xFF) << 16) | ((int(255.0f) & 0xFF) << 24); } @@ -78,7 +73,6 @@ void RenderablePolyLineEntityItem::updateGeometry() { _verticesBuffer.reset(new gpu::Buffer()); int vertexIndex = 0; for (int i = 0; i < _normals.size(); i++) { - compactColor = generateColor(); _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); vertexIndex++; _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); @@ -92,12 +86,8 @@ void RenderablePolyLineEntityItem::updateGeometry() { } _pointsChanged = false; - - } - - void RenderablePolyLineEntityItem::render(RenderArgs* args) { if (_points.size() < 2 || _vertices.size() != _normals.size() * 2) { return; diff --git a/libraries/octree/src/OctreePacketData.cpp b/libraries/octree/src/OctreePacketData.cpp index 5c0a872a71..d8c3a88eb0 100644 --- a/libraries/octree/src/OctreePacketData.cpp +++ b/libraries/octree/src/OctreePacketData.cpp @@ -629,6 +629,7 @@ int OctreePacketData::unpackDataFromBytes(const unsigned char *dataBytes, QVecto dataBytes += sizeof(length); result.resize(length); memcpy(result.data(), dataBytes, length * sizeof(float)); + return sizeof(uint16_t) + length * sizeof(float); } int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, QByteArray& result) { From ff99f68f89b560fcc73d0c0544a093dfd8b4e8ab Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Wed, 1 Jul 2015 22:20:53 -0700 Subject: [PATCH 19/61] fix quad logic --- .../src/RenderablePolyLineEntityItem.cpp | 37 +++++++++++-------- libraries/entities/src/PolyLineEntityItem.cpp | 19 ++++++++-- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index 17c97a5e9e..01f30a4a06 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -67,28 +67,33 @@ int generateColor() { } void RenderablePolyLineEntityItem::updateGeometry() { - QReadLocker lock(&_quadReadWriteLock); - int compactColor = generateColor(); - _numVertices = 0; - _verticesBuffer.reset(new gpu::Buffer()); - int vertexIndex = 0; - for (int i = 0; i < _normals.size(); i++) { - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); - vertexIndex++; - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); - _verticesBuffer->append(sizeof(int), (gpu::Byte*)&compactColor); - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); - vertexIndex++; - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); - _verticesBuffer->append(sizeof(int), (gpu::Byte*)&compactColor); - - _numVertices +=2; + if (_pointsChanged) { + int compactColor = generateColor(); + _numVertices = 0; + _verticesBuffer.reset(new gpu::Buffer()); + int vertexIndex = 0; + for (int i = 0; i < _normals.size(); i++) { + compactColor = generateColor(); + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); + vertexIndex++; + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); + _verticesBuffer->append(sizeof(int), (gpu::Byte*)&_color); + + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); + vertexIndex++; + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); + _verticesBuffer->append(sizeof(int), (gpu::Byte*)_color); + + _numVertices +=2; + } + _pointsChanged = false; } _pointsChanged = false; } void RenderablePolyLineEntityItem::render(RenderArgs* args) { + QWriteLocker lock(&_quadReadWriteLock); if (_points.size() < 2 || _vertices.size() != _normals.size() * 2) { return; } diff --git a/libraries/entities/src/PolyLineEntityItem.cpp b/libraries/entities/src/PolyLineEntityItem.cpp index fb01f341a7..66aa84b1a6 100644 --- a/libraries/entities/src/PolyLineEntityItem.cpp +++ b/libraries/entities/src/PolyLineEntityItem.cpp @@ -46,7 +46,7 @@ _strokeWidths(QVector(0)) } EntityItemProperties PolyLineEntityItem::getProperties() const { - _quadReadWriteLock.lockForWrite(); + QWriteLocker lock(&_quadReadWriteLock); EntityItemProperties properties = EntityItem::getProperties(); // get the properties from our base class @@ -67,7 +67,7 @@ EntityItemProperties PolyLineEntityItem::getProperties() const { } bool PolyLineEntityItem::setProperties(const EntityItemProperties& properties) { - _quadReadWriteLock.lockForWrite(); + QWriteLocker lock(&_quadReadWriteLock); bool somethingChanged = false; somethingChanged = EntityItem::setProperties(properties); // set the properties in our base class @@ -121,7 +121,7 @@ bool PolyLineEntityItem::setNormals(const QVector& normals) { } _normals = normals; _vertices.clear(); - //Go through and create vertices for triangle strip based on normals + //Go through and create vertices for triangle strip based on normalsa if (_normals.size() != _points.size()) { return false; } @@ -130,8 +130,18 @@ bool PolyLineEntityItem::setNormals(const QVector& normals) { float width = _strokeWidths.at(i); point = _points.at(i); //Get tangent + tangent = _points.at(i+1) - point; - binormal = glm::normalize(glm::cross(tangent, normals.at(i))) * width; + glm::vec3 normal = normals.at(i); +// qDebug() << "next point" << _points.at(i+1) << "cur point" << point; + binormal = glm::normalize(glm::cross(tangent, normal)) * _lineWidth; +// qDebug() << "glm cross" << glm::cross(tangent, normal); +// qDebug()<< "binormal" << binormal; +// qDebug() <<"dot " << glm::dot(tangent, normals.at(i)); + + if(binormal.x != binormal.x) { + + } v1 = point + binormal; v2 = point - binormal; _vertices << v1 << v2; @@ -219,6 +229,7 @@ void PolyLineEntityItem::appendSubclassData(OctreePacketData* packetData, Encode int& propertyCount, OctreeElement::AppendState& appendState) const { + QWriteLocker lock(&_quadReadWriteLock); bool successPropertyFits = true; APPEND_ENTITY_PROPERTY(PROP_COLOR, getColor()); From feeba2a02931423d31ab63d9533221f2b405209b Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Wed, 1 Jul 2015 23:03:03 -0700 Subject: [PATCH 20/61] testing for serialization --- .../src/RenderablePolyLineEntityItem.cpp | 39 +++++++++---------- libraries/entities/src/PolyLineEntityItem.cpp | 5 --- libraries/shared/src/RegisteredMetaTypes.cpp | 8 +++- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index 01f30a4a06..d991d3193f 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -67,29 +67,28 @@ int generateColor() { } void RenderablePolyLineEntityItem::updateGeometry() { - if (_pointsChanged) { - int compactColor = generateColor(); - _numVertices = 0; - _verticesBuffer.reset(new gpu::Buffer()); - int vertexIndex = 0; - for (int i = 0; i < _normals.size(); i++) { - compactColor = generateColor(); - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); - vertexIndex++; - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); - _verticesBuffer->append(sizeof(int), (gpu::Byte*)&_color); - - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); - vertexIndex++; - _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); - _verticesBuffer->append(sizeof(int), (gpu::Byte*)_color); - - _numVertices +=2; - } - _pointsChanged = false; + int compactColor = generateColor(); + _numVertices = 0; + _verticesBuffer.reset(new gpu::Buffer()); + int vertexIndex = 0; + for (int i = 0; i < _normals.size(); i++) { + compactColor = generateColor(); + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); + vertexIndex++; + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); + _verticesBuffer->append(sizeof(int), (gpu::Byte*)&_color); + + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); + vertexIndex++; + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); + _verticesBuffer->append(sizeof(int), (gpu::Byte*)_color); + + _numVertices +=2; } _pointsChanged = false; + _pointsChanged = false; + } void RenderablePolyLineEntityItem::render(RenderArgs* args) { diff --git a/libraries/entities/src/PolyLineEntityItem.cpp b/libraries/entities/src/PolyLineEntityItem.cpp index 66aa84b1a6..a99be1a757 100644 --- a/libraries/entities/src/PolyLineEntityItem.cpp +++ b/libraries/entities/src/PolyLineEntityItem.cpp @@ -129,15 +129,10 @@ bool PolyLineEntityItem::setNormals(const QVector& normals) { for (int i = 0; i < _points.size()-1; i++) { float width = _strokeWidths.at(i); point = _points.at(i); - //Get tangent tangent = _points.at(i+1) - point; glm::vec3 normal = normals.at(i); -// qDebug() << "next point" << _points.at(i+1) << "cur point" << point; binormal = glm::normalize(glm::cross(tangent, normal)) * _lineWidth; -// qDebug() << "glm cross" << glm::cross(tangent, normal); -// qDebug()<< "binormal" << binormal; -// qDebug() <<"dot " << glm::dot(tangent, normals.at(i)); if(binormal.x != binormal.x) { diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index 3674e09dae..f349c568bd 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -90,10 +90,16 @@ QScriptValue qVectorVec3ToScriptValue(QScriptEngine* engine, const QVector qVectorFloatFromScriptValue(const QScriptValue& array) { + if(!array.isArray()) { + return QVector(); + } QVector newVector; int length = array.property("length").toInteger(); + newVector.reserve(length); for (int i = 0; i < length; i++) { - newVector << array.property(i).toVariant().toFloat(); + if(array.property(i).isNumber()) { + newVector << array.property(i).toNumber(); + } } return newVector; From 163c479bd34371edc7cf76674e887eb63fca1c27 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Thu, 2 Jul 2015 10:41:57 -0700 Subject: [PATCH 21/61] bug fixes for polyline --- libraries/entities/src/EntityItemProperties.cpp | 1 + libraries/entities/src/PolyLineEntityItem.cpp | 15 ++++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 538175cba2..c21fe0b9d5 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -823,6 +823,7 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem APPEND_ENTITY_PROPERTY(PROP_LINE_WIDTH, properties.getLineWidth()); APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, properties.getLinePoints()); APPEND_ENTITY_PROPERTY(PROP_NORMALS, properties.getNormals()); + APPEND_ENTITY_PROPERTY(PROP_STROKE_WIDTHS, properties.getStrokeWidths()); } APPEND_ENTITY_PROPERTY(PROP_MARKETPLACE_ID, properties.getMarketplaceID()); diff --git a/libraries/entities/src/PolyLineEntityItem.cpp b/libraries/entities/src/PolyLineEntityItem.cpp index a99be1a757..f25c40012c 100644 --- a/libraries/entities/src/PolyLineEntityItem.cpp +++ b/libraries/entities/src/PolyLineEntityItem.cpp @@ -116,10 +116,16 @@ bool PolyLineEntityItem::setStrokeWidths(const QVector& strokeWidths ) { } bool PolyLineEntityItem::setNormals(const QVector& normals) { + + _normals = normals; + if( _normals.size() != _points.size()) { + qDebug() << "RETURN FALSE"; + return false; + } + if (_points.size () < 2 || _strokeWidths.size() < 2) { return false; } - _normals = normals; _vertices.clear(); //Go through and create vertices for triangle strip based on normalsa if (_normals.size() != _points.size()) { @@ -132,11 +138,9 @@ bool PolyLineEntityItem::setNormals(const QVector& normals) { tangent = _points.at(i+1) - point; glm::vec3 normal = normals.at(i); - binormal = glm::normalize(glm::cross(tangent, normal)) * _lineWidth; + binormal = glm::normalize(glm::cross(tangent, normal)) * width; - if(binormal.x != binormal.x) { - - } + assert(binormal.x == binormal.x); v1 = point + binormal; v2 = point - binormal; _vertices << v1 << v2; @@ -213,6 +217,7 @@ EntityPropertyFlags PolyLineEntityItem::getEntityProperties(EncodeBitstreamParam requestedProperties += PROP_LINE_WIDTH; requestedProperties += PROP_LINE_POINTS; requestedProperties += PROP_NORMALS; + requestedProperties += PROP_STROKE_WIDTHS; return requestedProperties; } From c4b780d922c59d10941f09e0281392a58b05df3f Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Thu, 2 Jul 2015 11:14:06 -0700 Subject: [PATCH 22/61] added accessors for deferred lighting shaders --- .../render-utils/src/DeferredLightingEffect.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index 3b6d1bf327..68bb4c05c4 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -117,6 +117,22 @@ void DeferredLightingEffect::init(AbstractViewStateInterface* viewState) { lp->setAmbientSpherePreset(gpu::SphericalHarmonics::Preset(_ambientLightMode % gpu::SphericalHarmonics::NUM_PRESET)); } +gpu::ShaderPointer DeferredLightingEffect::getSimpleVertexShader() const { + if (_simpleProgram) { + return _simpleProgram->getProgram()->getShaders()[gpu::Shader::VERTEX]; + } else { + return gpu::ShaderPointer(); + } +} + +gpu::ShaderPointer DeferredLightingEffect::getSimplePixelShader() const { + if (_simpleProgram) { + return _simpleProgram->getProgram()->getShaders()[gpu::Shader::PIXEL]; + } else { + return gpu::ShaderPointer(); + } +} + void DeferredLightingEffect::bindSimpleProgram(gpu::Batch& batch, bool textured, bool culled, bool emmisive) { if (emmisive) { if (culled) { From f52d9c12936129c6407325fc69a4b414fb680b26 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Thu, 2 Jul 2015 14:54:09 -0700 Subject: [PATCH 23/61] added paint scripts for polylines --- examples/hydraPolyLinePaint.js | 233 +++++++++++++++++++++++++++++++ examples/mousePolyLinePaint.js | 248 +++++++++++++++++++++++++++++++++ 2 files changed, 481 insertions(+) create mode 100644 examples/hydraPolyLinePaint.js create mode 100644 examples/mousePolyLinePaint.js diff --git a/examples/hydraPolyLinePaint.js b/examples/hydraPolyLinePaint.js new file mode 100644 index 0000000000..b0336a48da --- /dev/null +++ b/examples/hydraPolyLinePaint.js @@ -0,0 +1,233 @@ +// +// hydraPaint.js +// examples +// +// Created by Eric Levin on 5/14/15. +// Copyright 2014 High Fidelity, Inc. +// +// This script allows you to paint with the hydra! +// +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// +var LEFT = 0; +var RIGHT = 1; +var LASER_WIDTH = 3; +var LASER_COLOR = { + red: 50, + green: 150, + blue: 200 +}; +var TRIGGER_THRESHOLD = .02; + +var MAX_POINTS_PER_LINE = 50; + +var LIFETIME = 6000; +var DRAWING_DEPTH = 2; +var LINE_DIMENSIONS = 100; + + +var DISTANCE_FROM_HAND = 5; +var MIN_POINT_DISTANCE = 0.01; + +var MIN_BRUSH_RADIUS = 0.04; +var MAX_BRUSH_RADIUS = 0.08; + +var RIGHT_BUTTON_1 = 7 +var RIGHT_BUTTON_2 = 8 +var RIGHT_BUTTON_3 = 9; +var RIGHT_BUTTON_4 = 10 +var LEFT_BUTTON_1 = 1; +var LEFT_BUTTON_2 = 2; +var LEFT_BUTTON_3 = 3; +var LEFT_BUTTON_4 = 4; + +var colorPalette = [{ + red: 10, + green: 208, + blue: 60 +}, { + red: 214, + green: 91, + blue: 67 +}, { + red: 192, + green: 41, + blue: 66 +}, { + red: 84, + green: 36, + blue: 55 +}, { + red: 83, + green: 119, + blue: 122 +}]; + +var MIN_STROKE_WIDTH = 0.002; +var MAX_STROKE_WIDTH = 0.05; + +function controller(side, cycleColorButton) { + this.triggerHeld = false; + this.triggerThreshold = 0.9; + this.side = side; + this.palm = 2 * side; + this.tip = 2 * side + 1; + this.trigger = side; + this.cycleColorButton = cycleColorButton; + + this.points = []; + this.normals = []; + this.strokeWidths = []; + + this.currentColorIndex = 0; + this.currentColor = colorPalette[this.currentColorIndex]; + + + this.brush = Entities.addEntity({ + type: 'Sphere', + position: { + x: 0, + y: 0, + z: 0 + }, + color: this.currentColor, + dimensions: { + x: MIN_BRUSH_RADIUS, + y: MIN_BRUSH_RADIUS, + z: MIN_BRUSH_RADIUS + } + }); + + this.cycleColor = function() { + this.currentColor = colorPalette[++this.currentColorIndex]; + if (this.currentColorIndex === colorPalette.length - 1) { + this.currentColorIndex = -1; + } + } + this.newLine = function(position) { + print("NEW LINE") + this.linePosition = position; + this.line = Entities.addEntity({ + position: position, + type: "PolyLine", + color: this.currentColor, + dimensions: { + x: LINE_DIMENSIONS, + y: LINE_DIMENSIONS, + z: LINE_DIMENSIONS + }, + lineWidth: 0.1, + lifetime: LIFETIME + }); + this.points = []; + this.normals = [] + this.strokeWidths = []; + } + + this.update = function(deltaTime) { + this.updateControllerState(); + + var newBrushPosOffset = Vec3.multiply(Vec3.normalize(Vec3.subtract(this.tipPosition, this.palmPosition)), DRAWING_DEPTH); + var newBrushPos = Vec3.sum(this.palmPosition, newBrushPosOffset); + var brushRadius = map(this.triggerValue, TRIGGER_THRESHOLD, 1, MIN_BRUSH_RADIUS, MAX_BRUSH_RADIUS) + Entities.editEntity(this.brush, { + position: newBrushPos, + color: this.currentColor, + dimensions: { + x: brushRadius, + y: brushRadius, + z: brushRadius + } + }); + + + if (this.triggerValue > TRIGGER_THRESHOLD && !this.drawing) { + this.newLine(this.palmPosition); + this.drawing = true; + } else if (this.drawing && this.triggerValue < TRIGGER_THRESHOLD) { + this.drawing = false; + } + + if (this.drawing) { + var localPoint = Vec3.subtract(newBrushPos, this.linePosition); + if (Vec3.distance(localPoint, this.points[this.points.length - 1]) < MIN_POINT_DISTANCE) { + // print("NOT ENOUGH DISTANCE BETWEEN POINTS!!"); + return; + } + + this.points.push(localPoint); + var normal = computeNormal(newBrushPos, Camera.getPosition()); + + this.normals.push(normal); + var strokeWidth = map(this.triggerValue, TRIGGER_THRESHOLD, 1, MIN_STROKE_WIDTH, MAX_STROKE_WIDTH); + this.strokeWidths.push(strokeWidth); + Entities.editEntity(this.line, { + linePoints: this.points, + normals: this.normals, + strokeWidths: this.strokeWidths, + color: this.currentColor + }); + + if (this.points.length > MAX_POINTS_PER_LINE) { + this.newLine(newBrushPos); + this.points.push(Vec3.subtract(newBrushPos, this.linePosition)); + this.normals.push(computeNormal(newBrushPos, Camera.getPosition())); + this.strokeWidths.push(MIN_STROKE_WIDTH); + } + } + } + + + this.updateControllerState = function() { + this.cycleColorButtonPressed = Controller.isButtonPressed(this.cycleColorButton); + this.palmPosition = Controller.getSpatialControlPosition(this.palm); + this.tipPosition = Controller.getSpatialControlPosition(this.tip); + this.palmNormal = Controller.getSpatialControlNormal(this.palm); + this.triggerValue = Controller.getTriggerValue(this.trigger); + + + if (this.prevCycleColorButtonPressed === true && this.cycleColorButtonPressed === false) { + this.cycleColor(); + Entities.editEntity(this.brush, { + // color: this.currentColor + }); + } + + this.prevCycleColorButtonPressed = this.cycleColorButtonPressed; + + } + + this.cleanup = function() { + Entities.deleteEntity(this.brush); + } +} + +function computeNormal(p1, p2) { + return Vec3.normalize(Vec3.subtract(p2, p1)); +} + +function update(deltaTime) { + leftController.update(deltaTime); + rightController.update(deltaTime); +} + +function scriptEnding() { + leftController.cleanup(); + rightController.cleanup(); +} + +function vectorIsZero(v) { + return v.x === 0 && v.y === 0 && v.z === 0; +} + + +var rightController = new controller(RIGHT, RIGHT_BUTTON_4); +var leftController = new controller(LEFT, LEFT_BUTTON_4); +Script.update.connect(update); +Script.scriptEnding.connect(scriptEnding); + +function map(value, min1, max1, min2, max2) { + return min2 + (max2 - min2) * ((value - min1) / (max1 - min1)); +} \ No newline at end of file diff --git a/examples/mousePolyLinePaint.js b/examples/mousePolyLinePaint.js new file mode 100644 index 0000000000..14949c6c5c --- /dev/null +++ b/examples/mousePolyLinePaint.js @@ -0,0 +1,248 @@ +// +// paint.js +// examples +// +// Created by Eric Levin on 6/4/15. +// Copyright 2014 High Fidelity, Inc. +// +// This script allows you to paint with the hydra or mouse! +// +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +var LINE_DIMENSIONS = 5; +var LIFETIME = 6000; +var EVENT_CHANGE_THRESHOLD = 200; +var LINE_WIDTH = .05; +var MAX_POINTS = 10; +var points = []; +var normals = []; +var strokeWidths = []; +var count = 0; +var prevEvent = null; + +var MIN_POINT_DISTANCE = .01; + +var colorPalette = [{ + red: 236, + green: 208, + blue: 120 +}, { + red: 214, + green: 91, + blue: 67 +}, { + red: 192, + green: 41, + blue: 66 +}, { + red: 84, + green: 36, + blue: 55 +}, { + red: 83, + green: 119, + blue: 122 +}]; + +var currentColorIndex = 0; +var currentColor = colorPalette[currentColorIndex]; + +function cycleColor() { + currentColor = colorPalette[++currentColorIndex]; + if (currentColorIndex === colorPalette.length - 1) { + currentColorIndex = -1; + } + +} + +MousePaint(); + +function MousePaint() { + var DRAWING_DISTANCE = 5; + var lines = []; + var isDrawing = false; + + var line, linePosition; + + var BRUSH_SIZE = .05; + + var brush = Entities.addEntity({ + type: 'Sphere', + position: { + x: 0, + y: 0, + z: 0 + }, + color: currentColor, + dimensions: { + x: BRUSH_SIZE, + y: BRUSH_SIZE, + z: BRUSH_SIZE + } + }); + + + function newLine(position) { + linePosition = position; + line = Entities.addEntity({ + position: position, + type: "PolyLine", + color: currentColor, + dimensions: { + x: LINE_DIMENSIONS, + y: LINE_DIMENSIONS, + z: LINE_DIMENSIONS + }, + linePoints: [], + lineWidth: LINE_WIDTH, + lifetime: LIFETIME + }); + points = []; + normals = [] + strokeWidths = []; + } + + + + function mouseMoveEvent(event) { + + var pickRay = Camera.computePickRay(event.x, event.y); + count++; + var worldPoint = computeWorldPoint(pickRay); + Entities.editEntity(brush, { + position: worldPoint + }); + + + if (!isDrawing) { + return; + } + var eventChange = Math.sqrt(Math.pow(event.x - prevEvent.x, 2) + Math.pow(event.y - prevEvent.y, 2)); + //print("EVENT CHANGE " + eventChange) + if (eventChange > EVENT_CHANGE_THRESHOLD) { + print("PAST THRESHOLD!") + return; + } + + + var localPoint = computeLocalPoint(worldPoint); + if (Vec3.distance(points[points.length - 1], localPoint) < MIN_POINT_DISTANCE) { + print("NOT ENOUGH DISTANCE BETWEEN MOUSE MOVES") + return; + } + var width = (Math.sin(count / 100) + 1.1) / 10; + points.push(localPoint) + normals.push(computeNormal(worldPoint, pickRay.origin)); + strokeWidths.push(.07); + Entities.editEntity(line, { + strokeWidths: strokeWidths, + linePoints: points, + normals: normals, + }); + if (points.length > MAX_POINTS) { + newLine(worldPoint); + var localPoint = computeLocalPoint(worldPoint); + points.push(localPoint); + normals.push(computeNormal(worldPoint, pickRay.origin)); + strokeWidths.push(.07); + + } + prevEvent = event; + } + + function undoStroke() { + var deletedLine = lines.pop(); + var deletedLineProps = Entities.getEntityProperties(deletedLine); + deletedLines.push(deletedLineProps); + Entities.deleteEntity(deletedLine); + } + + function redoStroke() { + var restoredLine = Entities.addEntity(deletedLines.pop()); + Entities.addEntity(restoredLine); + lines.push(restoredLine); + } + + function computeNormal(p1, p2) { + return Vec3.normalize(Vec3.subtract(p2, p1)); + } + + function computeWorldPoint(pickRay) { + var addVector = Vec3.multiply(Vec3.normalize(pickRay.direction), DRAWING_DISTANCE); + return Vec3.sum(pickRay.origin, addVector); + } + + function computeLocalPoint(worldPoint) { + + var localPoint = Vec3.subtract(worldPoint, linePosition); + return localPoint; + } + + function mousePressEvent(event) { + if (!event.isLeftButton) { + isDrawing = false; + return; + } + var pickRay = Camera.computePickRay(event.x, event.y); + prevEvent = {x: event.x, y:event.y}; + var worldPoint = computeWorldPoint(pickRay); + newLine(worldPoint); + var localPoint = computeLocalPoint(worldPoint); + points.push(localPoint); + normals.push(computeNormal(worldPoint, pickRay.origin)); + strokeWidths.push(0.07); + isDrawing = true; + + } + + function mouseReleaseEvent() { + isDrawing = false; + } + + function keyPressEvent(event) { + if (event.text === "SPACE") { + cycleColor(); + Entities.editEntity(brush, { + color: currentColor + }); + } + if (event.text === "z") { + undoStroke(); + } + if (event.text === "x") { + redoStroke(); + } + } + + + + function cleanup() { + lines.forEach(function(line) { + // Entities.deleteEntity(line); + }); + Entities.deleteEntity(brush); + + } + + Controller.mousePressEvent.connect(mousePressEvent); + Controller.mouseReleaseEvent.connect(mouseReleaseEvent); + Controller.mouseMoveEvent.connect(mouseMoveEvent); + Script.scriptEnding.connect(cleanup); + + Controller.keyPressEvent.connect(keyPressEvent); +} + + +function randFloat(low, high) { + return low + Math.random() * (high - low); +} + + +function randInt(low, high) { + return Math.floor(randFloat(low, high)); +} + +function map(value, min1, max1, min2, max2) { + return min2 + (max2 - min2) * ((value - min1) / (max1 - min1)); +} \ No newline at end of file From b3b12bd2dc73f7a1215116b2407a1f92569e3c53 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Mon, 13 Jul 2015 08:54:53 -0700 Subject: [PATCH 24/61] adding custom shader for flipped normals --- examples/hydraPolyLinePaint.js | 2 +- libraries/entities-renderer/CMakeLists.txt | 2 + .../src/DeferredBufferWrite.slh | 54 +++++++++++++++++++ .../src/RenderablePolyLineEntityItem.cpp | 8 ++- .../entities-renderer/src/paintStroke.slf | 29 ++++++++++ .../entities-renderer/src/paintStroke.slv | 35 ++++++++++++ libraries/entities/src/PolyLineEntityItem.cpp | 2 + 7 files changed, 129 insertions(+), 3 deletions(-) create mode 100755 libraries/entities-renderer/src/DeferredBufferWrite.slh create mode 100644 libraries/entities-renderer/src/paintStroke.slf create mode 100644 libraries/entities-renderer/src/paintStroke.slv diff --git a/examples/hydraPolyLinePaint.js b/examples/hydraPolyLinePaint.js index b0336a48da..1c20655a03 100644 --- a/examples/hydraPolyLinePaint.js +++ b/examples/hydraPolyLinePaint.js @@ -28,7 +28,7 @@ var DRAWING_DEPTH = 2; var LINE_DIMENSIONS = 100; -var DISTANCE_FROM_HAND = 5; +var DISTANCE_FROM_HAND = 2; var MIN_POINT_DISTANCE = 0.01; var MIN_BRUSH_RADIUS = 0.04; diff --git a/libraries/entities-renderer/CMakeLists.txt b/libraries/entities-renderer/CMakeLists.txt index 40ca1ccbc9..8237121a20 100644 --- a/libraries/entities-renderer/CMakeLists.txt +++ b/libraries/entities-renderer/CMakeLists.txt @@ -1,5 +1,7 @@ set(TARGET_NAME entities-renderer) +AUTOSCRIBE_SHADER_LIB(gpu model render) + # use setup_hifi_library macro to setup our project and link appropriate Qt modules setup_hifi_library(Widgets OpenGL Network Script) diff --git a/libraries/entities-renderer/src/DeferredBufferWrite.slh b/libraries/entities-renderer/src/DeferredBufferWrite.slh new file mode 100755 index 0000000000..a7f4055bba --- /dev/null +++ b/libraries/entities-renderer/src/DeferredBufferWrite.slh @@ -0,0 +1,54 @@ + +<@if not DEFERRED_BUFFER_WRITE_SLH@> +<@def DEFERRED_BUFFER_WRITE_SLH@> + +// the glow intensity +uniform float glowIntensity; + +// the alpha threshold +uniform float alphaThreshold; + +float evalOpaqueFinalAlpha(float alpha, float mapAlpha) { + return mix(alpha * glowIntensity, 1.0 - alpha * glowIntensity, step(mapAlpha, alphaThreshold)); +} + +void packDeferredFragment(vec3 normal, float alpha, vec3 diffuse, vec3 specular, float shininess) { + if (alpha != glowIntensity) { + discard; + } + gl_FragData[0] = vec4(diffuse.rgb, alpha); + gl_FragData[1] = vec4(normal, 0.0) * 0.5 + vec4(0.5, 0.5, 0.5, 1.0); + gl_FragData[2] = vec4(specular, shininess / 128.0); +} + +void packDeferredFragmentLightmap(vec3 normal, float alpha, vec3 diffuse, vec3 specular, float shininess, vec3 emissive) { + if (alpha != glowIntensity) { + discard; + } + + gl_FragData[0] = vec4(diffuse.rgb, alpha); + //gl_FragData[1] = vec4(normal, 0.0) * 0.5 + vec4(0.5, 0.5, 0.5, 1.0); + gl_FragData[1] = vec4(normal, 0.0) * 0.5 + vec4(0.5, 0.5, 0.5, 0.5); + gl_FragData[2] = vec4(emissive, shininess / 128.0); +} + +void packDeferredFragmentTranslucent(vec3 normal, float alpha, vec3 diffuse, vec3 specular, float shininess) { + if (alpha <= alphaThreshold) { + discard; + } + + gl_FragData[0] = vec4(diffuse.rgb, alpha); + // gl_FragData[1] = vec4(normal, 0.0) * 0.5 + vec4(0.5, 0.5, 0.5, 1.0); + // gl_FragData[2] = vec4(specular, shininess / 128.0); +} + +<@endif@> diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index d991d3193f..17d0c3dbda 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -19,6 +19,10 @@ #include "RenderablePolyLineEntityItem.h" +#include "paintStroke_vert.h" +#include "paintStroke_frag.h" + + EntityItemPointer RenderablePolyLineEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { return EntityItemPointer(new RenderablePolyLineEntityItem(entityID, properties)); @@ -41,8 +45,8 @@ void RenderablePolyLineEntityItem::createPipeline() { _format->setAttribute(gpu::Stream::NORMAL, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), NORMAL_OFFSET); _format->setAttribute(gpu::Stream::COLOR, 0, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA), COLOR_OFFSET); - auto VS = DependencyManager::get()->getSimpleVertexShader(); - auto PS = DependencyManager::get()->getSimplePixelShader(); + auto VS = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(paintStroke_vert))); + auto PS = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(paintStroke_frag))); gpu::ShaderPointer program = gpu::ShaderPointer(gpu::Shader::createProgram(VS, PS)); gpu::Shader::BindingSet slotBindings; diff --git a/libraries/entities-renderer/src/paintStroke.slf b/libraries/entities-renderer/src/paintStroke.slf new file mode 100644 index 0000000000..e09e81155a --- /dev/null +++ b/libraries/entities-renderer/src/paintStroke.slf @@ -0,0 +1,29 @@ +<@include gpu/Config.slh@> +<$VERSION_HEADER$> +// Generated on <$_SCRIBE_DATE$> +// +// paintStroke.frag +// fragment shader +// +// Created by Andrzej Kapolka on 9/15/14. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +<@include DeferredBufferWrite.slh@> + +// the interpolated normal +varying vec4 interpolatedNormal; + + +void main(void) { + vec3 color = vec3(0.9, 0.2, 0.9); + packDeferredFragment( + normalize(interpolatedNormal.xyz), + glowIntensity, + gl_Color.rgb, + gl_FrontMaterial.specular.rgb, + gl_FrontMaterial.shininess); +} diff --git a/libraries/entities-renderer/src/paintStroke.slv b/libraries/entities-renderer/src/paintStroke.slv new file mode 100644 index 0000000000..d865a4651e --- /dev/null +++ b/libraries/entities-renderer/src/paintStroke.slv @@ -0,0 +1,35 @@ +<@include gpu/Config.slh@> +<$VERSION_HEADER$> +// Generated on <$_SCRIBE_DATE$> +// +// paintStroke.vert +// vertex shader +// +// Created by Andrzej Kapolka on 9/15/14. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +<@include gpu/Transform.slh@> + +<$declareStandardTransform()$> + +// the interpolated normal +varying vec4 interpolatedNormal; + +void main(void) { + gl_TexCoord[0] = gl_MultiTexCoord0; + + // pass along the diffuse color + gl_FrontColor = gl_Color; + + // standard transform + TransformCamera cam = getTransformCamera(); + TransformObject obj = getTransformObject(); + <$transformModelToClipPos(cam, obj, gl_Vertex, gl_Position)$> + <$transformModelToEyeDir(cam, obj, gl_Normal, interpolatedNormal.xyz)$> + + interpolatedNormal = vec4(normalize(interpolatedNormal.xyz), 0.0); +} \ No newline at end of file diff --git a/libraries/entities/src/PolyLineEntityItem.cpp b/libraries/entities/src/PolyLineEntityItem.cpp index f25c40012c..a5d27d8f93 100644 --- a/libraries/entities/src/PolyLineEntityItem.cpp +++ b/libraries/entities/src/PolyLineEntityItem.cpp @@ -126,6 +126,8 @@ bool PolyLineEntityItem::setNormals(const QVector& normals) { if (_points.size () < 2 || _strokeWidths.size() < 2) { return false; } + +// int minArraySize = glm::min(_normals.size(), _points.size()) _vertices.clear(); //Go through and create vertices for triangle strip based on normalsa if (_normals.size() != _points.size()) { From dab31e5e42778a8ca556d3534400535973f1e640 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Mon, 13 Jul 2015 11:32:12 -0700 Subject: [PATCH 25/61] setNormals refactor --- libraries/entities/src/PolyLineEntityItem.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/libraries/entities/src/PolyLineEntityItem.cpp b/libraries/entities/src/PolyLineEntityItem.cpp index a5d27d8f93..1c8af5b5a9 100644 --- a/libraries/entities/src/PolyLineEntityItem.cpp +++ b/libraries/entities/src/PolyLineEntityItem.cpp @@ -118,21 +118,18 @@ bool PolyLineEntityItem::setStrokeWidths(const QVector& strokeWidths ) { bool PolyLineEntityItem::setNormals(const QVector& normals) { _normals = normals; - if( _normals.size() != _points.size()) { - qDebug() << "RETURN FALSE"; + if( _normals.size() != _points.size() || _normals.size() != _strokeWidths.size()) { + qDebug() << "normals dont equal points!"; return false; } - if (_points.size () < 2 || _strokeWidths.size() < 2) { + if (_points.size () < 2) { + qDebug() << "points size is less than 2!"; return false; } // int minArraySize = glm::min(_normals.size(), _points.size()) _vertices.clear(); - //Go through and create vertices for triangle strip based on normalsa - if (_normals.size() != _points.size()) { - return false; - } glm::vec3 v1, v2, tangent, binormal, point; for (int i = 0; i < _points.size()-1; i++) { float width = _strokeWidths.at(i); @@ -197,7 +194,7 @@ bool PolyLineEntityItem::setLinePoints(const QVector& points) { int PolyLineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { - _quadReadWriteLock.lockForWrite(); + QWriteLocker lock(&_quadReadWriteLock); int bytesRead = 0; const unsigned char* dataAt = data; @@ -207,7 +204,6 @@ int PolyLineEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* da READ_ENTITY_PROPERTY(PROP_NORMALS, QVector, setNormals); READ_ENTITY_PROPERTY(PROP_STROKE_WIDTHS, QVector, setStrokeWidths); - _quadReadWriteLock.unlock(); return bytesRead; } From f54d1cf0f6047c2cc015b6fd0769b3374fdb6aaa Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Mon, 13 Jul 2015 14:24:26 -0700 Subject: [PATCH 26/61] smoother line drawing over network --- libraries/entities-renderer/src/paintStroke.slf | 7 +------ libraries/entities/src/PolyLineEntityItem.cpp | 11 ++++------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/libraries/entities-renderer/src/paintStroke.slf b/libraries/entities-renderer/src/paintStroke.slf index 6ff805f79a..4755025483 100644 --- a/libraries/entities-renderer/src/paintStroke.slf +++ b/libraries/entities-renderer/src/paintStroke.slf @@ -19,13 +19,8 @@ varying vec4 interpolatedNormal; vec3 newNormal = normalize(interpolatedNormal.xyz); -int frontCondition = 1 -int(gl_FrontFacing) * 2; -//if (!gl_FrontFacing) { - // newNormal = -newNormal; -//} - - void main(void) { + int frontCondition = 1 -int(gl_FrontFacing) * 2; vec3 color = vec3(0.9, 0.2, 0.9); packDeferredFragment( newNormal * frontCondition, diff --git a/libraries/entities/src/PolyLineEntityItem.cpp b/libraries/entities/src/PolyLineEntityItem.cpp index 1c8af5b5a9..5099bfeb27 100644 --- a/libraries/entities/src/PolyLineEntityItem.cpp +++ b/libraries/entities/src/PolyLineEntityItem.cpp @@ -62,7 +62,6 @@ EntityItemProperties PolyLineEntityItem::getProperties() const { properties._glowLevel = getGlowLevel(); properties._glowLevelChanged = false; - _quadReadWriteLock.unlock(); return properties; } @@ -89,8 +88,6 @@ bool PolyLineEntityItem::setProperties(const EntityItemProperties& properties) { } setLastEdited(properties._lastEdited); } - - _quadReadWriteLock.unlock(); return somethingChanged; } @@ -116,21 +113,21 @@ bool PolyLineEntityItem::setStrokeWidths(const QVector& strokeWidths ) { } bool PolyLineEntityItem::setNormals(const QVector& normals) { - _normals = normals; - if( _normals.size() != _points.size() || _normals.size() != _strokeWidths.size()) { - qDebug() << "normals dont equal points!"; + if( _normals.size() != _points.size()) { +// qDebug() << "normals dont equal points!"; return false; } if (_points.size () < 2) { - qDebug() << "points size is less than 2!"; +// qDebug() << "points size is less than 2!"; return false; } // int minArraySize = glm::min(_normals.size(), _points.size()) _vertices.clear(); glm::vec3 v1, v2, tangent, binormal, point; + for (int i = 0; i < _points.size()-1; i++) { float width = _strokeWidths.at(i); point = _points.at(i); From c4194cd03082623487e212c2e77bb6b99713facf Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Tue, 14 Jul 2015 09:38:55 -0700 Subject: [PATCH 27/61] adding textures --- .../src/RenderablePolyLineEntityItem.cpp | 7 ++++++- .../src/RenderablePolyLineEntityItem.h | 1 + libraries/entities-renderer/src/paintStroke.slf | 15 ++++++++++++--- libraries/entities-renderer/src/paintStroke.slv | 3 ++- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index 17d0c3dbda..fcacbcd458 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -13,7 +13,8 @@ #include #include - +#include +#include #include #include @@ -40,6 +41,10 @@ gpu::Stream::FormatPointer RenderablePolyLineEntityItem::_format; void RenderablePolyLineEntityItem::createPipeline() { static const int NORMAL_OFFSET = 12; static const int COLOR_OFFSET = 24; + + auto textureCache = DependencyManager::get(); + textureCache->getImageTexture(PathUtils::resourcesPath() + "images/paintStrokeTexture.png"); + _format.reset(new gpu::Stream::Format()); _format->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), 0); _format->setAttribute(gpu::Stream::NORMAL, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), NORMAL_OFFSET); diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h index ae92f47ae0..f057f2e785 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h @@ -36,6 +36,7 @@ protected: void updateGeometry(); gpu::BufferPointer _verticesBuffer; unsigned int _numVertices; + gpu::TexturePointer _texture; }; diff --git a/libraries/entities-renderer/src/paintStroke.slf b/libraries/entities-renderer/src/paintStroke.slf index 4755025483..791b1d4107 100644 --- a/libraries/entities-renderer/src/paintStroke.slf +++ b/libraries/entities-renderer/src/paintStroke.slf @@ -16,16 +16,25 @@ // the interpolated normal varying vec4 interpolatedNormal; - +varying vec4 modelPosition; vec3 newNormal = normalize(interpolatedNormal.xyz); +float rand(vec2 point){ + return fract(sin(dot(point.xy ,vec2(12.9898,78.233))) * 43758.5453); +} + void main(void) { int frontCondition = 1 -int(gl_FrontFacing) * 2; - vec3 color = vec3(0.9, 0.2, 0.9); + vec3 color = gl_Color.rgb; + color.r = mix(0, -1.0, modelPosition.x); + if(color.r > 1.0) { + color.b = 1.0; + } + packDeferredFragment( newNormal * frontCondition, glowIntensity, - gl_Color.rgb, + color, gl_FrontMaterial.specular.rgb, gl_FrontMaterial.shininess); } diff --git a/libraries/entities-renderer/src/paintStroke.slv b/libraries/entities-renderer/src/paintStroke.slv index d865a4651e..1bf40316a1 100644 --- a/libraries/entities-renderer/src/paintStroke.slv +++ b/libraries/entities-renderer/src/paintStroke.slv @@ -18,7 +18,7 @@ // the interpolated normal varying vec4 interpolatedNormal; - +varying vec4 modelPosition; void main(void) { gl_TexCoord[0] = gl_MultiTexCoord0; @@ -31,5 +31,6 @@ void main(void) { <$transformModelToClipPos(cam, obj, gl_Vertex, gl_Position)$> <$transformModelToEyeDir(cam, obj, gl_Normal, interpolatedNormal.xyz)$> + modelPosition = gl_Vertex; interpolatedNormal = vec4(normalize(interpolatedNormal.xyz), 0.0); } \ No newline at end of file From 5e3e1e4567ad280793ec7d5f060bf8ec2d2d646c Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Fri, 17 Jul 2015 15:00:10 -0700 Subject: [PATCH 28/61] adding texture --- .../entities-renderer/src/RenderablePolyLineEntityItem.cpp | 4 +++- .../entities-renderer/src/RenderablePolyLineEntityItem.h | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index fcacbcd458..b44be2acf2 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -37,13 +37,15 @@ PolyLineEntityItem(entityItemID, properties) { gpu::PipelinePointer RenderablePolyLineEntityItem::_pipeline; gpu::Stream::FormatPointer RenderablePolyLineEntityItem::_format; +gpu::TexturePointer RenderablePolyLineEntityItem::_texture; void RenderablePolyLineEntityItem::createPipeline() { static const int NORMAL_OFFSET = 12; static const int COLOR_OFFSET = 24; auto textureCache = DependencyManager::get(); - textureCache->getImageTexture(PathUtils::resourcesPath() + "images/paintStrokeTexture.png"); + _texture = textureCache->getImageTexture(PathUtils::resourcesPath() + "images/paintStrokeTexture.png"); + _format.reset(new gpu::Stream::Format()); _format->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), 0); diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h index f057f2e785..9bd9a8e973 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h @@ -31,12 +31,12 @@ public: static gpu::PipelinePointer _pipeline; static gpu::Stream::FormatPointer _format; + static gpu::TexturePointer _texture; protected: void updateGeometry(); gpu::BufferPointer _verticesBuffer; unsigned int _numVertices; - gpu::TexturePointer _texture; }; From bad6aa8f0a4f615b6500e905b869e49e7e0e1bfc Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Fri, 17 Jul 2015 15:39:44 -0700 Subject: [PATCH 29/61] adding textures to poly line" --- libraries/entities-renderer/src/paintStroke.slf | 4 ---- libraries/entities/src/PolyLineEntityItem.cpp | 15 +++++++++------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/libraries/entities-renderer/src/paintStroke.slf b/libraries/entities-renderer/src/paintStroke.slf index 791b1d4107..5fd3ca9c44 100644 --- a/libraries/entities-renderer/src/paintStroke.slf +++ b/libraries/entities-renderer/src/paintStroke.slf @@ -26,10 +26,6 @@ float rand(vec2 point){ void main(void) { int frontCondition = 1 -int(gl_FrontFacing) * 2; vec3 color = gl_Color.rgb; - color.r = mix(0, -1.0, modelPosition.x); - if(color.r > 1.0) { - color.b = 1.0; - } packDeferredFragment( newNormal * frontCondition, diff --git a/libraries/entities/src/PolyLineEntityItem.cpp b/libraries/entities/src/PolyLineEntityItem.cpp index 5099bfeb27..e8d504091d 100644 --- a/libraries/entities/src/PolyLineEntityItem.cpp +++ b/libraries/entities/src/PolyLineEntityItem.cpp @@ -114,21 +114,24 @@ bool PolyLineEntityItem::setStrokeWidths(const QVector& strokeWidths ) { bool PolyLineEntityItem::setNormals(const QVector& normals) { _normals = normals; - if( _normals.size() != _points.size()) { -// qDebug() << "normals dont equal points!"; - return false; - } - if (_points.size () < 2) { // qDebug() << "points size is less than 2!"; return false; } + int minVectorSize = _normals.size(); + if (_points.size() < minVectorSize) { + minVectorSize = _points.size(); + } + if (_strokeWidths.size() < minVectorSize) { + minVectorSize = _strokeWidths.size(); + } + // int minArraySize = glm::min(_normals.size(), _points.size()) _vertices.clear(); glm::vec3 v1, v2, tangent, binormal, point; - for (int i = 0; i < _points.size()-1; i++) { + for (int i = 0; i < minVectorSize-1; i++) { float width = _strokeWidths.at(i); point = _points.at(i); From 1e34de1c51fbbdc038c8c1e09e7816f9334ac4cf Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Mon, 20 Jul 2015 10:44:38 -0700 Subject: [PATCH 30/61] adding in screen space effect for getting hit --- .../src/RenderablePolyLineEntityItem.cpp | 15 +-- libraries/render-utils/src/HitEffect.cpp | 105 ++++++++++++++++++ libraries/render-utils/src/HitEffect.h | 34 ++++++ .../render-utils/src/RenderDeferredTask.cpp | 4 + libraries/render-utils/src/hit_effect.slf | 29 +++++ libraries/render-utils/src/hit_effect.slv | 21 ++++ 6 files changed, 195 insertions(+), 13 deletions(-) create mode 100644 libraries/render-utils/src/HitEffect.cpp create mode 100644 libraries/render-utils/src/HitEffect.h create mode 100644 libraries/render-utils/src/hit_effect.slf create mode 100644 libraries/render-utils/src/hit_effect.slv diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index b44be2acf2..735bdd2229 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -67,23 +67,13 @@ void RenderablePolyLineEntityItem::createPipeline() { gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); _pipeline = gpu::PipelinePointer(gpu::Pipeline::create(program, state)); } -int generateColor() { - float c1 = static_cast (rand()) / static_cast (RAND_MAX); - float c2 = static_cast (rand()) / static_cast (RAND_MAX); - float c3 = static_cast (rand()) / static_cast (RAND_MAX); - return ((int(0.7 * 255.0f) & 0xFF)) | - ((int(0.3 * 255.0f) & 0xFF) << 8) | - ((int(0.6 * 255.0f) & 0xFF) << 16) | - ((int(255.0f) & 0xFF) << 24); -} void RenderablePolyLineEntityItem::updateGeometry() { - int compactColor = generateColor(); _numVertices = 0; _verticesBuffer.reset(new gpu::Buffer()); int vertexIndex = 0; for (int i = 0; i < _normals.size(); i++) { - compactColor = generateColor(); + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); vertexIndex++; _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); @@ -119,7 +109,6 @@ void RenderablePolyLineEntityItem::render(RenderArgs* args) { if (_pointsChanged) { updateGeometry(); } - gpu::Batch& batch = *args->_batch; Transform transform = Transform(); @@ -127,7 +116,7 @@ void RenderablePolyLineEntityItem::render(RenderArgs* args) { transform.setRotation(getRotation()); batch.setModelTransform(transform); - + batch.setResourceTexture(0, _texture); batch.setPipeline(_pipeline); batch.setInputFormat(_format); diff --git a/libraries/render-utils/src/HitEffect.cpp b/libraries/render-utils/src/HitEffect.cpp new file mode 100644 index 0000000000..1b81c3b85f --- /dev/null +++ b/libraries/render-utils/src/HitEffect.cpp @@ -0,0 +1,105 @@ +// +// HitEffect.cpp +// interface/src/renderer +// +// Created by Andrzej Kapolka on 7/14/13. +// Copyright 2013 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +// include this before QOpenGLFramebufferObject, which includes an earlier version of OpenGL +#include + +#include + +#include + +#include +#include + +#include "AbstractViewStateInterface.h" +#include "HitEffect.h" +#include "ProgramObject.h" +#include "RenderUtil.h" +#include "TextureCache.h" +#include "DependencyManager.h" +#include "ViewFrustum.h" +#include "GeometryCache.h" + +#include "hit_effect_vert.h" +#include "hit_effect_frag.h" + + +HitEffect::HitEffect() { +} + +const gpu::PipelinePointer& HitEffect::getHitEffectPipeline() { + if (!_hitEffectPipeline) { + auto vs = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(hit_effect_vert))); + auto ps = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(hit_effect_frag))); + gpu::ShaderPointer program = gpu::ShaderPointer(gpu::Shader::createProgram(vs, ps)); + + + gpu::Shader::BindingSet slotBindings; + gpu::Shader::makeProgram(*program, slotBindings); + + _screenSizeLocation = program->getUniforms().findLocation("screenSize"); + + gpu::StatePointer state = gpu::StatePointer(new gpu::State()); + + state->setDepthTest(false, false, gpu::LESS_EQUAL); + + // Blend on transparent + state->setBlendFunction(true, + gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA); + + + // Good to go add the brand new pipeline + _hitEffectPipeline.reset(gpu::Pipeline::create(program, state)); + } + return _hitEffectPipeline; +} + + + + +void HitEffect::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext) { + + // create a simple pipeline that does: + + assert(renderContext->args); + assert(renderContext->args->_viewFrustum); + RenderArgs* args = renderContext->args; + + // Allright, something to render let's do it + gpu::Batch batch; + + glm::mat4 projMat; + Transform viewMat; + args->_viewFrustum->evalProjectionMatrix(projMat); + args->_viewFrustum->evalViewTransform(viewMat); + batch.setProjectionTransform(projMat); + batch.setViewTransform(viewMat); + batch.setModelTransform(Transform()); + + + + + // bind the first gpu::Pipeline we need - for calculating occlusion buffer + batch.setPipeline(getHitEffectPipeline()); + + + glm::vec4 color(0.0f, 0.0f, 0.0f, 1.0f); + glm::vec2 bottomLeft(-1.0f, -1.0f); + glm::vec2 topRight(1.0f, 1.0f); + DependencyManager::get()->renderQuad(batch, bottomLeft, topRight, color); + + + // Ready to render + renderContext->args->_context->syncCache(); + args->_context->render((batch)); + +} + diff --git a/libraries/render-utils/src/HitEffect.h b/libraries/render-utils/src/HitEffect.h new file mode 100644 index 0000000000..3ee05a27aa --- /dev/null +++ b/libraries/render-utils/src/HitEffect.h @@ -0,0 +1,34 @@ +// +// hitEffect.h +// hifi +// +// Created by eric levin on 7/17/15. +// +// + +#ifndef hifi_hitEffect_h +#define hifi_hitEffect_h + +#include +#include "render/DrawTask.h" + +class AbstractViewStateInterface; +class ProgramObject; + +class HitEffect { +public: + + HitEffect(); + + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); + typedef render::Job::Model JobModel; + + const gpu::PipelinePointer& getHitEffectPipeline(); + +private: + + gpu::PipelinePointer _hitEffectPipeline; + GLuint _screenSizeLocation; +}; + +#endif diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index fab134913d..95e0344313 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -16,6 +16,7 @@ #include "ViewFrustum.h" #include "RenderArgs.h" #include "TextureCache.h" +#include "HitEffect.h" #include "render/DrawStatus.h" @@ -54,6 +55,7 @@ RenderDeferredTask::RenderDeferredTask() : Task() { _jobs.push_back(Job(new DepthSortItems::JobModel("DepthSortOpaque", _jobs.back().getOutput()))); auto& renderedOpaques = _jobs.back().getOutput(); _jobs.push_back(Job(new DrawOpaqueDeferred::JobModel("DrawOpaqueDeferred", _jobs.back().getOutput()))); + _jobs.push_back(Job(new DrawLight::JobModel("DrawLight"))); _jobs.push_back(Job(new ResetGLState::JobModel())); _jobs.push_back(Job(new RenderDeferred::JobModel("RenderDeferred"))); @@ -75,7 +77,9 @@ RenderDeferredTask::RenderDeferredTask() : Task() { _drawStatusJobIndex = _jobs.size() - 1; _jobs.push_back(Job(new DrawOverlay3D::JobModel("DrawOverlay3D"))); + _jobs.push_back(Job(new HitEffect::JobModel("HitEffect"))); _jobs.push_back(Job(new ResetGLState::JobModel())); + // Give ourselves 3 frmaes of timer queries _timerQueries.push_back(gpu::QueryPointer(new gpu::Query())); diff --git a/libraries/render-utils/src/hit_effect.slf b/libraries/render-utils/src/hit_effect.slf new file mode 100644 index 0000000000..cd94de3620 --- /dev/null +++ b/libraries/render-utils/src/hit_effect.slf @@ -0,0 +1,29 @@ +<@include gpu/Config.slh@> +<$VERSION_HEADER$> +// Generated on <$_SCRIBE_DATE$> +// +// ambient_occlusion.frag +// fragment shader +// +// Created by Eric Levin on 7/20 +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// +<@include gpu/Transform.slh@> +<$declareStandardTransform()$> +<@include DeferredBufferWrite.slh@> + +void main(void) { + + TransformCamera cam = getTransformCamera(); + vec4 myViewport; + <$transformCameraViewport(cam, myViewport)$> + vec2 center = vec2(myViewport.z/2.0, myViewport.w/2.0); + float distFromCenter = distance(center, gl_FragCoord.xy); + //normalize + distFromCenter = distFromCenter/myViewport.z; + float alpha = mix(0.0, 1.0, distFromCenter); + gl_FragColor = vec4(0.7, 0.0, 0.0, alpha); +} \ No newline at end of file diff --git a/libraries/render-utils/src/hit_effect.slv b/libraries/render-utils/src/hit_effect.slv new file mode 100644 index 0000000000..c12e3e71f8 --- /dev/null +++ b/libraries/render-utils/src/hit_effect.slv @@ -0,0 +1,21 @@ +<@include gpu/Config.slh@> +<$VERSION_HEADER$> +// Generated on <$_SCRIBE_DATE$> +// +// ambient_occlusion.vert +// vertex shader +// +// Created by Niraj Venkat on 7/20/15. +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +<@include gpu/Transform.slh@> + +<$declareStandardTransform()$> + +void main(void) { + gl_Position = gl_Vertex; +} \ No newline at end of file From 9fc54a604037c343feb90e2106b9b539bee35a27 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Mon, 20 Jul 2015 15:33:21 -0700 Subject: [PATCH 31/61] getting closer to texturing properly --- .../src/RenderablePolyLineEntityItem.cpp | 34 ++++++++++++++----- .../entities-renderer/src/paintStroke.slf | 13 +++++-- .../entities-renderer/src/paintStroke.slv | 9 +++-- .../render-utils/src/RenderDeferredTask.cpp | 1 - 4 files changed, 42 insertions(+), 15 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index 735bdd2229..b107ad884a 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -41,26 +41,29 @@ gpu::TexturePointer RenderablePolyLineEntityItem::_texture; void RenderablePolyLineEntityItem::createPipeline() { static const int NORMAL_OFFSET = 12; - static const int COLOR_OFFSET = 24; +// static const int COLOR_OFFSET = 24; + static const int TEXTURE_OFFSET = 24; auto textureCache = DependencyManager::get(); - _texture = textureCache->getImageTexture(PathUtils::resourcesPath() + "images/paintStrokeTexture.png"); + _texture = textureCache->getImageTexture(PathUtils::resourcesPath() + "images/paintStrokeTexture.jpeg"); _format.reset(new gpu::Stream::Format()); _format->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), 0); _format->setAttribute(gpu::Stream::NORMAL, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), NORMAL_OFFSET); - _format->setAttribute(gpu::Stream::COLOR, 0, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA), COLOR_OFFSET); +// _format->setAttribute(gpu::Stream::COLOR, 0, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA), COLOR_OFFSET); + _format->setAttribute(gpu::Stream::TEXCOORD, 0, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV), TEXTURE_OFFSET); auto VS = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(paintStroke_vert))); auto PS = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(paintStroke_frag))); gpu::ShaderPointer program = gpu::ShaderPointer(gpu::Shader::createProgram(VS, PS)); gpu::Shader::BindingSet slotBindings; +// const GLint PAINTSTROKE_GPU_SLOT = 0; +// slotBindings.insert(gpu::Shader::Binding(std::string("paintStrokeTextureBinding"), PAINTSTROKE_GPU_SLOT)); gpu::Shader::makeProgram(*program, slotBindings); gpu::StatePointer state = gpu::StatePointer(new gpu::State()); - //state->setCullMode(gpu::State::CULL_BACK); state->setDepthTest(true, true, gpu::LESS_EQUAL); state->setBlendFunction(false, gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, @@ -72,17 +75,30 @@ void RenderablePolyLineEntityItem::updateGeometry() { _numVertices = 0; _verticesBuffer.reset(new gpu::Buffer()); int vertexIndex = 0; + vec2 uv; for (int i = 0; i < _normals.size(); i++) { - + if(i % 2 == 0){ + uv = vec2(0.0, 1.0); + } else { + uv = vec2(1.0, 1.0); + } + _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); - vertexIndex++; _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); - _verticesBuffer->append(sizeof(int), (gpu::Byte*)&_color); +// _verticesBuffer->append(sizeof(int), (gpu::Byte*)&_color); + _verticesBuffer->append(sizeof(glm::vec2), (gpu::Byte*)&uv); + vertexIndex++; + if(i % 2 == 0){ + uv = vec2(0.0, 0.0); + } else { + uv = vec2(1, 1.0); + } _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); - vertexIndex++; _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); - _verticesBuffer->append(sizeof(int), (gpu::Byte*)_color); +// _verticesBuffer->append(sizeof(int), (gpu::Byte*)_color); + _verticesBuffer->append(sizeof(glm::vec2), (const gpu::Byte*)&uv); + vertexIndex++; _numVertices +=2; } diff --git a/libraries/entities-renderer/src/paintStroke.slf b/libraries/entities-renderer/src/paintStroke.slf index 5fd3ca9c44..4e2a219d18 100644 --- a/libraries/entities-renderer/src/paintStroke.slf +++ b/libraries/entities-renderer/src/paintStroke.slf @@ -14,23 +14,30 @@ <@include DeferredBufferWrite.slh@> + +// the diffuse texture +uniform sampler2D originalTexture; // the interpolated normal varying vec4 interpolatedNormal; varying vec4 modelPosition; vec3 newNormal = normalize(interpolatedNormal.xyz); +varying vec2 varTexcoord; + float rand(vec2 point){ return fract(sin(dot(point.xy ,vec2(12.9898,78.233))) * 43758.5453); } + + void main(void) { + vec4 texel = texture2D(originalTexture, varTexcoord); int frontCondition = 1 -int(gl_FrontFacing) * 2; vec3 color = gl_Color.rgb; - packDeferredFragment( newNormal * frontCondition, - glowIntensity, - color, + glowIntensity * texel.a, + color * texel.rgb, gl_FrontMaterial.specular.rgb, gl_FrontMaterial.shininess); } diff --git a/libraries/entities-renderer/src/paintStroke.slv b/libraries/entities-renderer/src/paintStroke.slv index 1bf40316a1..ca4e86139f 100644 --- a/libraries/entities-renderer/src/paintStroke.slv +++ b/libraries/entities-renderer/src/paintStroke.slv @@ -5,7 +5,7 @@ // paintStroke.vert // vertex shader // -// Created by Andrzej Kapolka on 9/15/14. +// Created by Eric Levin on 7/20/15. // Copyright 2014 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. @@ -19,8 +19,13 @@ // the interpolated normal varying vec4 interpolatedNormal; varying vec4 modelPosition; + +//the diffuse texture +varying vec2 varTexcoord; + void main(void) { - gl_TexCoord[0] = gl_MultiTexCoord0; + + varTexcoord = gl_MultiTexCoord0.st; // pass along the diffuse color gl_FrontColor = gl_Color; diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 95e0344313..70f28bcd3d 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -77,7 +77,6 @@ RenderDeferredTask::RenderDeferredTask() : Task() { _drawStatusJobIndex = _jobs.size() - 1; _jobs.push_back(Job(new DrawOverlay3D::JobModel("DrawOverlay3D"))); - _jobs.push_back(Job(new HitEffect::JobModel("HitEffect"))); _jobs.push_back(Job(new ResetGLState::JobModel())); From b9affba93f42f5a85010a546f4b48da012d82d45 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Tue, 21 Jul 2015 09:56:09 -0700 Subject: [PATCH 32/61] textures working --- .../src/RenderablePolyLineEntityItem.cpp | 22 +++++++++++-------- .../src/RenderablePolyLineEntityItem.h | 1 + .../entities-renderer/src/paintStroke.slf | 17 ++++++++------ 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index b107ad884a..4d8ba21653 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -38,6 +38,7 @@ PolyLineEntityItem(entityItemID, properties) { gpu::PipelinePointer RenderablePolyLineEntityItem::_pipeline; gpu::Stream::FormatPointer RenderablePolyLineEntityItem::_format; gpu::TexturePointer RenderablePolyLineEntityItem::_texture; +GLint RenderablePolyLineEntityItem::PAINTSTROKE_GPU_SLOT; void RenderablePolyLineEntityItem::createPipeline() { static const int NORMAL_OFFSET = 12; @@ -45,9 +46,11 @@ void RenderablePolyLineEntityItem::createPipeline() { static const int TEXTURE_OFFSET = 24; auto textureCache = DependencyManager::get(); - _texture = textureCache->getImageTexture(PathUtils::resourcesPath() + "images/paintStrokeTexture.jpeg"); - - + QString path = PathUtils::resourcesPath() + "images/paintStroke.png"; +// QString path = PathUtils::resourcesPath() + "images/arrow.png"; + qDebug() << "IMAGE PATHHHH ******: " << path; + _texture = textureCache->getImageTexture(path); +// _texture = textureCache->getBlueTexture(); _format.reset(new gpu::Stream::Format()); _format->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), 0); _format->setAttribute(gpu::Stream::NORMAL, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), NORMAL_OFFSET); @@ -59,8 +62,8 @@ void RenderablePolyLineEntityItem::createPipeline() { gpu::ShaderPointer program = gpu::ShaderPointer(gpu::Shader::createProgram(VS, PS)); gpu::Shader::BindingSet slotBindings; -// const GLint PAINTSTROKE_GPU_SLOT = 0; -// slotBindings.insert(gpu::Shader::Binding(std::string("paintStrokeTextureBinding"), PAINTSTROKE_GPU_SLOT)); + PAINTSTROKE_GPU_SLOT = 0; + slotBindings.insert(gpu::Shader::Binding(std::string("paintStrokeTextureBinding"), PAINTSTROKE_GPU_SLOT)); gpu::Shader::makeProgram(*program, slotBindings); gpu::StatePointer state = gpu::StatePointer(new gpu::State()); @@ -80,7 +83,7 @@ void RenderablePolyLineEntityItem::updateGeometry() { if(i % 2 == 0){ uv = vec2(0.0, 1.0); } else { - uv = vec2(1.0, 1.0); + uv = vec2(0.0, 0.0); } _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); @@ -90,9 +93,9 @@ void RenderablePolyLineEntityItem::updateGeometry() { vertexIndex++; if(i % 2 == 0){ - uv = vec2(0.0, 0.0); + uv = vec2(1.0, 1.0); } else { - uv = vec2(1, 1.0); + uv = vec2(1, 0); } _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); @@ -132,8 +135,9 @@ void RenderablePolyLineEntityItem::render(RenderArgs* args) { transform.setRotation(getRotation()); batch.setModelTransform(transform); - batch.setResourceTexture(0, _texture); batch.setPipeline(_pipeline); + batch.setResourceTexture(0, _texture); + batch.setInputFormat(_format); batch.setInputBuffer(0, _verticesBuffer, 0, _format->getChannels().at(0)._stride); diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h index 9bd9a8e973..e8f70a562b 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h @@ -32,6 +32,7 @@ public: static gpu::PipelinePointer _pipeline; static gpu::Stream::FormatPointer _format; static gpu::TexturePointer _texture; + static GLint PAINTSTROKE_GPU_SLOT; protected: void updateGeometry(); diff --git a/libraries/entities-renderer/src/paintStroke.slf b/libraries/entities-renderer/src/paintStroke.slf index 4e2a219d18..b8adb3445f 100644 --- a/libraries/entities-renderer/src/paintStroke.slf +++ b/libraries/entities-renderer/src/paintStroke.slf @@ -17,11 +17,10 @@ // the diffuse texture uniform sampler2D originalTexture; + // the interpolated normal varying vec4 interpolatedNormal; varying vec4 modelPosition; -vec3 newNormal = normalize(interpolatedNormal.xyz); - varying vec2 varTexcoord; float rand(vec2 point){ @@ -31,13 +30,17 @@ float rand(vec2 point){ void main(void) { + + vec3 newNormal = normalize(interpolatedNormal.xyz); + vec4 texel = texture2D(originalTexture, varTexcoord); int frontCondition = 1 -int(gl_FrontFacing) * 2; - vec3 color = gl_Color.rgb; + // vec3 color = gl_Color.rgb; packDeferredFragment( newNormal * frontCondition, - glowIntensity * texel.a, - color * texel.rgb, - gl_FrontMaterial.specular.rgb, - gl_FrontMaterial.shininess); + glowIntensity, + texel.rgb, + //vec3(varTexcoord, 0.0), + vec3(0.01, 0.01, 0.01), + 10.0); } From e1f8871ec9a7596f67a2e78a82e80386dd4aae59 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Tue, 21 Jul 2015 10:48:25 -0700 Subject: [PATCH 33/61] drawing trails at end of stroke --- .../src/RenderablePolyLineEntityItem.cpp | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index 4d8ba21653..a44e0f5a3f 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -80,10 +80,15 @@ void RenderablePolyLineEntityItem::updateGeometry() { int vertexIndex = 0; vec2 uv; for (int i = 0; i < _normals.size(); i++) { - if(i % 2 == 0){ - uv = vec2(0.0, 1.0); - } else { - uv = vec2(0.0, 0.0); +// if(i % 2 == 0){ + uv = vec2(0.1, 0.9); +// } else { +// uv = vec2(1, 1); +// } + + + if(i > _normals.size() -3) { + uv = vec2(0.8, 0.01); } _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); @@ -92,10 +97,14 @@ void RenderablePolyLineEntityItem::updateGeometry() { _verticesBuffer->append(sizeof(glm::vec2), (gpu::Byte*)&uv); vertexIndex++; - if(i % 2 == 0){ - uv = vec2(1.0, 1.0); - } else { - uv = vec2(1, 0); +// if(i % 2 == 0){ + uv = vec2(0.1, 0.2); +// } else { +// uv = vec2(0, 1); +// } + + if(i > _normals.size() -3) { + uv = vec2(0.8, 0.1); } _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); @@ -136,7 +145,7 @@ void RenderablePolyLineEntityItem::render(RenderArgs* args) { batch.setModelTransform(transform); batch.setPipeline(_pipeline); - batch.setResourceTexture(0, _texture); + batch.setResourceTexture(PAINTSTROKE_GPU_SLOT, _texture); batch.setInputFormat(_format); From 99856df112a634e67fd000029240e2b75ed8b493 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Tue, 21 Jul 2015 11:43:10 -0700 Subject: [PATCH 34/61] tail strip --- .../src/RenderablePolyLineEntityItem.cpp | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index a44e0f5a3f..a2a9c3a40b 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -79,16 +79,14 @@ void RenderablePolyLineEntityItem::updateGeometry() { _verticesBuffer.reset(new gpu::Buffer()); int vertexIndex = 0; vec2 uv; + int numTailStrips = 5; for (int i = 0; i < _normals.size(); i++) { -// if(i % 2 == 0){ - uv = vec2(0.1, 0.9); -// } else { -// uv = vec2(1, 1); -// } + uv = vec2(0.1, 0.9); + - if(i > _normals.size() -3) { - uv = vec2(0.8, 0.01); + if(i < numTailStrips) { + uv = vec2(0.9, 0.01); } _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); @@ -96,15 +94,10 @@ void RenderablePolyLineEntityItem::updateGeometry() { // _verticesBuffer->append(sizeof(int), (gpu::Byte*)&_color); _verticesBuffer->append(sizeof(glm::vec2), (gpu::Byte*)&uv); vertexIndex++; + uv = vec2(0.1, 0.2); -// if(i % 2 == 0){ - uv = vec2(0.1, 0.2); -// } else { -// uv = vec2(0, 1); -// } - - if(i > _normals.size() -3) { - uv = vec2(0.8, 0.1); + if(i < numTailStrips) { + uv = vec2(0.9, 0.9); } _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); From b452566d75cad5349d525a7f5beeeaf18be8de7a Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Wed, 22 Jul 2015 10:57:03 -0700 Subject: [PATCH 35/61] transparent textures and setting up 9-patch system for texture scaling --- .../src/RenderablePolyLineEntityItem.cpp | 52 ++++++++++++++++--- .../entities-renderer/src/paintStroke.slf | 6 +-- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index a2a9c3a40b..7b2d584579 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -68,7 +68,7 @@ void RenderablePolyLineEntityItem::createPipeline() { gpu::StatePointer state = gpu::StatePointer(new gpu::State()); state->setDepthTest(true, true, gpu::LESS_EQUAL); - state->setBlendFunction(false, + state->setBlendFunction(true, gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); _pipeline = gpu::PipelinePointer(gpu::Pipeline::create(program, state)); @@ -79,14 +79,20 @@ void RenderablePolyLineEntityItem::updateGeometry() { _verticesBuffer.reset(new gpu::Buffer()); int vertexIndex = 0; vec2 uv; + float zero = 0.01; //For some reason actual 0.0 gives color that's not part of texture... + //Actually it's specifying exact border between two colors in texture... int numTailStrips = 5; for (int i = 0; i < _normals.size(); i++) { - uv = vec2(0.1, 0.9); + uv = vec2(0.26, zero); - - + //tail if(i < numTailStrips) { - uv = vec2(0.9, 0.01); + uv = vec2(0.76, zero); + } + + //head + if( i > _normals.size() - numTailStrips ) { + uv = vec2(zero, zero); } _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); @@ -94,10 +100,13 @@ void RenderablePolyLineEntityItem::updateGeometry() { // _verticesBuffer->append(sizeof(int), (gpu::Byte*)&_color); _verticesBuffer->append(sizeof(glm::vec2), (gpu::Byte*)&uv); vertexIndex++; - uv = vec2(0.1, 0.2); + uv = vec2(0.26, zero); - if(i < numTailStrips) { - uv = vec2(0.9, 0.9); + if (i < numTailStrips) { + uv = vec2(0.76, zero); + } + if (i > _normals.size() -numTailStrips) { + uv = vec2(zero, zero); } _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); @@ -113,6 +122,33 @@ void RenderablePolyLineEntityItem::updateGeometry() { } +namespace render { + template <> const ItemKey payloadGetKey(const RenderableEntityItemProxy::Pointer& payload) { + if (payload && payload->entity) { + if (payload->entity->getType() == EntityTypes::Light) { + return ItemKey::Builder::light(); + } + } + return ItemKey::Builder::opaqueShape(); + } + + template <> const Item::Bound payloadGetBound(const RenderableEntityItemProxy::Pointer& payload) { + if (payload && payload->entity) { + return payload->entity->getAABox(); + } + return render::Item::Bound(); + } + template <> void payloadRender(const RenderableEntityItemProxy::Pointer& payload, RenderArgs* args) { + if (args) { + if (payload && payload->entity && payload->entity->getVisible()) { + payload->entity->render(args); + } + } + } +} + + + void RenderablePolyLineEntityItem::render(RenderArgs* args) { QWriteLocker lock(&_quadReadWriteLock); if (_points.size() < 2 || _vertices.size() != _normals.size() * 2) { diff --git a/libraries/entities-renderer/src/paintStroke.slf b/libraries/entities-renderer/src/paintStroke.slf index b8adb3445f..ed7c737897 100644 --- a/libraries/entities-renderer/src/paintStroke.slf +++ b/libraries/entities-renderer/src/paintStroke.slf @@ -36,11 +36,11 @@ void main(void) { vec4 texel = texture2D(originalTexture, varTexcoord); int frontCondition = 1 -int(gl_FrontFacing) * 2; // vec3 color = gl_Color.rgb; - packDeferredFragment( + //vec3 normal, float alpha, vec3 diffuse, vec3 specular, float shininess + packDeferredFragmentTranslucent( newNormal * frontCondition, - glowIntensity, + texel.a, texel.rgb, - //vec3(varTexcoord, 0.0), vec3(0.01, 0.01, 0.01), 10.0); } From 75220a32e7b54a5cd51f2f7d94965d39d216e390 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Wed, 22 Jul 2015 14:49:48 -0700 Subject: [PATCH 36/61] tail dynamic --- .../src/RenderablePolyLineEntityItem.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index 7b2d584579..8df5af989e 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -80,6 +80,10 @@ void RenderablePolyLineEntityItem::updateGeometry() { int vertexIndex = 0; vec2 uv; float zero = 0.01; //For some reason actual 0.0 gives color that's not part of texture... + float tailStart = 0.76; + float tailEnd = 1.0; + float tailLength = tailEnd - tailStart; + float currentTail; //Actually it's specifying exact border between two colors in texture... int numTailStrips = 5; for (int i = 0; i < _normals.size(); i++) { @@ -87,7 +91,9 @@ void RenderablePolyLineEntityItem::updateGeometry() { //tail if(i < numTailStrips) { - uv = vec2(0.76, zero); + currentTail = float(i)/numTailStrips * tailLength + tailStart; + qDebug() << "current Tail: " << currentTail; + uv = vec2(currentTail, zero); } //head @@ -102,8 +108,11 @@ void RenderablePolyLineEntityItem::updateGeometry() { vertexIndex++; uv = vec2(0.26, zero); + //tail if (i < numTailStrips) { - uv = vec2(0.76, zero); + currentTail = float(i)/numTailStrips * tailLength + tailStart; + //Go through an distrubte uv's based on percent of way through + uv = vec2(currentTail, 1); } if (i > _normals.size() -numTailStrips) { uv = vec2(zero, zero); @@ -129,7 +138,7 @@ namespace render { return ItemKey::Builder::light(); } } - return ItemKey::Builder::opaqueShape(); + return ItemKey::Builder::transparentShape(); } template <> const Item::Bound payloadGetBound(const RenderableEntityItemProxy::Pointer& payload) { From 352c42d8d44d8f0e971bf212e52aa956ea8d9224 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Wed, 22 Jul 2015 15:40:29 -0700 Subject: [PATCH 37/61] head body tail --- .../src/RenderablePolyLineEntityItem.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index 8df5af989e..ca241c5e13 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -80,15 +80,15 @@ void RenderablePolyLineEntityItem::updateGeometry() { int vertexIndex = 0; vec2 uv; float zero = 0.01; //For some reason actual 0.0 gives color that's not part of texture... - float tailStart = 0.76; - float tailEnd = 1.0; + float tailStart = 0.0; + float tailEnd = 0.25; float tailLength = tailEnd - tailStart; float currentTail; //Actually it's specifying exact border between two colors in texture... - int numTailStrips = 5; + int numTailStrips = 10; for (int i = 0; i < _normals.size(); i++) { + uv = vec2(0.26, zero); - //tail if(i < numTailStrips) { currentTail = float(i)/numTailStrips * tailLength + tailStart; @@ -98,7 +98,7 @@ void RenderablePolyLineEntityItem::updateGeometry() { //head if( i > _normals.size() - numTailStrips ) { - uv = vec2(zero, zero); + uv = vec2(0.76, zero); } _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); @@ -106,16 +106,18 @@ void RenderablePolyLineEntityItem::updateGeometry() { // _verticesBuffer->append(sizeof(int), (gpu::Byte*)&_color); _verticesBuffer->append(sizeof(glm::vec2), (gpu::Byte*)&uv); vertexIndex++; - uv = vec2(0.26, zero); + uv = vec2(0.26, 1.0); //tail if (i < numTailStrips) { currentTail = float(i)/numTailStrips * tailLength + tailStart; //Go through an distrubte uv's based on percent of way through - uv = vec2(currentTail, 1); + uv = vec2(currentTail, 1.0); } + //head if (i > _normals.size() -numTailStrips) { - uv = vec2(zero, zero); + uv = vec2(0.76, 1.0); + } _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); From 3379291b05dc3580c1a39446adc891dfb52d98c9 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Wed, 22 Jul 2015 16:13:02 -0700 Subject: [PATCH 38/61] making uv mapping DRIER --- .../src/RenderablePolyLineEntityItem.cpp | 41 ++++++++----------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index ca241c5e13..3e5b20c5e5 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -79,46 +79,41 @@ void RenderablePolyLineEntityItem::updateGeometry() { _verticesBuffer.reset(new gpu::Buffer()); int vertexIndex = 0; vec2 uv; - float zero = 0.01; //For some reason actual 0.0 gives color that's not part of texture... float tailStart = 0.0; float tailEnd = 0.25; float tailLength = tailEnd - tailStart; - float currentTail; - //Actually it's specifying exact border between two colors in texture... - int numTailStrips = 10; + + float headStart = 0.76; + float headEnd = 1.0; + float headLength = headEnd - headStart; + float uCoord, vCoord; + + int numTailStrips = 5; + int numHeadStrips = 10; + int startHeadIndex = _normals.size() - numHeadStrips; for (int i = 0; i < _normals.size(); i++) { - - uv = vec2(0.26, zero); + uCoord = 0.26; + vCoord = 0; //tail if(i < numTailStrips) { - currentTail = float(i)/numTailStrips * tailLength + tailStart; - qDebug() << "current Tail: " << currentTail; - uv = vec2(currentTail, zero); + uCoord = float(i)/numTailStrips * tailLength + tailStart; } //head - if( i > _normals.size() - numTailStrips ) { - uv = vec2(0.76, zero); + if( i > startHeadIndex) { + uCoord = float(i - startHeadIndex)/numHeadStrips * headLength + headStart; + qDebug()<< "ucoord:" << uCoord; } + uv = vec2(uCoord, vCoord); _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); // _verticesBuffer->append(sizeof(int), (gpu::Byte*)&_color); _verticesBuffer->append(sizeof(glm::vec2), (gpu::Byte*)&uv); vertexIndex++; - uv = vec2(0.26, 1.0); + - //tail - if (i < numTailStrips) { - currentTail = float(i)/numTailStrips * tailLength + tailStart; - //Go through an distrubte uv's based on percent of way through - uv = vec2(currentTail, 1.0); - } - //head - if (i > _normals.size() -numTailStrips) { - uv = vec2(0.76, 1.0); - - } + uv.y = 1.0; _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); // _verticesBuffer->append(sizeof(int), (gpu::Byte*)_color); From b44193c2adb02c5a8b72716615dcbccdd2780a63 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Wed, 22 Jul 2015 17:25:33 -0700 Subject: [PATCH 39/61] catching end of texture --- .../entities-renderer/src/RenderablePolyLineEntityItem.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index 3e5b20c5e5..3f69dcba30 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -101,9 +101,13 @@ void RenderablePolyLineEntityItem::updateGeometry() { //head if( i > startHeadIndex) { - uCoord = float(i - startHeadIndex)/numHeadStrips * headLength + headStart; + uCoord = float( (i+ 1) - startHeadIndex)/numHeadStrips * headLength + headStart; qDebug()<< "ucoord:" << uCoord; } + //make sure we map to the end of texture; +// if (i == _normals.size() -1) { +// uCoord = 1; +// } uv = vec2(uCoord, vCoord); _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); From b4a9469dffc8b67d140c1cb5f78d6832273e9195 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Tue, 28 Jul 2015 11:42:23 -0700 Subject: [PATCH 40/61] colors --- .../src/RenderablePolyLineEntityItem.cpp | 10 +++++----- libraries/entities-renderer/src/paintStroke.slf | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index 3f69dcba30..4052a33c27 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -42,8 +42,8 @@ GLint RenderablePolyLineEntityItem::PAINTSTROKE_GPU_SLOT; void RenderablePolyLineEntityItem::createPipeline() { static const int NORMAL_OFFSET = 12; -// static const int COLOR_OFFSET = 24; - static const int TEXTURE_OFFSET = 24; + static const int COLOR_OFFSET = 24; + static const int TEXTURE_OFFSET = 28; auto textureCache = DependencyManager::get(); QString path = PathUtils::resourcesPath() + "images/paintStroke.png"; @@ -54,7 +54,7 @@ void RenderablePolyLineEntityItem::createPipeline() { _format.reset(new gpu::Stream::Format()); _format->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), 0); _format->setAttribute(gpu::Stream::NORMAL, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), NORMAL_OFFSET); -// _format->setAttribute(gpu::Stream::COLOR, 0, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA), COLOR_OFFSET); + _format->setAttribute(gpu::Stream::COLOR, 0, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA), COLOR_OFFSET); _format->setAttribute(gpu::Stream::TEXCOORD, 0, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV), TEXTURE_OFFSET); auto VS = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(paintStroke_vert))); @@ -112,7 +112,7 @@ void RenderablePolyLineEntityItem::updateGeometry() { _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); -// _verticesBuffer->append(sizeof(int), (gpu::Byte*)&_color); + _verticesBuffer->append(sizeof(int), (gpu::Byte*)&_color); _verticesBuffer->append(sizeof(glm::vec2), (gpu::Byte*)&uv); vertexIndex++; @@ -120,7 +120,7 @@ void RenderablePolyLineEntityItem::updateGeometry() { uv.y = 1.0; _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); -// _verticesBuffer->append(sizeof(int), (gpu::Byte*)_color); + _verticesBuffer->append(sizeof(int), (gpu::Byte*)_color); _verticesBuffer->append(sizeof(glm::vec2), (const gpu::Byte*)&uv); vertexIndex++; diff --git a/libraries/entities-renderer/src/paintStroke.slf b/libraries/entities-renderer/src/paintStroke.slf index ed7c737897..4d54f68865 100644 --- a/libraries/entities-renderer/src/paintStroke.slf +++ b/libraries/entities-renderer/src/paintStroke.slf @@ -35,12 +35,12 @@ void main(void) { vec4 texel = texture2D(originalTexture, varTexcoord); int frontCondition = 1 -int(gl_FrontFacing) * 2; - // vec3 color = gl_Color.rgb; + vec3 color = gl_Color.rgb; //vec3 normal, float alpha, vec3 diffuse, vec3 specular, float shininess packDeferredFragmentTranslucent( newNormal * frontCondition, texel.a, - texel.rgb, + color *texel.rgb, vec3(0.01, 0.01, 0.01), 10.0); } From b2753507dc7d16bf886c1fb7bfcca883a96c19e6 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Mon, 3 Aug 2015 09:35:47 -0700 Subject: [PATCH 41/61] cleanup of comments and dead code --- interface/resources/images/paintStroke.png | Bin 0 -> 26029 bytes .../src/RenderablePolyLineEntityItem.cpp | 2 -- libraries/entities/src/PolyLineEntityItem.cpp | 14 ++------------ 3 files changed, 2 insertions(+), 14 deletions(-) create mode 100644 interface/resources/images/paintStroke.png diff --git a/interface/resources/images/paintStroke.png b/interface/resources/images/paintStroke.png new file mode 100644 index 0000000000000000000000000000000000000000..b9feb0d485ef5d7c8b3b0a1976b4b7d55652b07d GIT binary patch literal 26029 zcmV)HK)t_-P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv00000008+zyMF)x010qNS#tmY79{`x79{~mQY7#I0A&$LL_t(|+U>o0m@HXY z;Qfotth#mUE`4uxH#B>L$TA`*1BM)B8DJ0u)DgFFz;SnEM8M^99R0?9V;C14#YaVE z#1Rk?Tv$FvK~N3^G>B`n$s#S%+r4%7TT5nqf1G$bPM(U0j5Q-O>-?Ulo~p`>h&&M) zao+d5YY@kAOgmh7^IzP0`%@o#_tyb$1#Sjz2X=tTO;Pm3M}^^^0t7)2M_RuW_^OsZ zdztz3P^quZdLz>MCg6VZf2h>;&ikJMh7~?*7Z?DezE8RaTfmvV2jTIQz`a)k;B-fy z<(~<|Q$wZR*Y_Znji7-75MzY2NfR_VL z0{*P;lU_7Lut!=CfKjN_uDlm%eY?9|^7^NMjglV`V5yH!;uP1T$wA zu}S&o8vHW>@YqnP5B5EXWu%S*5Ci+b1>nQLdw|yfe}_>9ChvLIyROFw{6}I|oXakJ z=E2tjuZAgw;Q7E0+Z%;SU2iJ|CAc|M>T!|QzYF}^zE83NUIFkd3r+9UtqR*7_GjWE z@T^d&_xC-JWyCcF$IcHJtySI|V=nmLV^;is3VaYa2kZgk_eIfX0gnalOEvTKVdvEu zul*bMg^I!-;Gs44@pwG*r;6Zr_u0kF&4-N<@W;Tt`X0zKGQ!+6V~hab!`w)F&X3$& zp9cO0Bm6%BoCS7oilXOCCX*|`ZNM7v4Zz*|KDia(i)!vS2Hprfv+on|cn&c!@D||l z$=@Fa9+AAa4V(gwW84CJ4L@rgqYO-vV;>gI0B`Sm5X(vs$MLUWF5+3tjdK}uL&{CL zoBVwiBjC?tTmW$p1o2Jpe)o;z$>dGIdy}7k0)8E1`uFrhjQQS<^gWOk@h$+*vXFJJ zieTQ#*!F7jcNO1%7CXSDzE6J6T*fR;Ulc0!zxy7{vJu2_{29{Bk=73eegSxN-zVl-IlKbkSr)3?t0!rel{3b;U=K4f@SaeqXY@UgWh02=SXSx> zg!?Rk4-jenN#JF`!vMuzD!9fX`hkS_W~mPD&OPrc=8BH6@Vere*Zd={&mN2gjD#$auxuq%H#VUz%o&K z1)r?=KY$nh9*@UUhpS|`S{oqB#Cpbi5(qrDUK{3YyHZ42`h-jF3M@_FTV@N$Xx&yb@4MrVAih^&ckT4@UT3?t2g`zy$b6 z--GaYmV|(`TzZ+H>?(oVM=?QwdHal5@wk9U>tF1942#T^0uX8a{6lW?-^3K__+;M$ z>6r=ee$2J_aK(LZ1wIAb)b~kvJWGTq0C~Mr26U5kbrNG;TVpj#xBrK}2e8PD03xk7 zf&U9Uu0lLrIazEYkXGF={{T7eV>QNvjpUI=`6Aa1kV0#v5Bc& zaA>Tck=CP7sr|mk(I=xw>wm^H^m$O`MX05iXi$zScmwD6wLPl2_=ApC}r)}JD6Z1?a;>vMnxeg?R??*Yym zU&+to@-30pHhUZnG1G!x{=Y)17-Ug5&@WDoxkuW$ z^$gY0X4g18N`TD{@DIR?L!~bEJ(zjp6#!2bkB_we;k-8wd8UZRGm8KdT@TZxf9(~f z2xtjHt2-Bq|9{Q;-&Q`(kh&md75+Ka>s6aSHv?Y}d@*pJz6a9>fuGDhB`NY@&I4Zv z$g?cCg@9trs(j1(TbKaXQ}5Ywga7gh`y5NQ+hifS4{CA9y-Xd+}Bb+0R515cG?6V36#iaB4(Aid+1I^+v#RB{% z;BWgLL|=FXz~k|F=7a5jUn8x?MM^Ae^t3W_nW_*mX0_-HeXI0RQGyZo24T~xRjxb7xSOR8o zs>C)cL8SGem4hqY3CgpS*n)q^iuWw{tRzK#dx^xqm~1Cz{yKhlS8&D7Z!+EwtbN^a z+LnYa3KlIQF9?-7Ea!TFL#z3C=1SQzqwcET3xChDk|k6E>-CdN`{tQ8V;_2{OaGctPC(_{vC`! z+_2v3GSA*!!N<%l{4?u3CZs}sf+=MzxW_(?31(c17Q3NRWl|zn8t($|^vxF8=Ff9| z56t6ffC%Hu%y(7nW(qW|;3;l`fHXK)6q<_}=XN6bIZUa9OUq%h0PM0{z3PXU2klbd z18EU=GRpHY9){MWp4CN~^9WJ~xNYobDKC(%twmm7{oYJ|u41elu7zVQxd!W`T?!X% zwf%#A4`2~EOcsF8RNTG~Emkyasp7S04^0!w3V$#w3y)`65g}=_-O=Yje-Zl|`3QE(m#!4d28 zJGTskO8xgaoYPWp*c5=Hq@A(m>5p2cd;sDq`Tbo2j0tqsq_RnNUvrOV*;%9CGP_4G zbBv_f1{ft^!}=el%L!+t7k0%KW)b99=yTw(nPIQ=J%B^b2IUl?!={*eJo6%}-bPjo zlC20drD~AkaXMU}MOuGuSI1s94x0k7NKvS5vJ6FY)~M!E*}}MLvWf(GJf33m1h+d^ z9HqXivn-b}ZilK!HdNcZInw&}j?Z~1I4lZ)q}DA1r)umI0E>DZ|m4Jk`j0Zfs@RE=`>EYz}BgMjWTUk})J*479~MK&16wwRp^>gKrzl^>Q}*ebEYp2}@j33#*w4KeCzybsIx7c{XOXzt!)FF$Th8p)BnxRCa$vLJ z{&tO&wzzks^(*FZ?hDJRD*&gNUs_8YhUELZ2N+Fti!^Xi*u|LDb}*C6--b%vK(@wz z8TcmP(=CtPR!$^~;;3^zvZ}vGwW3OgAr;bdc({yFX60vIrGc~NgBX(rXqWV@f>;as zlpS`lv`y>(6E%+Y)E>{HcUCpn%8vG5cD^0B8Tc{a^ODz|is@waFQHOzwYL2>;J2Lp zH-VS8IG&T3`(_to)>|VD?6V6YT_AO5Tu-qdU-pa1U-5f4fM;1b&GdaOe|K%Q%X;Sa zG0)~PninOin-L&Y0-IJa96IN?R_7p**0+aBUEgplOG&U|!4QkS;;+gXAOcbFFsl)ltV)4vtagnA&+3q;0Fb;MU{aEs`o-&V zCHZj`kgDZ@?K%Nfg!#bQze{(>F4YRFJuFn})(*$Ba4d@ga4Pw|o%4QK;lE4Tsmg9v zAqi2Q2A%*s8TbTnV+Ws~wL)pDQdrf8bBq4#hkHC_C{h3*bpiAl zpj_qI4GOlkmG!a$eczHPvaBYH>i5fb zc8_bDv&`R(AP>xh=~eZC2Ps2YlLzj`mdE6-`fY-ozpLN{x#zGVO~U5gY1F04vl|!e zQ#Ke-thj@m*Slg9BR|S=s45UHOBR6rr5wWuX(_L}5Bw$Y{^b2jq|vr6YZ#?Rx^vk` zeeQXtorx*#EO5>m_ul}&1pHUvlabbMEU?tH{qSs2zHD(>V$$B>dDr)M6HCX<8SniR zUTN^G25XpStn1=CZPRp7lvit@>#Twe(ky|Qf#IQ2hpGq3vM2yT%ygUGF|ZRV^+b%> z&HeI3pxP1S1I)wcp8GND{VtI}xjoE^KP#~9-oV#mO#E-dC@ue=_5KS(rLGT^x?8B! z-CG>nte~VFjG`pI_%TK~D>CElVw9XcQYFCV?|`ofm3lrvsMO<~Vs}y{jbLmpBEG_^rg8T&2sUCJvSdl;N9Mi%r@4V*`l{<8P z+b)MOX7ad@jPWVS>oM@np;FJzIc6KN3+}n^aWJiBL|T8qW`NPO?NyDe`mb8s{4Vfs zf!$E4hnE=BZIRXhcQiaVk7wSTqnk3eeIf3~q6Lz~3b?TVZMjq>W2mf~RxGTg2$fnz z#jTKKQUJgRM?2_bgYv@R3?`Ux(X1Z!jqK*N+S|N5()w252ScU)Sl)=V{ygUx`z1+ za$Ft0iIZp97-Qy~MX1o(CS?{If%Cg8QVS%{+935u#EodTanDk?{Jb%PWm5n?i76^$ zul8S({Jssi+l>7$QLkFmqHuTMw<4|o2zWd2<-k7!zl;&sSAo}JH06EZUt_EY=aOso zVBksC@iv&wtk_{XC`VHCBweX&F&8@bTH^sir5?E?*(x57iv$+uah2u; zdFDwOO90eg^}87d_B^t|bU>ddS;7vf6>{z|Ly^|62fk>TiVDqZHQbg7_c{*d&OR3) zRO)j|>@O?QGo(R(i--iRVb4k6&WP~ z;M?@mLG+!FYsFkhx~cO1NWS#p$r38St3GjK1Ag0RDM@L3FK;Gv`qAcmM5;v!~M|4YfX z|1a5<X40aciX z5|9@ku!Ff?WlDw5Dk=U&p;8~NJ3x1ya^|q#S~R6#gz<@&xzTnprmS_~rI-u(LQ-M< z?og>`=ItCR_2Hyu{fmG*F;;;Whf2LN()wRxl!Fmzp&x)aRBFnvpCJf>P^q6v-g`mK z>#$8)ZE&CTVJuqR#vCl()0E3}SMNTnxR1NS*hqdP-7kxeV0@a_bu>=kVD&?fXGO>h zM&2XMiC?E$mCQvzR_H}l1Dj$W*H#2%K~rY#oVCpZf!YcH#@&6_+_>lqml0`{cotVM z-R0hZDNggXKolzVq2%Pg1ruo=7YTnMRO9N+Qhv%2eg+{T-BGB#m9lqZuy)&p2NmA(@KD(w_V04 z*8@y>bIGnbPB-qhF0fbWU04OO%C`&G(A-`6#iVBZIy@bdh2`?87RJ^(BaA>5z7b=h z`gwp*DOWl8ZTp{4sfR>b--Zb?D@CZ(nDhc)?`TN-0Fl-=g-Sgt=MV=>Xvs0M8pu>Z z_7{O0Gu_@+EE6MAr69mO$Wmh1PMNF2NlZ+GJ*Fne#4*d7VNbGGku+}0}>SIam65$f? z9^kL(wrN`}2EdO<<+V_$H-t*P0+U`A=Is<|ZLh!|Te7H29(U(p6zu&Xt$#FU`<J;1p+yuN2^IbP_Ep);lRO+AH7el3VsMN;__Pf#A_CrkukW^p#NlZYX z&3}%xeo@9Qd7sxtO3Fpjnn|TCubHfG3#? zr!W)82qW-MV^#;pG0IBW+~RH0)R~1L()#E69)rg-2d-eA`=g|bj0+f7=1=DAbH2oJ z`^L^_kd#6BdtRS^5;HFzr$ViTq~MzU|JxEP^L{oe<(sQ%44oqMH= zv=BsEKMi;}PDi|qAi#$Jf6?JkHj?Y&HVkr8bjna!AwAlS_1Ra zp;C{4#Sfl-n1?9YZuy}pNY&!yEbBGP&z()tmR*54j!{l!)G4V8KmCad5MtUTC^w2BXQd`+&B zEfkAPSYu#pxl*K=O;KT+I=#RpMnMW1H4*+Y(QGz2M%Uca3x3Zb;S6SxAq$X;EMD32 zDijq8>SDn$YhgAd&Gahb8jN!FI{U?%SxGmMx?tVO1%o1+-^(ib8WC{BlLZxoVc>i(aM}CTlYF5LLQ54|FZznd<7vteBQQ>5tb9`QB#UKm0~ArTpeovD;{4d}&0;`W zW%U%sohokBfN3|(T_xk|rX+_-{ShYZeJ?ro2fDbBk=C^>`K`MEBCVf;Q2=hjtbjiU z6Hs^y@TO3yPeodv0=@?L^Q@u^k=B2T6EPVob$z7uZ(+*a&Wow2{JJ+n1p#JPH5Baq z#AGi~{dF|Ttj|~m>X=nMo<691uNKV_(x6Mos_U_ARBak0fzksG2LF{!Jg#;QCMKS*@?x&_ywXsqS43KW1XH>1$(ZInH()f{dq!G6 z6eCz4l?-0?voG>XfR{NZ*@r2(bWxs2>qlVH*M2@!>Svs{zYO>zrn^^VaT4RF$}^E2 z!2}HLV{Z5(9K7KrMKSNYZAEP&ihrRzu)fCL##wvpCDta=Ep));C14vbPH*f*EES{Nli6Aro|Bx~R#+25aJ zC2W!%`MOZ$ekpuZy())iwtO5GwVFq^7{DFim>SCO=om z4?KGf@Xe9dmoZ=JA_l>HU5;|{Ui+U&>)R94j9ib$Va#~@O!uiigHepuF*nI+jBwv1 zI|ktdX#tTeBqi}OX{zCQ%(Xv{nQT^dCE@Wb8&@#T<{6BD+f81(NIM-kmxWovSgfKV z6I_dl|JxA$VCLt#6;QV@^Zp4sh}&o){K2d;e;L?Miu>FQJOg-kR@Ue5q9nub}IQT9iSG5L*tdTBRkX*mm}HgUmcnFG-(!`TmR+`S9Hvn+IVubyHtt)gvFv}&IvxXWCZvgwE08QZ=a z_zF@tZvgyQsMIfK9UxgyKNWa5CJ_D-aC@lKceQn~650I^m=gUzo4ouwj3wzuL#6JF zw7w7UL%>?7)VH|DC=&$u+Kkt}4kPUEz+Cu`V0_a@lfTbLT7MI!`q5F0qF}Rzm1a?a zjbz_Gn<|W%Hp~4IMv1Aam~>&<^Fq?&SzWdP9WvEK+fukI>#+<+e zwA*9)Z&rEWp9__GvGx7~FqH#0FcyS!z?-UEj7aNsj8*<5@RCrepRnG0O!DWy0=~!E z?cXJ1dt6dY^)hA=|9e@V5ky-571;rKWs!2WV1)l)01w7!KUpT4CMIt?|8tN0z5w&a z4!Eo0uBfXBm0`>RcAsj1S8hDZ!aVNPs@BtGAWxuAYV6}u+eh|5j_M=%d_+gkl9DFI#q@GJ}Sx>r{% zm^Vw9w_*A(I$qZPV@zOXKw7bNH+fyUzV4APH?}bH=?Z2+d_%JBL9_4YX#esJ?|aN4cB&w zOvx|q%F5vJcsy-TN5IvIhZs0NSxA845z@kGA4+~tnC=Lh#~wyDJQ0%$|GB`2BCS6X zY5nt&)^1k8IMRAO()#<{110@%n#u;9^KXP1k=D0R zuC046SrrXOnDjL{$!mb817C@WIDJUX&vJ!V8RUzONlQK2t#&U^tWXS+3v`6^%PQ(^ zFIIyh;a}B9KcQGFl{B7p(n;cbF@+-RLKeHpkA1%4_Q<;N-5YB&`K(JUZl^zw$I}dV zE^yP4aUW&ceKD*Vn=m%p}tK zKVTXeRIN8X!bC03Vjm;q)-gA#E3DTuUTb1e5L1pc;SpgRW0U}QMLxnPGF8rhmI7e& z#!#teMq0lSlO>Ur-MnPkYvY%Dvdjqp5TJ#zMS@Wi> zz$Ngzuigi40O164&DSuC)HRHSRpeEkoZ6=U1=&+VrT$9(Db%Qv0zTgXd>`eIYD_1R z-=gif%^NOJJ%YcBfR~B&`;s-@D#Aa;eEI7XyC|UEq;Qgh+MjJ1IV^Yuz_ToLeXq(~ zSo9g2q;>9>p=r>p06@F6Z<(^eZR08d;?A{^?;}rEEyVm~y8=pG#7OJU2i{V!iLHqW z(z{*|L3Wu6O?EIh@9_%T+lb#>K2!2%*O>nD#u%Y0O?0xF?BsDS*{>)YV1m*9>SD(p z9JZCe;1vMRvaksE>at}B)X4y7TM;PRKcJ{$;Te`l0VpNp5|hCr$S-5)7RP~uU!GJ4 zoF)7Rq|Jl2s4x7-q?)h2qIbVM`O=4^g0`&i-zW9w7p?xcYo3E}1#|OACqR$K<8j%d zIO}ScYKyOV;>wFMwfbYStps(k1$-7_;hsfSTv^|y|4c?!u))6ozZxp_YmwH^!qhvy z4It9`v6x~(PoRA3#w_wQpsZlKCO)ePW<@Vi^HMu{z`@R2^0(x5mI=1FN*d^BZ$HZf z)Re2qIb_90cs!oN$tj8j(++0tn3WkIt;DZl=CyU^S9&zG5} zPNrkYAg#HQ6|lZ2C7h?OY1e6hvnU%dSd|M@i{8IN8fjV9{Qu9S)(WWtxX;0kPp7Ds zp6JPD5zML{PZ|2SSBn-McFdKyD$7uW^3V>UU(QQ%e zvIz6n--k*)LH_9^wO|GTMksa_#IaBHeEAX8f@RK-YSNb}&avMvc}!W+FGIkN$KzQn zE|Hz?x5IS6^@VbWyNioVSHvqKD=@AsO)Secwh%9?3=}CEVhtEr{|CTzr0IbH<&>49 z^xxI?LH0lMGD}Ehr7en6+uA^cc@@?u7QB)naE5NQxP9QEEKY9&kH@oIWX&C8+9?1Q zQ*Q2SJJqnMoM_YUK4H2jknJLn&zV(kVG#;5O~tBptpJ?F2>omNKI;Z-V;-(9Yw8a% zU7vi(UXRDq7E(N{O}bhHx!3}?Ys$z$iAj(iG+6_T!` zxW~9axu$bRlVe{jv27i8fOjUXhVK&49|Ug0_|89{c1$@JnXXm^&3r`jW)T85JRXmy z4ECyWUUOI5C2HG>1F)%byrONz%)i5I#pehISNV2fygVd8v&&TPb^AQU^zn0{QqKZj z%fY4#O*n@!p^Mq*9BD*+-J5hCrlIYQkMHq#JZ)hMqI%7WlIkzQ;+GhVyjC)HN3E?d6fyU;;*@dz?hYzZ>|%h8NErfTY{iVXwiyHhJ3S z4hvee!Q=6Gav0NXoKg{IXjZXRh@Ia}X*;W+iktQ#X;U^RUj6r0wb2cJkO3dHPWJ1Q z(t$tM;%6RV+H^F=l(#KY+@`7Um$t#8?6@q8i^Ajac)$pozJ$N9OIoe832j<;%PIh~ ztjbaWaD41tb>r3xKpioE*=UC9_QabGvuuou;=> zDmZN-Od%XuNe38>X_t1>(3}v*hB1NK4GuA9_1pcz`L3li#L&15BiF>W!{jR7x561h{VLZ$8zY5i&73z#l>=ytBM8Iwj=9;e!kvp?h5O?Z6r(n#l zohE%SFLN-Tc^y-)A@95P!r$XreZ+d3x1fkg-NadnfU7ucBtJHnNEf96M(LPW``#{V z{}(cE1wg*Q`;(e}+>?JV@Gy+8{xiTmfCoCq=p%cfOWdX!^C*Z^l_4gmMaJ1yV<&mw zqzdJj>}DD+UWxN~4j1P!bN?ylb-O!X7Gj{-Mf zF7)$5rG8g7NCNF#Ev&Bam-4@5S~AWX_j_>jPy18`Bz-V2Ufp;eFe+koqetFXdr^X6#sljVvyPmg{zkH^y)t0?@zEUub1QmV{66aXpWBU~YSaxT-& zYA^ZOr?>%zXj4twQ})e1=6bDRgq(a|N9d>h=K!OKjY<19tYb`PS*E!?raNuzV7`+b z4!RWT;vOT$3xAJi)mWqaeBPDsUP>J2EjF95ftgSDlXG2T4hlgZSpZEZ=a}-{ua(6%czYo6Pn8rL=};5unm)^W0h`z2B(jaYyWwF0n=)Qt$XZ{VtdFR~IB zKfUD19<$zyF*j4y#uHM7F$+6o(N+f5oNa7{;3Vk-K1s&uDmrDmXn8yy4`k1|Bg`tg zZj1TLq%}*jj!`tvkCXRLkiD3Zw#gSTbq=Qe!b=T`kn!&n`?M zB{QYN)U4=xNuNBQ>|^KI2c(ho@;PN1B^BlBi&a2Y@ROWtaAd~+dB>JI;dyZ+BaA}f z-2@(w$7P?{abZ$2UQ*L%QMHNBh2*ze-q@bkwt?3I&$9NDx%C(=W`Xso0EpmUQb7yh&UN%TZ)}16cT`V26KJ) zF;0k_Wn6^w#VHs`<1qDAglMM;u$85?nTl+6_J zcs!meR9)2NA=UsXv3`Vf-v18Z4=@VJ!|5ibp%Vq*Yk^mHG1w*GDD?|f$QK+i9bmVa z{75hBdDM-Trb&?I)r;GqET`r$&OFL?8T5EOp1zS4y*>9oHTe;?N$1q8270w;-Ivw>Q-|7`fdVL_d9e`0_VjTFZ?|o&+6f}FW#bs#ZFhN zy2B>?C2};6EwYsZ_jQTv@9O&PV3d&}|F{&}C^H5rU{Qvw61{B;>v@+(_INy=d61Pl zc$)etjlg0A0WKrbw_ccKBG0k_NR~jCrgcdh+`tHQyP=Owoz?y%;}}I;CJksjLTcfd zB>!iPE4F?wiwnZz@p#(Coo`#|1>+Tf@*H8h)a`_{BVm?yCc^7%#(N{o7ua=myFEFzoRh46lgLUo)q$}4f0@8d^H-f%vQ@JG1>(&VoW~l^~t$hz$jE_a(*s5=X4aK@SN)K8hbqRW{im)>LfMH(+MYN)}6K! zdEqSp#cWWm;Es!wunjQ6ZHKh(eVJ?DG!W2sQ%L*WCQ4u4SnSn&);X+Wl#l^N82=F2 z8tfis?>yUrZ-X5@klnnaf|{W4}i2X&Wd6!y6$x}XfOOdtHutg0+8qSYQ1xu zrx7yuo**p%RF=+M#oh&QkOAG8*6NyY0_%6x{p}k^0`BTyNBidm&+Uta%w25=^F82Qw2(#RZ<1+F(~ZB_7T#5bn4OlF z^@SIer94iWZ6M6LY4VCuh!PNxn*6IOHCZW!8>EWB8ts-4_IOs6S@qyIN*%>BFYJKL zD%D)GWc0rPFQA3F(klQdZnSxuh%l{t{GxpOtH7<~ukQ0w>zJ{lF%V$defh-F|mGg;9zE);zW%uu^BB95#j2y>g()eeldnD~yI8(5l&4e_&tnmW= zuv-AOXeRsv=kFlrb@%4c(&SMmZHL}zA%8sQd1<)O5(f{`6?g5_$ZU-KQNt+~jUB)Y)eKpx< zx572^cvgXZ+L^;;E*#^P=B_B3C#zob`$t;0664Xe1wg9gEt0EYM1A3(75J9760N%8 z7eSlX4XVlc%JF4f8yL&MI{9Y&s$(yMYYoY|Mp7m4IiXTd4wbrrG=N5`VF?3_Z_Rz( z<2ek>dPd94bM`hD`#zx+=5oP%+Xe5rLEZr-hT!%#2GzA-zKZcH4KQZtefo{^ZsPCH zQkJp;?7A}b7jcQSz>th9YsH=Q8F@-zmGRi)pLPC0&c1T(q#W>{MOt5`Tp=dEYVjOK z%0!d9O295g&>!QV<Z=?9otm_dMY%7I=uE7+|m=qkt<5_jw=3`A*$5{Us$trtT z$g;N1QULPi&{nMX^9%x%rZhz-)fK0xS4FOi>k~VFS6%%}6Qau)i;7rR>~gq59fhP# zp&A#wUgmR#nD6dn#<@srNq|uGr#Kb%!4kJQ8z-r$-SJnFz^aMcgVucCT4crMbRSe1P$qHLX?QeBgt=9 zV{X&rwTtnQ+o^Cxnp0OwQJVsIfLRsfeU6(e--oH(jtOwHBDxq)jPYw0)!FtwPS3J( z6k|nopQpCjB8?O9bjvLB|LL69?d*?6wNCo112AFQB`{2W)~WBW&tr$wS6-C&-qrPx z$bL8AttcA4DtY<(Wrb}_H?{NaynnYJL7VBJ>zIe4=)UnW1D<7O3nLUx(A{eN9L2)_ zblC%W4p7B1v`)TE7?RFqjqZcKEC3>`B!}CMV7JF4d8uuz8YKh4F2N{*Im^V{HLez4 zMQ{%&zY55@c9%(g=k|78G(oZzixFv72+WRR9$V)+OF5JGPhh_5^LRX~NoU>R$hVRm zO@8iV{&VHBa~v}#x!;=`#XrPYc4t*?bpxhr)29nS*iA0XF!?PfC#4eYiT^6a`ILFw z4qQhnOytX$$N9%I-YaSpBxQVUiYoJ!MQ*$+q-~13;;i-eJ|^c?6peuFVkTJvyoz!% z>w6W2b3pahoF30S=|U+lVjc7Ri8WSYj;bs=JSk$)cIPBp(Ygj>c@ekn05dn2S=~!r zn_AY}0q|O;Cux^0S_n2MU>~Cd>@zLw++a2^!fK0yjTB~aJ;tmxBGsksvU{t zU=4HAj(|4;ufixdA~1gg_$cs?w7>GVEBMt3y34Bo807q}S~1XlaNR}}G4ovspCQ}S z*dzvFjCp9zk*`1m80AO4|Lr-Rv&T~vUz>lqIZpl}L+0d@8Smv44Vpz|cYs6?mRaGS zYWd>WjFX?8!hVlgK$3d9BAb--JIPXPA=-VS^d@C(WI4<%bj*D1qWc9mb2 ztnsIlDsVf=wRvRn|6a-CROK|;dHm;??rGk%_|RpHHKQof-+mZ<-E+?( zGjG#>S$ryOd5Q$Gtnjnuy}D_n*HqnM1U$Lm{jH4cyKL+u?tmtm?=zDh;RC=uG0H)i zW(=Yn%qo%FWkh+AudOI>a29Ux$m4-O1HKn{F=hqc#l$1QE&EJI81E!MTQ$zbJ+EUJ z1t70Hrt42T*TH#uJZ-S3!rxP#qVI4IqX5`3Z#H>_q{_r#oT7qdQ?$9y05_D_ejZ)@ z#3$00fc<=opmU4kl<9H@^G%hU)j_bS56<3S(s`}}{+D&Wm#7|NA>?%@6N|+<=E0EF zx^RXxwW+G_OBj$}AKR^@<}(C5i^`&>*)3vc*JVT8t$8sXv)l$n43guPs^c)g`2U|A zDs?>vgTZc31}pX0i(CaC1?~a76f+4|DI_6fY)@M!-&VlM5z@)OPVk@Y+i&9MFGG{y z#0kZ94$6G4tfZwTg4_9U*5{wc2=hE2ztm&MnnW%DKbqW!52|?$_Bg1pZE?^P=O;1G zqOvG~cG8v8rmk<=lVY##i|YJWwE|rwb>n7b9b_^!fTYLpr;>j^4%|OupFd{W#10UJ zN0?pPAx4?v`~+wL;&fjC22IBL(j4g<39 zyR&rbzVUeKre!UP>0i=tH!xN?`!}=PGFe-a9XLX+2#(Zge);7nJ-@Bw{=F6mCv>n`bC)p2qmcXrAa3imdK%HY% z!HydkU{>Pia?bN2X$QYL!fpAOt&>dR)xIz zN3LJp?|arg^}j=_vr|$(m4g56b3m-AvlGlD{ z1o;9*897z*9A;6rY-F3*<6OfiK1Bh1M@h>r%l?-!*I9}{i8Vp)3;Q$j%0auYWd%`< z@lpSt#ii`LG%sYHl1O#IThE#iklot3Ej9rnt#2#4!;}ILY5nb_rtBvt2h56?7BlP5 zVPXdEle~Tf_;9Gy*CfY#5~cvpiJW6dSHMeT_jIpXwNKg%+pEkmX7yR6+-+7#UO5Lb zt^c>=|8u~90e%J(2>D3LSsJe4U}K=H&t4>K6Z*jVd!5-qpYBaB0f%6|BZ(yt#cPk$ zq(5s+o22)Sef=hwd$R5R>>f{BoMN$_`MlEOo_6R;_yc@7@LVd~Pp$>v0`S?uZKT!z zHaS>-Ukdj?D*WFLyaaeqr1cLa$9f9IH_({0DqWV)+#!ubFVpXRJvojv_u0n?kWH#- z*&>wl3I^Fi=^Ef?fgead|HkCEo#G)YW7|UD9upR4BFG8`bgxC8l2gZ*DG!DHd2Y2r z+X7&_HAHEcF#T{%Nb3xEJd23*qgW)io&TjF7YjJnRlzpx=UE8Kq(_e;tv_AmgR=q= z?hD)-_H)y7%-Cm4YO3GGJOmdoH)xe&LV1Yr zl{|5YaX3e+Rc$8Y*iC**y5BD8#gB8wGfP3bjL{0OtvKe``MZq*M3bD??0~y0<*CW% z78M5acn&K8W^u5CnIkUIT|W*NTZm*?G`Cn?bAMMp_-iP(@Cs5eO&E|Wf_bv!VzN)` z6-)=AQvU=z4R}hZ)K6ke=%+Etz`ZIS?`5G<&kmLPeBedNYp(=eGh;v7&*ZY*(zym0 z?fMvL)1fPvhe3qikm-vo`RjLtN{x~_1{X+k-pg1=+IX1a8UL4ImZ`~J?GLQqO~!6p zf7+}f7L%_~_$q&%MQ2F57?A*2s1~T)lv#7vsrg@)xghgKR?vA>Mi{}LRc$m6iA}R( zlk#fe#L0I1n5w*G6pTvTwc3lcekJhrm^}SQVba{Lr<{-C&qJlYI_r%{>!ZMr0bfIY zfdt7Rmvp@gq&cW0`^n!;o5sk6wKd-X<_naRv@GE=X8KD$MZa2d*-C$|OJP>a;VkO< z(u+)uRgt1YXRZI&Fb|>qAp2Z@Pu~>P0g!Z9=~-dNC>>)yE&xG_q*dwtu`17(U5U>v z-X<3YGeY zq7R9*{zr_D-4>Wb%#A0p2Ny8f)Gj7)(5(_E+Xu97#;J2ti#1_UDC%@Lu>Q77;YvY@ zB1I-o_~+&2XVHf5N+!xZjAh{@smo}CbmCl<3Cgp)6e$4Wip-+R9PzeTmFFvK{@%yP zA<2L`)xqaVQMn_Sd22{odf8S0CKyGb)7lGJn#{9-N0Uz2MbU?!nkD=bK7?uTB8_>Z z_>b$;IG22GR%gO7`Sq!rQm1zJPI4}bQp6*#Wu0V1i9JDfVgvJO*D6Od_HY6 z#3+TUVw&_EPUh+RZ^H5Bhv*e4(sr8uuK6xzPPeV=?qYn6Iap_0ZSKo3!u5j~lf=I% z+SzX3>Jn-F5=<N|DK{$`+n9Evc`spH zBQFe<`t3;T>ws^;bZzYF206pxbSH~3uAgi0Lf*5wxOMjzg)>Yyuh~w1AH~eG0cMU` z^opBn7@4*R>5W-(#&yG1>C9T2yA*&(>&KJkrEW4i1u%2v8)^MLzz=pk@Qks@#gZG< z4yG70-7&6BL9)-mRrwz671214Nzwc$K&aFmk=8H6WNSQ;>EcNnWSi(D>Uc7q-=Qz79JWB}wMfbq>0^ zv*NIh&~Ezl0c>IM3XG7v6SG3T&y0QV8Ubr1l-g{h^#F5$AB%|#n0NKKa~Of^UcjtY zvGYKR3AsH1sv?bUelOB`7x*mT4}k{)pJQ$Jo525zDdzOUq|u~y8lH4TTqAY!WJS8# z0g-Jh0Ws$LkjYNco|a(+;qi2dyZUdk`jcm>DdJwW$L2=Px9tKwMYDx~oi2WggZ)g} zmP>gVP9pSeL{1%NdJ!t=%r0wW_u{F_yD_nS2V_wI5NZ7{)DQ0X2aI6(C*X52y#%tf znXbtawu@pi7NJ`e@%c|MH`6W2aqe%O+XVR1P^tGtTE76J7<>ira!gN#Hn4MMn;@2$ zI+I47Obw5x59-{jZPx&3ItSZIdC?-E&1X{5AZHyjYXvRL+jV&vBRgkRS9Il*y^Wjy zZ_|cl^u8FY$cNlFf=KJz=X;$A@J{jZ*yM%QcQ~F z+kn>r53pl1BCTHqJgJ4T*HvP&xJ+tZta9xZ?fdk2vZ!;fo@B8i?4@9hJEz*@70{`J z{W-I)oy?;bIG9%1ckGfqc45;uXS^b7 zgGGpl>;mz7FH)sGVM4KnYd0bi&XR2+`kqj!JCgUF3%sAyzy5W=?hUZ(0sXI9^C*)x+!j@WrmxaYqqupoPPu^0bC~(kP7kbG z+vY;3)aL=;8fkqCIrrG2X`NZvje^PsaO|@D=3@H>&pYq`6KQS#|JOO&by+(3IJ55~ zX=>pH`pJH-(0>DFLU?S;tS$kISroy2Vx5 zMEFC#AH1x8e_3LQWVL^W@~P=(tn+(y65L(JB6AUwS&%3EKLY#-@bk;y0`Pb|o>gR7 zR{s->AZlCK7RjGAvRA+^modV1gT-`d$H^G$);YNh?1xHySMq-uH+Y`%bOF*`CuE@ZD*r3qJ)6tyw|hGkpaprG1Jcm(`>=>qF z$(W?;ZPPf9&uwX}VW^bt@_)@TXrCU>E{C^msb~2ZFncw6s_#J-a0XL?`~um+e+whL zn+Ud}%r1OXCFV!^xy+M2va^;hS?`I3qBcpU7m?OCH8{-kLZxnxw7$`P(JKI+Wgx~Y z0G{RIBt}rWL25zrUSF+fXHk@b>z+^DR6J>P)8;h@XtxPl8Rk-EKGOPy$)ESFdyG)2 zS4CQ14}8*o-Dd&JpHBhzW^pHgMa5?Uc$S6hm@aqiR);&m;y(ZGGnUuSr0KIbtMqZz z;~!^!H4ECh2J_^_7=>jgRO)5&qK^TXKi5+H@Snq&kFM)`pdOE>6{M@1G^1Hm;qNkJ zcD1?@#-eeSas|AkDOr*1spDGk!oQgBOMd@~{i0U@=1-BC>VudfIM2m2SGpJ8^zHF1 zJDV7x=GL}YL{5>W_8leLO)L@ZVjb9{obX@6C`0=c&udj&3nLb@;_E_T_lL3Z3czCV zkmLs%_ZWmRvYO`Fs&-$h*rv9@W-zV(@4 zY8|X6*B~!Qe&PEN^POP?T~81e}XaRZ&9r|P+cV5(d9V# zvT@OU|9=JitFjw=1;8^;veKeF9#3}!&QBZ1vfG#oZl=J9>Ox%H5A$G>^Lmqbf`6fZ z1>wO|kn3In@XQM@_&uKaV`m=7%Du|GA7Fg#7n0wTlKYiuf7>UnAAf|Iqw1t4#=xgS zr5+wC^dx|;D@}xa^JgY`Pssz}G5|A~|*$RUA z`j2NEV~hy^bSvF0o3by(nVRf>w@B;PVB!OwLiRPE2d@HN8Y&e7L|O;(cNSg&m?p+t zlM!htM^7`n@b`H7Lj+NtKpKz=`M}vvUe5})%WDHX?`nK?anCgmxenVij&}rjLh|>7 z`ObUa87lSrS#J~xf5G7;6b$t0T(*iy3m@%n; zKT9cqw54rc8{mz;FA(K=0!U4QBNX>#xWsJX?=nx<`kV8Ff8Bxl{Bt9umL=D75jjeB z^sjX7@_0Pek^1?zFF(t#pQj{U#cbClvZILbV%ZDy}{;bEdz+?$%dtS1Y z0#``@BjoSE2+1Ogfcu#uSY2!-e~bRDrt8T#X05>G`ecoFf~j=4$70P_4*)(Q|Ab0C zFI4IZ@RLmr>azgKvxdevT*Scm(q>Rk=U%O#Wrb z8FqGX?NA=l_eLQVLTZ{`(@W zUjPs)b!(Fk@!bH+BQ>Xom>Yiw^Kh(TR=i#1e@buh0p_M1V*FBLOo_|^X~1HZ|Ltt@ z`x?p%bT?q=5^4Q!VQ77RS+0^kSf@(tYX=(nZh)R;!R-dv1yy1JnvP|RX;Nl$95V;> zz3Ok1JhpQR%!Jw>^DC|X}%Hozrb$*e+PUgM$sz7vf6(~ zsMH@c8Gv^I%ti#hRKeOLU5U@4tPner95*j=cNqf^>ynpW>|Fq!Wno?}0DEq*EB@J( z8OH=44+h5k?`An1!?-}-20V`Tl%78fmHJlug-Gi!1723~IIjtndT!l8cm<#wVxAvk zG~i9jKQMb#vk2I3fHEDiRt2{!my1^bJj=p76absR`OTa^e^t21!L+|E%=|4eUriN& z_lHV-N#2{0*8dUH%;%ed&j2@AZ%;y{?%w7Jdlx`CMB9ecCth}CE(IrcN^A?$53U#f z9?xoF&n0EHrNs8GC7@2GfX6KCYz1J$`rV{{$+IzWQ+ELOF4{0u>VE@7T3-U5XTA0G zP^tH{eZt-XP#+0st7GN@GJ{r0mu^euE{=j z-m`=I?EHNwRvzq5eV%&QSxS&*DrH#)ig*g}<-lu!lc7@YwBL-h{_aqzm&`gyr1c*G zkAZG70Kh8%O*oLIQIQGe#&UyBHYit5`z+~XFv0|nETa-IOCb`x0^nH|Y!`t2OuEmf ztk!K4eqLSvtiNr%0?-_He%UH`&t{i&5%&8{eDYaDTHhQh_0TR(*t-Dgaf1A`yRr;8 zSWu{}Tj2`R6TyCoeXk_jZB!WhJc5I^J3hY0v#8iL`0dxSwi6Dkd4Irsm77_aPh-q{ z`dy(?uLl#I-?s1v=t}rQ_mg|yKI}g!xm}g!KU*{x{&_Sh?BRZwXPh4?7F6~jx=JdX z$H_7J@YBb@Bk+oXXZdiW^1Bw^tF9b$Vd0cxx+{FQ){2{(KLqYC!XLUb(|1Xi3cxA) z&lA0~xIAk7p5)B3?pM0VV?8tyEVfuy7H{>RVtlu(oRpX$a(Uocx9B7REh$5_oH< z)Y3OL>&gXSYfDE-t47VcxxzO9zlBMu$YV&hd1=H!|9p&D1>3KWF{|Z(`c?O;B26z` z6MfP3wF?!MVU&Evj&r^jsaE@YmTN+eb%C_b!dlKY9?!Bcpjx!Q9lamS*zO_+pOa-) z0^GpIqWPkUE5M#BuaKJg?d!HqaWS9`;M1W}U)$T&YLPsFuugj`Jt-U8$IUqomHL55 z>mmg}Og(m*UXf)a@8+17@V9ZtDMc$>@&xEO*?ygTH%QaUSY_iHW>vuQg-Sfj#;p6^ zeKyLJ_uXb%@y`k%Tt>>4Hf{^Cgo^cHjdTuLBmY|Nhf3Y2$_GVSKL;Zpc0;9pZBFM` ziaZ72C`K^WiMq}cHuH>7-^B>EQHd;vbEMs|guLF^?)gYnz(wJRH6HoyidN4e@T<5n zs>F4~z+V8Li(kciJT7jAfXq30!M9>15P@Y2%~gp0x6iMLy2_4yUB!|hpJ^{ZijMuh zq7R6)z6Q7_@Z-P}GB#N#1t2dC@RW6-swe?Pll(4=)nB6Ie#a*UL zJj@#FRp36rbAV%^Qdcn+R|Wh85CIP+l^g4rx%Df6jY#VkMq2+&q;;$1e4CKx0vKEG zZE~epUmoB=JBi&UHP@$3W3W))$33;D6%R=*G-PO&a{=l{hSv?T7L?&(til) zB5IFmxe)`e!OXE=oV@k`U?GAC^DF>vzV{Z{U&0nfXqD0I$^^;XmgG|YJK)8@TYI`L z*U)UWKOxO}IFG5?XJhB*OQWDGv{UJBozzq>f?gP5G}d*BGXk1cIm{xM@xRBjYP21c zx9rV+W|{TJOb26&04@`g)#ljT=1ODC9KJ;==pTwH`TJ;$Y!i7Q8E?YHjIn<~$LCV( zq-SxO>0Inn)-lT5i~+L)=I$10{XcuVZPdrdAD-6W(Gv4W(>lyjk%C=P>4x(*U7T9|XRQ>Zxcl z#;V)5S>dlq`kWM)xJs%J#0`(>@p$G-k)RPPVH?L<6=s#+h3w`^vIxC^Ns~N>vApg& z+mDzoaJEaDHk}s~IKT*ccWft;W7)-k&NA&j&*Ll$!n}I{3`qsEbY8j*cy*}MkLT?3 zcfhAH!56bu<|iwhlPE52_}#OP-R1+khqyX0ct94hswSsRB+#gW$E4SYZF*n&-uIp>q-Pak5mw*f|=b@ebE$0#^E zO%G&oiFN}MU8FqbRf^*}BzBLWel{5<=>pC`RB5{%FEP`#SXAkUTT%&!eRRo-6#@bHCD!$G$ z7;~DBWAGdXW(jz=kk4esaRPifY(a#7UH4;|wDmfT&%T#(mHr-Y{}XBb?|~;`+}!tW z^-9gazM<@sEt}h4g*8li-7cn*(yJq_Z;!P8ok;69&e}QBddnKuDe?nGY$0|86Bi)D zzbP?kirvvbE{G^Bp}V(s~3CY5g?d`53wQ{CW2Z zkW#?&sBpK3F`17rtHX7s1IqS*w*WVVO8rW5alR4wZj5FmoS@irFRO0XHPEK1+&wSx znSTIyASTUY9r#7yxtPobcc1qGkEC4WYhA>*E<*Si(;cwv2WY#(aYv-7FIm^)672`N zY|&1g1dpd{u47tw+pAUgfA={QVLvH&t*g0gQQ6^OA+fHA={8D#9}@%cz~uLLVCK_z z_R(Q5h_v3NTpPxw#H5|9ntsj^%qm<0$Lxn;hl9DKl5x;>fg3lKWxLcTc ztLyloDlt%PAVrBrz?^In@LD&!ShsLL30bDY6M|BG)sEB&tRJo+^b zW=agL*X)OUlx#1;@F*r2n`W}SHMpL4^QGD9)$6A zc|3=eqQJEs%p6uUKiY9Sheh}cCz)RL*IB90%3P`x_1^*`QhD)^Ie#`_TmV%%G*v~) zDAvg+7*S8-dpyR!@`ISz0dWU(Wik?zoD_%sDOH zV}ReMx(U;}06fdWEEj-l`rl_d=xiNhDRhPWMbd?h)Zws$cdHaa6IX0NYMrz{ZwE79 z3V>%>C=&xr#7ccF8M)QvhOop;?XrA?o~Ax3bQVK2E3c?-y_8Z22{rnmvxS^BLr zvKuOOuRcDwZ4>i^)TG?hUnAul%Z%}+Nb4_mUksJ{O5jU?8v*gJ%=)6YNptKkQ69O$ zy6}0QVey6kyvs^^Jj;lb^R*e0c9fG2tB|JC+WXF0$Xuk_+$-sY8>DeTcA&O&DQ!#n z9y8tW%oXlpNtJEf_id|0*?tO}d?BDK~kAgcgyyE}OD=3xH=?5DP$7X4R}1D7yu%oBJ;cL7DR6BaG#< z$m}kC1!Bx%M-%{gkL2~DIjD{2vWjniGa2Vu>;GAK{Y4x~)4$M`V4Gl8&V37ifN#wy z84M;$|2QTSpiKE-FiMTBWp>${`i%3lEW#grg+GtSrOrHI7yWTd-d>@c@E;`mNJY}3 z?SvuOsfSW=HLFc;U3Y^UyeF8OvT2NgU)_2i<4CGp6X7qMV%l9?XAyC=#Mq0jQ=iO_(w?WC)WlkZN_}@9pX*X3XVg{}R&B+4uED;dX$ztq?_;i;ZF$Jb4)Bd~ zJf6cxo-3fJ0_zdlS$IjQVY?SgRx2K*)8`(btO8))7+zo%^HJb#*8f+@*HY(QdCKGQ%oh=mS@r#kaJO%hm~z(N ztT7giX-GMD02skuCdk=t8rK$e<1ktwROt;cXDCa}fL-Mv8egVQ8^ z#pCfTE|NdLP1*#_CQkrOto`e@q@6`p0Cep9WR0;+g`}+P*>3SOi+V83g}&4NTlC%`*AJApX#AW5$oY(hAZ{&5%bv=f;mOj7T<5?{xOq=RAE9^VK zxDRFjGfY>!tJ<_H>-c#KI1!9jIaq|P3u}Y~1B$(#V=cIZ(D@YY#BOOHD)$s%)B)2dNh$ad^k@eP=1(z`kny!Q7 z<|X`Pk(-y9F%P=3=+tJw>O}J|BUdmFniu{a&+0M3tftF6;}@Bpi?al88*@dL+fgb3 z+Mj6es$GDHn2!F{WXv17D*Dfpd zFw5%F36a+CZGM#YsC&|9fgeu-8onBz8Q}4FJVJmGy3e#;D?3MS({6g&X-v%4$>hgH zDxHonE{3dDzHK3vhO)}UNsNrDBBypqgRUjuZ%lEpQeR-3)OxWH3)E1lZ|HjrE_D=uF>qU?^}hoCtmZL19*<|$*&wa-8DmzV zcJUg!oUTN~mn|z^M3p-IqNsGuMT(Ujdj)=s^g5MYnM+L-+s9wFUGSl$&dU8L@SlLU zOfEhFU0R@YlJsubPXz$h_w6cXvdvarG*AXMt_ z`yPXfU%`7k9#6Z(q`qgVhc6Ao-0fBsyWH>yBjDw_46SW;lIxOX=9Z8O} zo*Y|J9T%xs-EDmjAPcVmcsw3YyNF5N4y@~~^IVVD0E%4_0n;%NWm^=xR+BXj#xX3K za`ocA2atu2-uHMsp7ycR*Rljzml*)7Oxd`AMOys>JTB6D9>JEC@Cty(=*@NIuR9*?IhnkWFvSkZ2f^J6Oj?zORN_}l+yo&P@5#g=T&(5|v|6(b*?5NUls zrn47ZZb^QB1b7j}3PG;~k=D18ei4T$O~tcZY_XWZJ+ldd?B^5UdY_U}G2zHiyCBnE4$X9S#N?gTY{JFc^#o zf2#Y&U7YYA(#(uNTDN8=}aUBMjg~(UT*lrj24fn-RDTT3G zR4v!s8NLvZ$5WPR0UZp?|9AZaQ+~~0Fd-fQgCH0LKoG~1Kn?`NK`@BpcrpPd!(cFm zctQ|NV%VR=@x)sQmYRL?E8NXukF;9e0N9AMz8%vfXHjuik#?5UhznM-%`f*ulDnsep$d5%SY=y3XYe zf;f(YfM5{ACu)h7G@lFnayM5d7z~48eFE!2 zFc`)0BnX^Ud-ejn`%4f?z^CxjK&HtHkjlOmv=n#9eh1<1>!Q?gqFF%qu`VD~3Rn0$ZS7 z!L0DlCI1h}PX+9Y-wu_Ul_jtccng51OD4b@flI*W0RIU558%d7sW(?VR&(K>`uB%1 zY>=$@iETIkVj|XnAPCk5L2z{($GhGdu&_w9__Dd)vS@4kb*_aS=qIcFeWvTxESm5K z_`|*jP!_KMc)H{>z&(Jsgi1Zndi{fQ8$q(#9|S=V!1@H%2EkxRJQ>7syzqiQ<7Czd zg5i*OJr3fXNgVHaMPOlBrkg7dS%o(twtmVUOYZ40a2aFfUj}wUrQXr^Aj(o#0f;fa z+fM`U1pWXM{7@(5#j~2cK2+-4di(TL@DBqRO<*ku2BRRJ1j{G*r!m%mcs&RPYeV8a zuLyV+9Q(ekqEPH%g#RM0@(+;IYFH{ND*y#2d9O(8_XGE4nP*o|TRbAtdLvY-9lw29 zEHi&#BKk)`Fc_|a;CD~doKL(S1cT9#c%LBN9UDc!#|U`p(8g*%i!zn|+#tR&#^k@~ z>;iunD)rpH2U3T!U-tW;Si_05el&0&+MQuzjPLhi^8fb(j|IL7_$7=_*|V6u2e@0L zb@y6vT77SA7z9TGf}=5PV*Xw;E9S)w@N0VVaU2h0;&p<-u^J>et@xT#0?=#oqw0AUn(8!OJTAA=?7*LLdab4)dk_P^i>zL|XrG-a#U* zUxX3LZF39o=NO;yYeS{(OkV#W@F$VhzXSXx@QB{7V0m^iH~4R1wA+tjnnnB(tFtT> zV&Jba5&!p(w0t-t(0O zJteTybA>AYdbhEU9J5RVBuNq8$C&&V$%6H6;KxFxZi=*i7N*Of@P7KMH_!^A0PKWH z-P?NocOtES6*x%}uoWux%&Y@MTK_iiw3f$pEAYR7cZ5p4C+Bn5L!~|uY5i-M@`}R> z$M1uG43&CZ#(CTXJi70}waj+%`+XQi=d&?gw7vrPsZgn#i*`1qZNMtC`<{2b%l7LJ zjL>H|fl&;DfOr_(wePCwQ&q5w3B|)87_7zdWRfTY^Y z;8f0WvJ{40jPUQ1+km^-<8tKQrnCKZ!2N*_^*rv{jDTB0r9R(%W7Z@M5NZ8xX4FNl z$oWE`4criE{gGuU{p<4o1F#$Bf8F=92><{907*qoM6N<$g4S5~hyVZp literal 0 HcmV?d00001 diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index 1cb5678bc1..a5eb11f4e1 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -108,7 +108,6 @@ void RenderablePolyLineEntityItem::updateGeometry() { _verticesBuffer->append(sizeof(glm::vec2), (gpu::Byte*)&uv); vertexIndex++; - uv.y = 1.0; _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); @@ -178,7 +177,6 @@ void RenderablePolyLineEntityItem::render(RenderArgs* args) { batch.setPipeline(_pipeline); batch.setResourceTexture(PAINTSTROKE_GPU_SLOT, _texture); - batch.setInputFormat(_format); batch.setInputBuffer(0, _verticesBuffer, 0, _format->getChannels().at(0)._stride); diff --git a/libraries/entities/src/PolyLineEntityItem.cpp b/libraries/entities/src/PolyLineEntityItem.cpp index e8d504091d..0c068e7789 100644 --- a/libraries/entities/src/PolyLineEntityItem.cpp +++ b/libraries/entities/src/PolyLineEntityItem.cpp @@ -53,13 +53,11 @@ EntityItemProperties PolyLineEntityItem::getProperties() const { properties._color = getXColor(); properties._colorChanged = false; - COPY_ENTITY_PROPERTY_TO_PROPERTIES(lineWidth, getLineWidth); COPY_ENTITY_PROPERTY_TO_PROPERTIES(linePoints, getLinePoints); COPY_ENTITY_PROPERTY_TO_PROPERTIES(normals, getNormals); COPY_ENTITY_PROPERTY_TO_PROPERTIES(strokeWidths, getStrokeWidths); - properties._glowLevel = getGlowLevel(); properties._glowLevelChanged = false; return properties; @@ -75,8 +73,6 @@ bool PolyLineEntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(linePoints, setLinePoints); SET_ENTITY_PROPERTY_FROM_PROPERTIES(normals, setNormals); SET_ENTITY_PROPERTY_FROM_PROPERTIES(strokeWidths, setStrokeWidths); - - if (somethingChanged) { bool wantDebug = false; @@ -89,7 +85,6 @@ bool PolyLineEntityItem::setProperties(const EntityItemProperties& properties) { setLastEdited(properties._lastEdited); } return somethingChanged; - } bool PolyLineEntityItem::appendPoint(const glm::vec3& point) { @@ -115,7 +110,6 @@ bool PolyLineEntityItem::setStrokeWidths(const QVector& strokeWidths ) { bool PolyLineEntityItem::setNormals(const QVector& normals) { _normals = normals; if (_points.size () < 2) { -// qDebug() << "points size is less than 2!"; return false; } @@ -126,8 +120,7 @@ bool PolyLineEntityItem::setNormals(const QVector& normals) { if (_strokeWidths.size() < minVectorSize) { minVectorSize = _strokeWidths.size(); } - -// int minArraySize = glm::min(_normals.size(), _points.size()) + _vertices.clear(); glm::vec3 v1, v2, tangent, binormal, point; @@ -139,6 +132,7 @@ bool PolyLineEntityItem::setNormals(const QVector& normals) { glm::vec3 normal = normals.at(i); binormal = glm::normalize(glm::cross(tangent, normal)) * width; + //This checks to make sure binormal is not a NAN assert(binormal.x == binormal.x); v1 = point + binormal; v2 = point - binormal; @@ -174,7 +168,6 @@ bool PolyLineEntityItem::setLinePoints(const QVector& points) { return false; } - for (int i = 0; i < points.size(); i++) { glm::vec3 point = points.at(i); glm::vec3 pos = getPosition(); @@ -183,11 +176,8 @@ bool PolyLineEntityItem::setLinePoints(const QVector& points) { qDebug() << "Point is outside entity's bounding box"; return false; } - } _points = points; - //All our points are valid and at least one point has changed, now create quads from points - return true; } From dc8fa0beb42e02f47e62bc820c59f64dc64c045d Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Mon, 3 Aug 2015 11:15:14 -0700 Subject: [PATCH 42/61] added painting scripts to demonstrate one way to use the PolyLineEntity --- .../painting/hydraPaint.js} | 38 +++--- .../painting/mousePaint.js} | 116 +++++------------- 2 files changed, 46 insertions(+), 108 deletions(-) rename examples/{hydraPolyLinePaint.js => example/painting/hydraPaint.js} (87%) rename examples/{mousePolyLinePaint.js => example/painting/mousePaint.js} (65%) diff --git a/examples/hydraPolyLinePaint.js b/examples/example/painting/hydraPaint.js similarity index 87% rename from examples/hydraPolyLinePaint.js rename to examples/example/painting/hydraPaint.js index 1c20655a03..29a3323e72 100644 --- a/examples/hydraPolyLinePaint.js +++ b/examples/example/painting/hydraPaint.js @@ -19,20 +19,19 @@ var LASER_COLOR = { green: 150, blue: 200 }; -var TRIGGER_THRESHOLD = .02; +var TRIGGER_THRESHOLD = .1; -var MAX_POINTS_PER_LINE = 50; +var MAX_POINTS_PER_LINE = 40; var LIFETIME = 6000; -var DRAWING_DEPTH = 2; -var LINE_DIMENSIONS = 100; +var DRAWING_DEPTH = 1; +var LINE_DIMENSIONS = 20; -var DISTANCE_FROM_HAND = 2; var MIN_POINT_DISTANCE = 0.01; -var MIN_BRUSH_RADIUS = 0.04; -var MAX_BRUSH_RADIUS = 0.08; +var MIN_BRUSH_RADIUS = 0.08; +var MAX_BRUSH_RADIUS = 0.1; var RIGHT_BUTTON_1 = 7 var RIGHT_BUTTON_2 = 8 @@ -44,9 +43,9 @@ var LEFT_BUTTON_3 = 3; var LEFT_BUTTON_4 = 4; var colorPalette = [{ - red: 10, - green: 208, - blue: 60 + red: 250, + green: 0, + blue: 0 }, { red: 214, green: 91, @@ -84,6 +83,8 @@ function controller(side, cycleColorButton) { this.currentColorIndex = 0; this.currentColor = colorPalette[this.currentColorIndex]; + var self = this; + this.brush = Entities.addEntity({ type: 'Sphere', @@ -107,7 +108,6 @@ function controller(side, cycleColorButton) { } } this.newLine = function(position) { - print("NEW LINE") this.linePosition = position; this.line = Entities.addEntity({ position: position, @@ -118,7 +118,6 @@ function controller(side, cycleColorButton) { y: LINE_DIMENSIONS, z: LINE_DIMENSIONS }, - lineWidth: 0.1, lifetime: LIFETIME }); this.points = []; @@ -128,7 +127,6 @@ function controller(side, cycleColorButton) { this.update = function(deltaTime) { this.updateControllerState(); - var newBrushPosOffset = Vec3.multiply(Vec3.normalize(Vec3.subtract(this.tipPosition, this.palmPosition)), DRAWING_DEPTH); var newBrushPos = Vec3.sum(this.palmPosition, newBrushPosOffset); var brushRadius = map(this.triggerValue, TRIGGER_THRESHOLD, 1, MIN_BRUSH_RADIUS, MAX_BRUSH_RADIUS) @@ -144,16 +142,16 @@ function controller(side, cycleColorButton) { if (this.triggerValue > TRIGGER_THRESHOLD && !this.drawing) { - this.newLine(this.palmPosition); + this.newLine(newBrushPos); this.drawing = true; } else if (this.drawing && this.triggerValue < TRIGGER_THRESHOLD) { this.drawing = false; } - if (this.drawing) { + if (this.drawing && this.points.length < MAX_POINTS_PER_LINE) { var localPoint = Vec3.subtract(newBrushPos, this.linePosition); if (Vec3.distance(localPoint, this.points[this.points.length - 1]) < MIN_POINT_DISTANCE) { - // print("NOT ENOUGH DISTANCE BETWEEN POINTS!!"); + //Need a minimum distance to avoid binormal NANs return; } @@ -170,12 +168,6 @@ function controller(side, cycleColorButton) { color: this.currentColor }); - if (this.points.length > MAX_POINTS_PER_LINE) { - this.newLine(newBrushPos); - this.points.push(Vec3.subtract(newBrushPos, this.linePosition)); - this.normals.push(computeNormal(newBrushPos, Camera.getPosition())); - this.strokeWidths.push(MIN_STROKE_WIDTH); - } } } @@ -200,7 +192,7 @@ function controller(side, cycleColorButton) { } this.cleanup = function() { - Entities.deleteEntity(this.brush); + Entities.deleteEntity(self.brush); } } diff --git a/examples/mousePolyLinePaint.js b/examples/example/painting/mousePaint.js similarity index 65% rename from examples/mousePolyLinePaint.js rename to examples/example/painting/mousePaint.js index 14949c6c5c..30a2e1fbf9 100644 --- a/examples/mousePolyLinePaint.js +++ b/examples/example/painting/mousePaint.js @@ -1,5 +1,5 @@ // -// paint.js +// mousePaint.js // examples // // Created by Eric Levin on 6/4/15. @@ -10,39 +10,42 @@ // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -var LINE_DIMENSIONS = 5; + +var LINE_DIMENSIONS = 10; var LIFETIME = 6000; var EVENT_CHANGE_THRESHOLD = 200; -var LINE_WIDTH = .05; -var MAX_POINTS = 10; +var LINE_WIDTH = .07; +var MAX_POINTS_PER_LINE = 40; var points = []; var normals = []; +var deletedLines = []; var strokeWidths = []; var count = 0; -var prevEvent = null; +var prevEvent = {x: 0, y: 0}; +var eventChange; var MIN_POINT_DISTANCE = .01; var colorPalette = [{ - red: 236, - green: 208, - blue: 120 + red: 250, + green: 0, + blue: 0 }, { - red: 214, - green: 91, - blue: 67 + red: 214, + green: 91, + blue: 67 }, { - red: 192, - green: 41, - blue: 66 + red: 192, + green: 41, + blue: 66 }, { - red: 84, - green: 36, - blue: 55 + red: 84, + green: 36, + blue: 55 }, { - red: 83, - green: 119, - blue: 122 + red: 83, + green: 119, + blue: 122 }]; var currentColorIndex = 0; @@ -95,12 +98,12 @@ function MousePaint() { z: LINE_DIMENSIONS }, linePoints: [], - lineWidth: LINE_WIDTH, lifetime: LIFETIME }); points = []; normals = [] strokeWidths = []; + lines.push(line); } @@ -114,56 +117,24 @@ function MousePaint() { position: worldPoint }); + eventChange = Math.sqrt(Math.pow(event.x - prevEvent.x, 2) + Math.pow(event.y - prevEvent.y, 2)); + localPoint = computeLocalPoint(worldPoint); + if (!isDrawing || points.length > MAX_POINTS_PER_LINE || eventChange > EVENT_CHANGE_THRESHOLD || + Vec3.distance(points[points.length - 1], localPoint) < MIN_POINT_DISTANCE) { + return; + } - if (!isDrawing) { - return; - } - var eventChange = Math.sqrt(Math.pow(event.x - prevEvent.x, 2) + Math.pow(event.y - prevEvent.y, 2)); - //print("EVENT CHANGE " + eventChange) - if (eventChange > EVENT_CHANGE_THRESHOLD) { - print("PAST THRESHOLD!") - return; - } - - - var localPoint = computeLocalPoint(worldPoint); - if (Vec3.distance(points[points.length - 1], localPoint) < MIN_POINT_DISTANCE) { - print("NOT ENOUGH DISTANCE BETWEEN MOUSE MOVES") - return; - } - var width = (Math.sin(count / 100) + 1.1) / 10; points.push(localPoint) normals.push(computeNormal(worldPoint, pickRay.origin)); - strokeWidths.push(.07); + strokeWidths.push(LINE_WIDTH); Entities.editEntity(line, { strokeWidths: strokeWidths, linePoints: points, normals: normals, }); - if (points.length > MAX_POINTS) { - newLine(worldPoint); - var localPoint = computeLocalPoint(worldPoint); - points.push(localPoint); - normals.push(computeNormal(worldPoint, pickRay.origin)); - strokeWidths.push(.07); - - } prevEvent = event; } - function undoStroke() { - var deletedLine = lines.pop(); - var deletedLineProps = Entities.getEntityProperties(deletedLine); - deletedLines.push(deletedLineProps); - Entities.deleteEntity(deletedLine); - } - - function redoStroke() { - var restoredLine = Entities.addEntity(deletedLines.pop()); - Entities.addEntity(restoredLine); - lines.push(restoredLine); - } - function computeNormal(p1, p2) { return Vec3.normalize(Vec3.subtract(p2, p1)); } @@ -174,7 +145,6 @@ function MousePaint() { } function computeLocalPoint(worldPoint) { - var localPoint = Vec3.subtract(worldPoint, linePosition); return localPoint; } @@ -193,7 +163,6 @@ function MousePaint() { normals.push(computeNormal(worldPoint, pickRay.origin)); strokeWidths.push(0.07); isDrawing = true; - } function mouseReleaseEvent() { @@ -207,22 +176,13 @@ function MousePaint() { color: currentColor }); } - if (event.text === "z") { - undoStroke(); - } - if (event.text === "x") { - redoStroke(); - } } - - function cleanup() { lines.forEach(function(line) { // Entities.deleteEntity(line); }); Entities.deleteEntity(brush); - } Controller.mousePressEvent.connect(mousePressEvent); @@ -232,17 +192,3 @@ function MousePaint() { Controller.keyPressEvent.connect(keyPressEvent); } - - -function randFloat(low, high) { - return low + Math.random() * (high - low); -} - - -function randInt(low, high) { - return Math.floor(randFloat(low, high)); -} - -function map(value, min1, max1, min2, max2) { - return min2 + (max2 - min2) * ((value - min1) / (max1 - min1)); -} \ No newline at end of file From 98a5d1e7597a95e9bf11d7d29828ae4ce4018b23 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Mon, 3 Aug 2015 11:25:18 -0700 Subject: [PATCH 43/61] fixed merge conflics in hit effect --- libraries/render-utils/src/hit_effect.slf | 22 +--------------------- libraries/render-utils/src/hit_effect.slv | 12 ------------ 2 files changed, 1 insertion(+), 33 deletions(-) diff --git a/libraries/render-utils/src/hit_effect.slf b/libraries/render-utils/src/hit_effect.slf index a42a68e315..791a1e7f74 100644 --- a/libraries/render-utils/src/hit_effect.slf +++ b/libraries/render-utils/src/hit_effect.slf @@ -2,11 +2,8 @@ <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // -<<<<<<< HEAD -// ambient_occlusion.frag -======= + // hit_effect.frag ->>>>>>> master // fragment shader // // Created by Eric Levin on 7/20 @@ -15,23 +12,7 @@ // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -<<<<<<< HEAD -<@include gpu/Transform.slh@> -<$declareStandardTransform()$> -<@include DeferredBufferWrite.slh@> -void main(void) { - - TransformCamera cam = getTransformCamera(); - vec4 myViewport; - <$transformCameraViewport(cam, myViewport)$> - vec2 center = vec2(myViewport.z/2.0, myViewport.w/2.0); - float distFromCenter = distance(center, gl_FragCoord.xy); - //normalize - distFromCenter = distFromCenter/myViewport.z; - float alpha = mix(0.0, 1.0, distFromCenter); - gl_FragColor = vec4(0.7, 0.0, 0.0, alpha); -======= <@include DeferredBufferWrite.slh@> @@ -42,5 +23,4 @@ void main(void) { float distFromCenter = distance( vec2(0.0, 0.0), varQuadPosition); float alpha = mix(0.0, 0.5, pow(distFromCenter,5.)); gl_FragColor = vec4(1.0, 0.0, 0.0, alpha); ->>>>>>> master } \ No newline at end of file diff --git a/libraries/render-utils/src/hit_effect.slv b/libraries/render-utils/src/hit_effect.slv index 140a9d0685..d1efdebc18 100644 --- a/libraries/render-utils/src/hit_effect.slv +++ b/libraries/render-utils/src/hit_effect.slv @@ -2,17 +2,10 @@ <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // -<<<<<<< HEAD -// ambient_occlusion.vert -// vertex shader -// -// Created by Niraj Venkat on 7/20/15. -======= // hit_effect.vert // vertex shader // // Created by Eric Levin on 7/20/15. ->>>>>>> master // Copyright 2015 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. @@ -23,14 +16,9 @@ <$declareStandardTransform()$> -<<<<<<< HEAD -void main(void) { - gl_Position = gl_Vertex; -======= varying vec2 varQuadPosition; void main(void) { varQuadPosition = gl_Vertex.xy; gl_Position = gl_Vertex; ->>>>>>> master } \ No newline at end of file From e4ff3fa9da8c18a5cf8bc91d3a35254e0c242a29 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Mon, 3 Aug 2015 11:26:48 -0700 Subject: [PATCH 44/61] corrected author name at top of PolyLineEntity.h file --- libraries/entities/src/PolyLineEntityItem.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities/src/PolyLineEntityItem.h b/libraries/entities/src/PolyLineEntityItem.h index dad7569efb..f1126be9c1 100644 --- a/libraries/entities/src/PolyLineEntityItem.h +++ b/libraries/entities/src/PolyLineEntityItem.h @@ -2,7 +2,7 @@ // PolyLineEntityItem.h // libraries/entities/src // -// Created by Seth Alves on 5/11/15. +// Created by Eric Levin on 8/3/15. // Copyright 2015 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. From e36099f2b672ba82cd5fc1fe6d7b64505343564e Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Mon, 3 Aug 2015 12:31:21 -0700 Subject: [PATCH 45/61] fixing ambiguous "call to overloaded function compiler" errors on windows and linux builds --- libraries/entities/src/EntityScriptingInterface.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 518124a719..cf72cffb65 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -500,7 +500,7 @@ bool EntityScriptingInterface::setPoints(QUuid entityID, std::functiongetType(); - if (entityType != EntityTypes::Line) { + if (entityType != EntityTypes::PolyLine) { return false; } @@ -554,14 +554,14 @@ bool EntityScriptingInterface::setAllPoints(QUuid entityID, const QVector bool { - return lineEntity.setLinePoints(points); + return (LineEntityItem*)lineEntity.setLinePoints(points); }); } if (entityType == EntityTypes::PolyLine) { - return setPoints(entityID, [points](PolyLineEntityItem& PolyLineEntity) -> bool + return setPoints(entityID, [points](PolyLineEntityItem& polyLineEntity) -> bool { - return PolyLineEntity.setLinePoints(points); + return (PolyLineEntityItem*)polyLineEntity.setLinePoints(points); }); } @@ -579,14 +579,14 @@ bool EntityScriptingInterface::appendPoint(QUuid entityID, const glm::vec3& poin if (entityType == EntityTypes::Line) { return setPoints(entityID, [point](LineEntityItem& lineEntity) -> bool { - return lineEntity.appendPoint(point); + return (LineEntityItem*)lineEntity.appendPoint(point); }); } if (entityType == EntityTypes::PolyLine) { return setPoints(entityID, [point](PolyLineEntityItem& PolyLineEntity) -> bool { - return PolyLineEntity.appendPoint(point); + return (PolyLineEntityItem*)PolyLineEntity.appendPoint(point); }); } From 9125b3a2a9cda633e7843857f42f8f1e494ae3f5 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Mon, 3 Aug 2015 14:53:02 -0700 Subject: [PATCH 46/61] attempting to fix windows and linux builds again --- .../entities/src/EntityScriptingInterface.cpp | 50 ------------------- .../entities/src/EntityScriptingInterface.h | 1 - 2 files changed, 51 deletions(-) diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index cf72cffb65..9654de0fc4 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -488,42 +488,6 @@ bool EntityScriptingInterface::setPoints(QUuid entityID, std::function actor) { - if (!_entityTree) { - return false; - } - - EntityItemPointer entity = static_cast(_entityTree->findEntityByEntityItemID(entityID)); - if (!entity) { - qCDebug(entities) << "EntityScriptingInterface::setPoints no entity with ID" << entityID; - } - - EntityTypes::EntityType entityType = entity->getType(); - - if (entityType != EntityTypes::PolyLine) { - return false; - } - - auto now = usecTimestampNow(); - - auto polyLineEntity = std::static_pointer_cast(entity); - _entityTree->lockForWrite(); - bool success = actor(*polyLineEntity); - entity->setLastEdited(now); - entity->setLastBroadcast(now); - _entityTree->unlock(); - - _entityTree->lockForRead(); - EntityItemProperties properties = entity->getProperties(); - _entityTree->unlock(); - - properties.setLinePointsDirty(); - properties.setLastEdited(now); - - - queueEntityMessage(PacketType::EntityEdit, entityID, properties); - return success; -} bool EntityScriptingInterface::setVoxelSphere(QUuid entityID, const glm::vec3& center, float radius, int value) { return setVoxels(entityID, [center, radius, value](PolyVoxEntityItem& polyVoxEntity) { @@ -558,13 +522,6 @@ bool EntityScriptingInterface::setAllPoints(QUuid entityID, const QVector bool - { - return (PolyLineEntityItem*)polyLineEntity.setLinePoints(points); - }); - } - return false; } @@ -583,13 +540,6 @@ bool EntityScriptingInterface::appendPoint(QUuid entityID, const glm::vec3& poin }); } - if (entityType == EntityTypes::PolyLine) { - return setPoints(entityID, [point](PolyLineEntityItem& PolyLineEntity) -> bool - { - return (PolyLineEntityItem*)PolyLineEntity.appendPoint(point); - }); - } - return false; } diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index a7744e3166..4d5c108d56 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -165,7 +165,6 @@ private: bool actionWorker(const QUuid& entityID, std::function actor); bool setVoxels(QUuid entityID, std::function actor); bool setPoints(QUuid entityID, std::function actor); - bool setPoints(QUuid entityID, std::function actor); void queueEntityMessage(PacketType::Value packetType, EntityItemID entityID, const EntityItemProperties& properties); From 94acb23f27e1e58ab6bdc21d2ce90285583f1259 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Mon, 3 Aug 2015 15:51:11 -0700 Subject: [PATCH 47/61] no longer redefining payloadRender method in effort to avoid linux build errors --- .../src/RenderableEntityItem.cpp | 3 +++ .../src/RenderablePolyLineEntityItem.cpp | 26 ------------------- 2 files changed, 3 insertions(+), 26 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableEntityItem.cpp b/libraries/entities-renderer/src/RenderableEntityItem.cpp index 461b64a9e6..bf9710857a 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableEntityItem.cpp @@ -18,6 +18,9 @@ namespace render { if (payload->entity->getType() == EntityTypes::Light) { return ItemKey::Builder::light(); } + if (payload && payload->entity->getType() == EntityTypes::PolyLine) { + return ItemKey::Builder::transparentShape(); + } } return ItemKey::Builder::opaqueShape(); } diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index a5eb11f4e1..270c38edb6 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -123,32 +123,6 @@ void RenderablePolyLineEntityItem::updateGeometry() { } -namespace render { - template <> const ItemKey payloadGetKey(const RenderableEntityItemProxy::Pointer& payload) { - if (payload && payload->entity) { - if (payload->entity->getType() == EntityTypes::Light) { - return ItemKey::Builder::light(); - } - } - return ItemKey::Builder::transparentShape(); - } - - template <> const Item::Bound payloadGetBound(const RenderableEntityItemProxy::Pointer& payload) { - if (payload && payload->entity) { - return payload->entity->getAABox(); - } - return render::Item::Bound(); - } - template <> void payloadRender(const RenderableEntityItemProxy::Pointer& payload, RenderArgs* args) { - if (args) { - if (payload && payload->entity && payload->entity->getVisible()) { - payload->entity->render(args); - } - } - } -} - - void RenderablePolyLineEntityItem::render(RenderArgs* args) { QWriteLocker lock(&_quadReadWriteLock); From d735c85806ef00a6b15b7c0e8ff7a6a32c218e9b Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Fri, 7 Aug 2015 11:41:55 -0700 Subject: [PATCH 48/61] moving polyLineEntity over to core profile --- .../src/DeferredBufferWrite.slh | 50 ++++++++++++++----- .../entities-renderer/src/paintStroke.slf | 13 +++-- .../entities-renderer/src/paintStroke.slv | 21 ++++---- tests/shaders/src/main.cpp | 4 ++ 4 files changed, 57 insertions(+), 31 deletions(-) diff --git a/libraries/entities-renderer/src/DeferredBufferWrite.slh b/libraries/entities-renderer/src/DeferredBufferWrite.slh index a7f4055bba..293d38096f 100755 --- a/libraries/entities-renderer/src/DeferredBufferWrite.slh +++ b/libraries/entities-renderer/src/DeferredBufferWrite.slh @@ -11,44 +11,68 @@ <@if not DEFERRED_BUFFER_WRITE_SLH@> <@def DEFERRED_BUFFER_WRITE_SLH@> +layout(location = 0) out vec4 _fragColor0; +layout(location = 1) out vec4 _fragColor1; +layout(location = 2) out vec4 _fragColor2; + // the glow intensity uniform float glowIntensity; // the alpha threshold uniform float alphaThreshold; +uniform sampler2D normalFittingMap; + +vec3 bestFitNormal(vec3 normal) { + vec3 absNorm = abs(normal); + float maxNAbs = max(absNorm.z, max(absNorm.x, absNorm.y)); + + vec2 texcoord = (absNorm.z < maxNAbs ? + (absNorm.y < maxNAbs ? absNorm.yz : absNorm.xz) : + absNorm.xy); + texcoord = (texcoord.x < texcoord.y ? texcoord.yx : texcoord.xy); + texcoord.y /= texcoord.x; + vec3 cN = normal / maxNAbs; + float fittingScale = texture(normalFittingMap, texcoord).a; + cN *= fittingScale; + return (cN * 0.5 + 0.5); +} + float evalOpaqueFinalAlpha(float alpha, float mapAlpha) { return mix(alpha * glowIntensity, 1.0 - alpha * glowIntensity, step(mapAlpha, alphaThreshold)); } +const vec3 DEFAULT_SPECULAR = vec3(0.1); +const float DEFAULT_SHININESS = 10; + void packDeferredFragment(vec3 normal, float alpha, vec3 diffuse, vec3 specular, float shininess) { if (alpha != glowIntensity) { discard; } - gl_FragData[0] = vec4(diffuse.rgb, alpha); - gl_FragData[1] = vec4(normal, 0.0) * 0.5 + vec4(0.5, 0.5, 0.5, 1.0); - gl_FragData[2] = vec4(specular, shininess / 128.0); + _fragColor0 = vec4(diffuse.rgb, alpha); + _fragColor1 = vec4(bestFitNormal(normal), 1.0); + _fragColor2 = vec4(specular, shininess / 128.0); } void packDeferredFragmentLightmap(vec3 normal, float alpha, vec3 diffuse, vec3 specular, float shininess, vec3 emissive) { if (alpha != glowIntensity) { discard; } - - gl_FragData[0] = vec4(diffuse.rgb, alpha); - //gl_FragData[1] = vec4(normal, 0.0) * 0.5 + vec4(0.5, 0.5, 0.5, 1.0); - gl_FragData[1] = vec4(normal, 0.0) * 0.5 + vec4(0.5, 0.5, 0.5, 0.5); - gl_FragData[2] = vec4(emissive, shininess / 128.0); + + _fragColor0 = vec4(diffuse.rgb, alpha); + //_fragColor1 = vec4(normal, 0.0) * 0.5 + vec4(0.5, 0.5, 0.5, 1.0); + _fragColor1 = vec4(bestFitNormal(normal), 0.5); + _fragColor2 = vec4(emissive, shininess / 128.0); } void packDeferredFragmentTranslucent(vec3 normal, float alpha, vec3 diffuse, vec3 specular, float shininess) { if (alpha <= alphaThreshold) { discard; - } - - gl_FragData[0] = vec4(diffuse.rgb, alpha); - // gl_FragData[1] = vec4(normal, 0.0) * 0.5 + vec4(0.5, 0.5, 0.5, 1.0); - // gl_FragData[2] = vec4(specular, shininess / 128.0); + } + + _fragColor0 = vec4(diffuse.rgb, alpha); + // _fragColor1 = vec4(normal, 0.0) * 0.5 + vec4(0.5, 0.5, 0.5, 1.0); + // _fragColor2 = vec4(specular, shininess / 128.0); } <@endif@> diff --git a/libraries/entities-renderer/src/paintStroke.slf b/libraries/entities-renderer/src/paintStroke.slf index 4d54f68865..70ddb41b4c 100644 --- a/libraries/entities-renderer/src/paintStroke.slf +++ b/libraries/entities-renderer/src/paintStroke.slf @@ -19,9 +19,9 @@ uniform sampler2D originalTexture; // the interpolated normal -varying vec4 interpolatedNormal; -varying vec4 modelPosition; -varying vec2 varTexcoord; +in vec3 interpolatedNormal; +in vec2 varTexcoord; +in vec4 varColor; float rand(vec2 point){ return fract(sin(dot(point.xy ,vec2(12.9898,78.233))) * 43758.5453); @@ -31,14 +31,13 @@ float rand(vec2 point){ void main(void) { - vec3 newNormal = normalize(interpolatedNormal.xyz); - vec4 texel = texture2D(originalTexture, varTexcoord); + vec4 texel = texture(originalTexture, varTexcoord); int frontCondition = 1 -int(gl_FrontFacing) * 2; - vec3 color = gl_Color.rgb; + vec3 color = varColor.rgb; //vec3 normal, float alpha, vec3 diffuse, vec3 specular, float shininess packDeferredFragmentTranslucent( - newNormal * frontCondition, + interpolatedNormal * frontCondition, texel.a, color *texel.rgb, vec3(0.01, 0.01, 0.01), diff --git a/libraries/entities-renderer/src/paintStroke.slv b/libraries/entities-renderer/src/paintStroke.slv index ca4e86139f..7d7523deb9 100644 --- a/libraries/entities-renderer/src/paintStroke.slv +++ b/libraries/entities-renderer/src/paintStroke.slv @@ -12,30 +12,29 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +<@include gpu/Inputs.slh@> <@include gpu/Transform.slh@> <$declareStandardTransform()$> // the interpolated normal -varying vec4 interpolatedNormal; -varying vec4 modelPosition; +out vec3 interpolatedNormal; //the diffuse texture -varying vec2 varTexcoord; +out vec2 varTexcoord; + +out vec4 varColor; void main(void) { - varTexcoord = gl_MultiTexCoord0.st; + varTexcoord = inTexCoord0.st; // pass along the diffuse color - gl_FrontColor = gl_Color; - + varColor = inColor; + // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - <$transformModelToClipPos(cam, obj, gl_Vertex, gl_Position)$> - <$transformModelToEyeDir(cam, obj, gl_Normal, interpolatedNormal.xyz)$> - - modelPosition = gl_Vertex; - interpolatedNormal = vec4(normalize(interpolatedNormal.xyz), 0.0); + <$transformModelToClipPos(cam, obj, inPosition, gl_Position)$> + <$transformModelToEyeDir(cam, obj, inNormal.xyz, interpolatedNormal)$> } \ No newline at end of file diff --git a/tests/shaders/src/main.cpp b/tests/shaders/src/main.cpp index c514532eac..dde7419264 100644 --- a/tests/shaders/src/main.cpp +++ b/tests/shaders/src/main.cpp @@ -109,6 +109,8 @@ #include "sdf_text3D_vert.h" #include "sdf_text3D_frag.h" +#include "paintStroke_vert.h" +#include "paintStroke_frag.h" class RateCounter { std::vector times; @@ -324,6 +326,8 @@ void QTestWindow::draw() { testShaderBuild(SkyFromAtmosphere_vert, SkyFromAtmosphere_frag); testShaderBuild(Skybox_vert, Skybox_frag); + + testShaderBuild(paintStroke_vert,paintStroke_frag); }); From 205a2d53b64cfa67425203a35b8a285508c4a92a Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Fri, 7 Aug 2015 16:15:51 -0700 Subject: [PATCH 49/61] no longer returning early on NaN --- .../entities-renderer/src/RenderablePolyLineEntityItem.cpp | 2 -- .../entities-renderer/src/RenderablePolyLineEntityItem.h | 2 +- libraries/entities/src/PolyLineEntityItem.h | 5 ++++- libraries/octree/src/OctreePacketData.cpp | 2 +- libraries/shared/src/RegisteredMetaTypes.cpp | 4 ---- 5 files changed, 6 insertions(+), 9 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index 270c38edb6..05abe40635 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -119,8 +119,6 @@ void RenderablePolyLineEntityItem::updateGeometry() { } _pointsChanged = false; - _pointsChanged = false; - } diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h index 9da641a6f4..59bf416d7a 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h @@ -2,7 +2,7 @@ // RenderablePolyLineEntityItem.h // libraries/entities-renderer/src/ // -// Created by Eric Levin on 5/11/15. +// Created by Eric Levin on 6/22/15. // Copyright 2015 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. diff --git a/libraries/entities/src/PolyLineEntityItem.h b/libraries/entities/src/PolyLineEntityItem.h index f1126be9c1..25b348fa55 100644 --- a/libraries/entities/src/PolyLineEntityItem.h +++ b/libraries/entities/src/PolyLineEntityItem.h @@ -44,8 +44,11 @@ class PolyLineEntityItem : public EntityItem { const rgbColor& getColor() const { return _color; } xColor getXColor() const { xColor color = { _color[RED_INDEX], _color[GREEN_INDEX], _color[BLUE_INDEX] }; return color; } - void setColor(const rgbColor& value) { memcpy(_color, value, sizeof(_color)); } + void setColor(const rgbColor& value) { + memcpy(_color, value, sizeof(_color)); + } void setColor(const xColor& value) { + _color[RED_INDEX] = value.red; _color[GREEN_INDEX] = value.green; _color[BLUE_INDEX] = value.blue; diff --git a/libraries/octree/src/OctreePacketData.cpp b/libraries/octree/src/OctreePacketData.cpp index d8c3a88eb0..8430e21d79 100644 --- a/libraries/octree/src/OctreePacketData.cpp +++ b/libraries/octree/src/OctreePacketData.cpp @@ -623,7 +623,7 @@ int OctreePacketData::unpackDataFromBytes(const unsigned char *dataBytes, QVecto return sizeof(uint16_t) + length * sizeof(glm::vec3); } -int OctreePacketData::unpackDataFromBytes(const unsigned char *dataBytes, QVector& result) { +int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, QVector& result) { uint16_t length; memcpy(&length, dataBytes, sizeof(uint16_t)); dataBytes += sizeof(length); diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index fd164cc287..c4e05a68fb 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -109,10 +109,6 @@ QScriptValue qVectorFloatToScriptValue(QScriptEngine* engine, const QVectornewArray(); for (int i = 0; i < vector.size(); i++) { float num = vector.at(i); - if(num != num) { - //if num is NaN don't convert it - return array; - } array.setProperty(i, QScriptValue(num)); } return array; From 19e645fc65a8f8e6e76836755077cc5c1f5985b4 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Fri, 7 Aug 2015 16:26:52 -0700 Subject: [PATCH 50/61] fixed the way colors are handled to work with new core profile changes --- .../entities-renderer/src/RenderablePolyLineEntityItem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index 05abe40635..39938b4708 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -50,7 +50,7 @@ void RenderablePolyLineEntityItem::createPipeline() { _format.reset(new gpu::Stream::Format()); _format->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), 0); _format->setAttribute(gpu::Stream::NORMAL, 0, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), NORMAL_OFFSET); - _format->setAttribute(gpu::Stream::COLOR, 0, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA), COLOR_OFFSET); + _format->setAttribute(gpu::Stream::COLOR, 0, gpu::Element::COLOR_RGBA_32, COLOR_OFFSET); _format->setAttribute(gpu::Stream::TEXCOORD, 0, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV), TEXTURE_OFFSET); auto VS = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(paintStroke_vert))); From 6a4e2728eef012ea655cecf84fe5791945306e98 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Fri, 7 Aug 2015 16:29:57 -0700 Subject: [PATCH 51/61] deleted old packet headers file --- libraries/networking/src/PacketHeaders.h | 193 ----------------------- 1 file changed, 193 deletions(-) delete mode 100644 libraries/networking/src/PacketHeaders.h diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h deleted file mode 100644 index 617d6d1c9d..0000000000 --- a/libraries/networking/src/PacketHeaders.h +++ /dev/null @@ -1,193 +0,0 @@ -// -// PacketHeaders.h -// libraries/networking/src -// -// Created by Stephen Birarda on 4/8/13. -// Copyright 2013 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#ifndef hifi_PacketHeaders_h -#define hifi_PacketHeaders_h - -#pragma once - -#include -#include - -#include -#include -#include - -#include "UUID.h" - -// NOTE: if adding a new packet packetType, you can replace one marked usable or add at the end -// NOTE: if you want the name of the packet packetType to be available for debugging or logging, update nameForPacketType() as well - -enum PacketType { - PacketTypeUnknown, // 0 - PacketTypeStunResponse, - PacketTypeDomainList, - PacketTypePing, - PacketTypePingReply, - PacketTypeKillAvatar, // 5 - PacketTypeAvatarData, - PacketTypeInjectAudio, - PacketTypeMixedAudio, - PacketTypeMicrophoneAudioNoEcho, - PacketTypeMicrophoneAudioWithEcho, // 10 - PacketTypeBulkAvatarData, - PacketTypeSilentAudioFrame, - PacketTypeEnvironmentData, - PacketTypeDomainListRequest, - PacketTypeRequestAssignment, // 15 - PacketTypeCreateAssignment, - PacketTypeDomainConnectionDenied, - PacketTypeMuteEnvironment, - PacketTypeAudioStreamStats, - PacketTypeDataServerConfirm, // 20 - PacketTypeDomainServerPathQuery, - PacketTypeDomainServerPathResponse, - PacketTypeDomainServerAddedNode, - PacketTypeIceServerPeerInformation, - PacketTypeIceServerQuery, // 25 - PacketTypeOctreeStats, - PacketTypeJurisdiction, - PacketTypeJurisdictionRequest, - UNUSED_6, - UNUSED_7, // 30 - UNUSED_8, - UNUSED_9, - PacketTypeNoisyMute, - UNUSED_10, - PacketTypeAvatarIdentity, // 35 - PacketTypeAvatarBillboard, - PacketTypeDomainConnectRequest, - PacketTypeDomainServerRequireDTLS, - PacketTypeNodeJsonStats, - PacketTypeEntityQuery, // 40 - PacketTypeEntityData, - PacketTypeEntityAdd, - PacketTypeEntityErase, - PacketTypeEntityEdit, - PacketTypeOctreeDataNack, // 45 - PacketTypeStopNode, - PacketTypeAudioEnvironment, - PacketTypeEntityEditNack, - PacketTypeSignedTransactionPayment, - PacketTypeIceServerHeartbeat, // 50 - PacketTypeUnverifiedPing, - PacketTypeUnverifiedPingReply -}; - -typedef char PacketVersion; - -typedef uint16_t PacketSequenceNumber; -const PacketSequenceNumber DEFAULT_SEQUENCE_NUMBER = 0; - -typedef std::map PacketTypeSequenceMap; - -const QSet NON_VERIFIED_PACKETS = QSet() - << PacketTypeDomainServerRequireDTLS << PacketTypeDomainConnectRequest - << PacketTypeDomainList << PacketTypeDomainListRequest << PacketTypeDomainConnectionDenied - << PacketTypeCreateAssignment << PacketTypeRequestAssignment << PacketTypeStunResponse - << PacketTypeNodeJsonStats << PacketTypeEntityQuery - << PacketTypeOctreeDataNack << PacketTypeEntityEditNack - << PacketTypeIceServerHeartbeat << PacketTypeIceServerPeerInformation - << PacketTypeIceServerQuery << PacketTypeUnverifiedPing - << PacketTypeUnverifiedPingReply << PacketTypeStopNode - << PacketTypeDomainServerPathQuery << PacketTypeDomainServerPathResponse - << PacketTypeDomainServerAddedNode; - -const QSet SEQUENCE_NUMBERED_PACKETS = QSet() -<< PacketTypeAvatarData; - -const int NUM_BYTES_MD5_HASH = 16; -const int NUM_STATIC_HEADER_BYTES = sizeof(PacketVersion) + NUM_BYTES_RFC4122_UUID; -const int MAX_PACKET_HEADER_BYTES = sizeof(PacketType) + NUM_BYTES_MD5_HASH + NUM_STATIC_HEADER_BYTES; - -PacketType packetTypeForPacket(const QByteArray& packet); -PacketType packetTypeForPacket(const char* packet); - -PacketVersion versionForPacketType(PacketType packetType); -QString nameForPacketType(PacketType packetType); - -const QUuid nullUUID = QUuid(); - -QByteArray byteArrayWithUUIDPopulatedHeader(PacketType packetType, const QUuid& connectionUUID); -int populatePacketHeaderWithUUID(QByteArray& packet, PacketType packetType, const QUuid& connectionUUID); -int populatePacketHeaderWithUUID(char* packet, PacketType packetType, const QUuid& connectionUUID); - -int numHashBytesForType(PacketType packetType); -int numSequenceNumberBytesForType(PacketType packetType); - -int numBytesForPacketHeader(const QByteArray& packet); -int numBytesForPacketHeader(const char* packet); -int numBytesForArithmeticCodedPacketType(PacketType packetType); -int numBytesForPacketHeaderGivenPacketType(PacketType packetType); - -QUuid uuidFromPacketHeader(const QByteArray& packet); - -int hashOffsetForPacketType(PacketType packetType); -int sequenceNumberOffsetForPacketType(PacketType packetType); - -QByteArray hashFromPacketHeader(const QByteArray& packet); -QByteArray hashForPacketAndConnectionUUID(const QByteArray& packet, const QUuid& connectionUUID); - -// NOTE: The following four methods accept a PacketType which defaults to PacketTypeUnknown. -// If the caller has already looked at the packet type and can provide it then the methods below won't have to look it up. - -PacketSequenceNumber sequenceNumberFromHeader(const QByteArray& packet, PacketType packetType = PacketTypeUnknown); - -void replaceHashInPacket(QByteArray& packet, const QUuid& connectionUUID, PacketType packetType = PacketTypeUnknown); - -void replaceSequenceNumberInPacket(QByteArray& packet, PacketSequenceNumber sequenceNumber, - PacketType packetType = PacketTypeUnknown); - -void replaceHashAndSequenceNumberInPacket(QByteArray& packet, const QUuid& connectionUUID, PacketSequenceNumber sequenceNumber, - PacketType packetType = PacketTypeUnknown); - -int arithmeticCodingValueFromBuffer(const char* checkValue); -int numBytesArithmeticCodingFromBuffer(const char* checkValue); - -const PacketVersion VERSION_OCTREE_HAS_FILE_BREAKS = 1; -const PacketVersion VERSION_ENTITIES_HAVE_ANIMATION = 1; -const PacketVersion VERSION_ROOT_ELEMENT_HAS_DATA = 2; -const PacketVersion VERSION_ENTITIES_SUPPORT_SPLIT_MTU = 3; -const PacketVersion VERSION_ENTITIES_HAS_FILE_BREAKS = VERSION_ENTITIES_SUPPORT_SPLIT_MTU; -const PacketVersion VERSION_ENTITIES_SUPPORT_DIMENSIONS = 4; -const PacketVersion VERSION_ENTITIES_MODELS_HAVE_ANIMATION_SETTINGS = 5; -const PacketVersion VERSION_ENTITIES_HAVE_USER_DATA = 6; -const PacketVersion VERSION_ENTITIES_HAS_LAST_SIMULATED_TIME = 7; -const PacketVersion VERSION_MODEL_ENTITIES_SUPPORT_SHAPE_TYPE = 8; -const PacketVersion VERSION_ENTITIES_LIGHT_HAS_INTENSITY_AND_COLOR_PROPERTIES = 9; -const PacketVersion VERSION_ENTITIES_HAS_PARTICLES = 10; -const PacketVersion VERSION_ENTITIES_USE_METERS_AND_RADIANS = 11; -const PacketVersion VERSION_ENTITIES_HAS_COLLISION_MODEL = 12; -const PacketVersion VERSION_ENTITIES_HAS_MARKETPLACE_ID_DAMAGED = 13; -const PacketVersion VERSION_ENTITIES_HAS_MARKETPLACE_ID = 14; -const PacketVersion VERSION_ENTITIES_HAVE_ACCELERATION = 15; -const PacketVersion VERSION_ENTITIES_HAVE_UUIDS = 16; -const PacketVersion VERSION_ENTITIES_ZONE_ENTITIES_EXIST = 17; -const PacketVersion VERSION_ENTITIES_ZONE_ENTITIES_HAVE_DYNAMIC_SHAPE = 18; -const PacketVersion VERSION_ENTITIES_HAVE_NAMES = 19; -const PacketVersion VERSION_ENTITIES_ZONE_ENTITIES_HAVE_ATMOSPHERE = 20; -const PacketVersion VERSION_ENTITIES_ZONE_ENTITIES_HAVE_SKYBOX = 21; -const PacketVersion VERSION_ENTITIES_ZONE_ENTITIES_STAGE_HAS_AUTOMATIC_HOURDAY = 22; -const PacketVersion VERSION_ENTITIES_PARTICLE_ENTITIES_HAVE_TEXTURES = 23; -const PacketVersion VERSION_ENTITIES_HAVE_LINE_TYPE = 24; -const PacketVersion VERSION_ENTITIES_HAVE_COLLISION_SOUND_URL = 25; -const PacketVersion VERSION_ENTITIES_HAVE_FRICTION = 26; -const PacketVersion VERSION_NO_ENTITY_ID_SWAP = 27; -const PacketVersion VERSION_ENTITIES_PARTICLE_FIX = 28; -const PacketVersion VERSION_ENTITIES_LINE_POINTS = 29; -const PacketVersion VERSION_ENTITIES_FACE_CAMERA = 30; -const PacketVersion VERSION_ENTITIES_SCRIPT_TIMESTAMP = 31; -const PacketVersion VERSION_ENTITIES_SCRIPT_TIMESTAMP_FIX = 32; -const PacketVersion VERSION_ENTITIES_HAVE_SIMULATION_OWNER_AND_ACTIONS_OVER_WIRE = 33; -const PacketVersion VERSION_ENTITIES_NORMALS = 34; -const PacketVersion VERSION_ENTITIES_STROKE_WIDTHS = 35; - -#endif // hifi_PacketHeaders_h From 4fbd6f6337a28bd48b450c48d220e270ed2e6094 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Fri, 7 Aug 2015 16:42:10 -0700 Subject: [PATCH 52/61] removed old PacketHeaders.h file, updated udt version --- libraries/networking/src/udt/PacketHeaders.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 46f834db74..5df5473be8 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -75,7 +75,7 @@ namespace PacketType { EntityErase, EntityEdit, DomainServerConnectionToken - }; + }; }; const int NUM_BYTES_MD5_HASH = 16; @@ -141,4 +141,4 @@ const PacketVersion VERSION_ENTITIES_SCRIPT_TIMESTAMP_FIX = 32; const PacketVersion VERSION_ENTITIES_HAVE_SIMULATION_OWNER_AND_ACTIONS_OVER_WIRE = 33; const PacketVersion VERSION_ENTITIES_NEW_PROTOCOL_LAYER = 35; -#endif // hifi_PacketHeaders_h +#endif // hifi_PacketHeaders_h \ No newline at end of file From 942958c4f1dfec227ebdee0df30605f67f766845 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Sun, 9 Aug 2015 16:07:56 -0700 Subject: [PATCH 53/61] only setJointState() if animation frame actually changed --- .../entities-renderer/src/RenderableModelEntityItem.cpp | 9 ++++++--- libraries/entities/src/ModelEntityItem.cpp | 4 +++- libraries/entities/src/ModelEntityItem.h | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 6d2ff30d4b..eed908e429 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -275,9 +275,12 @@ void RenderableModelEntityItem::render(RenderArgs* args) { } if (jointsMapped()) { - auto frameData = getAnimationFrame(); - for (int i = 0; i < frameData.size(); i++) { - _model->setJointState(i, true, frameData[i]); + bool newFrame; + auto frameData = getAnimationFrame(newFrame); + if (newFrame) { + for (int i = 0; i < frameData.size(); i++) { + _model->setJointState(i, true, frameData[i]); + } } } } diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 362f5dc72a..4c03f4a7da 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -218,7 +218,8 @@ void ModelEntityItem::mapJoints(const QStringList& modelJointNames) { } } -const QVector& ModelEntityItem::getAnimationFrame() { +const QVector& ModelEntityItem::getAnimationFrame(bool& newFrame) { + newFrame = false; if (!hasAnimation() || !_jointMappingCompleted) { return _lastKnownFrameData; @@ -238,6 +239,7 @@ const QVector& ModelEntityItem::getAnimationFrame() { if (animationFrameIndex != _lastKnownFrameIndex) { _lastKnownFrameIndex = animationFrameIndex; + newFrame = true; const QVector& rotations = frames[animationFrameIndex].rotations; diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index e3d42e6b2c..950a95bae2 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -106,7 +106,7 @@ public: float getAnimationLastFrame() const { return _animationLoop.getLastFrame(); } void mapJoints(const QStringList& modelJointNames); - const QVector& getAnimationFrame(); + const QVector& getAnimationFrame(bool& newFrame); bool jointsMapped() const { return _jointMappingCompleted; } bool getAnimationIsPlaying() const { return _animationLoop.isRunning(); } From 668778cfd99c5372e2f571302fcc4293d5b4c081 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Sun, 9 Aug 2015 16:55:43 -0700 Subject: [PATCH 54/61] optimize JointState::setRotationInConstrainedFrameInternal() to short cut cases where targetRotation matches previous targetRotation --- libraries/animation/src/JointState.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/libraries/animation/src/JointState.cpp b/libraries/animation/src/JointState.cpp index 3682837719..1253dc4649 100644 --- a/libraries/animation/src/JointState.cpp +++ b/libraries/animation/src/JointState.cpp @@ -244,11 +244,13 @@ void JointState::setRotationInConstrainedFrame(glm::quat targetRotation, float p } void JointState::setRotationInConstrainedFrameInternal(const glm::quat& targetRotation) { - glm::quat parentRotation = computeParentRotation(); - _rotationInConstrainedFrame = targetRotation; - _transformChanged = true; - // R' = Rp * Rpre * r' * Rpost - _rotation = parentRotation * _fbxJoint->preRotation * _rotationInConstrainedFrame * _fbxJoint->postRotation; + if (_rotationInConstrainedFrame != targetRotation) { + glm::quat parentRotation = computeParentRotation(); + _rotationInConstrainedFrame = targetRotation; + _transformChanged = true; + // R' = Rp * Rpre * r' * Rpost + _rotation = parentRotation * _fbxJoint->preRotation * _rotationInConstrainedFrame * _fbxJoint->postRotation; + } } void JointState::setVisibleRotationInConstrainedFrame(const glm::quat& targetRotation) { From c299d77c9207eff67cd448611b13d96af537551e Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Mon, 10 Aug 2015 10:57:53 -0700 Subject: [PATCH 55/61] fixed implicit double to float casting and incorrect header author attribution --- .../src/RenderablePolyLineEntityItem.cpp | 14 +++++++------- libraries/entities-renderer/src/paintStroke.slf | 4 ++-- .../entities/src/ParticleEffectEntityItem.cpp | 1 + 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index 39938b4708..0d88f128aa 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -75,12 +75,12 @@ void RenderablePolyLineEntityItem::updateGeometry() { _verticesBuffer.reset(new gpu::Buffer()); int vertexIndex = 0; vec2 uv; - float tailStart = 0.0; - float tailEnd = 0.25; + float tailStart = 0.0f; + float tailEnd = 0.25f; float tailLength = tailEnd - tailStart; - float headStart = 0.76; - float headEnd = 1.0; + float headStart = 0.76f; + float headEnd = 1.0f; float headLength = headEnd - headStart; float uCoord, vCoord; @@ -88,8 +88,8 @@ void RenderablePolyLineEntityItem::updateGeometry() { int numHeadStrips = 10; int startHeadIndex = _normals.size() - numHeadStrips; for (int i = 0; i < _normals.size(); i++) { - uCoord = 0.26; - vCoord = 0; + uCoord = 0.26f; + vCoord = 0.0f; //tail if(i < numTailStrips) { uCoord = float(i)/numTailStrips * tailLength + tailStart; @@ -108,7 +108,7 @@ void RenderablePolyLineEntityItem::updateGeometry() { _verticesBuffer->append(sizeof(glm::vec2), (gpu::Byte*)&uv); vertexIndex++; - uv.y = 1.0; + uv.y = 1.0f; _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_vertices.at(vertexIndex)); _verticesBuffer->append(sizeof(glm::vec3), (const gpu::Byte*)&_normals.at(i)); _verticesBuffer->append(sizeof(int), (gpu::Byte*)_color); diff --git a/libraries/entities-renderer/src/paintStroke.slf b/libraries/entities-renderer/src/paintStroke.slf index 70ddb41b4c..4e2bc8d097 100644 --- a/libraries/entities-renderer/src/paintStroke.slf +++ b/libraries/entities-renderer/src/paintStroke.slf @@ -5,8 +5,8 @@ // paintStroke.frag // fragment shader // -// Created by Andrzej Kapolka on 9/15/14. -// Copyright 2014 High Fidelity, Inc. +// Created by Eric Levin on 8/10/2015 +// Copyright 2015 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index dc5bbb85ed..349e0c4d46 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -1,3 +1,4 @@ + // // ParticleEffectEntityItem.cpp // libraries/entities/src From 8aa7002ab80021fc29f6307aa8a5af603e4946f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20N=C3=A6sbye=20Christensen?= Date: Mon, 10 Aug 2015 21:07:08 +0200 Subject: [PATCH 56/61] Simple whitespace correction Added a space to make the reduced complexity notification look better. --- examples/notifications.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/notifications.js b/examples/notifications.js index 461d28cd2c..f7c172ab24 100644 --- a/examples/notifications.js +++ b/examples/notifications.js @@ -596,7 +596,7 @@ function menuItemEvent(menuItem) { LODManager.LODDecreased.connect(function() { var warningText = "\n" + "Due to the complexity of the content, the \n" - + "level of detail has been decreased." + + "level of detail has been decreased. " + "You can now see: \n" + LODManager.getLODFeedbackText(); From c9ad8e6e104ac50413a08f5224f8152ff685974b Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Mon, 10 Aug 2015 12:10:27 -0700 Subject: [PATCH 57/61] fixed comment formatting. --- libraries/entities/src/EntityPropertyFlags.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h index 2205b6e115..e439710695 100644 --- a/libraries/entities/src/EntityPropertyFlags.h +++ b/libraries/entities/src/EntityPropertyFlags.h @@ -131,7 +131,7 @@ enum EntityPropertyList { PROP_Y_TEXTURE_URL, // used by PolyVox PROP_Z_TEXTURE_URL, // used by PolyVox - //Used by PolyLine entity + // Used by PolyLine entity PROP_NORMALS, PROP_STROKE_WIDTHS, From 964d04d24f017f08aaf3bd3d42f94d886759016b Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Mon, 10 Aug 2015 12:34:01 -0700 Subject: [PATCH 58/61] Restore correct space for eye joint rotations. Also, do not correct for camera position on my avatar. (That will be done by zero or one receivers.) --- interface/src/avatar/SkeletonModel.cpp | 4 +++- libraries/animation/src/Rig.cpp | 21 ++++++++++++--------- libraries/animation/src/Rig.h | 4 +++- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index c0f1913d49..31f82a654c 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -107,12 +107,14 @@ void SkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) { const FBXGeometry& geometry = _geometry->getFBXGeometry(); Rig::HeadParameters params; + params.modelRotation = getRotation(); + params.modelTranslation = getTranslation(); params.leanSideways = _owningAvatar->getHead()->getFinalLeanSideways(); params.leanForward = _owningAvatar->getHead()->getFinalLeanSideways(); params.torsoTwist = _owningAvatar->getHead()->getTorsoTwist(); params.localHeadOrientation = _owningAvatar->getHead()->getFinalOrientationInLocalFrame(); params.worldHeadOrientation = _owningAvatar->getHead()->getFinalOrientationInWorldFrame(); - params.eyeLookAt = _owningAvatar->getHead()->getCorrectedLookAtPosition(); + params.eyeLookAt = _owningAvatar->getHead()->getLookAtPosition(); params.eyeSaccade = _owningAvatar->getHead()->getSaccade(); params.leanJointIndex = geometry.leanJointIndex; params.neckJointIndex = geometry.neckJointIndex; diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index b8bb9db6ea..1a8bd0bbad 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -27,6 +27,10 @@ void Rig::HeadParameters::dump() const { axis = glm::axis(worldHeadOrientation); theta = glm::angle(worldHeadOrientation); qCDebug(animation, " worldHeadOrientation axis = (%.5f, %.5f, %.5f), theta = %0.5f", axis.x, axis.y, axis.z, theta); + axis = glm::axis(modelRotation); + theta = glm::angle(modelRotation); + qCDebug(animation, " modelRotation axis = (%.5f, %.5f, %.5f), theta = %0.5f", axis.x, axis.y, axis.z, theta); + qCDebug(animation, " modelTranslation = (%.5f, %.5f, %.5f)", modelTranslation.x, modelTranslation.y, modelTranslation.z); qCDebug(animation, " eyeLookAt = (%.5f, %.5f, %.5f)", eyeLookAt.x, eyeLookAt.y, eyeLookAt.z); qCDebug(animation, " eyeSaccade = (%.5f, %.5f, %.5f)", eyeSaccade.x, eyeSaccade.y, eyeSaccade.z); qCDebug(animation, " leanJointIndex = %.d", leanJointIndex); @@ -782,8 +786,8 @@ glm::quat Rig::getJointDefaultRotationInParentFrame(int jointIndex) { void Rig::updateFromHeadParameters(const HeadParameters& params) { updateLeanJoint(params.leanJointIndex, params.leanSideways, params.leanForward, params.torsoTwist); updateNeckJoint(params.neckJointIndex, params.localHeadOrientation, params.leanSideways, params.leanForward, params.torsoTwist); - updateEyeJoint(params.leftEyeJointIndex, params.worldHeadOrientation, params.eyeLookAt, params.eyeSaccade); - updateEyeJoint(params.rightEyeJointIndex, params.worldHeadOrientation, params.eyeLookAt, params.eyeSaccade); + updateEyeJoint(params.leftEyeJointIndex, params.modelTranslation, params.modelRotation, params.worldHeadOrientation, params.eyeLookAt, params.eyeSaccade); + updateEyeJoint(params.rightEyeJointIndex, params.modelTranslation, params.modelRotation, params.worldHeadOrientation, params.eyeLookAt, params.eyeSaccade); } void Rig::updateLeanJoint(int index, float leanSideways, float leanForward, float torsoTwist) { @@ -824,22 +828,21 @@ void Rig::updateNeckJoint(int index, const glm::quat& localHeadOrientation, floa } } -void Rig::updateEyeJoint(int index, const glm::quat& worldHeadOrientation, const glm::vec3& lookAt, const glm::vec3& saccade) { +void Rig::updateEyeJoint(int index, const glm::vec3& modelTranslation, const glm::quat& modelRotation, const glm::quat& worldHeadOrientation, const glm::vec3& lookAtSpot, const glm::vec3& saccade) { if (index >= 0 && _jointStates[index].getParentIndex() >= 0) { auto& state = _jointStates[index]; auto& parentState = _jointStates[state.getParentIndex()]; // NOTE: at the moment we do the math in the world-frame, hence the inverse transform is more complex than usual. - glm::mat4 inverse = glm::inverse(parentState.getTransform() * - glm::translate(getJointDefaultTranslationInConstrainedFrame(index)) * + glm::mat4 inverse = glm::inverse(glm::mat4_cast(modelRotation) * parentState.getTransform() * + glm::translate(state.getDefaultTranslationInConstrainedFrame()) * state.getPreTransform() * glm::mat4_cast(state.getPreRotation() * state.getDefaultRotation())); glm::vec3 front = glm::vec3(inverse * glm::vec4(worldHeadOrientation * IDENTITY_FRONT, 0.0f)); - glm::vec3 lookAtDelta = lookAt; + glm::vec3 lookAtDelta = lookAtSpot - modelTranslation; glm::vec3 lookAt = glm::vec3(inverse * glm::vec4(lookAtDelta + glm::length(lookAtDelta) * saccade, 1.0f)); glm::quat between = rotationBetween(front, lookAt); const float MAX_ANGLE = 30.0f * RADIANS_PER_DEGREE; - float angle = glm::clamp(glm::angle(between), -MAX_ANGLE, MAX_ANGLE); - glm::quat rot = glm::angleAxis(angle, glm::axis(between)); - setJointRotationInConstrainedFrame(index, rot * state.getDefaultRotation(), DEFAULT_PRIORITY); + state.setRotationInConstrainedFrame(glm::angleAxis(glm::clamp(glm::angle(between), -MAX_ANGLE, MAX_ANGLE), glm::axis(between)) * + state.getDefaultRotation(), DEFAULT_PRIORITY); } } diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index 113d097f96..face79bc15 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -54,10 +54,12 @@ public: float leanSideways = 0.0f; // degrees float leanForward = 0.0f; // degrees float torsoTwist = 0.0f; // degrees + glm::quat modelRotation = glm::quat(); glm::quat localHeadOrientation = glm::quat(); glm::quat worldHeadOrientation = glm::quat(); glm::vec3 eyeLookAt = glm::vec3(); // world space glm::vec3 eyeSaccade = glm::vec3(); // world space + glm::vec3 modelTranslation = glm::vec3(); int leanJointIndex = -1; int neckJointIndex = -1; int leftEyeJointIndex = -1; @@ -163,7 +165,7 @@ public: void updateLeanJoint(int index, float leanSideways, float leanForward, float torsoTwist); void updateNeckJoint(int index, const glm::quat& localHeadOrientation, float leanSideways, float leanForward, float torsoTwist); - void updateEyeJoint(int index, const glm::quat& worldHeadOrientation, const glm::vec3& lookAt, const glm::vec3& saccade); + void updateEyeJoint(int index, const glm::vec3& modelTranslation, const glm::quat& modelRotation, const glm::quat& worldHeadOrientation, const glm::vec3& lookAt, const glm::vec3& saccade); QVector _jointStates; int _rootJointIndex = -1; From 8e7398ac7d45591f5d60e9abfff219f9e45b5d66 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Mon, 10 Aug 2015 13:41:30 -0700 Subject: [PATCH 59/61] small comment change --- .../entities-renderer/src/RenderablePolyLineEntityItem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index 0d88f128aa..c6b7b58538 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -2,7 +2,7 @@ // RenderablePolyLineEntityItem.cpp // libraries/entities-renderer/src/ // -// Created by Eric Levin on 6/22/15 +// Created by Eric Levin on 8/10/15 // Copyright 2015 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. From 59d5f61af4dce51145d09d57cc4a61ee2f0b49e3 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Mon, 10 Aug 2015 14:20:46 -0700 Subject: [PATCH 60/61] incremented protocol number --- libraries/networking/src/udt/PacketHeaders.h | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index c1211317fb..1aeadb1af9 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -141,5 +141,6 @@ const PacketVersion VERSION_ENTITIES_SCRIPT_TIMESTAMP_FIX = 32; const PacketVersion VERSION_ENTITIES_HAVE_SIMULATION_OWNER_AND_ACTIONS_OVER_WIRE = 33; const PacketVersion VERSION_ENTITIES_NEW_PROTOCOL_LAYER = 35; const PacketVersion VERSION_POLYVOX_TEXTURES = 36; +const PacketVersion VERSION_ENTITIES_POLYLINE = 37; #endif // hifi_PacketHeaders_h \ No newline at end of file From 7403929323fe138bea5f227100edc892ff116207 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 10 Aug 2015 15:15:54 -0700 Subject: [PATCH 61/61] missed this in the last commit -- bump protocol version --- libraries/networking/src/udt/PacketHeaders.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index a4e9b5f799..0146abdb7c 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -67,7 +67,7 @@ PacketVersion versionForPacketType(PacketType::Value packetType) { case EntityAdd: case EntityEdit: case EntityData: - return VERSION_POLYVOX_TEXTURES; + return VERSION_ENTITIES_POLYLINE; default: return 11; }