Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2009-08-12 18:11:53 +0400
committerCampbell Barton <ideasman42@gmail.com>2009-08-12 18:11:53 +0400
commit45ba3d31c04a8ea3020f5ae24827d2a40ada5f7f (patch)
tree0f2d16615f778fb64d58ab784eb2ad0a38627988 /source
parentfcf883ecf9b90ca859c3fe692dffe4eb37e5e75d (diff)
when units are enabled use them for 3d viewport grid drawing, display the dimension for the smallest grid cell.
still need to make this work with grid snapping.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_unit.h21
-rw-r--r--source/blender/blenkernel/intern/unit.c126
-rw-r--r--source/blender/editors/interface/interface.c2
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c132
4 files changed, 201 insertions, 80 deletions
diff --git a/source/blender/blenkernel/BKE_unit.h b/source/blender/blenkernel/BKE_unit.h
index 91b1702ca82..c64c5aa50a1 100644
--- a/source/blender/blenkernel/BKE_unit.h
+++ b/source/blender/blenkernel/BKE_unit.h
@@ -37,7 +37,26 @@ void bUnit_AsString(char *str, double value, int prec, int system, int type, int
int bUnit_ReplaceString(char *str, char *str_orig, char *str_prev, double scale_pref, int system, int type);
/* the size of the unit used for this value (used for calculating the ckickstep) */
-double bUnit_Size(double value, int system, int type);
+double bUnit_ClosestScalar(double value, int system, int type);
+
+/* loop over scales, coudl add names later */
+//double bUnit_Iter(void **unit, char **name, int system, int type);
+
+void bUnit_GetSystem(void **usys_pt, int *len, int system, int type);
+char* bUnit_GetName(void *usys_pt, int index);
+char* bUnit_GetNamePlural(void *usys_pt, int index);
+double bUnit_GetScaler(void *usys_pt, int index);
+
+/* aligned with PropertyUnit */
+#define B_UNIT_NONE 0
+#define B_UNIT_LENGTH 1
+#define B_UNIT_AREA 2
+#define B_UNIT_VOLUME 3
+#define B_UNIT_MASS 4
+#define B_UNIT_ROTATION 5
+#define B_UNIT_TIME 6
+#define B_UNIT_VELOCITY 7
+#define B_UNIT_ACCELERATION 8
#ifdef __cplusplus
}
diff --git a/source/blender/blenkernel/intern/unit.c b/source/blender/blenkernel/intern/unit.c
index 5ecc8ddf5b8..fef15f83ccd 100644
--- a/source/blender/blenkernel/intern/unit.c
+++ b/source/blender/blenkernel/intern/unit.c
@@ -30,19 +30,24 @@
/* define a single unit */
typedef struct bUnitDef {
char *name;
- char *name_plural; /* can be NULL */
+ char *name_plural; /* abused a bit for the display name */
char *name_short; /* this is used for display*/
char *name_alt; /* can be NULL */
- double mul;
+ double scalar;
double bias; /* not used yet, needed for converting temperature */
+ int flag;
} bUnitDef;
+#define B_UNIT_DEF_NONE 0
+#define B_UNIT_DEF_SUPPRESS 1 /* Use for units that are not used enough to be translated into for common use */
+
/* define a single unit */
typedef struct bUnitCollection {
struct bUnitDef *units;
int base_unit; /* use for 0.0, or none given */
int flag; /* options for this system */
+ int length; /* to quickly find the last item */
} bUnitCollection;
/* Dummy */
@@ -50,45 +55,49 @@ static struct bUnitDef buDummyDef[] = {
{"", NULL, "", NULL, 1.0, 0.0},
{NULL, NULL, NULL, NULL, 0.0, 0.0}
};
-static struct bUnitCollection buDummyCollecton = {buDummyDef, 0, 0};
+static struct bUnitCollection buDummyCollecton = {buDummyDef, 0, 0, sizeof(buDummyDef)};
/* Lengths */
static struct bUnitDef buMetricLenDef[] = {
- {"kilometer", "kilometers", "km", NULL, 1000.0, 0.0},
- {"meter", "meters", "m", NULL, 1.0, 0.0}, /* base unit */
- {"centimeter", "centimeters", "cm", NULL, 0.01, 0.0},
- {"millimeter", "millimeters", "mm", NULL, 0.001, 0.0},
- {"micrometer", "micrometers", "um", "µm", 0.000001, 0.0}, // micron too?
- {"nanometer", "nanometers", "nm", NULL, 0.000000001, 0.0},
- {"picometer", "picometers", "pm", NULL, 0.000000000001, 0.0},
+ {"kilometer", "Kilometers", "km", NULL, 1000.0, 0.0, B_UNIT_DEF_NONE},
+ {"hectometer", "100 Meters", "hm", NULL, 100.0, 0.0, B_UNIT_DEF_SUPPRESS},
+ {"dekameter", "10 Meters", "dkm",NULL, 10.0, 0.0, B_UNIT_DEF_SUPPRESS},
+ {"meter", "Meters", "m", NULL, 1.0, 0.0, B_UNIT_DEF_NONE}, /* base unit */
+ {"decimetre", "10 Centimeters", "dm", NULL, 0.1, 0.0, B_UNIT_DEF_SUPPRESS},
+ {"centimeter", "Centimeters", "cm", NULL, 0.01, 0.0, B_UNIT_DEF_NONE},
+ {"millimeter", "Millimeters", "mm", NULL, 0.001, 0.0, B_UNIT_DEF_NONE},
+ {"micrometer", "Micrometers", "um", "µm", 0.000001, 0.0, B_UNIT_DEF_NONE}, // micron too?
+ {"nanometer", "Nanometers", "nm", NULL, 0.000000001, 0.0, B_UNIT_DEF_NONE},
+ {"picometer", "Picometers", "pm", NULL, 0.000000000001, 0.0,B_UNIT_DEF_NONE},
{NULL, NULL, NULL, NULL, 0.0, 0.0}
};
-static struct bUnitCollection buMetricLenCollecton = {buMetricLenDef, 1, 0};
+static struct bUnitCollection buMetricLenCollecton = {buMetricLenDef, 1, 0, sizeof(buMetricLenDef)/sizeof(bUnitDef)};
static struct bUnitDef buImperialLenDef[] = {
- {"mile", "miles", "mi", "m", 1609.344, 0.0},
- {"yard", "yards", "yd", NULL, 0.9144, 0.0},
- {"foot", "feet", "'", "ft", 0.3048, 0.0},
- {"inch", "inches", "\"", "in", 0.0254, 0.0}, /* base unit */
- {"thou", "thous", "mil", NULL,0.0000254, 0.0},
+ {"mile", "Miles", "mi", "m", 1609.344, 0.0, B_UNIT_DEF_NONE},
+ {"furlong", "Furlongs", "fur", NULL,201.168, 0.0, B_UNIT_DEF_SUPPRESS},
+ {"yard", "Yards", "yd", NULL, 0.9144, 0.0, B_UNIT_DEF_NONE},
+ {"foot", "Feet", "'", "ft", 0.3048, 0.0, B_UNIT_DEF_NONE},
+ {"inch", "Inches", "\"", "in", 0.0254, 0.0, B_UNIT_DEF_NONE}, /* base unit */
+ {"thou", "Thous", "mil", NULL,0.0000254, 0.0, B_UNIT_DEF_NONE},
{NULL, NULL, NULL, NULL, 0.0, 0.0}
};
-static struct bUnitCollection buImperialLenCollecton = {buImperialLenDef, 2, 0};
+static struct bUnitCollection buImperialLenCollecton = {buImperialLenDef, 2, 0, sizeof(buImperialLenDef)/sizeof(bUnitDef)};
/* Time */
static struct bUnitDef buNaturalTimeDef[] = {
/* weeks? - probably not needed for blender */
- {"day", "days", "d", NULL, 90000.0, 0.0},
- {"hour", "hours", "hr", "h", 3600.0, 0.0},
- {"minute", "minutes", "min", "m", 60.0, 0.0},
- {"second", "seconds", "sec", "s", 1.0, 0.0}, /* base unit */
- {"millisecond", "milliseconds", "ms", NULL, 0.001, 0.0},
- {"microsecond", "microseconds", "us", NULL, 0.000001, 0.0},
+ {"day", "Days", "d", NULL, 90000.0, 0.0, B_UNIT_DEF_NONE},
+ {"hour", "Hours", "hr", "h", 3600.0, 0.0, B_UNIT_DEF_NONE},
+ {"minute", "Minutes", "min", "m", 60.0, 0.0, B_UNIT_DEF_NONE},
+ {"second", "Seconds", "sec", "s", 1.0, 0.0, B_UNIT_DEF_NONE}, /* base unit */
+ {"millisecond", "Milliseconds", "ms", NULL, 0.001, 0.0 , B_UNIT_DEF_NONE},
+ {"microsecond", "Microseconds", "us", NULL, 0.000001, 0.0, B_UNIT_DEF_NONE},
{NULL, NULL, NULL, NULL, 0.0, 0.0}
};
-static struct bUnitCollection buNaturalTimeCollecton = {buNaturalTimeDef, 3, 0};
+static struct bUnitCollection buNaturalTimeCollecton = {buNaturalTimeDef, 3, 0, sizeof(buNaturalTimeDef)/sizeof(bUnitDef)};
#define UNIT_SYSTEM_MAX 3
static struct bUnitCollection *bUnitSystems[][8] = {
@@ -109,14 +118,19 @@ static bUnitDef *unit_default(bUnitCollection *usys)
return &usys->units[usys->base_unit];
}
-static bUnitDef *unit_best_fit(double value, bUnitCollection *usys, bUnitDef *unit_start)
+static bUnitDef *unit_best_fit(double value, bUnitCollection *usys, bUnitDef *unit_start, int suppress)
{
bUnitDef *unit;
double value_abs= value>0.0?value:-value;
- for(unit= unit_start ? unit_start:usys->units; unit->name; unit++)
- if (value_abs >= unit->mul*0.9999) /* scale down mul so 1cm doesnt convert to 10mm because of float error */
+ for(unit= unit_start ? unit_start:usys->units; unit->name; unit++) {
+
+ if(suppress && (unit->flag & B_UNIT_DEF_SUPPRESS))
+ continue;
+
+ if (value_abs >= unit->scalar*0.9999) /* scale down scalar so 1cm doesnt convert to 10mm because of float error */
return unit;
+ }
return unit_default(usys);
}
@@ -127,13 +141,13 @@ static bUnitDef *unit_best_fit(double value, bUnitCollection *usys, bUnitDef *un
static void unit_dual_convert(double value, bUnitCollection *usys,
bUnitDef **unit_a, bUnitDef **unit_b, double *value_a, double *value_b)
{
- bUnitDef *unit= unit_best_fit(value, usys, NULL);
+ bUnitDef *unit= unit_best_fit(value, usys, NULL, 1);
- *value_a= floor(value/unit->mul) * unit->mul;
+ *value_a= floor(value/unit->scalar) * unit->scalar;
*value_b= value - (*value_a);
*unit_a= unit;
- *unit_b= unit_best_fit(*value_b, usys, *unit_a);
+ *unit_b= unit_best_fit(*value_b, usys, *unit_a, 1);
}
static int unit_as_string(char *str, double value, int prec, bUnitCollection *usys,
@@ -151,10 +165,10 @@ static int unit_as_string(char *str, double value, int prec, bUnitCollection *us
unit= unit_default(usys);
}
else {
- unit= unit_best_fit(value, usys, NULL);
+ unit= unit_best_fit(value, usys, NULL, 1);
}
- value_conv= value/unit->mul;
+ value_conv= value/unit->scalar;
/* Convert to a string */
{
@@ -252,7 +266,7 @@ static int unit_scale_str(char *str, char *str_tmp, double scale_pref, bUnitDef
/* next char cannot be alphanum */
if (!isalpha(*(str_found+len_name))) {
int len= strlen(str);
- int len_num= sprintf(str_tmp, "*%g", unit->mul/scale_pref);
+ int len_num= sprintf(str_tmp, "*%g", unit->scalar/scale_pref);
memmove(str_found+len_num, str_found+len_name, (len+1)-(int)((str_found+len_name)-str)); /* may grow or shrink the string, 1+ to copy the string terminator */
memcpy(str_found, str_tmp, len_num); /* without the string terminator */
change= 1;
@@ -299,6 +313,10 @@ int bUnit_ReplaceString(char *str, char *str_orig, char *str_prev, double scale_
}
for(unit= usys->units; unit->name; unit++) {
+
+ if(unit->flag & B_UNIT_DEF_SUPPRESS)
+ continue;
+
/* incase there are multiple instances */
while(unit_replace(str, str_tmp, scale_pref, unit))
change= 1;
@@ -314,6 +332,10 @@ int bUnit_ReplaceString(char *str, char *str_orig, char *str_prev, double scale_
if (system_iter != system) {
usys_iter= unit_get_system(system_iter, type);
for(unit= usys_iter->units; unit->name; unit++) {
+
+ if(unit->flag & B_UNIT_DEF_SUPPRESS)
+ continue;
+
/* incase there are multiple instances */
while(unit_replace(str, str_tmp, scale_pref, unit))
change= 1;
@@ -329,6 +351,10 @@ int bUnit_ReplaceString(char *str, char *str_orig, char *str_prev, double scale_
/* see which units the original value had */
strcpy(str, str_prev); /* temp overwrite */
for(unit= usys->units; unit->name; unit++) {
+
+ if(unit->flag & B_UNIT_DEF_SUPPRESS)
+ continue;
+
if (unit_replace(str, str_tmp, scale_pref, unit))
break;
}
@@ -349,7 +375,7 @@ int bUnit_ReplaceString(char *str, char *str_orig, char *str_prev, double scale_
}
-double bUnit_Size(double value, int system, int type)
+double bUnit_ClosestScalar(double value, int system, int type)
{
bUnitCollection *usys = unit_get_system(system, type);
bUnitDef *unit;
@@ -357,9 +383,37 @@ double bUnit_Size(double value, int system, int type)
if(usys==NULL)
return -1;
- unit= unit_best_fit(value, usys, NULL);
+ unit= unit_best_fit(value, usys, NULL, 1);
if(unit==NULL)
return -1;
- return unit->mul;
+ return unit->scalar;
+}
+
+/* external access */
+void bUnit_GetSystem(void **usys_pt, int *len, int system, int type)
+{
+ bUnitCollection *usys = unit_get_system(system, type);
+ *usys_pt= usys;
+
+ if(usys==NULL) {
+ *len= 0;
+ return;
+ }
+
+ *len= usys->length;
+}
+
+char *bUnit_GetName(void *usys_pt, int index)
+{
+ return ((bUnitCollection *)usys_pt)->units[index].name;
+}
+char *bUnit_GetNamePlural(void *usys_pt, int index)
+{
+ return ((bUnitCollection *)usys_pt)->units[index].name_plural;
+}
+
+double bUnit_GetScaler(void *usys_pt, int index)
+{
+ return ((bUnitCollection *)usys_pt)->units[index].scalar;
}
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index a3ae08bbe09..2fe3ac720b6 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -1356,7 +1356,7 @@ static float ui_get_but_step_unit(uiBut *but, double value, float step_default)
int unit_type= RNA_SUBTYPE_UNIT_VALUE(RNA_property_subtype(but->rnaprop));
float step;
- step = bUnit_Size(ui_get_but_scale_unit(but, value), U.unit_system, unit_type);
+ step = bUnit_ClosestScalar(ui_get_but_scale_unit(but, value), U.unit_system, unit_type);
if(step > 0.0) { /* -1 is an error value */
return (step/ui_get_but_scale_unit(but, 1.0))*100;
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 5e6bfe89165..fb4ef3349e6 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -62,6 +62,7 @@
#include "BKE_scene.h"
#include "BKE_screen.h"
#include "BKE_utildefines.h"
+#include "BKE_unit.h"
#include "RE_pipeline.h" // make_stars
@@ -234,7 +235,9 @@ static void drawgrid_draw(ARegion *ar, float wx, float wy, float x, float y, flo
}
-static void drawgrid(ARegion *ar, View3D *v3d)
+#define GRID_MIN_PX 6.0f
+
+static void drawgrid(ARegion *ar, View3D *v3d, char **grid_unit)
{
/* extern short bgpicmode; */
RegionView3D *rv3d= ar->regiondata;
@@ -243,6 +246,8 @@ static void drawgrid(ARegion *ar, View3D *v3d)
char col[3], col2[3];
short sublines = v3d->gridsubdiv;
+ *grid_unit= NULL;
+
vec4[0]=vec4[1]=vec4[2]=0.0;
vec4[3]= 1.0;
Mat4MulVec4fl(rv3d->persmat, vec4);
@@ -272,72 +277,110 @@ static void drawgrid(ARegion *ar, View3D *v3d)
/* check zoom out */
UI_ThemeColor(TH_GRID);
- if(dx<6.0) {
- v3d->gridview*= sublines;
- dx*= sublines;
-
- if(dx<6.0) {
+ if(U.unit_system) {
+ void *usys;
+ int len, i;
+ double scalar;
+ float dx_scalar;
+ float blend_fac;
+
+ bUnit_GetSystem(&usys, &len, U.unit_system, B_UNIT_LENGTH);
+
+ if(usys) {
+ i= len;
+ while(i--) {
+ scalar= bUnit_GetScaler(usys, i);
+
+ dx_scalar = dx * scalar * U.unit_scale_length;
+ if (dx_scalar < GRID_MIN_PX)
+ continue;
+
+ /* Store the smallest drawn grid size units name so users know how bit each grid cell is */
+ if(*grid_unit==NULL)
+ *grid_unit= bUnit_GetNamePlural(usys, i);
+
+ blend_fac= 1-(GRID_MIN_PX/dx_scalar);
+
+ /* tweak to have the fade a bit nicer */
+ blend_fac= (blend_fac * blend_fac) * 2.0f;
+ CLAMP(blend_fac, 0.3f, 1.0f);
+
+
+ UI_ThemeColorBlend(TH_BACK, TH_GRID, blend_fac);
+
+ drawgrid_draw(ar, wx, wy, x, y, dx_scalar);
+ }
+ }
+ }
+ else {
+ if(dx<GRID_MIN_PX) {
v3d->gridview*= sublines;
dx*= sublines;
- if(dx<6.0) {
+ if(dx<GRID_MIN_PX) {
v3d->gridview*= sublines;
- dx*=sublines;
- if(dx<6.0);
- else {
- UI_ThemeColor(TH_GRID);
+ dx*= sublines;
+
+ if(dx<GRID_MIN_PX) {
+ v3d->gridview*= sublines;
+ dx*=sublines;
+ if(dx<GRID_MIN_PX);
+ else {
+ UI_ThemeColor(TH_GRID);
+ drawgrid_draw(ar, wx, wy, x, y, dx);
+ }
+ }
+ else { // start blending out
+ UI_ThemeColorBlend(TH_BACK, TH_GRID, dx/(GRID_MIN_PX*10));
drawgrid_draw(ar, wx, wy, x, y, dx);
+
+ UI_ThemeColor(TH_GRID);
+ drawgrid_draw(ar, wx, wy, x, y, sublines*dx);
}
}
- else { // start blending out
- UI_ThemeColorBlend(TH_BACK, TH_GRID, dx/60.0);
+ else { // start blending out (GRID_MIN_PX < dx < (GRID_MIN_PX*10))
+ UI_ThemeColorBlend(TH_BACK, TH_GRID, dx/(GRID_MIN_PX*10));
drawgrid_draw(ar, wx, wy, x, y, dx);
-
+
UI_ThemeColor(TH_GRID);
drawgrid_draw(ar, wx, wy, x, y, sublines*dx);
}
}
- else { // start blending out (6 < dx < 60)
- UI_ThemeColorBlend(TH_BACK, TH_GRID, dx/60.0);
- drawgrid_draw(ar, wx, wy, x, y, dx);
-
- UI_ThemeColor(TH_GRID);
- drawgrid_draw(ar, wx, wy, x, y, sublines*dx);
- }
- }
- else {
- if(dx>60.0) { // start blending in
- v3d->gridview/= sublines;
- dx/= sublines;
- if(dx>60.0) { // start blending in
+ else {
+ if(dx>(GRID_MIN_PX*10)) { // start blending in
v3d->gridview/= sublines;
dx/= sublines;
- if(dx>60.0) {
- UI_ThemeColor(TH_GRID);
- drawgrid_draw(ar, wx, wy, x, y, dx);
+ if(dx>(GRID_MIN_PX*10)) { // start blending in
+ v3d->gridview/= sublines;
+ dx/= sublines;
+ if(dx>(GRID_MIN_PX*10)) {
+ UI_ThemeColor(TH_GRID);
+ drawgrid_draw(ar, wx, wy, x, y, dx);
+ }
+ else {
+ UI_ThemeColorBlend(TH_BACK, TH_GRID, dx/(GRID_MIN_PX*10));
+ drawgrid_draw(ar, wx, wy, x, y, dx);
+ UI_ThemeColor(TH_GRID);
+ drawgrid_draw(ar, wx, wy, x, y, dx*sublines);
+ }
}
else {
- UI_ThemeColorBlend(TH_BACK, TH_GRID, dx/60.0);
+ UI_ThemeColorBlend(TH_BACK, TH_GRID, dx/(GRID_MIN_PX*10));
drawgrid_draw(ar, wx, wy, x, y, dx);
UI_ThemeColor(TH_GRID);
drawgrid_draw(ar, wx, wy, x, y, dx*sublines);
}
}
else {
- UI_ThemeColorBlend(TH_BACK, TH_GRID, dx/60.0);
+ UI_ThemeColorBlend(TH_BACK, TH_GRID, dx/(GRID_MIN_PX*10));
drawgrid_draw(ar, wx, wy, x, y, dx);
- UI_ThemeColor(TH_GRID);
+ UI_ThemeColor(TH_GRID);
drawgrid_draw(ar, wx, wy, x, y, dx*sublines);
}
}
- else {
- UI_ThemeColorBlend(TH_BACK, TH_GRID, dx/60.0);
- drawgrid_draw(ar, wx, wy, x, y, dx);
- UI_ThemeColor(TH_GRID);
- drawgrid_draw(ar, wx, wy, x, y, dx*sublines);
- }
}
+
x+= (wx);
y+= (wy);
UI_GetThemeColor3ubv(TH_GRID, col);
@@ -361,7 +404,7 @@ static void drawgrid(ARegion *ar, View3D *v3d)
glDepthMask(1); // enable write in zbuffer
}
-
+#undef GRID_MIN_PX
static void drawfloor(Scene *scene, View3D *v3d)
{
@@ -1855,6 +1898,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
Object *ob;
int retopo= 0, sculptparticle= 0;
Object *obact = OBACT;
+ char *grid_unit= NULL;
/* from now on all object derived meshes check this */
v3d->customdata_mask= get_viewedit_datamask(CTX_wm_screen(C));
@@ -1929,7 +1973,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
}
else {
ED_region_pixelspace(ar);
- drawgrid(ar, v3d);
+ drawgrid(ar, v3d, &grid_unit);
/* XXX make function? replaces persp(1) */
glMatrixMode(GL_PROJECTION);
wmLoadMatrix(rv3d->winmat);
@@ -2060,7 +2104,11 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
if(U.uiflag & USER_SHOW_VIEWPORTNAME) {
draw_viewport_name(ar, v3d);
}
-
+ if (grid_unit) { /* draw below the viewport name */
+ UI_ThemeColor(TH_TEXT_HI);
+ BLF_draw_default(10, ar->winy-(USER_SHOW_VIEWPORTNAME?40:20), 0.0f, grid_unit);
+ }
+
ob= OBACT;
if(U.uiflag & USER_DRAWVIEWINFO)
draw_selected_name(scene, ob, v3d);