Edit Mode overlay: Added theme color via UBO.
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user