mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-29 11:42:51 +02:00
show actions in status icons
This commit is contained in:
parent
f07d5d9d3f
commit
715a46ee82
8 changed files with 72 additions and 31 deletions
|
@ -27,4 +27,5 @@
|
||||||
c-3.9-1.9-7.8-3.7-11.7-5.6c-4-2-4.6-8.1-1.1-10.8c2-1.5,2.4-3.7,2.1-5.9c-0.2-1.8-1-3.5-1.2-5.3c-0.6-6-5.2-10.2-11.1-10.1
|
c-3.9-1.9-7.8-3.7-11.7-5.6c-4-2-4.6-8.1-1.1-10.8c2-1.5,2.4-3.7,2.1-5.9c-0.2-1.8-1-3.5-1.2-5.3c-0.6-6-5.2-10.2-11.1-10.1
|
||||||
c-5.9,0.1-10.4,4.8-10.6,10.9c-0.1,1.4-0.4,2.8-0.9,4.1c-0.6,1.9,0.1,4.9,1.7,6.3c3.8,3.1,3.1,9-1.4,11.2c-3.6,1.7-7.2,3.4-10.8,5.2
|
c-5.9,0.1-10.4,4.8-10.6,10.9c-0.1,1.4-0.4,2.8-0.9,4.1c-0.6,1.9,0.1,4.9,1.7,6.3c3.8,3.1,3.1,9-1.4,11.2c-3.6,1.7-7.2,3.4-10.8,5.2
|
||||||
c-3.4,1.6-3.6,2.5-0.8,5.1C336.2,80.6,343.8,83.9,353.7,83.9z"/>
|
c-3.4,1.6-3.6,2.5-0.8,5.1C336.2,80.6,343.8,83.9,353.7,83.9z"/>
|
||||||
|
<polygon fill="#FFFFFF" points="445.3,14.1 484.6,14.1 461.5,38.2 485.6,41.4 422.2,86.9 441.2,53.4 425.6,49.3 "/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 3 KiB |
|
@ -88,4 +88,13 @@ void makeEntityItemStatusGetters(EntityItemPointer entity, render::Item::Status:
|
||||||
return render::Item::Status::Value(0.0f, render::Item::Status::Value::BLUE,
|
return render::Item::Status::Value(0.0f, render::Item::Status::Value::BLUE,
|
||||||
(unsigned char)RenderItemStatusIcon::SIMULATION_OWNER);
|
(unsigned char)RenderItemStatusIcon::SIMULATION_OWNER);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
statusGetters.push_back([entity] () -> render::Item::Status::Value {
|
||||||
|
if (entity->hasActions()) {
|
||||||
|
return render::Item::Status::Value(1.0f, render::Item::Status::Value::GREEN,
|
||||||
|
(unsigned char)RenderItemStatusIcon::HAS_ACTIONS);
|
||||||
|
}
|
||||||
|
return render::Item::Status::Value(0.0f, render::Item::Status::Value::GREEN,
|
||||||
|
(unsigned char)RenderItemStatusIcon::HAS_ACTIONS);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@ enum class RenderItemStatusIcon {
|
||||||
PACKET_SENT = 1,
|
PACKET_SENT = 1,
|
||||||
PACKET_RECEIVED = 2,
|
PACKET_RECEIVED = 2,
|
||||||
SIMULATION_OWNER = 3,
|
SIMULATION_OWNER = 3,
|
||||||
|
HAS_ACTIONS = 4,
|
||||||
NONE = 255
|
NONE = 255
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -68,7 +68,8 @@ const gpu::PipelinePointer DrawStatus::getDrawItemStatusPipeline() {
|
||||||
|
|
||||||
_drawItemStatusPosLoc = program->getUniforms().findLocation("inBoundPos");
|
_drawItemStatusPosLoc = program->getUniforms().findLocation("inBoundPos");
|
||||||
_drawItemStatusDimLoc = program->getUniforms().findLocation("inBoundDim");
|
_drawItemStatusDimLoc = program->getUniforms().findLocation("inBoundDim");
|
||||||
_drawItemStatusValueLoc = program->getUniforms().findLocation("inStatus");
|
_drawItemStatusValue0Loc = program->getUniforms().findLocation("inStatus0");
|
||||||
|
_drawItemStatusValue1Loc = program->getUniforms().findLocation("inStatus1");
|
||||||
|
|
||||||
auto state = std::make_shared<gpu::State>();
|
auto state = std::make_shared<gpu::State>();
|
||||||
|
|
||||||
|
@ -98,6 +99,8 @@ void DrawStatus::run(const SceneContextPointer& sceneContext, const RenderContex
|
||||||
assert(renderContext->args->_viewFrustum);
|
assert(renderContext->args->_viewFrustum);
|
||||||
RenderArgs* args = renderContext->args;
|
RenderArgs* args = renderContext->args;
|
||||||
auto& scene = sceneContext->_scene;
|
auto& scene = sceneContext->_scene;
|
||||||
|
const int NUM_STATUS_VEC4_PER_ITEM = 2;
|
||||||
|
const int VEC4_LENGTH = 4;
|
||||||
|
|
||||||
// FIrst thing, we collect the bound and the status for all the items we want to render
|
// FIrst thing, we collect the bound and the status for all the items we want to render
|
||||||
int nbItems = 0;
|
int nbItems = 0;
|
||||||
|
@ -109,8 +112,8 @@ void DrawStatus::run(const SceneContextPointer& sceneContext, const RenderContex
|
||||||
_itemStatus = std::make_shared<gpu::Buffer>();;
|
_itemStatus = std::make_shared<gpu::Buffer>();;
|
||||||
}
|
}
|
||||||
|
|
||||||
_itemBounds->resize((inItems.size() * sizeof(AABox)));
|
_itemBounds->resize((inItems.size() * sizeof(AABox)));
|
||||||
_itemStatus->resize((inItems.size() * sizeof(glm::vec4)));
|
_itemStatus->resize((inItems.size() * NUM_STATUS_VEC4_PER_ITEM * sizeof(glm::vec4)));
|
||||||
AABox* itemAABox = reinterpret_cast<AABox*> (_itemBounds->editData());
|
AABox* itemAABox = reinterpret_cast<AABox*> (_itemBounds->editData());
|
||||||
glm::ivec4* itemStatus = reinterpret_cast<glm::ivec4*> (_itemStatus->editData());
|
glm::ivec4* itemStatus = reinterpret_cast<glm::ivec4*> (_itemStatus->editData());
|
||||||
for (auto& item : inItems) {
|
for (auto& item : inItems) {
|
||||||
|
@ -121,11 +124,31 @@ void DrawStatus::run(const SceneContextPointer& sceneContext, const RenderContex
|
||||||
(*itemAABox).setBox(item.bounds.getCorner(), 0.1f);
|
(*itemAABox).setBox(item.bounds.getCorner(), 0.1f);
|
||||||
}
|
}
|
||||||
auto& itemScene = scene->getItem(item.id);
|
auto& itemScene = scene->getItem(item.id);
|
||||||
(*itemStatus) = itemScene.getStatusPackedValues();
|
|
||||||
|
auto itemStatusPointer = itemScene.getStatus();
|
||||||
|
if (itemStatusPointer) {
|
||||||
|
// Query the current status values, this is where the statusGetter lambda get called
|
||||||
|
auto&& currentStatusValues = itemStatusPointer->getCurrentValues();
|
||||||
|
int valueNum = 0;
|
||||||
|
for (int vec4Num = 0; vec4Num < NUM_STATUS_VEC4_PER_ITEM; vec4Num++) {
|
||||||
|
(*itemStatus) = glm::ivec4(Item::Status::Value::INVALID.getPackedData());
|
||||||
|
for (int component = 0; component < VEC4_LENGTH; component++) {
|
||||||
|
valueNum = vec4Num * VEC4_LENGTH + component;
|
||||||
|
if (valueNum < (int)currentStatusValues.size()) {
|
||||||
|
(*itemStatus)[component] = currentStatusValues[valueNum].getPackedData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
itemStatus++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
(*itemStatus) = glm::ivec4(Item::Status::Value::INVALID.getPackedData());
|
||||||
|
itemStatus++;
|
||||||
|
(*itemStatus) = glm::ivec4(Item::Status::Value::INVALID.getPackedData());
|
||||||
|
itemStatus++;
|
||||||
|
}
|
||||||
|
|
||||||
nbItems++;
|
nbItems++;
|
||||||
itemAABox++;
|
itemAABox++;
|
||||||
itemStatus++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -170,9 +193,9 @@ void DrawStatus::run(const SceneContextPointer& sceneContext, const RenderContex
|
||||||
for (int i = 0; i < nbItems; i++) {
|
for (int i = 0; i < nbItems; i++) {
|
||||||
batch._glUniform3fv(_drawItemStatusPosLoc, 1, (const float*) (itemAABox + i));
|
batch._glUniform3fv(_drawItemStatusPosLoc, 1, (const float*) (itemAABox + i));
|
||||||
batch._glUniform3fv(_drawItemStatusDimLoc, 1, ((const float*) (itemAABox + i)) + VEC3_ADRESS_OFFSET);
|
batch._glUniform3fv(_drawItemStatusDimLoc, 1, ((const float*) (itemAABox + i)) + VEC3_ADRESS_OFFSET);
|
||||||
batch._glUniform4iv(_drawItemStatusValueLoc, 1, (const int*) (itemStatus + i));
|
batch._glUniform4iv(_drawItemStatusValue0Loc, 1, (const int*)(itemStatus + NUM_STATUS_VEC4_PER_ITEM * i));
|
||||||
|
batch._glUniform4iv(_drawItemStatusValue1Loc, 1, (const int*)(itemStatus + NUM_STATUS_VEC4_PER_ITEM * i + 1));
|
||||||
batch.draw(gpu::TRIANGLES, 24, 0);
|
batch.draw(gpu::TRIANGLES, 24 * NUM_STATUS_VEC4_PER_ITEM, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
batch.setResourceTexture(0, 0);
|
batch.setResourceTexture(0, 0);
|
||||||
|
|
|
@ -21,7 +21,8 @@ namespace render {
|
||||||
int _drawItemBoundDimLoc = -1;
|
int _drawItemBoundDimLoc = -1;
|
||||||
int _drawItemStatusPosLoc = -1;
|
int _drawItemStatusPosLoc = -1;
|
||||||
int _drawItemStatusDimLoc = -1;
|
int _drawItemStatusDimLoc = -1;
|
||||||
int _drawItemStatusValueLoc = -1;
|
int _drawItemStatusValue0Loc = -1;
|
||||||
|
int _drawItemStatusValue1Loc = -1;
|
||||||
|
|
||||||
gpu::Stream::FormatPointer _drawItemFormat;
|
gpu::Stream::FormatPointer _drawItemFormat;
|
||||||
gpu::PipelinePointer _drawItemBoundsPipeline;
|
gpu::PipelinePointer _drawItemBoundsPipeline;
|
||||||
|
|
|
@ -78,14 +78,14 @@ void Item::Status::Value::setIcon(unsigned char icon) {
|
||||||
_icon = icon;
|
_icon = icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Item::Status::getPackedValues(glm::ivec4& values) const {
|
Item::Status::Values Item::Status::getCurrentValues() const {
|
||||||
for (unsigned int i = 0; i < (unsigned int)values.length(); i++) {
|
Values currentValues(_values.size());
|
||||||
if (i < _values.size()) {
|
auto currentValue = currentValues.begin();
|
||||||
values[i] = _values[i]().getPackedData();
|
for (auto& getter : _values) {
|
||||||
} else {
|
(*currentValue) = getter();
|
||||||
values[i] = Value::INVALID.getPackedData();
|
currentValue++;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
return currentValues;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Item::PayloadInterface::addStatusGetter(const Status::Getter& getter) {
|
void Item::PayloadInterface::addStatusGetter(const Status::Getter& getter) {
|
||||||
|
@ -113,15 +113,6 @@ void Item::resetPayload(const PayloadPointer& payload) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::ivec4 Item::getStatusPackedValues() const {
|
|
||||||
glm::ivec4 values(Status::Value::INVALID.getPackedData());
|
|
||||||
auto& status = getStatus();
|
|
||||||
if (status) {
|
|
||||||
status->getPackedValues(values);
|
|
||||||
};
|
|
||||||
return values;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PendingChanges::resetItem(ItemID id, const PayloadPointer& payload) {
|
void PendingChanges::resetItem(ItemID id, const PayloadPointer& payload) {
|
||||||
_resetItems.push_back(id);
|
_resetItems.push_back(id);
|
||||||
_resetPayloads.push_back(payload);
|
_resetPayloads.push_back(payload);
|
||||||
|
|
|
@ -241,7 +241,10 @@ public:
|
||||||
|
|
||||||
void addGetter(const Getter& getter) { _values.push_back(getter); }
|
void addGetter(const Getter& getter) { _values.push_back(getter); }
|
||||||
|
|
||||||
void getPackedValues(glm::ivec4& values) const;
|
size_t getNumValues() const { return _values.size(); }
|
||||||
|
|
||||||
|
using Values = std::vector <Value>;
|
||||||
|
Values getCurrentValues() const;
|
||||||
};
|
};
|
||||||
typedef std::shared_ptr<Status> StatusPointer;
|
typedef std::shared_ptr<Status> StatusPointer;
|
||||||
|
|
||||||
|
@ -305,7 +308,6 @@ public:
|
||||||
|
|
||||||
// Access the status
|
// Access the status
|
||||||
const StatusPointer& getStatus() const { return _payload->getStatus(); }
|
const StatusPointer& getStatus() const { return _payload->getStatus(); }
|
||||||
glm::ivec4 getStatusPackedValues() const;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
PayloadPointer _payload;
|
PayloadPointer _payload;
|
||||||
|
|
|
@ -21,7 +21,8 @@ out vec3 varTexcoord;
|
||||||
|
|
||||||
uniform vec3 inBoundPos;
|
uniform vec3 inBoundPos;
|
||||||
uniform vec3 inBoundDim;
|
uniform vec3 inBoundDim;
|
||||||
uniform ivec4 inStatus;
|
uniform ivec4 inStatus0;
|
||||||
|
uniform ivec4 inStatus1;
|
||||||
|
|
||||||
vec3 paintRainbow(float normalizedHue) {
|
vec3 paintRainbow(float normalizedHue) {
|
||||||
float v = normalizedHue * 6.f;
|
float v = normalizedHue * 6.f;
|
||||||
|
@ -44,6 +45,17 @@ vec3 paintRainbow(float normalizedHue) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const int INVALID_STATUS = 0xFFFFFFFF;
|
||||||
|
|
||||||
|
int getIconStatus(int icon) {
|
||||||
|
if (icon < 4) {
|
||||||
|
return inStatus0[icon];
|
||||||
|
} else if (icon < 8) {
|
||||||
|
return inStatus1[icon - 4];
|
||||||
|
}
|
||||||
|
return INVALID_STATUS;
|
||||||
|
}
|
||||||
|
|
||||||
vec3 unpackStatus(int v) {
|
vec3 unpackStatus(int v) {
|
||||||
return vec3(clamp(float(int((v >> 0) & 0xFFFF) - 32727) / 32727.0, -1.0, 1.0),
|
return vec3(clamp(float(int((v >> 0) & 0xFFFF) - 32727) / 32727.0, -1.0, 1.0),
|
||||||
clamp(float(uint((v >> 16) & 0xFF)) / 255.0, 0.0, 1.0),
|
clamp(float(uint((v >> 16) & 0xFF)) / 255.0, 0.0, 1.0),
|
||||||
|
@ -71,9 +83,10 @@ void main(void) {
|
||||||
|
|
||||||
// Which icon are we dealing with ?
|
// Which icon are we dealing with ?
|
||||||
int iconNum = gl_VertexID / NUM_VERTICES;
|
int iconNum = gl_VertexID / NUM_VERTICES;
|
||||||
|
int packedIconStatus = getIconStatus(iconNum);
|
||||||
|
|
||||||
// if invalid, just kill
|
// if invalid, just kill
|
||||||
if (inStatus[iconNum] == 0xFFFFFFFF) {
|
if (packedIconStatus == INVALID_STATUS) {
|
||||||
gl_Position = anchorPoint;
|
gl_Position = anchorPoint;
|
||||||
varColor = vec4(1.0);
|
varColor = vec4(1.0);
|
||||||
return;
|
return;
|
||||||
|
@ -84,7 +97,7 @@ void main(void) {
|
||||||
vec4 quadPos = UNIT_QUAD[twoTriID];
|
vec4 quadPos = UNIT_QUAD[twoTriID];
|
||||||
|
|
||||||
// unpack to get x and y satus
|
// unpack to get x and y satus
|
||||||
vec3 iconStatus = unpackStatus(inStatus[iconNum]);
|
vec3 iconStatus = unpackStatus(packedIconStatus);
|
||||||
|
|
||||||
// Use the status for showing a color
|
// Use the status for showing a color
|
||||||
varColor = vec4(paintRainbow(abs(iconStatus.y)), 1.0);
|
varColor = vec4(paintRainbow(abs(iconStatus.y)), 1.0);
|
||||||
|
|
Loading…
Reference in a new issue