Edit Mode overlay: Added theme color via UBO.

This commit is contained in:
Clément Foucault
2017-03-01 18:54:58 +01:00
parent 043c90fdcd
commit aa102283da
8 changed files with 361 additions and 139 deletions

View File

@@ -1284,6 +1284,8 @@ void DRW_viewport_init(const bContext *C)
/* Save context for all later needs */
DST.context = C;
DRW_update_global_values();
}
void DRW_viewport_matrix_get(float mat[4][4], DRWViewportMatrixType type)
@@ -1366,6 +1368,7 @@ void DRW_engines_init(void)
#endif
}
extern struct GPUUniformBuffer *globals_ubo; /* draw_mode_pass.c */
void DRW_engines_free(void)
{
#ifdef WITH_CLAY_ENGINE
@@ -1373,6 +1376,9 @@ void DRW_engines_free(void)
DRW_shape_cache_free();
if (globals_ubo)
GPU_uniformbuffer_free(globals_ubo);
BLI_remlink(&R_engines, &viewport_clay_type);
#endif
}

View File

@@ -71,10 +71,60 @@ static DRWShadingGroup *center_selected;
static DRWShadingGroup *center_deselected;
/* Colors & Constant */
static float colorWire[4], colorWireEdit[4];
static float colorActive[4], colorSelect[4], colorTransform[4], colorGroup[4], colorGroupActive[4];
static float colorEmpty[4], colorLamp[4], colorCamera[4], colorSpeaker[4];
static float lampCenterSize, lampCircleRad, lampCircleShadowRad, colorLampNoAlpha[4];
GlobalsUboStorage ts;
struct GPUUniformBuffer *globals_ubo = NULL;
void DRW_update_global_values(void)
{
UI_GetThemeColor4fv(TH_WIRE, ts.colorWire);
UI_GetThemeColor4fv(TH_WIRE_EDIT, ts.colorWireEdit);
UI_GetThemeColor4fv(TH_ACTIVE, ts.colorActive);
UI_GetThemeColor4fv(TH_SELECT, ts.colorSelect);
UI_GetThemeColor4fv(TH_TRANSFORM, ts.colorTransform);
UI_GetThemeColor4fv(TH_GROUP_ACTIVE, ts.colorGroupActive);
UI_GetThemeColor4fv(TH_GROUP, ts.colorGroup);
UI_GetThemeColor4fv(TH_LAMP, ts.colorLamp);
UI_GetThemeColor4fv(TH_SPEAKER, ts.colorSpeaker);
UI_GetThemeColor4fv(TH_CAMERA, ts.colorCamera);
UI_GetThemeColor4fv(TH_EMPTY, ts.colorEmpty);
UI_GetThemeColor4fv(TH_VERTEX, ts.colorVertex);
UI_GetThemeColor4fv(TH_VERTEX_SELECT, ts.colorVertexSelect);
UI_GetThemeColor4fv(TH_EDITMESH_ACTIVE, ts.colorEditMeshActive);
UI_GetThemeColor4fv(TH_EDGE_SELECT, ts.colorEdgeSelect);
UI_GetThemeColor4fv(TH_EDGE_SEAM, ts.colorEdgeSeam);
UI_GetThemeColor4fv(TH_EDGE_SHARP, ts.colorEdgeSharp);
UI_GetThemeColor4fv(TH_EDGE_CREASE, ts.colorEdgeCrease);
UI_GetThemeColor4fv(TH_EDGE_BEVEL, ts.colorEdgeBWeight);
UI_GetThemeColor4fv(TH_EDGE_FACESEL, ts.colorEdgeFaceSelect);
UI_GetThemeColor4fv(TH_FACE, ts.colorFace);
UI_GetThemeColor4fv(TH_FACE_SELECT, ts.colorFaceSelect);
UI_GetThemeColor4fv(TH_NORMAL, ts.colorNormal);
UI_GetThemeColor4fv(TH_VNORMAL, ts.colorVNormal);
UI_GetThemeColor4fv(TH_LNORMAL, ts.colorLNormal);
UI_GetThemeColor4fv(TH_FACE_DOT, ts.colorFaceDot);
UI_GetThemeColorShadeAlpha4fv(TH_TRANSFORM, 0, -80, ts.colorDeselect);
UI_GetThemeColorShadeAlpha4fv(TH_WIRE, 0, -30, ts.colorOutline);
UI_GetThemeColorShadeAlpha4fv(TH_LAMP, 0, 255, ts.colorLampNoAlpha);
ts.sizeLampCenter = (U.obcenter_dia + 1.5f) * U.pixelsize;
ts.sizeLampCircle = U.pixelsize * 9.0f;
ts.sizeLampCircleShadow = ts.sizeLampCircle + U.pixelsize * 3.0f;
/* M_SQRT2 to be at least the same size of the old square */
ts.sizeVertex = UI_GetThemeValuef(TH_VERTEX_SIZE) * M_SQRT2 / 2.0f;
ts.sizeFaceDot = UI_GetThemeValuef(TH_FACEDOT_SIZE) * M_SQRT2 / 2.0f;
ts.sizeEdge = 1.0f / 2.0f; /* TODO Theme */
ts.sizeEdgeFix = 0.5f + 2.0f * (2.0f * (MAX2(ts.sizeVertex, ts.sizeEdge)) * M_SQRT1_2);
ts.sizeNormal = 1.0f; /* TODO compute */
/* TODO Waiting for notifiers to invalidate cache */
if (globals_ubo) {
DRW_uniformbuffer_free(globals_ubo);
}
globals_ubo = DRW_uniformbuffer_create(sizeof(GlobalsUboStorage), &ts);
}
/* Store list of passes for easy access */
static DRWPass *wire_overlay;
@@ -205,20 +255,7 @@ void DRW_mode_passes_setup(DRWPass **psl_wire_overlay,
DRWPass **psl_bone_solid,
DRWPass **psl_bone_wire)
{
UI_GetThemeColor4fv(TH_WIRE, colorWire);
UI_GetThemeColor4fv(TH_WIRE_EDIT, colorWireEdit);
UI_GetThemeColor4fv(TH_ACTIVE, colorActive);
UI_GetThemeColor4fv(TH_SELECT, colorSelect);
UI_GetThemeColor4fv(TH_TRANSFORM, colorTransform);
UI_GetThemeColor4fv(TH_GROUP_ACTIVE, colorGroupActive);
UI_GetThemeColor4fv(TH_GROUP, colorGroup);
UI_GetThemeColor4fv(TH_LAMP, colorLamp);
UI_GetThemeColor4fv(TH_LAMP, colorLampNoAlpha);
UI_GetThemeColor4fv(TH_SPEAKER, colorSpeaker);
UI_GetThemeColor4fv(TH_CAMERA, colorCamera);
UI_GetThemeColor4fv(TH_EMPTY, colorEmpty);
colorLampNoAlpha[3] = 1.0f;
if (psl_wire_overlay) {
/* This pass can draw mesh edges top of Shaded Meshes without any Z fighting */
@@ -293,34 +330,30 @@ void DRW_mode_passes_setup(DRWPass **psl_wire_overlay,
speaker = shgroup_instance(*psl_non_meshes, geom);
/* Lamps */
lampCenterSize = (U.obcenter_dia + 1.5f) * U.pixelsize;
lampCircleRad = U.pixelsize * 9.0f;
lampCircleShadowRad = lampCircleRad + U.pixelsize * 3.0f;
/* TODO
* for now we create 3 times the same VBO with only lamp center coordinates
* but ideally we would only create it once */
lamp_center = shgroup_dynpoints_uniform_color(*psl_non_meshes, colorLampNoAlpha, &lampCenterSize);
lamp_center_group = shgroup_dynpoints_uniform_color(*psl_non_meshes, colorGroup, &lampCenterSize);
lamp_center = shgroup_dynpoints_uniform_color(*psl_non_meshes, ts.colorLampNoAlpha, &ts.sizeLampCenter);
lamp_center_group = shgroup_dynpoints_uniform_color(*psl_non_meshes, ts.colorGroup, &ts.sizeLampCenter);
geom = DRW_cache_lamp_get();
lamp_circle = shgroup_instance_screenspace(*psl_non_meshes, geom, &lampCircleRad);
lamp_circle_shadow = shgroup_instance_screenspace(*psl_non_meshes, geom, &lampCircleShadowRad);
lamp_circle = shgroup_instance_screenspace(*psl_non_meshes, geom, &ts.sizeLampCircle);
lamp_circle_shadow = shgroup_instance_screenspace(*psl_non_meshes, geom, &ts.sizeLampCircleShadow);
geom = DRW_cache_lamp_sunrays_get();
lamp_sunrays = shgroup_instance_screenspace(*psl_non_meshes, geom, &lampCircleRad);
lamp_sunrays = shgroup_instance_screenspace(*psl_non_meshes, geom, &ts.sizeLampCircle);
lamp_groundline = shgroup_groundlines_uniform_color(*psl_non_meshes, colorLamp);
lamp_groundpoint = shgroup_groundpoints_uniform_color(*psl_non_meshes, colorLamp);
lamp_groundline = shgroup_groundlines_uniform_color(*psl_non_meshes, ts.colorLamp);
lamp_groundpoint = shgroup_groundpoints_uniform_color(*psl_non_meshes, ts.colorLamp);
/* Relationship Lines */
relationship_lines = shgroup_dynlines_uniform_color(*psl_non_meshes, colorWire);
relationship_lines = shgroup_dynlines_uniform_color(*psl_non_meshes, ts.colorWire);
DRW_shgroup_state_set(relationship_lines, DRW_STATE_STIPPLE_3);
}
if (psl_ob_center) {
/* Object Center pass grouped by State */
DRWShadingGroup *grp;
static float colorDeselect[4], outlineColor[4];
static float outlineWidth, size;
DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND | DRW_STATE_POINT;
@@ -328,10 +361,6 @@ void DRW_mode_passes_setup(DRWPass **psl_wire_overlay,
outlineWidth = 1.0f * U.pixelsize;
size = U.obcenter_dia * U.pixelsize + outlineWidth;
//UI_GetThemeColorShadeAlpha4fv(TH_ACTIVE, 0, -80, colorActive);
//UI_GetThemeColorShadeAlpha4fv(TH_SELECT, 0, -80, colorSelect);
UI_GetThemeColorShadeAlpha4fv(TH_TRANSFORM, 0, -80, colorDeselect);
UI_GetThemeColorShadeAlpha4fv(TH_WIRE, 0, -30, outlineColor);
GPUShader *sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_OUTLINE_AA);
@@ -339,18 +368,18 @@ void DRW_mode_passes_setup(DRWPass **psl_wire_overlay,
grp = DRW_shgroup_point_batch_create(sh, *psl_ob_center);
DRW_shgroup_uniform_float(grp, "size", &size, 1);
DRW_shgroup_uniform_float(grp, "outlineWidth", &outlineWidth, 1);
DRW_shgroup_uniform_vec4(grp, "color", colorActive, 1);
DRW_shgroup_uniform_vec4(grp, "outlineColor", outlineColor, 1);
DRW_shgroup_uniform_vec4(grp, "color", ts.colorActive, 1);
DRW_shgroup_uniform_vec4(grp, "outlineColor", ts.colorOutline, 1);
center_active = grp;
/* Select */
grp = DRW_shgroup_point_batch_create(sh, *psl_ob_center);
DRW_shgroup_uniform_vec4(grp, "color", colorSelect, 1);
DRW_shgroup_uniform_vec4(grp, "color", ts.colorSelect, 1);
center_selected = grp;
/* Deselect */
grp = DRW_shgroup_point_batch_create(sh, *psl_ob_center);
DRW_shgroup_uniform_vec4(grp, "color", colorDeselect, 1);
DRW_shgroup_uniform_vec4(grp, "color", ts.colorDeselect, 1);
center_deselected = grp;
}
@@ -416,17 +445,17 @@ static int draw_object_wire_theme(Object *ob, float **color)
if (color != NULL) {
switch (theme_id) {
case TH_WIRE_EDIT: *color = colorTransform; break;
case TH_ACTIVE: *color = colorActive; break;
case TH_SELECT: *color = colorSelect; break;
case TH_GROUP: *color = colorGroup; break;
case TH_GROUP_ACTIVE: *color = colorGroupActive; break;
case TH_TRANSFORM: *color = colorTransform; break;
case OB_SPEAKER: *color = colorSpeaker; break;
case OB_CAMERA: *color = colorCamera; break;
case OB_EMPTY: *color = colorEmpty; break;
case OB_LAMP: *color = colorLamp; break;
default: *color = colorWire; break;
case TH_WIRE_EDIT: *color = ts.colorTransform; break;
case TH_ACTIVE: *color = ts.colorActive; break;
case TH_SELECT: *color = ts.colorSelect; break;
case TH_GROUP: *color = ts.colorGroup; break;
case TH_GROUP_ACTIVE: *color = ts.colorGroupActive; break;
case TH_TRANSFORM: *color = ts.colorTransform; break;
case OB_SPEAKER: *color = ts.colorSpeaker; break;
case OB_CAMERA: *color = ts.colorCamera; break;
case OB_EMPTY: *color = ts.colorEmpty; break;
case OB_LAMP: *color = ts.colorLamp; break;
default: *color = ts.colorWire; break;
}
}

View File

@@ -30,6 +30,50 @@ struct DRWPass;
struct Batch;
struct Object;
/* Used as ubo but colors can be directly
* referenced as well */
/* Keep in sync with globalsBlock in shaders */
typedef struct GlobalsUboStorage {
/* UBOs data needs to be 16 byte aligned (size of vec4) */
float colorWire[4];
float colorWireEdit[4];
float colorActive[4];
float colorSelect[4];
float colorTransform[4];
float colorGroupActive[4];
float colorGroup[4];
float colorLamp[4];
float colorSpeaker[4];
float colorCamera[4];
float colorEmpty[4];
float colorVertex[4];
float colorVertexSelect[4];
float colorEditMeshActive[4];
float colorEdgeSelect[4];
float colorEdgeSeam[4];
float colorEdgeSharp[4];
float colorEdgeCrease[4];
float colorEdgeBWeight[4];
float colorEdgeFaceSelect[4];
float colorFace[4];
float colorFaceSelect[4];
float colorNormal[4];
float colorVNormal[4];
float colorLNormal[4];
float colorFaceDot[4];
float colorDeselect[4];
float colorOutline[4];
float colorLampNoAlpha[4];
/* Pack individual float at the end of the buffer to avoid alignement errors */
float sizeLampCenter, sizeLampCircle, sizeLampCircleShadow;
float sizeVertex, sizeEdge, sizeEdgeFix, sizeNormal, sizeFaceDot;
} GlobalsUboStorage;
/* Keep in sync with globalsBlock in shaders */
void DRW_update_global_values(void);
void DRW_mode_passes_setup(struct DRWPass **psl_wire_overlay,
struct DRWPass **psl_wire_overlay_hidden_wire,
struct DRWPass **psl_wire_outline,

View File

@@ -47,6 +47,8 @@ static DRWShadingGroup *face_overlay_shgrp;
static DRWShadingGroup *ledges_overlay_shgrp;
static DRWShadingGroup *lverts_overlay_shgrp;
extern struct GPUUniformBuffer *globals_ubo; /* draw_mode_pass.c */
void EDIT_MESH_cache_init(void)
{
EDIT_MESH_PassList *psl = DRW_mode_pass_list_get();
@@ -78,6 +80,7 @@ void EDIT_MESH_cache_init(void)
ledges_overlay_shgrp = DRW_shgroup_create(over_edge_sh, psl->edit_face_overlay_pass);
lverts_overlay_shgrp = DRW_shgroup_create(over_vert_sh, psl->edit_face_overlay_pass);
DRW_shgroup_uniform_vec2(face_overlay_shgrp, "viewportSize", DRW_viewport_size_get(), 1);
DRW_shgroup_uniform_block(face_overlay_shgrp, "globalsBlock", globals_ubo, 0);
DRW_shgroup_uniform_vec2(ledges_overlay_shgrp, "viewportSize", DRW_viewport_size_get(), 1);
DRW_shgroup_uniform_vec2(lverts_overlay_shgrp, "viewportSize", DRW_viewport_size_get(), 1);

View File

@@ -5,14 +5,57 @@
/* This shader follows the principles of
* http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */
/* keep in sync with GlobalsUboStorage */
layout(std140) uniform globalsBlock {
vec4 colorWire;
vec4 colorWireEdit;
vec4 colorActive;
vec4 colorSelect;
vec4 colorTransform;
vec4 colorGroupActive;
vec4 colorGroup;
vec4 colorLamp;
vec4 colorSpeaker;
vec4 colorCamera;
vec4 colorEmpty;
vec4 colorVertex;
vec4 colorVertexSelect;
vec4 colorEditMeshActive;
vec4 colorEdgeSelect;
vec4 colorEdgeSeam;
vec4 colorEdgeSharp;
vec4 colorEdgeCrease;
vec4 colorEdgeBWeight;
vec4 colorEdgeFaceSelect;
vec4 colorFace;
vec4 colorFaceSelect;
vec4 colorNormal;
vec4 colorVNormal;
vec4 colorLNormal;
vec4 colorFaceDot;
vec4 colorDeselect;
vec4 colorOutline;
vec4 colorLampNoAlpha;
float sizeLampCenter;
float sizeLampCircle;
float sizeLampCircleShadow;
float sizeVertex;
float sizeEdge;
float sizeEdgeFix;
float sizeNormal;
float sizeFaceDot;
};
flat in vec3 edgesCrease;
flat in vec3 edgesBweight;
flat in ivec3 flag;
flat in vec4 faceColor;
flat in int clipCase;
// #ifdef VERTEX_SELECTION
#ifdef VERTEX_SELECTION
smooth in vec3 vertexColor;
// #endif
#endif
/* We use a vec4[2] interface to pass edge data
* (without fragmenting memory accesses)
@@ -44,17 +87,9 @@ out vec4 FragColor;
/* Vertex flag is shifted and combined with the edge flag */
#define VERTEX_ACTIVE (1 << (0 + 8))
#define VERTEX_SELECTED (1 << (1 + 8))
#define FACE_ACTIVE (1 << (2 + 8))
/* Style Parameters in pixel */
const float transitionWidth = 1.0;
/* Width : minimum central size
* Outline : additional info */
const float edgeWidth = 0.2;
const float edgeOutlineWidth = 1.5;
const float vertexWidth = 2.0;
const float vertexOutline = 2.0;
/* Array to retreive vert/edge indices */
const ivec3 clipEdgeIdx[6] = ivec3[6](
@@ -75,32 +110,14 @@ const ivec3 clipPointIdx[6] = ivec3[6](
ivec3(2, 1, 0)
);
float getEdgeSize(int v)
const mat4 stipple_matrix = mat4(vec4(1.0, 0.0, 0.0, 0.0),
vec4(0.0, 0.0, 0.0, 0.0),
vec4(0.0, 0.0, 1.0, 0.0),
vec4(0.0, 0.0, 0.0, 0.0));
void colorDist(vec4 color, float dist)
{
float size = 0.0;
size += ((flag[v] & EDGE_EXISTS) != 0) ? edgeWidth : 0;
size += ((flag[v] & EDGE_SEAM) != 0) ? edgeOutlineWidth : 0;
size += ((flag[v] & EDGE_SHARP) != 0) ? edgeOutlineWidth : 0;
size += (edgesCrease[v] > 0.0) ? edgeOutlineWidth : 0;
size += (edgesBweight[v] > 0.0) ? edgeOutlineWidth : 0;
return size;
}
float getVertexSize(int v)
{
float size = vertexWidth;
size += ((flag[v] & VERTEX_ACTIVE) != 0) ? vertexOutline : 0;
return size;
}
void colorDist(vec4 color, float width, inout float dist)
{
FragColor = (dist - transitionWidth < 0) ? color : FragColor;
dist += width;
FragColor = (dist < 0) ? color : FragColor;
}
float distToEdge(vec2 o, vec2 dir)
@@ -153,43 +170,49 @@ void main()
/* First */
FragColor = faceColor;
if ((flag[0] & FACE_ACTIVE) != 0) {
int x = int(gl_FragCoord.x) & 0x3; /* mod 4 */
int y = int(gl_FragCoord.y) & 0x3; /* mod 4 */
FragColor *= stipple_matrix[x][y];
}
/* Edges */
for (int v = 0; v < 3; ++v) {
float edgeness = e[v] - getEdgeSize(v);
if ((flag[v] & EDGE_EXISTS) != 0) {
float largeEdge = e[v] - sizeEdge * 2.0;
float innerEdge = e[v] - sizeEdge;
/* Ordered from outer to inner */
if (edgesBweight[v] > 0.0)
colorDist(vec4(0.0, 0.4, 1.0, edgesBweight[v]), edgeOutlineWidth, edgeness);
if (edgesCrease[v] > 0.0)
colorDist(vec4(0.0, 1.0, 1.0, edgesCrease[v]), edgeOutlineWidth, edgeness);
if ((flag[v] & EDGE_SEAM) != 0)
colorDist(vec4(1.0, 0.0, 0.0, 1.0), edgeOutlineWidth, edgeness);
if ((flag[v] & EDGE_SHARP) != 0)
colorDist(vec4(0.0, 0.5, 1.0, 1.0), edgeOutlineWidth, edgeness);
if ((flag[v] & EDGE_ACTIVE) != 0)
colorDist(vec4(1.0, 1.0, 0.0, 1.0), edgeWidth, edgeness);
else if ((flag[v] & EDGE_SELECTED) != 0)
colorDist(vec4(0.0, 1.0, 0.0, 1.0), edgeWidth, edgeness);
else if ((flag[v] & EDGE_EXISTS) != 0)
colorDist(vec4(0.0, 0.0, 0.0, 1.0), edgeWidth, edgeness);
if ((flag[v] & EDGE_SEAM) != 0)
colorDist(colorEdgeSeam, largeEdge);
else if (edgesBweight[v] > 0.0)
colorDist(vec4(colorEdgeBWeight.rgb, edgesBweight[v]), largeEdge);
else if (edgesCrease[v] > 0.0)
colorDist(vec4(colorEdgeCrease.rgb, edgesCrease[v]), largeEdge);
else if ((flag[v] & EDGE_SHARP) != 0)
colorDist(colorEdgeSharp, largeEdge);
else
#ifdef VERTEX_SELECTION
colorDist(vertexColor, innerEdge);
#else
colorDist(colorWireEdit, innerEdge);
if ((flag[v] & EDGE_ACTIVE) != 0)
colorDist(vec4(colorEditMeshActive.xyz, 1.0), innerEdge);
else if ((flag[v] & EDGE_SELECTED) != 0)
colorDist(colorEdgeSelect, innerEdge);
#endif
}
}
/* Points */
for (int v = 0; v < 3; ++v) {
float size = p[v] - getVertexSize(v);
float size = p[v] - sizeVertex;
/* Ordered from outer to inner */
if ((flag[v] & VERTEX_ACTIVE) != 0)
colorDist(vec4(1.0, 0.0, 0.0, 1.0), vertexOutline, size);
if ((flag[v] & VERTEX_SELECTED) != 0)
colorDist(vec4(0.0, 1.0, 0.0, 1.0), vertexWidth, size);
colorDist(vec4(colorEditMeshActive.xyz, 1.0), size);
else if ((flag[v] & VERTEX_SELECTED) != 0)
colorDist(colorVertexSelect, size);
else
colorDist(vec4(0.0, 0.0, 0.0, 1.0), vertexWidth, size);
colorDist(colorVertex, size);
}
/* don't write depth if not opaque */

View File

@@ -5,11 +5,52 @@
/* This shader follows the principles of
* http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */
/* keep in sync with GlobalsUboStorage */
layout(std140) uniform globalsBlock {
vec4 colorWire;
vec4 colorWireEdit;
vec4 colorActive;
vec4 colorSelect;
vec4 colorTransform;
vec4 colorGroupActive;
vec4 colorGroup;
vec4 colorLamp;
vec4 colorSpeaker;
vec4 colorCamera;
vec4 colorEmpty;
vec4 colorVertex;
vec4 colorVertexSelect;
vec4 colorEditMeshActive;
vec4 colorEdgeSelect;
vec4 colorEdgeSeam;
vec4 colorEdgeSharp;
vec4 colorEdgeCrease;
vec4 colorEdgeBWeight;
vec4 colorEdgeFaceSelect;
vec4 colorFace;
vec4 colorFaceSelect;
vec4 colorNormal;
vec4 colorVNormal;
vec4 colorLNormal;
vec4 colorFaceDot;
vec4 colorDeselect;
vec4 colorOutline;
vec4 colorLampNoAlpha;
float sizeLampCenter;
float sizeLampCircle;
float sizeLampCircleShadow;
float sizeVertex;
float sizeEdge;
float sizeEdgeFix;
float sizeNormal;
float sizeFaceDot;
};
layout(lines) in;
layout(triangle_strip, max_vertices=6) out;
const float fixupSize = 9.5; /* in pixels */
uniform mat4 ProjectionMatrix;
uniform vec2 viewportSize;
@@ -70,11 +111,11 @@ float dist(vec2 pos[3], vec2 vpos, int v)
vec3 getVertexColor(int v)
{
if ((vData[v].x & VERTEX_ACTIVE) != 0)
return vec3(0.0, 1.0, 0.0);
return colorEditMeshActive;
else if ((vData[v].x & VERTEX_SELECTED) != 0)
return vec3(1.0, 0.0, 0.0);
return colorEdgeSelect;
else
return vec3(0.0, 0.0, 0.0);
return colorWireEdit;
}
void doVertex(int v, vec4 pos)
@@ -109,7 +150,7 @@ void main()
dirs1.zw = vec2(-dirs1.y, dirs1.x);
/* Make it view independant */
dirs1 *= fixupSize / viewportSize.xyxy;
dirs1 *= sizeEdgeFix / viewportSize.xyxy;
dirs2 = dirs1;

View File

@@ -5,6 +5,49 @@
/* This shader follows the principles of
* http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */
/* keep in sync with GlobalsUboStorage */
layout(std140) uniform globalsBlock {
vec4 colorWire;
vec4 colorWireEdit;
vec4 colorActive;
vec4 colorSelect;
vec4 colorTransform;
vec4 colorGroupActive;
vec4 colorGroup;
vec4 colorLamp;
vec4 colorSpeaker;
vec4 colorCamera;
vec4 colorEmpty;
vec4 colorVertex;
vec4 colorVertexSelect;
vec4 colorEditMeshActive;
vec4 colorEdgeSelect;
vec4 colorEdgeSeam;
vec4 colorEdgeSharp;
vec4 colorEdgeCrease;
vec4 colorEdgeBWeight;
vec4 colorEdgeFaceSelect;
vec4 colorFace;
vec4 colorFaceSelect;
vec4 colorNormal;
vec4 colorVNormal;
vec4 colorLNormal;
vec4 colorFaceDot;
vec4 colorDeselect;
vec4 colorOutline;
vec4 colorLampNoAlpha;
float sizeLampCenter;
float sizeLampCircle;
float sizeLampCircleShadow;
float sizeVertex;
float sizeEdge;
float sizeEdgeFix;
float sizeNormal;
float sizeFaceDot;
};
layout(triangles) in;
#ifdef EDGE_FIX
@@ -12,8 +55,6 @@ layout(triangles) in;
* an outline strip around the screenspace
* triangle. Order is important.
* TODO diagram
* fixupsize should be equal to this formula with a small offset
* 2 * max(max_vert_radius, max_edge_width) / sqrt(2)
*/
layout(triangle_strip, max_vertices=23) out;
@@ -21,8 +62,6 @@ layout(triangle_strip, max_vertices=23) out;
layout(triangle_strip, max_vertices=3) out;
#endif
const float fixupSize = 9.5; /* in pixels */
uniform mat4 ProjectionMatrix;
uniform vec2 viewportSize;
@@ -84,11 +123,11 @@ float dist(vec2 pos[3], vec2 vpos, int v)
vec3 getVertexColor(int v)
{
if ((vData[v].x & VERTEX_ACTIVE) != 0)
return vec3(0.0, 1.0, 0.0);
return colorEditMeshActive;
else if ((vData[v].x & VERTEX_SELECTED) != 0)
return vec3(1.0, 0.0, 0.0);
return colorEdgeSelect;
else
return vec3(0.0, 0.0, 0.0);
return colorWireEdit;
}
vec4 getClipData(vec2 pos[3], ivec2 vidx)
@@ -136,20 +175,16 @@ void main()
}
/* Face */
if ((vData[0].x & FACE_ACTIVE) != 0) {
faceColor = vec4(0.1, 1.0, 0.0, 0.2);
}
else if ((vData[0].x & FACE_SELECTED) != 0) {
faceColor = vec4(1.0, 0.2, 0.0, 0.2);
}
else {
faceColor = vec4(0.0, 0.0, 0.0, 0.2);
}
if ((vData[0].x & FACE_ACTIVE) != 0)
faceColor = colorEditMeshActive;
else if ((vData[0].x & FACE_SELECTED) != 0)
faceColor = colorFaceSelect;
else
faceColor = colorFace;
/* Vertex */
vec2 pos[3] = vec2[3](proj(pPos[0]), proj(pPos[1]), proj(pPos[2]));
/* Simple case : compute edge distances in geometry shader */
if (clipCase == 0) {
@@ -205,8 +240,8 @@ void main()
}
/* Make it view independant */
perp *= fixupSize / viewportSize;
cornervec[i] *= fixupSize / viewportSize;
perp *= sizeEdgeFix / viewportSize;
cornervec[i] *= sizeEdgeFix / viewportSize;
fixvec[i] = fixvecaf[i] = perp;
/* Perspective */

View File

@@ -5,11 +5,52 @@
/* This shader follows the principles of
* http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */
/* keep in sync with GlobalsUboStorage */
layout(std140) uniform globalsBlock {
vec4 colorWire;
vec4 colorWireEdit;
vec4 colorActive;
vec4 colorSelect;
vec4 colorTransform;
vec4 colorGroupActive;
vec4 colorGroup;
vec4 colorLamp;
vec4 colorSpeaker;
vec4 colorCamera;
vec4 colorEmpty;
vec4 colorVertex;
vec4 colorVertexSelect;
vec4 colorEditMeshActive;
vec4 colorEdgeSelect;
vec4 colorEdgeSeam;
vec4 colorEdgeSharp;
vec4 colorEdgeCrease;
vec4 colorEdgeBWeight;
vec4 colorEdgeFaceSelect;
vec4 colorFace;
vec4 colorFaceSelect;
vec4 colorNormal;
vec4 colorVNormal;
vec4 colorLNormal;
vec4 colorFaceDot;
vec4 colorDeselect;
vec4 colorOutline;
vec4 colorLampNoAlpha;
float sizeLampCenter;
float sizeLampCircle;
float sizeLampCircleShadow;
float sizeVertex;
float sizeEdge;
float sizeEdgeFix;
float sizeNormal;
float sizeFaceDot;
};
layout(points) in;
layout(triangle_strip, max_vertices=4) out;
const float fixupSize = 9.5; /* in pixels */
uniform mat4 ProjectionMatrix;
uniform vec2 viewportSize;
@@ -50,7 +91,7 @@ void main()
eData1 = eData2 = vec4(1e10);
flag = ivec3(0);
vec2 dir = vec2(1.0) * fixupSize;
vec2 dir = vec2(1.0) * sizeEdgeFix;
/* Make it view independant */
dir /= viewportSize;