diff options
Diffstat (limited to 'source/blender')
295 files changed, 6063 insertions, 7027 deletions
diff --git a/source/blender/alembic/intern/abc_exporter.cc b/source/blender/alembic/intern/abc_exporter.cc index d050f3b78b1..d470488937a 100644 --- a/source/blender/alembic/intern/abc_exporter.cc +++ b/source/blender/alembic/intern/abc_exporter.cc @@ -421,7 +421,7 @@ void AbcExporter::exploreTransform(Base *ob_base, Object *parent, Object *dupliO } } -AbcTransformWriter * AbcExporter::createTransformWriter(Object *ob, Object *parent, Object *dupliObParent) +AbcTransformWriter *AbcExporter::createTransformWriter(Object *ob, Object *parent, Object *dupliObParent) { /* An object should not be its own parent, or we'll get infinite loops. */ BLI_assert(ob != parent); diff --git a/source/blender/alembic/intern/abc_exporter.h b/source/blender/alembic/intern/abc_exporter.h index a92e426292c..74af85bfef9 100644 --- a/source/blender/alembic/intern/abc_exporter.h +++ b/source/blender/alembic/intern/abc_exporter.h @@ -116,7 +116,7 @@ private: Alembic::Abc::TimeSamplingPtr createTimeSampling(double step); void createTransformWritersHierarchy(); - AbcTransformWriter * createTransformWriter(Object *ob, Object *parent, Object *dupliObParent); + AbcTransformWriter *createTransformWriter(Object *ob, Object *parent, Object *dupliObParent); void exploreTransform(Base *ob_base, Object *parent, Object *dupliObParent); void exploreObject(Base *ob_base, Object *dupliObParent); void createShapeWriters(); diff --git a/source/blender/alembic/intern/abc_hair.cc b/source/blender/alembic/intern/abc_hair.cc index 83a46a330fd..50c2d04e042 100644 --- a/source/blender/alembic/intern/abc_hair.cc +++ b/source/blender/alembic/intern/abc_hair.cc @@ -133,7 +133,7 @@ void AbcHairWriter::write_hair_sample(Mesh *mesh, m_uv_warning_shown = true; } - ParticleData * pa = m_psys->particles; + ParticleData *pa = m_psys->particles; int k; ParticleCacheKey **cache = m_psys->pathcache; diff --git a/source/blender/alembic/intern/abc_mesh.cc b/source/blender/alembic/intern/abc_mesh.cc index 2b739837239..4c48b7a5bce 100644 --- a/source/blender/alembic/intern/abc_mesh.cc +++ b/source/blender/alembic/intern/abc_mesh.cc @@ -546,8 +546,7 @@ Mesh *AbcMeshWriter::getFinalMesh(bool &r_needsfree) BM_mesh_triangulate(bm, quad_method, ngon_method, tag_only, NULL, NULL, NULL); - struct BMeshToMeshParams bmmp = {0}; - Mesh *result = BKE_bmesh_to_mesh_nomain(bm, &bmmp); + Mesh *result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0); BM_mesh_free(bm); mesh = result; diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 0b0030ec101..db918bb0fbd 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -514,7 +514,7 @@ void DM_interp_poly_data( * In use now by vertex/weight paint and particles */ DMCoNo *mesh_get_mapped_verts_nors(struct Scene *scene, struct Object *ob); #endif -void mesh_get_mapped_verts_coords(DerivedMesh *dm, float (*r_cos)[3], const int totcos); +void mesh_get_mapped_verts_coords(struct Mesh *me_eval, float (*r_cos)[3], const int totcos); /* */ @@ -526,10 +526,6 @@ DerivedMesh *mesh_create_derived_render( struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, CustomDataMask dataMask); -DerivedMesh *getEditDerivedBMesh( - struct BMEditMesh *em, struct Object *ob, CustomDataMask data_mask, - float (*vertexCos)[3]); - /* same as above but wont use render settings */ DerivedMesh *mesh_create_derived(struct Mesh *me, float (*vertCos)[3]); DerivedMesh *mesh_create_derived_no_deform( @@ -541,20 +537,16 @@ DerivedMesh *mesh_create_derived_no_deform_render( struct Object *ob, float (*vertCos)[3], CustomDataMask dataMask); -DerivedMesh *editbmesh_get_derived_base( - struct Object *ob, struct BMEditMesh *em, CustomDataMask data_mask); -DerivedMesh *editbmesh_get_derived_cage( +struct Mesh *editbmesh_get_eval_cage( struct Depsgraph *depsgraph, struct Scene *scene, struct Object *, struct BMEditMesh *em, CustomDataMask dataMask); -DerivedMesh *editbmesh_get_derived_cage_and_final( +struct Mesh *editbmesh_get_eval_cage_and_final( struct Depsgraph *depsgraph, struct Scene *scene, struct Object *, struct BMEditMesh *em, CustomDataMask dataMask, - DerivedMesh **r_final); - -DerivedMesh *object_get_derived_final(struct Object *ob, const bool for_render); + struct Mesh **r_final); float (*editbmesh_get_vertex_cos(struct BMEditMesh *em, int *r_numVerts))[3]; -bool editbmesh_modifier_is_enabled(struct Scene *scene, struct ModifierData *md, DerivedMesh *dm); +bool editbmesh_modifier_is_enabled(struct Scene *scene, struct ModifierData *md, bool has_prev_mesh); void makeDerivedMesh( struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct BMEditMesh *em, CustomDataMask dataMask, const bool build_shapekey_layers); diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index 84451fe31d4..d4b5b4c7d47 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -28,7 +28,7 @@ * and keep comment above the defines. * Use STRINGIFY() rather than defining with quotes */ #define BLENDER_VERSION 280 -#define BLENDER_SUBVERSION 25 +#define BLENDER_SUBVERSION 26 /* Several breakages with 280, e.g. collections vs layers */ #define BLENDER_MINVERSION 280 #define BLENDER_MINSUBVERSION 0 diff --git a/source/blender/blenkernel/BKE_bmfont.h b/source/blender/blenkernel/BKE_bmfont.h deleted file mode 100644 index 3be84c83892..00000000000 --- a/source/blender/blenkernel/BKE_bmfont.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ -#ifndef __BKE_BMFONT_H__ -#define __BKE_BMFONT_H__ - -/** \file BKE_bmfont.h - * \ingroup bke - * \since March 2001 - * \author nzc - */ - -#ifdef __cplusplus -extern "C" { -#endif - -struct bmGlyph; -struct ImBuf; -struct bmFont; - -void printfGlyph(struct bmGlyph *glyph); -void calcAlpha(struct ImBuf *ibuf); -void readBitmapFontVersion0(struct ImBuf *ibuf, - unsigned char *rect, - int step); -void detectBitmapFont(struct ImBuf *ibuf); -int locateGlyph(struct bmFont *bmfont, unsigned short unicode); -void matrixGlyph(struct ImBuf *ibuf, unsigned short unicode, - float *centerx, float *centery, - float *sizex, float *sizey, - float *transx, float *transy, - float *movex, float *movey, float *advance); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h index 28dcf9cb127..1c73434cde5 100644 --- a/source/blender/blenkernel/BKE_context.h +++ b/source/blender/blenkernel/BKE_context.h @@ -249,6 +249,12 @@ void CTX_data_list_add(bContextDataResult *result, void *data); CTX_DATA_BEGIN(C, Type, instance, member) \ Type_id instance_id = ctx_link->ptr.id.data; \ +#define CTX_DATA_BEGIN_FOR_ID(C, Type, instance, member, instance_id) \ + CTX_DATA_BEGIN(C, Type, instance, member) \ + if (ctx_link->ptr.id.data != (instance_id)) { \ + continue; \ + } + int ctx_data_list_count(const bContext *C, int (*func)(const bContext *, ListBase *)); #define CTX_DATA_COUNT(C, member) \ diff --git a/source/blender/blenkernel/BKE_editmesh.h b/source/blender/blenkernel/BKE_editmesh.h index 09f9c3dfbcf..de4efaf37b0 100644 --- a/source/blender/blenkernel/BKE_editmesh.h +++ b/source/blender/blenkernel/BKE_editmesh.h @@ -41,6 +41,7 @@ struct Scene; struct DerivedMesh; struct MeshStatVis; struct Depsgraph; +struct EditMeshData; /** * This structure is used for mesh edit-mode. @@ -63,8 +64,9 @@ typedef struct BMEditMesh { struct BMLoop *(*looptris)[3]; int tottri; + struct Mesh *mesh_eval_final, *mesh_eval_cage; + /*derivedmesh stuff*/ - struct DerivedMesh *derivedFinal, *derivedCage; CustomDataMask lastDataMask; unsigned char (*derivedVertColor)[4]; int derivedVertColorLen; @@ -97,8 +99,8 @@ void BKE_editmesh_lnorspace_update(BMEditMesh *em); /* editderivedmesh.c */ /* should really be defined in editmesh.c, but they use 'EditDerivedBMesh' */ -void BKE_editmesh_statvis_calc(BMEditMesh *em, struct DerivedMesh *dm, - const struct MeshStatVis *statvis); +void BKE_editmesh_statvis_calc( + BMEditMesh *em, struct EditMeshData *emd, const struct MeshStatVis *statvis); float (*BKE_editmesh_vertexCos_get( struct Depsgraph *depsgraph, struct BMEditMesh *em, struct Scene *scene, int *r_numVerts))[3]; diff --git a/source/blender/blenkernel/BKE_bmfont_types.h b/source/blender/blenkernel/BKE_editmesh_cache.h index 31513e4b8f1..aaaa79a0857 100644 --- a/source/blender/blenkernel/BKE_bmfont_types.h +++ b/source/blender/blenkernel/BKE_editmesh_cache.h @@ -15,44 +15,22 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * * ***** END GPL LICENSE BLOCK ***** */ -#ifndef __BKE_BMFONT_TYPES_H__ -#define __BKE_BMFONT_TYPES_H__ -/** \file BKE_bmfont_types.h +#ifndef __BKE_EDITMESH_CACHE_H__ +#define __BKE_EDITMESH_CACHE_H__ + +/** \file BKE_editmesh_cache.h * \ingroup bke - * \since March 2001 - * \author nzc */ -#define is_power_of_two(N) ((N ^ (N - 1)) == (2 * N - 1)) -/* - * Moved to IMB_imbuf_types.h where it will live close to the ImBuf type. - * It is used as a userflag bit mask. - */ -// #define IB_BITMAPFONT 1 -typedef struct bmGlyph { - unsigned short unicode; - short locx, locy; - signed char ofsx, ofsy; - unsigned char sizex, sizey; - unsigned char advance, reserved; -} bmGlyph; +struct BMEditMesh; +struct EditMeshData; + +void BKE_editmesh_cache_ensure_poly_normals(struct BMEditMesh *em, struct EditMeshData *emd); +void BKE_editmesh_cache_ensure_vert_normals(struct BMEditMesh *em, struct EditMeshData *emd); -typedef struct bmFont { - char magic[4]; - short version; - short glyphcount; - short xsize, ysize; - bmGlyph glyphs[1]; -} bmFont; +void BKE_editmesh_cache_ensure_poly_centers(struct BMEditMesh *em, struct EditMeshData *emd); -#endif +#endif /* __BKE_EDITMESH_CACHE_H__ */ diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h index 058e42bd261..8ab088eff02 100644 --- a/source/blender/blenkernel/BKE_gpencil.h +++ b/source/blender/blenkernel/BKE_gpencil.h @@ -143,6 +143,9 @@ struct Material *BKE_gpencil_get_material_from_brush(struct Brush *brush); struct Material *BKE_gpencil_material_ensure(struct Main *bmain, struct Object *ob); /* object boundbox */ +bool BKE_gpencil_data_minmax( + struct Object *ob, const struct bGPdata *gpd, + float r_min[3], float r_max[3]); bool BKE_gpencil_stroke_minmax( const struct bGPDstroke *gps, const bool use_select, float r_min[3], float r_max[3]); diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index a5f8338f3cc..89bde516264 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -67,6 +67,7 @@ struct CustomData; struct Scene; struct MLoopUV; struct ReportList; +struct BMEditMesh; #ifdef __cplusplus extern "C" { @@ -89,7 +90,11 @@ struct BMesh *BKE_mesh_to_bmesh( struct Mesh *me, struct Object *ob, const bool add_key_index, const struct BMeshCreateParams *params); -struct Mesh *BKE_bmesh_to_mesh_nomain(struct BMesh *bm, const struct BMeshToMeshParams *params); +struct Mesh *BKE_mesh_from_bmesh_nomain(struct BMesh *bm, const struct BMeshToMeshParams *params); +struct Mesh *BKE_mesh_from_bmesh_for_eval_nomain(struct BMesh *bm, int64_t cd_mask_extra); + +struct Mesh *BKE_mesh_from_editmesh_with_coords_thin_wrap( + struct BMEditMesh *em, CustomDataMask data_mask, float (*vertexCos)[3]); int poly_find_loop_from_vert( const struct MPoly *poly, @@ -174,7 +179,7 @@ void BKE_mesh_split_faces(struct Mesh *mesh, bool free_loop_normals); struct Mesh *BKE_mesh_new_from_object( struct Depsgraph *depsgraph, struct Main *bmain, struct Scene *sce, struct Object *ob, - const bool apply_modifiers, const bool calc_tessface, const bool calc_undeformed); + const bool apply_modifiers, const bool calc_undeformed); struct Mesh *BKE_mesh_create_derived_for_modifier( struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct ModifierData *md, int build_shapekey_layers); @@ -230,6 +235,7 @@ void BKE_mesh_calc_normals_poly( const bool only_face_normals); void BKE_mesh_calc_normals(struct Mesh *me); void BKE_mesh_ensure_normals(struct Mesh *me); +void BKE_mesh_ensure_normals_for_display(struct Mesh *mesh); void BKE_mesh_calc_normals_tessface( struct MVert *mverts, int numVerts, const struct MFace *mfaces, int numFaces, diff --git a/source/blender/blenkernel/BKE_mesh_runtime.h b/source/blender/blenkernel/BKE_mesh_runtime.h index 9132c3dae64..050d17771c9 100644 --- a/source/blender/blenkernel/BKE_mesh_runtime.h +++ b/source/blender/blenkernel/BKE_mesh_runtime.h @@ -87,6 +87,10 @@ struct Mesh *mesh_get_eval_deform( struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, CustomDataMask dataMask); +struct Mesh *mesh_create_eval_final_render( + struct Depsgraph *depsgraph, struct Scene *scene, + struct Object *ob, CustomDataMask dataMask); + #ifdef USE_DERIVEDMESH struct DerivedMesh *mesh_create_derived_index_render( struct Depsgraph *depsgraph, struct Scene *scene, diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h index eb08db93bd0..2be91406524 100644 --- a/source/blender/blenkernel/BKE_modifier.h +++ b/source/blender/blenkernel/BKE_modifier.h @@ -424,22 +424,22 @@ const char *modifier_path_relbase_from_global(struct Object *ob); /* wrappers for modifier callbacks that ensure valid normals */ -struct DerivedMesh *modwrap_applyModifier( +struct Mesh *modwrap_applyModifier( ModifierData *md, const struct ModifierEvalContext *ctx, - struct DerivedMesh *dm); + struct Mesh *me); -struct DerivedMesh *modwrap_applyModifierEM( +struct Mesh *modwrap_applyModifierEM( ModifierData *md, const struct ModifierEvalContext *ctx, - struct BMEditMesh *em, struct DerivedMesh *dm); + struct BMEditMesh *em, struct Mesh *me); void modwrap_deformVerts( ModifierData *md, const struct ModifierEvalContext *ctx, - struct DerivedMesh *dm, + struct Mesh *me, float (*vertexCos)[3], int numVerts); void modwrap_deformVertsEM( ModifierData *md, const struct ModifierEvalContext *ctx, - struct BMEditMesh *em, struct DerivedMesh *dm, + struct BMEditMesh *em, struct Mesh *me, float (*vertexCos)[3], int numVerts); #define applyModifier_DM_wrapper(NEW_FUNC_NAME, OLD_FUNC_NAME) \ @@ -456,43 +456,10 @@ void modwrap_deformVertsEM( * depending on if the modifier has been ported to Mesh or is still using DerivedMesh */ -void modifier_deformVerts_ensure_normals( - struct ModifierData *md, const struct ModifierEvalContext *ctx, - struct Mesh *mesh, float (*vertexCos)[3], int numVerts); - -struct Mesh *modifier_applyModifier_ensure_normals( - struct ModifierData *md, const struct ModifierEvalContext *ctx, - struct Mesh *mesh); - -/* deprecated variants of above that accept DerivedMesh */ - -void modifier_deformVerts_DM_deprecated( - struct ModifierData *md, const struct ModifierEvalContext *ctx, - struct DerivedMesh *dm, float (*vertexCos)[3], int numVerts); - -void modifier_deformMatrices_DM_deprecated( - struct ModifierData *md, const struct ModifierEvalContext *ctx, - struct DerivedMesh *dm, - float (*vertexCos)[3], float (*defMats)[3][3], int numVerts); - -void modifier_deformVertsEM_DM_deprecated( - struct ModifierData *md, const struct ModifierEvalContext *ctx, - struct BMEditMesh *editData, struct DerivedMesh *dm, - float (*vertexCos)[3], int numVerts); - -void modifier_deformMatricesEM_DM_deprecated( - struct ModifierData *md, const struct ModifierEvalContext *ctx, - struct BMEditMesh *editData, struct DerivedMesh *dm, - float (*vertexCos)[3], float (*defMats)[3][3], int numVerts); - struct DerivedMesh *modifier_applyModifier_DM_deprecated( struct ModifierData *md, const struct ModifierEvalContext *ctx, struct DerivedMesh *dm); -struct DerivedMesh *modifier_applyModifierEM_DM_deprecated( - struct ModifierData *md, const struct ModifierEvalContext *ctx, - struct BMEditMesh *editData, struct DerivedMesh *dm); - struct Mesh *BKE_modifier_get_evaluated_mesh_from_evaluated_object( struct Object *ob_eval, bool *r_free_mesh); diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index 81182a89f3e..6d7def8f93f 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -102,7 +102,7 @@ typedef enum eObjectVisibilityCheck { OB_VISIBILITY_CHECK_UNKNOWN_RENDER_MODE, } eObjectVisibilityCheck; -bool BKE_object_is_visible(struct Object *ob, const eObjectVisibilityCheck mode); +bool BKE_object_is_visible(const struct Object *ob, const eObjectVisibilityCheck mode); void BKE_object_init(struct Object *ob); struct Object *BKE_object_add_only_object( diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h index d2d09609221..3782d26fc1b 100644 --- a/source/blender/blenkernel/BKE_paint.h +++ b/source/blender/blenkernel/BKE_paint.h @@ -104,6 +104,7 @@ void BKE_paint_reset_overlay_invalid(eOverlayControlFlags flag); void BKE_paint_set_overlay_override(enum eOverlayFlags flag); /* palettes */ +void BKE_palette_init(struct Palette *palette); void BKE_palette_free(struct Palette *palette); struct Palette *BKE_palette_add(struct Main *bmain, const char *name); void BKE_palette_copy_data( diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h index 3279839f8b5..aa00024b27b 100644 --- a/source/blender/blenkernel/BKE_particle.h +++ b/source/blender/blenkernel/BKE_particle.h @@ -67,7 +67,7 @@ struct ViewLayer; #define PARTICLE_COLLISION_MAX_COLLISIONS 10 -#define PARTICLE_P ParticleData * pa; int p +#define PARTICLE_P ParticleData *pa; int p #define LOOP_PARTICLES for (p = 0, pa = psys->particles; p < psys->totpart; p++, pa++) #define LOOP_EXISTING_PARTICLES for (p = 0, pa = psys->particles; p < psys->totpart; p++, pa++) if (!(pa->flag & PARS_UNEXIST)) #define LOOP_SHOWN_PARTICLES for (p = 0, pa = psys->particles; p < psys->totpart; p++, pa++) if (!(pa->flag & (PARS_UNEXIST | PARS_NO_DISP))) @@ -75,7 +75,7 @@ struct ViewLayer; #define LOOP_DYNAMIC_PARTICLES for (p = 0; p < psys->totpart; p++) if ((pa = psys->particles + p)->state.time > 0.0f) /* fast but sure way to get the modifier*/ -#define PARTICLE_PSMD ParticleSystemModifierData * psmd = sim->psmd ? sim->psmd : psys_get_modifier(sim->ob, sim->psys) +#define PARTICLE_PSMD ParticleSystemModifierData *psmd = sim->psmd ? sim->psmd : psys_get_modifier(sim->ob, sim->psys) /* common stuff that many particle functions need */ typedef struct ParticleSimulationData { @@ -304,7 +304,7 @@ void psys_set_current_num(Object *ob, int index); struct LatticeDeformData *psys_create_lattice_deform_data(struct ParticleSimulationData *sim); struct ParticleSystem *psys_orig_get(struct ParticleSystem *psys); -bool psys_in_edit_mode(struct Depsgraph *depsgraph, struct ParticleSystem *psys); +bool psys_in_edit_mode(struct Depsgraph *depsgraph, const struct ParticleSystem *psys); bool psys_check_enabled(struct Object *ob, struct ParticleSystem *psys, const bool use_render_params); bool psys_check_edited(struct ParticleSystem *psys); diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h index aaaaf620afa..58058d1e134 100644 --- a/source/blender/blenkernel/BKE_screen.h +++ b/source/blender/blenkernel/BKE_screen.h @@ -238,7 +238,7 @@ typedef void (*uiListDrawItemFunc)( /* Draw the filtering part of an uiList */ typedef void (*uiListDrawFilterFunc)( - struct uiList *ui_list, struct bContext *C, struct uiLayout *layout); + struct uiList *ui_list, struct bContext *C, struct uiLayout *layout, bool reverse); /* Filter items of an uiList */ typedef void (*uiListFilterItemsFunc)( diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index 452ca90ecf1..77c9df12428 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -82,7 +82,6 @@ set(SRC intern/blender_undo.c intern/blender_user_menu.c intern/blendfile.c - intern/bmfont.c intern/boids.c intern/bpath.c intern/brush.c @@ -110,6 +109,7 @@ set(SRC intern/editlattice.c intern/editmesh.c intern/editmesh_bvh.c + intern/editmesh_cache.c intern/editmesh_tangent.c intern/effect.c intern/fcurve.c @@ -236,8 +236,6 @@ set(SRC BKE_blender_user_menu.h BKE_blender_version.h BKE_blendfile.h - BKE_bmfont.h - BKE_bmfont_types.h BKE_boids.h BKE_bpath.h BKE_brush.h @@ -264,6 +262,7 @@ set(SRC BKE_editlattice.h BKE_editmesh.h BKE_editmesh_bvh.h + BKE_editmesh_cache.h BKE_editmesh_tangent.h BKE_effect.h BKE_fcurve.h diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 4c55591db31..5a99978f00c 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -60,6 +60,7 @@ #include "BKE_material.h" #include "BKE_modifier.h" #include "BKE_mesh.h" +#include "BKE_mesh_iterators.h" #include "BKE_mesh_mapping.h" #include "BKE_mesh_runtime.h" #include "BKE_mesh_tangent.h" @@ -463,12 +464,6 @@ void DM_ensure_normals(DerivedMesh *dm) BLI_assert((dm->dirty & DM_DIRTY_NORMALS) == 0); } -static void DM_calc_loop_normals(DerivedMesh *dm, const bool use_split_normals, float split_angle) -{ - dm->calcLoopNormals(dm, use_split_normals, split_angle); - dm->dirty |= DM_DIRTY_TESS_CDLAYERS; -} - /* note: until all modifiers can take MPoly's as input, * use this at the start of modifiers */ void DM_ensure_tessface(DerivedMesh *dm) @@ -1169,7 +1164,7 @@ static float (*get_editbmesh_orco_verts(BMEditMesh *em))[3] } /* orco custom data layer */ -static float (*get_orco_coords_dm(Object *ob, BMEditMesh *em, int layer, int *free))[3] +static float (*get_orco_coords(Object *ob, BMEditMesh *em, int layer, int *free))[3] { *free = 0; @@ -1200,29 +1195,6 @@ static float (*get_orco_coords_dm(Object *ob, BMEditMesh *em, int layer, int *fr return NULL; } -static DerivedMesh *create_orco_dm(Object *ob, Mesh *me, BMEditMesh *em, int layer) -{ - DerivedMesh *dm; - float (*orco)[3]; - int free; - - if (em) { - dm = CDDM_from_editbmesh(em, false, false); - } - else { - dm = CDDM_from_mesh(me); - } - - orco = get_orco_coords_dm(ob, em, layer, &free); - - if (orco) { - CDDM_apply_vert_coords(dm, orco); - if (free) MEM_freeN(orco); - } - - return dm; -} - static Mesh *create_orco_mesh(Object *ob, Mesh *me, BMEditMesh *em, int layer) { Mesh *mesh; @@ -1230,13 +1202,13 @@ static Mesh *create_orco_mesh(Object *ob, Mesh *me, BMEditMesh *em, int layer) int free; if (em) { - mesh = BKE_bmesh_to_mesh_nomain(em->bm, &(struct BMeshToMeshParams){0}); + mesh = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, 0); } else { mesh = BKE_mesh_copy_for_eval(me, true); } - orco = get_orco_coords_dm(ob, em, layer, &free); + orco = get_orco_coords(ob, em, layer, &free); if (orco) { BKE_mesh_apply_vert_coords(mesh, orco); @@ -1246,58 +1218,20 @@ static Mesh *create_orco_mesh(Object *ob, Mesh *me, BMEditMesh *em, int layer) return mesh; } -static void add_orco_dm( - Object *ob, BMEditMesh *em, DerivedMesh *dm, - DerivedMesh *orcodm, int layer) -{ - float (*orco)[3], (*layerorco)[3]; - int totvert, free; - - totvert = dm->getNumVerts(dm); - - if (orcodm) { - orco = MEM_calloc_arrayN(totvert, sizeof(float[3]), "dm orco"); - free = 1; - - if (orcodm->getNumVerts(orcodm) == totvert) - orcodm->getVertCos(orcodm, orco); - else - dm->getVertCos(dm, orco); - } - else { - /* TODO(sybren): totvert should potentially change here, as ob->data - * or em may have a different number of vertices than dm. */ - orco = get_orco_coords_dm(ob, em, layer, &free); - } - - if (orco) { - if (layer == CD_ORCO) - BKE_mesh_orco_verts_transform(ob->data, orco, totvert, 0); - - if (!(layerorco = DM_get_vert_data_layer(dm, layer))) { - DM_add_vert_layer(dm, layer, CD_CALLOC, NULL); - layerorco = DM_get_vert_data_layer(dm, layer); - } - - memcpy(layerorco, orco, sizeof(float) * 3 * totvert); - if (free) MEM_freeN(orco); - } -} - static void add_orco_mesh( Object *ob, BMEditMesh *em, Mesh *mesh, - Mesh *orco_mesh, int layer) + Mesh *me_orco, int layer) { float (*orco)[3], (*layerorco)[3]; int totvert, free; totvert = mesh->totvert; - if (orco_mesh) { + if (me_orco) { free = 1; - if (orco_mesh->totvert == totvert) { - orco = BKE_mesh_vertexCos_get(orco_mesh, NULL); + if (me_orco->totvert == totvert) { + orco = BKE_mesh_vertexCos_get(me_orco, NULL); } else { orco = BKE_mesh_vertexCos_get(mesh, NULL); @@ -1306,7 +1240,7 @@ static void add_orco_mesh( else { /* TODO(sybren): totvert should potentially change here, as ob->data * or em may have a different number of vertices than dm. */ - orco = get_orco_coords_dm(ob, em, layer, &free); + orco = get_orco_coords(ob, em, layer, &free); } if (orco) { @@ -1326,11 +1260,12 @@ static void add_orco_mesh( } } -static void DM_update_statvis_color(const Scene *scene, Object *ob, DerivedMesh *dm) +static void editmesh_update_statvis_color(const Scene *scene, Object *ob) { BMEditMesh *em = BKE_editmesh_from_object(ob); - - BKE_editmesh_statvis_calc(em, dm, &scene->toolsettings->statvis); + Mesh *me = ob->data; + BKE_mesh_runtime_ensure_edit_data(me); + BKE_editmesh_statvis_calc(em, me->runtime.edit_data, &scene->toolsettings->statvis); } static void shapekey_layers_to_keyblocks(DerivedMesh *dm, Mesh *me, int actshape_uid) @@ -1389,20 +1324,20 @@ static void shapekey_layers_to_keyblocks(DerivedMesh *dm, Mesh *me, int actshape } } -static void UNUSED_FUNCTION(add_shapekey_layers)(DerivedMesh *dm, Mesh *me, Object *UNUSED(ob)) +static void add_shapekey_layers(Mesh *me_dst, Mesh *me_src, Object *UNUSED(ob)) { KeyBlock *kb; - Key *key = me->key; + Key *key = me_src->key; int i; - if (!me->key) + if (!me_src->key) return; /* ensure we can use mesh vertex count for derived mesh custom data */ - if (me->totvert != dm->getNumVerts(dm)) { + if (me_src->totvert != me_dst->totvert) { fprintf(stderr, - "%s: vertex size mismatch (mesh/dm) '%s' (%d != %d)\n", - __func__, me->id.name + 2, me->totvert, dm->getNumVerts(dm)); + "%s: vertex size mismatch (mesh/eval) '%s' (%d != %d)\n", + __func__, me_src->id.name + 2, me_src->totvert, me_dst->totvert); return; } @@ -1410,67 +1345,21 @@ static void UNUSED_FUNCTION(add_shapekey_layers)(DerivedMesh *dm, Mesh *me, Obje int ci; float *array; - if (me->totvert != kb->totelem) { + if (me_src->totvert != kb->totelem) { fprintf(stderr, "%s: vertex size mismatch (Mesh '%s':%d != KeyBlock '%s':%d)\n", - __func__, me->id.name + 2, me->totvert, kb->name, kb->totelem); - array = MEM_calloc_arrayN((size_t)me->totvert, 3 * sizeof(float), __func__); + __func__, me_src->id.name + 2, me_src->totvert, kb->name, kb->totelem); + array = MEM_calloc_arrayN((size_t)me_src->totvert, sizeof(float[3]), __func__); } else { - array = MEM_malloc_arrayN((size_t)me->totvert, 3 * sizeof(float), __func__); - memcpy(array, kb->data, (size_t)me->totvert * 3 * sizeof(float)); + array = MEM_malloc_arrayN((size_t)me_src->totvert, sizeof(float[3]), __func__); + memcpy(array, kb->data, (size_t)me_src->totvert * sizeof(float[3])); } - CustomData_add_layer_named(&dm->vertData, CD_SHAPEKEY, CD_ASSIGN, array, dm->numVertData, kb->name); - ci = CustomData_get_layer_index_n(&dm->vertData, CD_SHAPEKEY, i); - - dm->vertData.layers[ci].uid = kb->uid; - } -} - -/** - * Called after calculating all modifiers. - * - * \note tessfaces should already be calculated. - */ -static void dm_ensure_display_normals(DerivedMesh *dm) -{ - /* Note: dm *may* have a poly CD_NORMAL layer (generated by a modifier needing poly normals e.g.). - * We do not use it here, though. And it should be tagged as temp! - */ - /* BLI_assert((CustomData_has_layer(&dm->polyData, CD_NORMAL) == false)); */ - - if ((dm->type == DM_TYPE_CDDM) && - ((dm->dirty & DM_DIRTY_NORMALS) || CustomData_has_layer(&dm->polyData, CD_NORMAL) == false)) - { - /* if normals are dirty we want to calculate vertex normals too */ - CDDM_calc_normals_mapping_ex(dm, (dm->dirty & DM_DIRTY_NORMALS) ? false : true); - } -} - -static void mesh_ensure_display_normals(Mesh *mesh) -{ - /* Note: mesh *may* have a poly CD_NORMAL layer (generated by a modifier needing poly normals e.g.). - * We do not use it here, though. And it should be tagged as temp! - */ - /* BLI_assert((CustomData_has_layer(&mesh->pdata, CD_NORMAL) == false)); */ - - if (mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL || !CustomData_has_layer(&mesh->pdata, CD_NORMAL)) { - float (*face_nors)[3] = NULL; - face_nors = MEM_malloc_arrayN(mesh->totpoly, sizeof(*face_nors), "face_nors"); - - /* if normals are dirty we want to calculate vertex normals too */ - bool only_face_normals = !(mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL); + CustomData_add_layer_named(&me_dst->vdata, CD_SHAPEKEY, CD_ASSIGN, array, me_dst->totvert, kb->name); + ci = CustomData_get_layer_index_n(&me_dst->vdata, CD_SHAPEKEY, i); - /* calculate face normals */ - BKE_mesh_calc_normals_poly( - mesh->mvert, NULL, mesh->totvert, mesh->mloop, mesh->mpoly, - mesh->totloop, mesh->totpoly, face_nors, - only_face_normals); - - CustomData_add_layer(&mesh->pdata, CD_NORMAL, CD_ASSIGN, face_nors, mesh->totpoly); - - mesh->runtime.cd_dirty_vert &= ~CD_MASK_NORMAL; + me_dst->vdata.layers[ci].uid = kb->uid; } } @@ -1480,15 +1369,14 @@ static void mesh_calc_modifiers( const bool need_mapping, CustomDataMask dataMask, const int index, const bool useCache, const bool build_shapekey_layers, /* return args */ - Mesh **r_deform_mesh, Mesh **r_final_mesh) + Mesh **r_deform, Mesh **r_final) { - Mesh *me = ob->data; ModifierData *firstmd, *md, *previewmd = NULL; CDMaskLink *datamasks, *curr; /* XXX Always copying POLYINDEX, else tessellated data are no more valid! */ CustomDataMask mask, nextmask, previewmask = 0, append_mask = CD_MASK_ORIGINDEX; float (*deformedVerts)[3] = NULL; - int numVerts = me->totvert; + int numVerts = ((Mesh *)ob->data)->totvert; const bool useRenderParams = (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER); const int required_mode = useRenderParams ? eModifierMode_Render : eModifierMode_Realtime; bool isPrevDeform = false; @@ -1500,14 +1388,14 @@ static void mesh_calc_modifiers( /* Generic preview only in object mode! */ const bool do_mod_mcol = (ob->mode == OB_MODE_OBJECT); - const bool do_loop_normals = (me->flag & ME_AUTOSMOOTH) != 0; + const bool do_loop_normals = (((Mesh *)ob->data)->flag & ME_AUTOSMOOTH) != 0; VirtualModifierData virtualModifierData; ModifierApplyFlag app_flags = useRenderParams ? MOD_APPLY_RENDER : 0; ModifierApplyFlag deform_app_flags = app_flags; - BLI_assert((me->id.tag & LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT) == 0); + BLI_assert((((Mesh *)ob->data)->id.tag & LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT) == 0); if (useCache) app_flags |= MOD_APPLY_USECACHE; @@ -1535,10 +1423,10 @@ static void mesh_calc_modifiers( datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode, previewmd, previewmask); curr = datamasks; - if (r_deform_mesh) { - *r_deform_mesh = NULL; + if (r_deform) { + *r_deform = NULL; } - *r_final_mesh = NULL; + *r_final = NULL; if (useDeform) { if (inputVertexCos) @@ -1558,9 +1446,9 @@ static void mesh_calc_modifiers( if (mti->type == eModifierTypeType_OnlyDeform && !sculpt_dyntopo) { if (!deformedVerts) - deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts); + deformedVerts = BKE_mesh_vertexCos_get(ob->data, &numVerts); - modifier_deformVerts_ensure_normals(md, &mectx_deform, NULL, deformedVerts, numVerts); + modwrap_deformVerts(md, &mectx_deform, NULL, deformedVerts, numVerts); } else { break; @@ -1575,17 +1463,17 @@ static void mesh_calc_modifiers( * places that wish to use the original mesh but with deformed * coordinates (vpaint, etc.) */ - if (r_deform_mesh) { - *r_deform_mesh = BKE_mesh_copy_for_eval(me, true); + if (r_deform) { + *r_deform = BKE_mesh_copy_for_eval(ob->data, true); /* XXX: Is build_shapekey_layers ever even true? This should have crashed long ago... */ BLI_assert(!build_shapekey_layers); - UNUSED_VARS_NDEBUG(build_shapekey_layers); - //if (build_shapekey_layers) - // add_shapekey_layers(*r_deform_mesh, me, ob); + if (build_shapekey_layers) { + add_shapekey_layers(*r_deform, ob->data, ob); + } if (deformedVerts) { - BKE_mesh_apply_vert_coords(*r_deform_mesh, deformedVerts); + BKE_mesh_apply_vert_coords(*r_deform, deformedVerts); } } } @@ -1594,16 +1482,16 @@ static void mesh_calc_modifiers( if (inputVertexCos) deformedVerts = inputVertexCos; else - deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts); + deformedVerts = BKE_mesh_vertexCos_get(ob->data, &numVerts); } /* Now apply all remaining modifiers. If useDeform is off then skip * OnlyDeform ones. */ - Mesh *mesh = NULL; - Mesh *orco_mesh = NULL; - Mesh *cloth_orco_mesh = NULL; + Mesh *me = NULL; + Mesh *me_orco = NULL; + Mesh *me_orco_cloth = NULL; for (; md; md = md->next, curr = curr->next) { const ModifierTypeInfo *mti = modifierType_getInfo(md->type); @@ -1616,7 +1504,7 @@ static void mesh_calc_modifiers( continue; } - if ((mti->flags & eModifierTypeFlag_RequiresOriginalData) && mesh) { + if ((mti->flags & eModifierTypeFlag_RequiresOriginalData) && me) { modifier_setError(md, "Modifier requires original data, bad stack position"); continue; } @@ -1667,8 +1555,8 @@ static void mesh_calc_modifiers( else mask = 0; - if (mesh && (mask & CD_MASK_ORCO)) { - add_orco_mesh(ob, NULL, mesh, orco_mesh, CD_ORCO); + if (me && (mask & CD_MASK_ORCO)) { + add_orco_mesh(ob, NULL, me, me_orco, CD_ORCO); } /* How to apply modifier depends on (a) what we already have as @@ -1679,15 +1567,15 @@ static void mesh_calc_modifiers( if (mti->type == eModifierTypeType_OnlyDeform) { /* No existing verts to deform, need to build them. */ if (!deformedVerts) { - if (mesh) { + if (me) { /* Deforming a mesh, read the vertex locations * out of the mesh and deform them. Once done with this * run of deformers verts will be written back. */ - deformedVerts = BKE_mesh_vertexCos_get(mesh, &numVerts); + deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts); } else { - deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts); + deformedVerts = BKE_mesh_vertexCos_get(ob->data, &numVerts); } } @@ -1695,12 +1583,12 @@ static void mesh_calc_modifiers( * to avoid giving bogus normals to the next modifier see: [#23673] */ if (isPrevDeform && mti->dependsOnNormals && mti->dependsOnNormals(md)) { /* XXX, this covers bug #23673, but we may need normal calc for other types */ - if (mesh) { - BKE_mesh_apply_vert_coords(mesh, deformedVerts); + if (me) { + BKE_mesh_apply_vert_coords(me, deformedVerts); } } - modifier_deformVerts_ensure_normals(md, &mectx_deform, mesh, deformedVerts, numVerts); + modwrap_deformVerts(md, &mectx_deform, me, deformedVerts, numVerts); } else { /* determine which data layers are needed by following modifiers */ @@ -1710,21 +1598,21 @@ static void mesh_calc_modifiers( nextmask = dataMask; /* apply vertex coordinates or build a Mesh as necessary */ - if (mesh) { + if (me) { if (deformedVerts) { - BKE_mesh_apply_vert_coords(mesh, deformedVerts); + BKE_mesh_apply_vert_coords(me, deformedVerts); } } else { - mesh = BKE_mesh_copy_for_eval(me, true); - ASSERT_IS_VALID_MESH(mesh); + me = BKE_mesh_copy_for_eval(ob->data, true); + ASSERT_IS_VALID_MESH(me); - // XXX: port to Mesh if build_shapekey_layers can ever be true - //if (build_shapekey_layers) - // add_shapekey_layers(mesh, me, ob); + if (build_shapekey_layers) { + add_shapekey_layers(me, ob->data, ob); + } if (deformedVerts) { - BKE_mesh_apply_vert_coords(mesh, deformedVerts); + BKE_mesh_apply_vert_coords(me, deformedVerts); } /* Constructive modifiers need to have an origindex @@ -1736,14 +1624,14 @@ static void mesh_calc_modifiers( */ if (need_mapping || (nextmask & CD_MASK_ORIGINDEX)) { /* calc */ - CustomData_add_layer(&mesh->vdata, CD_ORIGINDEX, CD_CALLOC, NULL, mesh->totvert); - CustomData_add_layer(&mesh->edata, CD_ORIGINDEX, CD_CALLOC, NULL, mesh->totedge); - CustomData_add_layer(&mesh->pdata, CD_ORIGINDEX, CD_CALLOC, NULL, mesh->totpoly); + CustomData_add_layer(&me->vdata, CD_ORIGINDEX, CD_CALLOC, NULL, me->totvert); + CustomData_add_layer(&me->edata, CD_ORIGINDEX, CD_CALLOC, NULL, me->totedge); + CustomData_add_layer(&me->pdata, CD_ORIGINDEX, CD_CALLOC, NULL, me->totpoly); /* Not worth parallelizing this, gives less than 0.1% overall speedup in best of best cases... */ - range_vn_i(CustomData_get_layer(&mesh->vdata, CD_ORIGINDEX), mesh->totvert, 0); - range_vn_i(CustomData_get_layer(&mesh->edata, CD_ORIGINDEX), mesh->totedge, 0); - range_vn_i(CustomData_get_layer(&mesh->pdata, CD_ORIGINDEX), mesh->totpoly, 0); + range_vn_i(CustomData_get_layer(&me->vdata, CD_ORIGINDEX), me->totvert, 0); + range_vn_i(CustomData_get_layer(&me->edata, CD_ORIGINDEX), me->totedge, 0); + range_vn_i(CustomData_get_layer(&me->pdata, CD_ORIGINDEX), me->totpoly, 0); } } @@ -1753,85 +1641,84 @@ static void mesh_calc_modifiers( /* needMapping check here fixes bug [#28112], otherwise it's * possible that it won't be copied */ mask |= append_mask; - mesh_set_only_copy(mesh, mask | (need_mapping ? CD_MASK_ORIGINDEX : 0)); + mesh_set_only_copy(me, mask | (need_mapping ? CD_MASK_ORIGINDEX : 0)); /* add cloth rest shape key if needed */ if (mask & CD_MASK_CLOTH_ORCO) - add_orco_mesh(ob, NULL, mesh, orco_mesh, CD_CLOTH_ORCO); + add_orco_mesh(ob, NULL, me, me_orco, CD_CLOTH_ORCO); /* add an origspace layer if needed */ if ((curr->mask) & CD_MASK_ORIGSPACE_MLOOP) { - if (!CustomData_has_layer(&mesh->ldata, CD_ORIGSPACE_MLOOP)) { - CustomData_add_layer(&mesh->ldata, CD_ORIGSPACE_MLOOP, CD_CALLOC, NULL, mesh->totloop); - mesh_init_origspace(mesh); + if (!CustomData_has_layer(&me->ldata, CD_ORIGSPACE_MLOOP)) { + CustomData_add_layer(&me->ldata, CD_ORIGSPACE_MLOOP, CD_CALLOC, NULL, me->totloop); + mesh_init_origspace(me); } } - Mesh *new_mesh = modifier_applyModifier_ensure_normals(md, &mectx_apply, mesh); - ASSERT_IS_VALID_MESH(new_mesh); + Mesh *me_next = modwrap_applyModifier(md, &mectx_apply, me); + ASSERT_IS_VALID_MESH(me_next); - if (new_mesh) { + if (me_next) { /* if the modifier returned a new mesh, release the old one */ - if (mesh && mesh != new_mesh) { - BLI_assert(mesh != me); - BKE_id_free(NULL, mesh); + if (me && me != me_next) { + BLI_assert(me != ob->data); + BKE_id_free(NULL, me); } - - mesh = new_mesh; + me = me_next; if (deformedVerts) { - if (deformedVerts != inputVertexCos) + if (deformedVerts != inputVertexCos) { MEM_freeN(deformedVerts); - + } deformedVerts = NULL; } } /* create an orco mesh in parallel */ if (nextmask & CD_MASK_ORCO) { - if (!orco_mesh) { - orco_mesh = create_orco_mesh(ob, me, NULL, CD_ORCO); + if (!me_orco) { + me_orco = create_orco_mesh(ob, ob->data, NULL, CD_ORCO); } nextmask &= ~CD_MASK_ORCO; - mesh_set_only_copy(orco_mesh, nextmask | CD_MASK_ORIGINDEX | + mesh_set_only_copy(me_orco, nextmask | CD_MASK_ORIGINDEX | (mti->requiredDataMask ? mti->requiredDataMask(ob, md) : 0)); - new_mesh = modifier_applyModifier_ensure_normals(md, &mectx_orco, orco_mesh); - ASSERT_IS_VALID_MESH(new_mesh); + me_next = modwrap_applyModifier(md, &mectx_orco, me_orco); + ASSERT_IS_VALID_MESH(me_next); - if (new_mesh) { + if (me_next) { /* if the modifier returned a new mesh, release the old one */ - if (orco_mesh && orco_mesh != new_mesh) { - BLI_assert(orco_mesh != me); - BKE_id_free(NULL, orco_mesh); + if (me_orco && me_orco != me_next) { + BLI_assert(me_orco != ob->data); + BKE_id_free(NULL, me_orco); } - orco_mesh = new_mesh; + me_orco = me_next; } } /* create cloth orco mesh in parallel */ if (nextmask & CD_MASK_CLOTH_ORCO) { - if (!cloth_orco_mesh) { - cloth_orco_mesh = create_orco_mesh(ob, me, NULL, CD_CLOTH_ORCO); + if (!me_orco_cloth) { + me_orco_cloth = create_orco_mesh(ob, ob->data, NULL, CD_CLOTH_ORCO); } nextmask &= ~CD_MASK_CLOTH_ORCO; - mesh_set_only_copy(cloth_orco_mesh, nextmask | CD_MASK_ORIGINDEX); + mesh_set_only_copy(me_orco_cloth, nextmask | CD_MASK_ORIGINDEX); - new_mesh = modifier_applyModifier_ensure_normals(md, &mectx_orco, cloth_orco_mesh); - ASSERT_IS_VALID_DM(new_mesh); + me_next = modwrap_applyModifier(md, &mectx_orco, me_orco_cloth); + ASSERT_IS_VALID_DM(me_next); - if (new_mesh) { + if (me_next) { /* if the modifier returned a new mesh, release the old one */ - if (cloth_orco_mesh && cloth_orco_mesh != new_mesh) { - BLI_assert(orco_mesh != me); - BKE_id_free(NULL, cloth_orco_mesh); + if (me_orco_cloth && me_orco_cloth != me_next) { + BLI_assert(me_orco != ob->data); + BKE_id_free(NULL, me_orco_cloth); } - cloth_orco_mesh = new_mesh; + me_orco_cloth = me_next; } } @@ -1840,7 +1727,7 @@ static void mesh_calc_modifiers( if (md->type == eModifierType_DynamicPaint) append_mask |= CD_MASK_PREVIEW_MLOOPCOL; - mesh->runtime.deformed_only = false; + me->runtime.deformed_only = false; } isPrevDeform = (mti->type == eModifierTypeType_OnlyDeform); @@ -1861,45 +1748,43 @@ static void mesh_calc_modifiers( * need to apply these back onto the Mesh. If we have no * Mesh then we need to build one. */ - Mesh *final_mesh; - - if (mesh) { - final_mesh = mesh; + if (me) { + *r_final = me; if (deformedVerts) { - BKE_mesh_apply_vert_coords(final_mesh, deformedVerts); + BKE_mesh_apply_vert_coords(*r_final, deformedVerts); } } else { - final_mesh = BKE_mesh_copy_for_eval(me, true); + *r_final = BKE_mesh_copy_for_eval(ob->data, true); - //if (build_shapekey_layers) { - // add_shapekey_layers(final_mesh, me, ob); - //} + if (build_shapekey_layers) { + add_shapekey_layers(*r_final, ob->data, ob); + } if (deformedVerts) { - BKE_mesh_apply_vert_coords(final_mesh, deformedVerts); + BKE_mesh_apply_vert_coords(*r_final, deformedVerts); } } /* add an orco layer if needed */ if (dataMask & CD_MASK_ORCO) { - add_orco_mesh(ob, NULL, final_mesh, orco_mesh, CD_ORCO); + add_orco_mesh(ob, NULL, *r_final, me_orco, CD_ORCO); - if (r_deform_mesh && *r_deform_mesh) - add_orco_mesh(ob, NULL, *r_deform_mesh, NULL, CD_ORCO); + if (r_deform && *r_deform) + add_orco_mesh(ob, NULL, *r_deform, NULL, CD_ORCO); } if (do_loop_normals) { /* Compute loop normals (note: will compute poly and vert normals as well, if needed!) */ - BKE_mesh_calc_normals_split(final_mesh); - BKE_mesh_tessface_clear(final_mesh); + BKE_mesh_calc_normals_split(*r_final); + BKE_mesh_tessface_clear(*r_final); } if (sculpt_dyntopo == false) { /* watch this! after 2.75a we move to from tessface to looptri (by default) */ if (dataMask & CD_MASK_MFACE) { - BKE_mesh_tessface_ensure(final_mesh); + BKE_mesh_tessface_ensure(*r_final); } /* without this, drawing ngon tri's faces will show ugly tessellated face @@ -1912,23 +1797,21 @@ static void mesh_calc_modifiers( * If using loop normals, poly nors have already been computed. */ if (!do_loop_normals) { - mesh_ensure_display_normals(final_mesh); + BKE_mesh_ensure_normals_for_display(*r_final); } } /* Some modifiers, like datatransfer, may generate those data as temp layer, we do not want to keep them, * as they are used by display code when available (i.e. even if autosmooth is disabled). */ - if (!do_loop_normals && CustomData_has_layer(&final_mesh->ldata, CD_NORMAL)) { - CustomData_free_layers(&final_mesh->ldata, CD_NORMAL, final_mesh->totloop); + if (!do_loop_normals && CustomData_has_layer(&(*r_final)->ldata, CD_NORMAL)) { + CustomData_free_layers(&(*r_final)->ldata, CD_NORMAL, (*r_final)->totloop); } - *r_final_mesh = final_mesh; - - if (orco_mesh) { - BKE_id_free(NULL, orco_mesh); + if (me_orco) { + BKE_id_free(NULL, me_orco); } - if (cloth_orco_mesh) { - BKE_id_free(NULL, cloth_orco_mesh); + if (me_orco_cloth) { + BKE_id_free(NULL, me_orco_cloth); } if (deformedVerts && deformedVerts != inputVertexCos) @@ -1979,7 +1862,7 @@ float (*editbmesh_get_vertex_cos(BMEditMesh *em, int *r_numVerts))[3] return cos; } -bool editbmesh_modifier_is_enabled(Scene *scene, ModifierData *md, DerivedMesh *dm) +bool editbmesh_modifier_is_enabled(Scene *scene, ModifierData *md, bool has_prev_mesh) { const ModifierTypeInfo *mti = modifierType_getInfo(md->type); const int required_mode = eModifierMode_Realtime | eModifierMode_Editmode; @@ -1988,7 +1871,7 @@ bool editbmesh_modifier_is_enabled(Scene *scene, ModifierData *md, DerivedMesh * return false; } - if ((mti->flags & eModifierTypeFlag_RequiresOriginalData) && dm) { + if ((mti->flags & eModifierTypeFlag_RequiresOriginalData) && has_prev_mesh) { modifier_setError(md, "Modifier requires original data, bad stack position"); return false; } @@ -2000,17 +1883,15 @@ static void editbmesh_calc_modifiers( struct Depsgraph *depsgraph, Scene *scene, Object *ob, BMEditMesh *em, CustomDataMask dataMask, /* return args */ - DerivedMesh **r_cage, DerivedMesh **r_final) + Mesh **r_cage, Mesh **r_final) { ModifierData *md; float (*deformedVerts)[3] = NULL; CustomDataMask mask = 0, append_mask = 0; - DerivedMesh *dm = NULL, *orcodm = NULL; int i, numVerts = 0, cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1); CDMaskLink *datamasks, *curr; const int required_mode = eModifierMode_Realtime | eModifierMode_Editmode; - - const bool do_init_statvis = false; + const bool do_init_statvis = false; /* FIXME: use V3D_OVERLAY_EDIT_STATVIS. */ VirtualModifierData virtualModifierData; /* TODO(sybren): do we really need multiple objects, or shall we change the flags where needed? */ @@ -2019,12 +1900,11 @@ static void editbmesh_calc_modifiers( const ModifierEvalContext mectx_cache = {depsgraph, ob, MOD_APPLY_USECACHE}; const bool do_loop_normals = (((Mesh *)(ob->data))->flag & ME_AUTOSMOOTH) != 0; - const float loop_normals_split_angle = ((Mesh *)(ob->data))->smoothresh; modifiers_clearErrors(ob); if (r_cage && cageIndex == -1) { - *r_cage = getEditDerivedBMesh(em, ob, dataMask, NULL); + *r_cage = BKE_mesh_from_editmesh_with_coords_thin_wrap(em, dataMask, NULL); } md = modifiers_getVirtualModifierList(ob, &virtualModifierData); @@ -2033,18 +1913,23 @@ static void editbmesh_calc_modifiers( datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode, NULL, 0); curr = datamasks; + + Mesh *me = NULL; + Mesh *me_orco = NULL; + for (i = 0; md; i++, md = md->next, curr = curr->next) { const ModifierTypeInfo *mti = modifierType_getInfo(md->type); - if (!editbmesh_modifier_is_enabled(scene, md, dm)) { + if (!editbmesh_modifier_is_enabled(scene, md, me != NULL)) { continue; } /* add an orco layer if needed by this modifier */ - if (dm && mti->requiredDataMask) { + if (me && mti->requiredDataMask) { mask = mti->requiredDataMask(ob, md); - if (mask & CD_MASK_ORCO) - add_orco_dm(ob, em, dm, orcodm, CD_ORCO); + if (mask & CD_MASK_ORCO) { + add_orco_mesh(ob, em, me, me_orco, CD_ORCO); + } } /* How to apply modifier depends on (a) what we already have as @@ -2055,15 +1940,12 @@ static void editbmesh_calc_modifiers( if (mti->type == eModifierTypeType_OnlyDeform) { /* No existing verts to deform, need to build them. */ if (!deformedVerts) { - if (dm) { + if (me) { /* Deforming a derived mesh, read the vertex locations * out of the mesh and deform them. Once done with this * run of deformers verts will be written back. */ - numVerts = dm->getNumVerts(dm); - deformedVerts = - MEM_malloc_arrayN(numVerts, sizeof(*deformedVerts), "dfmv"); - dm->getVertCos(dm, deformedVerts); + deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts); } else { deformedVerts = editbmesh_get_vertex_cos(em, &numVerts); @@ -2071,60 +1953,63 @@ static void editbmesh_calc_modifiers( } if (mti->deformVertsEM) - modwrap_deformVertsEM(md, &mectx, em, dm, deformedVerts, numVerts); + modwrap_deformVertsEM(md, &mectx, em, me, deformedVerts, numVerts); else - modwrap_deformVerts(md, &mectx, dm, deformedVerts, numVerts); + modwrap_deformVerts(md, &mectx, me, deformedVerts, numVerts); } else { - DerivedMesh *ndm; + Mesh *me_next; /* apply vertex coordinates or build a DerivedMesh as necessary */ - if (dm) { + if (me) { if (deformedVerts) { - DerivedMesh *tdm = CDDM_copy(dm); - if (!(r_cage && dm == *r_cage)) { - dm->release(dm); - } - dm = tdm; + Mesh *me_temp = BKE_mesh_copy_for_eval(me, false); - CDDM_apply_vert_coords(dm, deformedVerts); + if (!(r_cage && me == *r_cage)) { + BKE_id_free(NULL, me); + } + me = me_temp; + BKE_mesh_apply_vert_coords(me, deformedVerts); } - else if (r_cage && dm == *r_cage) { - /* dm may be changed by this modifier, so we need to copy it */ - dm = CDDM_copy(dm); + else if (r_cage && me == *r_cage) { + /* 'me' may be changed by this modifier, so we need to copy it. */ + me = BKE_mesh_copy_for_eval(me, false); } } else { - dm = CDDM_from_editbmesh(em, false, false); - ASSERT_IS_VALID_DM(dm); + me = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, 0); + ASSERT_IS_VALID_MESH(me); if (deformedVerts) { - CDDM_apply_vert_coords(dm, deformedVerts); + BKE_mesh_apply_vert_coords(me, deformedVerts); } } /* create an orco derivedmesh in parallel */ mask = curr->mask; if (mask & CD_MASK_ORCO) { - if (!orcodm) - orcodm = create_orco_dm(ob, ob->data, em, CD_ORCO); + if (!me_orco) { + me_orco = create_orco_mesh(ob, ob->data, em, CD_ORCO); + } mask &= ~CD_MASK_ORCO; - DM_set_only_copy(orcodm, mask | CD_MASK_ORIGINDEX); + mesh_set_only_copy(me_orco, mask | CD_MASK_ORIGINDEX); if (mti->applyModifierEM) { - ndm = modwrap_applyModifierEM(md, &mectx_orco, em, orcodm); + me_next = modwrap_applyModifierEM(md, &mectx_orco, em, me_orco); } else { - ndm = modwrap_applyModifier(md, &mectx_orco, orcodm); + me_next = modwrap_applyModifier(md, &mectx_orco, me_orco); } - ASSERT_IS_VALID_DM(ndm); + ASSERT_IS_VALID_MESH(me_next); - if (ndm) { + if (me_next) { /* if the modifier returned a new dm, release the old one */ - if (orcodm && orcodm != ndm) orcodm->release(orcodm); - orcodm = ndm; + if (me_orco && me_orco != me_next) { + BKE_id_free(NULL, me_orco); + } + me_orco = me_next; } } @@ -2132,52 +2017,53 @@ static void editbmesh_calc_modifiers( mask |= append_mask; mask = curr->mask; /* CD_MASK_ORCO may have been cleared above */ - DM_set_only_copy(dm, mask | CD_MASK_ORIGINDEX); + mesh_set_only_copy(me, mask | CD_MASK_ORIGINDEX); if (mask & CD_MASK_ORIGSPACE_MLOOP) { - if (!CustomData_has_layer(&dm->loopData, CD_ORIGSPACE_MLOOP)) { - DM_add_loop_layer(dm, CD_ORIGSPACE_MLOOP, CD_CALLOC, NULL); - DM_init_origspace(dm); + if (!CustomData_has_layer(&me->ldata, CD_ORIGSPACE_MLOOP)) { + CustomData_add_layer(&me->ldata, CD_ORIGSPACE_MLOOP, CD_CALLOC, NULL, me->totloop); + mesh_init_origspace(me); } } - if (mti->applyModifierEM) - ndm = modwrap_applyModifierEM(md, &mectx_cache, em, dm); - else - ndm = modwrap_applyModifier(md, &mectx_cache, dm); - ASSERT_IS_VALID_DM(ndm); - - if (ndm) { - if (dm && dm != ndm) - dm->release(dm); + if (mti->applyModifierEM) { + me_next = modwrap_applyModifierEM(md, &mectx_cache, em, me); + } + else { + me_next = modwrap_applyModifier(md, &mectx_cache, me); + } + ASSERT_IS_VALID_MESH(me_next); - dm = ndm; + if (me_next) { + if (me && me != me_next) { + BKE_id_free(NULL, me); + } + me = me_next; if (deformedVerts) { MEM_freeN(deformedVerts); deformedVerts = NULL; } } - - dm->deformedOnly = false; + me->runtime.deformed_only = false; } if (r_cage && i == cageIndex) { - if (dm && deformedVerts) { - *r_cage = CDDM_copy(dm); - CDDM_apply_vert_coords(*r_cage, deformedVerts); + if (me && deformedVerts) { + *r_cage = BKE_mesh_copy_for_eval(me, false); + BKE_mesh_apply_vert_coords(*r_cage, deformedVerts); } - else if (dm) { - *r_cage = dm; + else if (me) { + *r_cage = me; } else { - struct Mesh *mesh = ob->data; - if (mesh->id.tag & LIB_TAG_COPIED_ON_WRITE) { - BKE_mesh_runtime_ensure_edit_data(mesh); - mesh->runtime.edit_data->vertexCos = MEM_dupallocN(deformedVerts); + Mesh *me_orig = ob->data; + if (me_orig->id.tag & LIB_TAG_COPIED_ON_WRITE) { + BKE_mesh_runtime_ensure_edit_data(me_orig); + me_orig->runtime.edit_data->vertexCos = MEM_dupallocN(deformedVerts); } - *r_cage = getEditDerivedBMesh( - em, ob, mask, + *r_cage = BKE_mesh_from_editmesh_with_coords_thin_wrap( + em, mask, deformedVerts ? MEM_dupallocN(deformedVerts) : NULL); } } @@ -2189,48 +2075,44 @@ static void editbmesh_calc_modifiers( * to apply these back onto the DerivedMesh. If we have no DerivedMesh * then we need to build one. */ - if (dm && deformedVerts) { - *r_final = CDDM_copy(dm); + if (me && deformedVerts) { + *r_final = BKE_mesh_copy_for_eval(me, false); - if (!(r_cage && dm == *r_cage)) { - dm->release(dm); + if (!(r_cage && me == *r_cage)) { + BKE_id_free(NULL, me); } - - CDDM_apply_vert_coords(*r_final, deformedVerts); + BKE_mesh_apply_vert_coords(*r_final, deformedVerts); } - else if (dm) { - *r_final = dm; + else if (me) { + *r_final = me; } else if (!deformedVerts && r_cage && *r_cage) { /* cage should already have up to date normals */ *r_final = *r_cage; /* In this case, we should never have weight-modifying modifiers in stack... */ - if (do_init_statvis) - DM_update_statvis_color(scene, ob, *r_final); + if (do_init_statvis) { + editmesh_update_statvis_color(scene, ob); + } } else { /* this is just a copy of the editmesh, no need to calc normals */ - struct Mesh *mesh = ob->data; - if (mesh->id.tag & LIB_TAG_COPIED_ON_WRITE) { - BKE_mesh_runtime_ensure_edit_data(mesh); - if (mesh->runtime.edit_data->vertexCos != NULL) - MEM_freeN((void *)mesh->runtime.edit_data->vertexCos); - mesh->runtime.edit_data->vertexCos = MEM_dupallocN(deformedVerts); - } - *r_final = getEditDerivedBMesh(em, ob, dataMask, deformedVerts); + *r_final = BKE_mesh_from_editmesh_with_coords_thin_wrap(em, dataMask, deformedVerts); deformedVerts = NULL; /* In this case, we should never have weight-modifying modifiers in stack... */ - if (do_init_statvis) - DM_update_statvis_color(scene, ob, *r_final); + if (do_init_statvis) { + editmesh_update_statvis_color(scene, ob); + } } if (do_loop_normals) { /* Compute loop normals */ - DM_calc_loop_normals(*r_final, do_loop_normals, loop_normals_split_angle); + BKE_mesh_calc_normals_split(*r_final); + BKE_mesh_tessface_clear(*r_final); if (r_cage && *r_cage && (*r_cage != *r_final)) { - DM_calc_loop_normals(*r_cage, do_loop_normals, loop_normals_split_angle); + BKE_mesh_calc_normals_split(*r_cage); + BKE_mesh_tessface_clear(*r_cage); } } @@ -2239,13 +2121,13 @@ static void editbmesh_calc_modifiers( * check if the derived meshes are DM_TYPE_EDITBMESH before calling, this isn't essential * but quiets annoying error messages since tessfaces wont be created. */ if (dataMask & CD_MASK_MFACE) { - if ((*r_final)->type != DM_TYPE_EDITBMESH) { - DM_ensure_tessface(*r_final); + if ((*r_final)->edit_btmesh == NULL) { + BKE_mesh_tessface_ensure(*r_final); } if (r_cage && *r_cage) { - if ((*r_cage)->type != DM_TYPE_EDITBMESH) { + if ((*r_cage)->edit_btmesh == NULL) { if (*r_cage != *r_final) { - DM_ensure_tessface(*r_cage); + BKE_mesh_tessface_ensure(*r_cage); } } } @@ -2254,27 +2136,29 @@ static void editbmesh_calc_modifiers( /* same as mesh_calc_modifiers (if using loop normals, poly nors have already been computed). */ if (!do_loop_normals) { - dm_ensure_display_normals(*r_final); + BKE_mesh_ensure_normals_for_display(*r_final); /* Some modifiers, like datatransfer, may generate those data, we do not want to keep them, * as they are used by display code when available (i.e. even if autosmooth is disabled). */ - if (CustomData_has_layer(&(*r_final)->loopData, CD_NORMAL)) { - CustomData_free_layers(&(*r_final)->loopData, CD_NORMAL, (*r_final)->numLoopData); + if (CustomData_has_layer(&(*r_final)->ldata, CD_NORMAL)) { + CustomData_free_layers(&(*r_final)->ldata, CD_NORMAL, (*r_final)->totloop); } - if (r_cage && CustomData_has_layer(&(*r_cage)->loopData, CD_NORMAL)) { - CustomData_free_layers(&(*r_cage)->loopData, CD_NORMAL, (*r_cage)->numLoopData); + if (r_cage && CustomData_has_layer(&(*r_cage)->ldata, CD_NORMAL)) { + CustomData_free_layers(&(*r_cage)->ldata, CD_NORMAL, (*r_cage)->totloop); } } /* add an orco layer if needed */ if (dataMask & CD_MASK_ORCO) - add_orco_dm(ob, em, *r_final, orcodm, CD_ORCO); + add_orco_mesh(ob, em, *r_final, me_orco, CD_ORCO); - if (orcodm) - orcodm->release(orcodm); + if (me_orco) { + BKE_id_free(NULL, me_orco); + } - if (deformedVerts) + if (deformedVerts) { MEM_freeN(deformedVerts); + } } static void mesh_finalize_eval(Object *object) @@ -2368,17 +2252,23 @@ static void editbmesh_build_data( BKE_editmesh_free_derivedmesh(em); + Mesh *me_cage; + Mesh *me_final; + editbmesh_calc_modifiers( depsgraph, scene, obedit, em, dataMask, - &em->derivedCage, &em->derivedFinal); + &me_cage, &me_final); + em->mesh_eval_final = me_final; + em->mesh_eval_cage = me_cage; + +#if 0 DM_set_object_boundbox(obedit, em->derivedFinal); +#endif em->lastDataMask = dataMask; - em->derivedFinal->needsFree = 0; - em->derivedCage->needsFree = 0; - BLI_assert(!(em->derivedFinal->dirty & DM_DIRTY_NORMALS)); + BLI_assert(!(em->mesh_eval_final->runtime.cd_dirty_vert & DM_DIRTY_NORMALS)); } static CustomDataMask object_get_datamask(const Depsgraph *depsgraph, Object *ob, bool *r_need_mapping) @@ -2409,6 +2299,10 @@ static CustomDataMask object_get_datamask(const Depsgraph *depsgraph, Object *ob mask |= CD_MASK_MLOOPCOL; } + if (ob->mode & OB_MODE_WEIGHT_PAINT) { + mask |= CD_MASK_MDEFORMVERT; + } + if (ob->mode & OB_MODE_EDIT) mask |= CD_MASK_MVERT_SKIN; } @@ -2516,6 +2410,8 @@ Mesh *mesh_get_eval_deform(struct Depsgraph *depsgraph, Scene *scene, Object *ob } +#ifdef USE_DERIVEDMESH +/* Deprecated, use `mesh_create_eval_final_render` instead. */ DerivedMesh *mesh_create_derived_render(struct Depsgraph *depsgraph, Scene *scene, Object *ob, CustomDataMask dataMask) { DerivedMesh *final; @@ -2526,6 +2422,17 @@ DerivedMesh *mesh_create_derived_render(struct Depsgraph *depsgraph, Scene *scen return final; } +#endif +Mesh *mesh_create_eval_final_render(struct Depsgraph *depsgraph, Scene *scene, Object *ob, CustomDataMask dataMask) +{ + Mesh *final; + + mesh_calc_modifiers( + depsgraph, scene, ob, NULL, 1, false, dataMask, -1, false, false, + NULL, &final); + + return final; +} #ifdef USE_DERIVEDMESH /* Deprecated, use `mesh_create_eval_final_index_render` instead. */ @@ -2540,7 +2447,7 @@ DerivedMesh *mesh_create_derived_index_render(struct Depsgraph *depsgraph, Scene return final; } #endif -struct Mesh *mesh_create_eval_final_index_render( +Mesh *mesh_create_eval_final_index_render( struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, CustomDataMask dataMask, int index) { @@ -2613,29 +2520,29 @@ DerivedMesh *mesh_create_derived_no_deform( /***/ -DerivedMesh *editbmesh_get_derived_cage_and_final( +Mesh *editbmesh_get_eval_cage_and_final( struct Depsgraph *depsgraph, Scene *scene, Object *obedit, BMEditMesh *em, CustomDataMask dataMask, /* return args */ - DerivedMesh **r_final) + Mesh **r_final) { /* if there's no derived mesh or the last data mask used doesn't include * the data we need, rebuild the derived mesh */ dataMask |= object_get_datamask(depsgraph, obedit, NULL); - if (!em->derivedCage || + if (!em->mesh_eval_cage || (em->lastDataMask & dataMask) != dataMask) { editbmesh_build_data(depsgraph, scene, obedit, em, dataMask); } - *r_final = em->derivedFinal; - if (em->derivedFinal) { BLI_assert(!(em->derivedFinal->dirty & DM_DIRTY_NORMALS)); } - return em->derivedCage; + *r_final = em->mesh_eval_final; + if (em->mesh_eval_final) { BLI_assert(!(em->mesh_eval_final->runtime.cd_dirty_vert & DM_DIRTY_NORMALS)); } + return em->mesh_eval_cage; } -DerivedMesh *editbmesh_get_derived_cage( +Mesh *editbmesh_get_eval_cage( struct Depsgraph *depsgraph, Scene *scene, Object *obedit, BMEditMesh *em, CustomDataMask dataMask) { @@ -2644,45 +2551,17 @@ DerivedMesh *editbmesh_get_derived_cage( */ dataMask |= object_get_datamask(depsgraph, obedit, NULL); - if (!em->derivedCage || + if (!em->mesh_eval_cage || (em->lastDataMask & dataMask) != dataMask) { editbmesh_build_data(depsgraph, scene, obedit, em, dataMask); } - return em->derivedCage; -} - -DerivedMesh *editbmesh_get_derived_base(Object *obedit, BMEditMesh *em, CustomDataMask data_mask) -{ - return getEditDerivedBMesh(em, obedit, data_mask, NULL); + return em->mesh_eval_cage; } /***/ -/* get derived mesh from an object, using editbmesh if available. */ -DerivedMesh *object_get_derived_final(Object *ob, const bool for_render) -{ - if (for_render) { - /* TODO(sergey): use proper derived render here in the future. */ - return ob->derivedFinal; - } - - /* only return the editmesh if its from this object because - * we don't a mesh from another object's modifier stack: T43122 */ - if (ob->type == OB_MESH) { - Mesh *me = ob->data; - BMEditMesh *em = me->edit_btmesh; - if (em && (em->ob == ob)) { - DerivedMesh *dm = em->derivedFinal; - return dm; - } - } - - return ob->derivedFinal; -} - - /* UNUSED */ #if 0 @@ -2764,20 +2643,20 @@ static void make_vertexcos__mapFunc( } } -void mesh_get_mapped_verts_coords(DerivedMesh *dm, float (*r_cos)[3], const int totcos) +void mesh_get_mapped_verts_coords(Mesh *me_eval, float (*r_cos)[3], const int totcos) { - if (dm->foreachMappedVert) { + if (me_eval->runtime.deformed_only == false) { MappedUserData userData; memset(r_cos, 0, sizeof(*r_cos) * totcos); userData.vertexcos = r_cos; userData.vertex_visit = BLI_BITMAP_NEW(totcos, "vertexcos flags"); - dm->foreachMappedVert(dm, make_vertexcos__mapFunc, &userData, DM_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert(me_eval, make_vertexcos__mapFunc, &userData, MESH_FOREACH_NOP); MEM_freeN(userData.vertex_visit); } else { - int i; - for (i = 0; i < totcos; i++) { - dm->getVertCo(dm, i, r_cos[i]); + MVert *mv = me_eval->mvert; + for (int i = 0; i < totcos; i++, mv++) { + copy_v3_v3(r_cos[i], mv->co); } } } @@ -3013,7 +2892,6 @@ char *DM_debug_info(DerivedMesh *dm) BLI_dynstr_appendf(dynstr, " 'ptr': '%p',\n", (void *)dm); switch (dm->type) { case DM_TYPE_CDDM: tstr = "DM_TYPE_CDDM"; break; - case DM_TYPE_EDITBMESH: tstr = "DM_TYPE_EDITMESH"; break; case DM_TYPE_CCGDM: tstr = "DM_TYPE_CCGDM"; break; default: tstr = "UNKNOWN"; break; } diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index 17a708fc3ba..22059a1ff0a 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -1059,9 +1059,10 @@ static void armature_bbone_defmats_cb(void *userdata, Link *iter, int index) } } -void armature_deform_verts(Object *armOb, Object *target, const Mesh * mesh, float (*vertexCos)[3], - float (*defMats)[3][3], int numVerts, int deformflag, - float (*prevCos)[3], const char *defgrp_name, bGPDstroke *gps) +void armature_deform_verts( + Object *armOb, Object *target, const Mesh *mesh, float (*vertexCos)[3], + float (*defMats)[3][3], int numVerts, int deformflag, + float (*prevCos)[3], const char *defgrp_name, bGPDstroke *gps) { bPoseChanDeform *pdef_info_array; bPoseChanDeform *pdef_info = NULL; diff --git a/source/blender/blenkernel/intern/bmfont.c b/source/blender/blenkernel/intern/bmfont.c deleted file mode 100644 index c99894bfbaf..00000000000 --- a/source/blender/blenkernel/intern/bmfont.c +++ /dev/null @@ -1,293 +0,0 @@ -/* - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): 04-10-2000 frank. - * - * ***** END GPL LICENSE BLOCK ***** - * - */ - -/** \file blender/blenkernel/intern/bmfont.c - * \ingroup bke - */ - - -/** - * Two external functions: - * - * void detectBitmapFont(ImBuf *ibuf) - * detects if an image buffer contains a bitmap font. It makes the - * specific bitmap data which is stored in the bitmap invisible to blender. - * - * void matrixGlyph(ImBuf *ibuf, unsigned short unicode, *float x 7) - * returns all the information about the character (unicode) in the floats - * - * Room for improvement: - * add kerning data in the bitmap - * all calculations in matrixGlyph() are static and could be done during - * initialization - */ - -#include <stdio.h> - -#include "MEM_guardedalloc.h" -#include "IMB_imbuf_types.h" - -#include "BLI_utildefines.h" - -#include "BKE_bmfont.h" -#include "BKE_bmfont_types.h" -#include "BKE_global.h" - -void printfGlyph(bmGlyph *glyph) -{ - printf("unicode: %d '%c'\n", glyph->unicode, glyph->unicode); - printf(" locx: %4d locy: %4d\n", glyph->locx, glyph->locy); - printf(" sizex: %3d sizey: %3d\n", glyph->sizex, glyph->sizey); - printf(" ofsx: %3d ofsy: %3d\n", glyph->ofsx, glyph->ofsy); - printf(" advan: %3d reser: %3d\n", glyph->advance, glyph->reserved); -} - -void calcAlpha(ImBuf *ibuf) -{ - int i; - char *rect; - - if (ibuf) { - rect = (char *) ibuf->rect; - for (i = ibuf->x * ibuf->y; i > 0; i--) { - rect[3] = MAX3(rect[0], rect[1], rect[2]); - rect += 4; - } - } -} - -void readBitmapFontVersion0(ImBuf *ibuf, unsigned char *rect, int step) -{ - int glyphcount, bytes, i, index, linelength, ysize; - unsigned char *buffer; - bmFont * bmfont; - - linelength = ibuf->x * step; - - glyphcount = (rect[6 * step] << 8) | rect[7 * step]; - bytes = ((glyphcount - 1) * sizeof(bmGlyph)) + sizeof(bmFont); - - ysize = (bytes + (ibuf->x - 1)) / ibuf->x; - - if (ysize < ibuf->y) { - /* we're first going to copy all data into a linear buffer. - * step can be 4 or 1 bytes, and the data is not sequential because - * the bitmap was flipped vertically. */ - - buffer = MEM_mallocN(bytes, "readBitmapFontVersion0:buffer"); - - index = 0; - for (i = 0; i < bytes; i++) { - buffer[i] = rect[index]; - index += step; - if (index >= linelength) { - /* we've read one line, no skip to the line *before* that */ - rect -= linelength; - index -= linelength; - } - } - - /* we're now going to endian convert the data */ - - bmfont = MEM_mallocN(bytes, "readBitmapFontVersion0:bmfont"); - index = 0; - - /* first read the header */ - bmfont->magic[0] = buffer[index++]; - bmfont->magic[1] = buffer[index++]; - bmfont->magic[2] = buffer[index++]; - bmfont->magic[3] = buffer[index++]; - bmfont->version = (buffer[index] << 8) | buffer[index + 1]; index += 2; - bmfont->glyphcount = (buffer[index] << 8) | buffer[index + 1]; index += 2; - bmfont->xsize = (buffer[index] << 8) | buffer[index + 1]; index += 2; - bmfont->ysize = (buffer[index] << 8) | buffer[index + 1]; index += 2; - - for (i = 0; i < bmfont->glyphcount; i++) { - bmfont->glyphs[i].unicode = (buffer[index] << 8) | buffer[index + 1]; index += 2; - bmfont->glyphs[i].locx = (buffer[index] << 8) | buffer[index + 1]; index += 2; - bmfont->glyphs[i].locy = (buffer[index] << 8) | buffer[index + 1]; index += 2; - bmfont->glyphs[i].ofsx = buffer[index++]; - bmfont->glyphs[i].ofsy = buffer[index++]; - bmfont->glyphs[i].sizex = buffer[index++]; - bmfont->glyphs[i].sizey = buffer[index++]; - bmfont->glyphs[i].advance = buffer[index++]; - bmfont->glyphs[i].reserved = buffer[index++]; - if (G.debug & G_DEBUG) { - printfGlyph(&bmfont->glyphs[i]); - } - } - - MEM_freeN(buffer); - - if (G.debug & G_DEBUG) { - printf("Oldy = %d Newy = %d\n", ibuf->y, ibuf->y - ysize); - printf("glyphcount = %d\n", glyphcount); - printf("bytes = %d\n", bytes); - } - - /* we've read the data from the image. Now we're going - * to crop the image vertically so only the bitmap data - * remains visible */ - - ibuf->y -= ysize; - ibuf->userdata = bmfont; - ibuf->userflags |= IB_BITMAPFONT; - - if (ibuf->planes < 32) { - /* we're going to fake alpha here: */ - calcAlpha(ibuf); - } - } - else { - printf("readBitmapFontVersion0: corrupted bitmapfont\n"); - } -} - -void detectBitmapFont(ImBuf *ibuf) -{ - unsigned char *rect; - unsigned short version; - int i; - - if (ibuf != NULL && ibuf->rect != NULL) { - /* bitmap must have an x size that is a power of two */ - if (is_power_of_two(ibuf->x)) { - rect = (unsigned char *) (ibuf->rect + (ibuf->x * (ibuf->y - 1))); - /* printf ("starts with: %s %c %c %c %c\n", rect, rect[0], rect[1], rect[2], rect[3]); */ - if (rect[0] == 'B' && rect[1] == 'F' && rect[2] == 'N' && rect[3] == 'T') { - /* printf("found 8bit font !\n"); - * round y size down - * do the 8 bit font stuff. (not yet) */ - } - else { - /* we try all 4 possible combinations */ - for (i = 0; i < 4; i++) { - if (rect[0] == 'B' && rect[4] == 'F' && rect[8] == 'N' && rect[12] == 'T') { - /* printf("found 24bit font !\n"); - * We're going to parse the file: */ - - version = (rect[16] << 8) | rect[20]; - - if (version == 0) { - readBitmapFontVersion0(ibuf, rect, 4); - } - else { - printf("detectBitmapFont :Unsupported version %d\n", (int)version); - } - - /* on success ibuf->userdata points to the bitmapfont */ - if (ibuf->userdata) { - break; - } - } - rect++; - } - } - } - } -} - -int locateGlyph(bmFont *bmfont, unsigned short unicode) -{ - int min, max, current = 0; - - if (bmfont) { - min = 0; - max = bmfont->glyphcount; - while (1) { - /* look halfway for glyph */ - current = (min + max) >> 1; - - if (bmfont->glyphs[current].unicode == unicode) { - break; - } - else if (bmfont->glyphs[current].unicode < unicode) { - /* have to move up */ - min = current; - } - else { - /* have to move down */ - max = current; - } - - if (max - min <= 1) { - /* unable to locate glyph */ - current = 0; - break; - } - } - } - - return(current); -} - -void matrixGlyph( - ImBuf *ibuf, unsigned short unicode, - float *centerx, float *centery, - float *sizex, float *sizey, - float *transx, float *transy, - float *movex, float *movey, - float *advance) -{ - int index; - bmFont *bmfont; - - *centerx = *centery = 0.0; - *sizex = *sizey = 1.0; - *transx = *transy = 0.0; - *movex = *movey = 0.0; - *advance = 1.0; - - if (ibuf) { - bmfont = ibuf->userdata; - if (bmfont && (ibuf->userflags & IB_BITMAPFONT)) { - index = locateGlyph(bmfont, unicode); - if (index) { - - *sizex = (bmfont->glyphs[index].sizex) / (float) (bmfont->glyphs[0].sizex); - *sizey = (bmfont->glyphs[index].sizey) / (float) (bmfont->glyphs[0].sizey); - - *transx = bmfont->glyphs[index].locx / (float) ibuf->x; - *transy = (ibuf->y - bmfont->glyphs[index].locy) / (float) ibuf->y; - - *centerx = bmfont->glyphs[0].locx / (float) ibuf->x; - *centery = (ibuf->y - bmfont->glyphs[0].locy) / (float) ibuf->y; - - /* 2.0 units is the default size of an object */ - - *movey = 1.0f - *sizey + 2.0f * (bmfont->glyphs[index].ofsy - bmfont->glyphs[0].ofsy) / (float) bmfont->glyphs[0].sizey; - *movex = *sizex - 1.0f + 2.0f * (bmfont->glyphs[index].ofsx - bmfont->glyphs[0].ofsx) / (float) bmfont->glyphs[0].sizex; - - *advance = 2.0f * bmfont->glyphs[index].advance / (float) bmfont->glyphs[0].advance; - - // printfGlyph(&bmfont->glyphs[index]); - // printf("%c %d %0.5f %0.5f %0.5f %0.5f %0.5f\n", unicode, index, *sizex, *sizey, *transx, *transy, *advance); - } - } - } -} diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 9043460562d..ef418fc68f5 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -752,6 +752,8 @@ static void loops_to_customdata_corners( } } +/* TODO(campbell): remove, use BKE_mesh_from_bmesh_for_eval_nomain instead. */ + /* used for both editbmesh and bmesh */ static DerivedMesh *cddm_from_bmesh_ex( struct BMesh *bm, const bool use_mdisps, diff --git a/source/blender/blenkernel/intern/crazyspace.c b/source/blender/blenkernel/intern/crazyspace.c index 539b4723121..354cc4926f1 100644 --- a/source/blender/blenkernel/intern/crazyspace.c +++ b/source/blender/blenkernel/intern/crazyspace.c @@ -48,6 +48,7 @@ #include "BKE_multires.h" #include "BKE_mesh.h" #include "BKE_editmesh.h" +#include "BKE_library.h" BLI_INLINE void tan_calc_quat_v3( float r_quat[4], @@ -103,7 +104,7 @@ float (*BKE_crazyspace_get_mapped_editverts( struct Depsgraph *depsgraph, Scene *scene, Object *obedit))[3] { Mesh *me = obedit->data; - DerivedMesh *dm; + Mesh *me_eval; float (*vertexcos)[3]; int nverts = me->edit_btmesh->bm->totvert; @@ -116,11 +117,9 @@ float (*BKE_crazyspace_get_mapped_editverts( /* now get the cage */ vertexcos = MEM_mallocN(sizeof(*vertexcos) * nverts, "vertexcos map"); - dm = editbmesh_get_derived_cage(depsgraph, scene, obedit, me->edit_btmesh, CD_MASK_BAREMESH); + me_eval = editbmesh_get_eval_cage(depsgraph, scene, obedit, me->edit_btmesh, CD_MASK_BAREMESH); - mesh_get_mapped_verts_coords(dm, vertexcos, nverts); - - dm->release(dm); + mesh_get_mapped_verts_coords(me_eval, vertexcos, nverts); /* set back the flag, no new cage needs to be built, transform does it */ modifiers_disable_subsurf_temporary(obedit); @@ -256,7 +255,7 @@ int BKE_crazyspace_get_first_deform_matrices_editbmesh( float (**deformmats)[3][3], float (**deformcos)[3]) { ModifierData *md; - DerivedMesh *dm; + Mesh *me; int i, a, numleft = 0, numVerts = 0; int cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1); float (*defmats)[3][3] = NULL, (*deformedVerts)[3] = NULL; @@ -265,7 +264,7 @@ int BKE_crazyspace_get_first_deform_matrices_editbmesh( modifiers_clearErrors(ob); - dm = NULL; + me = NULL; md = modifiers_getVirtualModifierList(ob, &virtualModifierData); /* compute the deformation matrices and coordinates for the first @@ -274,7 +273,7 @@ int BKE_crazyspace_get_first_deform_matrices_editbmesh( for (i = 0; md && i <= cageIndex; i++, md = md->next) { const ModifierTypeInfo *mti = modifierType_getInfo(md->type); - if (!editbmesh_modifier_is_enabled(scene, md, dm)) + if (!editbmesh_modifier_is_enabled(scene, md, me != NULL)) continue; if (mti->type == eModifierTypeType_OnlyDeform && mti->deformMatricesEM) { @@ -285,26 +284,26 @@ int BKE_crazyspace_get_first_deform_matrices_editbmesh( data_mask = datamasks->mask; BLI_linklist_free((LinkNode *)datamasks, NULL); - dm = getEditDerivedBMesh(em, ob, data_mask, NULL); + me = BKE_mesh_from_editmesh_with_coords_thin_wrap(em, data_mask, NULL); deformedVerts = editbmesh_get_vertex_cos(em, &numVerts); defmats = MEM_mallocN(sizeof(*defmats) * numVerts, "defmats"); for (a = 0; a < numVerts; a++) unit_m3(defmats[a]); } - - modifier_deformMatricesEM_DM_deprecated(md, &mectx, em, dm, deformedVerts, defmats, numVerts); + mti->deformMatricesEM(md, &mectx, em, me, deformedVerts, defmats, numVerts); } else break; } for (; md && i <= cageIndex; md = md->next, i++) - if (editbmesh_modifier_is_enabled(scene, md, dm) && modifier_isCorrectableDeformed(md)) + if (editbmesh_modifier_is_enabled(scene, md, me != NULL) && modifier_isCorrectableDeformed(md)) numleft++; - if (dm) - dm->release(dm); + if (me) { + BKE_id_free(NULL, me); + } *deformmats = defmats; *deformcos = deformedVerts; @@ -317,14 +316,14 @@ int BKE_sculpt_get_first_deform_matrices( Object *ob, float (**deformmats)[3][3], float (**deformcos)[3]) { ModifierData *md; - DerivedMesh *dm; + Mesh *me_eval; int a, numVerts = 0; float (*defmats)[3][3] = NULL, (*deformedVerts)[3] = NULL; MultiresModifierData *mmd = get_multires_modifier(scene, ob, 0); const bool has_multires = mmd != NULL && mmd->sculptlvl > 0; int numleft = 0; VirtualModifierData virtualModifierData; - ModifierEvalContext mectx = {depsgraph, ob, 0}; + const ModifierEvalContext mectx = {depsgraph, ob, 0}; if (has_multires) { *deformmats = NULL; @@ -332,7 +331,7 @@ int BKE_sculpt_get_first_deform_matrices( return numleft; } - dm = NULL; + me_eval = NULL; md = modifiers_getVirtualModifierList(ob, &virtualModifierData); for (; md; md = md->next) { @@ -342,8 +341,8 @@ int BKE_sculpt_get_first_deform_matrices( if (mti->type == eModifierTypeType_OnlyDeform) { if (!defmats) { - Mesh *me = (Mesh *)ob->data; - dm = mesh_create_derived(me, NULL); + Mesh *me = ob->data; + me_eval = BKE_mesh_copy_for_eval(me, true); deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts); defmats = MEM_callocN(sizeof(*defmats) * numVerts, "defmats"); @@ -352,7 +351,7 @@ int BKE_sculpt_get_first_deform_matrices( } if (mti->deformMatrices) { - modifier_deformMatrices_DM_deprecated(md, &mectx, dm, deformedVerts, defmats, numVerts); + mti->deformMatrices(md, &mectx, me_eval, deformedVerts, defmats, numVerts); } else break; } @@ -367,8 +366,9 @@ int BKE_sculpt_get_first_deform_matrices( numleft++; } - if (dm) - dm->release(dm); + if (me_eval) { + BKE_id_free(NULL, me_eval); + } *deformmats = defmats; *deformcos = deformedVerts; @@ -390,7 +390,7 @@ void BKE_crazyspace_build_sculpt(struct Depsgraph *depsgraph, Scene *scene, Obje int i, deformed = 0; VirtualModifierData virtualModifierData; ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData); - ModifierEvalContext mectx = {depsgraph, ob, 0}; + const ModifierEvalContext mectx = {depsgraph, ob, 0}; Mesh *me = (Mesh *)ob->data; for (; md; md = md->next) { diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c index 27d1ad01f2d..e6873e66c91 100644 --- a/source/blender/blenkernel/intern/editderivedmesh.c +++ b/source/blender/blenkernel/intern/editderivedmesh.c @@ -51,8 +51,10 @@ #include "BKE_cdderivedmesh.h" #include "BKE_deform.h" #include "BKE_mesh.h" +#include "BKE_mesh_iterators.h" #include "BKE_editmesh.h" #include "BKE_editmesh_bvh.h" +#include "BKE_editmesh_cache.h" #include "BKE_editmesh_tangent.h" #include "DNA_scene_types.h" @@ -61,986 +63,6 @@ #include "MEM_guardedalloc.h" -typedef struct EditDerivedBMesh { - DerivedMesh dm; - - BMEditMesh *em; - - EditMeshData emd; -} EditDerivedBMesh; - -/* -------------------------------------------------------------------- */ -/* Lazy initialize datastructures */ - -static void emDM_ensurePolyNormals(EditDerivedBMesh *bmdm); - -static void emDM_ensureVertNormals(EditDerivedBMesh *bmdm) -{ - if (bmdm->emd.vertexCos && (bmdm->emd.vertexNos == NULL)) { - - BMesh *bm = bmdm->em->bm; - const float (*vertexCos)[3], (*polyNos)[3]; - float (*vertexNos)[3]; - - /* calculate vertex normals from poly normals */ - emDM_ensurePolyNormals(bmdm); - - BM_mesh_elem_index_ensure(bm, BM_FACE); - - polyNos = bmdm->emd.polyNos; - vertexCos = bmdm->emd.vertexCos; - vertexNos = MEM_callocN(sizeof(*vertexNos) * bm->totvert, __func__); - - BM_verts_calc_normal_vcos(bm, polyNos, vertexCos, vertexNos); - - bmdm->emd.vertexNos = (const float (*)[3])vertexNos; - } -} - -static void emDM_ensurePolyNormals(EditDerivedBMesh *bmdm) -{ - if (bmdm->emd.vertexCos && (bmdm->emd.polyNos == NULL)) { - BMesh *bm = bmdm->em->bm; - const float (*vertexCos)[3]; - float (*polyNos)[3]; - - BMFace *efa; - BMIter fiter; - int i; - - BM_mesh_elem_index_ensure(bm, BM_VERT); - - polyNos = MEM_mallocN(sizeof(*polyNos) * bm->totface, __func__); - - vertexCos = bmdm->emd.vertexCos; - - BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) { - BM_elem_index_set(efa, i); /* set_inline */ - BM_face_calc_normal_vcos(bm, efa, polyNos[i], vertexCos); - } - bm->elem_index_dirty &= ~BM_FACE; - - bmdm->emd.polyNos = (const float (*)[3])polyNos; - } -} - -static void emDM_ensurePolyCenters(EditDerivedBMesh *bmdm) -{ - if (bmdm->emd.polyCos == NULL) { - BMesh *bm = bmdm->em->bm; - float (*polyCos)[3]; - - BMFace *efa; - BMIter fiter; - int i; - - polyCos = MEM_mallocN(sizeof(*polyCos) * bm->totface, __func__); - - if (bmdm->emd.vertexCos) { - const float (*vertexCos)[3]; - vertexCos = bmdm->emd.vertexCos; - - BM_mesh_elem_index_ensure(bm, BM_VERT); - - BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) { - BM_face_calc_center_mean_vcos(bm, efa, polyCos[i], vertexCos); - } - } - else { - BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) { - BM_face_calc_center_mean(efa, polyCos[i]); - } - } - - bmdm->emd.polyCos = (const float (*)[3])polyCos; - } -} - -static void emDM_calcNormals(DerivedMesh *dm) -{ - /* Nothing to do: normals are already calculated and stored on the - * BMVerts and BMFaces */ - dm->dirty &= ~DM_DIRTY_NORMALS; -} - -static void emDM_calcLoopNormalsSpaceArray( - DerivedMesh *dm, const bool use_split_normals, const float split_angle, MLoopNorSpaceArray *r_lnors_spacearr); - -static void emDM_calcLoopNormals(DerivedMesh *dm, const bool use_split_normals, const float split_angle) -{ - emDM_calcLoopNormalsSpaceArray(dm, use_split_normals, split_angle, NULL); -} - -/* #define DEBUG_CLNORS */ - -static void emDM_calcLoopNormalsSpaceArray( - DerivedMesh *dm, const bool use_split_normals, const float split_angle, MLoopNorSpaceArray *r_lnors_spacearr) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BMesh *bm = bmdm->em->bm; - const float (*vertexCos)[3], (*vertexNos)[3], (*polyNos)[3]; - float (*loopNos)[3]; - short (*clnors_data)[2]; - int cd_loop_clnors_offset; - - /* calculate loop normals from poly and vertex normals */ - emDM_ensureVertNormals(bmdm); - emDM_ensurePolyNormals(bmdm); - dm->dirty &= ~DM_DIRTY_NORMALS; - - vertexCos = bmdm->emd.vertexCos; - vertexNos = bmdm->emd.vertexNos; - polyNos = bmdm->emd.polyNos; - - loopNos = dm->getLoopDataArray(dm, CD_NORMAL); - if (!loopNos) { - DM_add_loop_layer(dm, CD_NORMAL, CD_CALLOC, NULL); - loopNos = dm->getLoopDataArray(dm, CD_NORMAL); - } - - /* We can have both, give priority to dm's data, and fallback to bm's ones. */ - clnors_data = dm->getLoopDataArray(dm, CD_CUSTOMLOOPNORMAL); - cd_loop_clnors_offset = clnors_data ? -1 : CustomData_get_offset(&bm->ldata, CD_CUSTOMLOOPNORMAL); - - BM_loops_calc_normal_vcos(bm, vertexCos, vertexNos, polyNos, use_split_normals, split_angle, loopNos, - r_lnors_spacearr, clnors_data, cd_loop_clnors_offset, false); -#ifdef DEBUG_CLNORS - if (r_lnors_spacearr) { - int i; - for (i = 0; i < numLoops; i++) { - if (r_lnors_spacearr->lspacearr[i]->ref_alpha != 0.0f) { - LinkNode *loops = r_lnors_spacearr->lspacearr[i]->loops; - printf("Loop %d uses lnor space %p:\n", i, r_lnors_spacearr->lspacearr[i]); - print_v3("\tfinal lnor:", loopNos[i]); - print_v3("\tauto lnor:", r_lnors_spacearr->lspacearr[i]->vec_lnor); - print_v3("\tref_vec:", r_lnors_spacearr->lspacearr[i]->vec_ref); - printf("\talpha: %f\n\tbeta: %f\n\tloops: %p\n", r_lnors_spacearr->lspacearr[i]->ref_alpha, - r_lnors_spacearr->lspacearr[i]->ref_beta, r_lnors_spacearr->lspacearr[i]->loops); - printf("\t\t(shared with loops"); - while (loops) { - printf(" %d", POINTER_AS_INT(loops->link)); - loops = loops->next; - } - printf(")\n"); - } - else { - printf("Loop %d has no lnor space\n", i); - } - } - } -#endif -} - -static void emDM_calc_loop_tangents( - DerivedMesh *dm, bool calc_active_tangent, - const char (*tangent_names)[MAX_NAME], int tangent_names_len) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BMEditMesh *em = bmdm->em; - - if (CustomData_number_of_layers(&em->bm->ldata, CD_MLOOPUV) == 0) { - return; - } - - const float (*poly_normals)[3] = bmdm->emd.polyNos; - const float (*loop_normals)[3] = CustomData_get_layer(&dm->loopData, CD_NORMAL); - const float (*vert_orco)[3] = dm->getVertDataArray(dm, CD_ORCO); /* can be NULL */ - BKE_editmesh_loop_tangent_calc( - em, calc_active_tangent, - tangent_names, tangent_names_len, - poly_normals, loop_normals, - vert_orco, - &dm->loopData, dm->numLoopData, - &dm->tangent_mask); -} - - -static void emDM_recalcTessellation(DerivedMesh *UNUSED(dm)) -{ - /* do nothing */ -} - -static void emDM_recalcLoopTri(DerivedMesh *dm) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BMLoop *(*looptris)[3] = bmdm->em->looptris; - MLoopTri *mlooptri; - const int tottri = bmdm->em->tottri; - int i; - - DM_ensure_looptri_data(dm); - mlooptri = dm->looptris.array_wip; - - BLI_assert(tottri == 0 || mlooptri != NULL); - BLI_assert(poly_to_tri_count(dm->numPolyData, dm->numLoopData) == dm->looptris.num); - BLI_assert(tottri == dm->looptris.num); - - BM_mesh_elem_index_ensure(bmdm->em->bm, BM_FACE | BM_LOOP); - - for (i = 0; i < tottri; i++) { - BMLoop **ltri = looptris[i]; - MLoopTri *lt = &mlooptri[i]; - - ARRAY_SET_ITEMS( - lt->tri, - BM_elem_index_get(ltri[0]), - BM_elem_index_get(ltri[1]), - BM_elem_index_get(ltri[2])); - lt->poly = BM_elem_index_get(ltri[0]->f); - } - - BLI_assert(dm->looptris.array == NULL); - atomic_cas_ptr((void **)&dm->looptris.array, dm->looptris.array, dm->looptris.array_wip); - dm->looptris.array_wip = NULL; -} - -static void emDM_foreachMappedVert( - DerivedMesh *dm, - void (*func)(void *userData, int index, const float co[3], const float no_f[3], const short no_s[3]), - void *userData, - DMForeachFlag flag) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BMesh *bm = bmdm->em->bm; - BMVert *eve; - BMIter iter; - int i; - - if (bmdm->emd.vertexCos) { - const float (*vertexCos)[3] = bmdm->emd.vertexCos; - const float (*vertexNos)[3]; - - if (flag & DM_FOREACH_USE_NORMAL) { - emDM_ensureVertNormals(bmdm); - vertexNos = bmdm->emd.vertexNos; - } - else { - vertexNos = NULL; - } - - BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) { - const float *no = (flag & DM_FOREACH_USE_NORMAL) ? vertexNos[i] : NULL; - func(userData, i, vertexCos[i], no, NULL); - } - } - else { - BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) { - const float *no = (flag & DM_FOREACH_USE_NORMAL) ? eve->no : NULL; - func(userData, i, eve->co, no, NULL); - } - } -} -static void emDM_foreachMappedEdge( - DerivedMesh *dm, - void (*func)(void *userData, int index, const float v0co[3], const float v1co[3]), - void *userData) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BMesh *bm = bmdm->em->bm; - BMEdge *eed; - BMIter iter; - int i; - - if (bmdm->emd.vertexCos) { - - BM_mesh_elem_index_ensure(bm, BM_VERT); - - BM_ITER_MESH_INDEX (eed, &iter, bm, BM_EDGES_OF_MESH, i) { - func(userData, i, - bmdm->emd.vertexCos[BM_elem_index_get(eed->v1)], - bmdm->emd.vertexCos[BM_elem_index_get(eed->v2)]); - } - } - else { - BM_ITER_MESH_INDEX (eed, &iter, bm, BM_EDGES_OF_MESH, i) { - func(userData, i, eed->v1->co, eed->v2->co); - } - } -} - -static void emDM_foreachMappedLoop( - DerivedMesh *dm, - void (*func)(void *userData, int vertex_index, int face_index, const float co[3], const float no[3]), - void *userData, - DMForeachFlag flag) -{ - /* We can't use dm->getLoopDataLayout(dm) here, we want to always access dm->loopData, EditDerivedBMesh would - * return loop data from bmesh itself. */ - const float (*lnors)[3] = (flag & DM_FOREACH_USE_NORMAL) ? DM_get_loop_data_layer(dm, CD_NORMAL) : NULL; - - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BMesh *bm = bmdm->em->bm; - BMFace *efa; - BMIter iter; - - const float (*vertexCos)[3] = bmdm->emd.vertexCos; - int f_idx; - - BM_mesh_elem_index_ensure(bm, BM_VERT); - - BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, f_idx) { - BMLoop *l_iter, *l_first; - - l_iter = l_first = BM_FACE_FIRST_LOOP(efa); - do { - const BMVert *eve = l_iter->v; - const int v_idx = BM_elem_index_get(eve); - const float *no = lnors ? *lnors++ : NULL; - func(userData, v_idx, f_idx, vertexCos ? vertexCos[v_idx] : eve->co, no); - } while ((l_iter = l_iter->next) != l_first); - } -} - -static void emDM_foreachMappedFaceCenter( - DerivedMesh *dm, - void (*func)(void *userData, int index, const float co[3], const float no[3]), - void *userData, - DMForeachFlag flag) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BMesh *bm = bmdm->em->bm; - const float (*polyNos)[3]; - const float (*polyCos)[3]; - BMFace *efa; - BMIter iter; - int i; - - emDM_ensurePolyCenters(bmdm); - polyCos = bmdm->emd.polyCos; /* always set */ - - if (flag & DM_FOREACH_USE_NORMAL) { - emDM_ensurePolyNormals(bmdm); - polyNos = bmdm->emd.polyNos; /* maybe NULL */ - } - else { - polyNos = NULL; - } - - if (polyNos) { - BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, i) { - const float *no = polyNos[i]; - func(userData, i, polyCos[i], no); - } - } - else { - BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, i) { - const float *no = (flag & DM_FOREACH_USE_NORMAL) ? efa->no : NULL; - func(userData, i, polyCos[i], no); - } - } -} - -static void emDM_getMinMax(DerivedMesh *dm, float r_min[3], float r_max[3]) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BMesh *bm = bmdm->em->bm; - BMVert *eve; - BMIter iter; - int i; - - if (bm->totvert) { - if (bmdm->emd.vertexCos) { - BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) { - minmax_v3v3_v3(r_min, r_max, bmdm->emd.vertexCos[i]); - } - } - else { - BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) { - minmax_v3v3_v3(r_min, r_max, eve->co); - } - } - } - else { - zero_v3(r_min); - zero_v3(r_max); - } -} -static int emDM_getNumVerts(DerivedMesh *dm) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - - return bmdm->em->bm->totvert; -} - -static int emDM_getNumEdges(DerivedMesh *dm) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - - return bmdm->em->bm->totedge; -} - -static int emDM_getNumTessFaces(DerivedMesh *dm) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - - return bmdm->em->tottri; -} - -static int emDM_getNumLoops(DerivedMesh *dm) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - - return bmdm->em->bm->totloop; -} - -static int emDM_getNumPolys(DerivedMesh *dm) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - - return bmdm->em->bm->totface; -} - -static void bmvert_to_mvert(BMesh *bm, BMVert *ev, MVert *r_vert) -{ - const float *f; - - copy_v3_v3(r_vert->co, ev->co); - - normal_float_to_short_v3(r_vert->no, ev->no); - - r_vert->flag = BM_vert_flag_to_mflag(ev); - - if ((f = CustomData_bmesh_get(&bm->vdata, ev->head.data, CD_BWEIGHT))) { - r_vert->bweight = (unsigned char)((*f) * 255.0f); - } -} - -static void emDM_getVert(DerivedMesh *dm, int index, MVert *r_vert) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BMesh *bm = bmdm->em->bm; - BMVert *ev; - - if (UNLIKELY(index < 0 || index >= bm->totvert)) { - BLI_assert(!"error in emDM_getVert"); - return; - } - - BLI_assert((bm->elem_table_dirty & BM_VERT) == 0); - ev = bm->vtable[index]; /* should be BM_vert_at_index() */ - // ev = BM_vert_at_index(bm, index); /* warning, does list loop, _not_ ideal */ - - bmvert_to_mvert(bm, ev, r_vert); - if (bmdm->emd.vertexCos) - copy_v3_v3(r_vert->co, bmdm->emd.vertexCos[index]); -} - -static void emDM_getVertCo(DerivedMesh *dm, int index, float r_co[3]) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BMesh *bm = bmdm->em->bm; - - if (UNLIKELY(index < 0 || index >= bm->totvert)) { - BLI_assert(!"error in emDM_getVertCo"); - return; - } - - if (bmdm->emd.vertexCos) { - copy_v3_v3(r_co, bmdm->emd.vertexCos[index]); - } - else { - BMVert *ev; - - BLI_assert((bm->elem_table_dirty & BM_VERT) == 0); - ev = bm->vtable[index]; /* should be BM_vert_at_index() */ - // ev = BM_vert_at_index(bm, index); /* warning, does list loop, _not_ ideal */ - copy_v3_v3(r_co, ev->co); - } -} - -static void emDM_getVertNo(DerivedMesh *dm, int index, float r_no[3]) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BMesh *bm = bmdm->em->bm; - - if (UNLIKELY(index < 0 || index >= bm->totvert)) { - BLI_assert(!"error in emDM_getVertNo"); - return; - } - - - if (bmdm->emd.vertexCos) { - emDM_ensureVertNormals(bmdm); - copy_v3_v3(r_no, bmdm->emd.vertexNos[index]); - } - else { - BMVert *ev; - - BLI_assert((bm->elem_table_dirty & BM_VERT) == 0); - ev = bm->vtable[index]; /* should be BM_vert_at_index() */ - // ev = BM_vert_at_index(bm, index); /* warning, does list loop, _not_ ideal */ - copy_v3_v3(r_no, ev->no); - } -} - -static void emDM_getPolyNo(DerivedMesh *dm, int index, float r_no[3]) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BMesh *bm = bmdm->em->bm; - - if (UNLIKELY(index < 0 || index >= bm->totface)) { - BLI_assert(!"error in emDM_getPolyNo"); - return; - } - - if (bmdm->emd.vertexCos) { - emDM_ensurePolyNormals(bmdm); - copy_v3_v3(r_no, bmdm->emd.polyNos[index]); - } - else { - BMFace *efa; - - BLI_assert((bm->elem_table_dirty & BM_FACE) == 0); - efa = bm->ftable[index]; /* should be BM_vert_at_index() */ - // efa = BM_face_at_index(bm, index); /* warning, does list loop, _not_ ideal */ - copy_v3_v3(r_no, efa->no); - } -} - -static void emDM_getEdge(DerivedMesh *dm, int index, MEdge *r_edge) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BMesh *bm = bmdm->em->bm; - BMEdge *e; - const float *f; - - if (UNLIKELY(index < 0 || index >= bm->totedge)) { - BLI_assert(!"error in emDM_getEdge"); - return; - } - - BLI_assert((bm->elem_table_dirty & BM_EDGE) == 0); - e = bm->etable[index]; /* should be BM_edge_at_index() */ - // e = BM_edge_at_index(bm, index); /* warning, does list loop, _not_ ideal */ - - r_edge->flag = BM_edge_flag_to_mflag(e); - - r_edge->v1 = BM_elem_index_get(e->v1); - r_edge->v2 = BM_elem_index_get(e->v2); - - if ((f = CustomData_bmesh_get(&bm->edata, e->head.data, CD_BWEIGHT))) { - r_edge->bweight = (unsigned char)((*f) * 255.0f); - } - if ((f = CustomData_bmesh_get(&bm->edata, e->head.data, CD_CREASE))) { - r_edge->crease = (unsigned char)((*f) * 255.0f); - } -} - -static void emDM_getTessFace(DerivedMesh *dm, int index, MFace *r_face) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BMFace *ef; - BMLoop **ltri; - - if (UNLIKELY(index < 0 || index >= bmdm->em->tottri)) { - BLI_assert(!"error in emDM_getTessFace"); - return; - } - - ltri = bmdm->em->looptris[index]; - - ef = ltri[0]->f; - - r_face->mat_nr = (unsigned char) ef->mat_nr; - r_face->flag = BM_face_flag_to_mflag(ef); - - r_face->v1 = BM_elem_index_get(ltri[0]->v); - r_face->v2 = BM_elem_index_get(ltri[1]->v); - r_face->v3 = BM_elem_index_get(ltri[2]->v); - r_face->v4 = 0; - - test_index_face(r_face, NULL, 0, 3); -} - -static void emDM_copyVertArray(DerivedMesh *dm, MVert *r_vert) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BMesh *bm = bmdm->em->bm; - BMVert *eve; - BMIter iter; - const int cd_vert_bweight_offset = CustomData_get_offset(&bm->vdata, CD_BWEIGHT); - - if (bmdm->emd.vertexCos) { - int i; - - BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) { - copy_v3_v3(r_vert->co, bmdm->emd.vertexCos[i]); - normal_float_to_short_v3(r_vert->no, eve->no); - r_vert->flag = BM_vert_flag_to_mflag(eve); - - r_vert->bweight = (cd_vert_bweight_offset != -1) ? BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eve, cd_vert_bweight_offset) : 0; - - r_vert++; - } - } - else { - BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) { - copy_v3_v3(r_vert->co, eve->co); - normal_float_to_short_v3(r_vert->no, eve->no); - r_vert->flag = BM_vert_flag_to_mflag(eve); - - r_vert->bweight = (cd_vert_bweight_offset != -1) ? BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eve, cd_vert_bweight_offset) : 0; - - r_vert++; - } - } -} - -static void emDM_copyEdgeArray(DerivedMesh *dm, MEdge *r_edge) -{ - BMesh *bm = ((EditDerivedBMesh *)dm)->em->bm; - BMEdge *eed; - BMIter iter; - - const int cd_edge_bweight_offset = CustomData_get_offset(&bm->edata, CD_BWEIGHT); - const int cd_edge_crease_offset = CustomData_get_offset(&bm->edata, CD_CREASE); - - BM_mesh_elem_index_ensure(bm, BM_VERT); - - BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) { - r_edge->v1 = BM_elem_index_get(eed->v1); - r_edge->v2 = BM_elem_index_get(eed->v2); - - r_edge->flag = BM_edge_flag_to_mflag(eed); - - r_edge->crease = (cd_edge_crease_offset != -1) ? BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eed, cd_edge_crease_offset) : 0; - r_edge->bweight = (cd_edge_bweight_offset != -1) ? BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eed, cd_edge_bweight_offset) : 0; - - r_edge++; - } -} - -static void emDM_copyTessFaceArray(DerivedMesh *dm, MFace *r_face) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BMesh *bm = bmdm->em->bm; - struct BMLoop *(*looptris)[3] = bmdm->em->looptris; - BMFace *ef; - int i; - - BM_mesh_elem_index_ensure(bm, BM_VERT); - - for (i = 0; i < bmdm->em->tottri; i++, r_face++) { - BMLoop **ltri = looptris[i]; - ef = ltri[0]->f; - - r_face->mat_nr = (unsigned char) ef->mat_nr; - - r_face->flag = BM_face_flag_to_mflag(ef); - r_face->edcode = 0; - - r_face->v1 = BM_elem_index_get(ltri[0]->v); - r_face->v2 = BM_elem_index_get(ltri[1]->v); - r_face->v3 = BM_elem_index_get(ltri[2]->v); - r_face->v4 = 0; - - test_index_face(r_face, NULL, 0, 3); - } -} - -static void emDM_copyLoopArray(DerivedMesh *dm, MLoop *r_loop) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BMesh *bm = bmdm->em->bm; - BMIter iter; - BMFace *efa; - - BM_mesh_elem_index_ensure(bm, BM_VERT | BM_EDGE); - - BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) { - BMLoop *l_iter, *l_first; - l_iter = l_first = BM_FACE_FIRST_LOOP(efa); - do { - r_loop->v = BM_elem_index_get(l_iter->v); - r_loop->e = BM_elem_index_get(l_iter->e); - r_loop++; - } while ((l_iter = l_iter->next) != l_first); - } -} - -static void emDM_copyPolyArray(DerivedMesh *dm, MPoly *r_poly) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BMesh *bm = bmdm->em->bm; - BMIter iter; - BMFace *efa; - int i; - - i = 0; - BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) { - r_poly->flag = BM_face_flag_to_mflag(efa); - r_poly->loopstart = i; - r_poly->totloop = efa->len; - r_poly->mat_nr = efa->mat_nr; - - r_poly++; - i += efa->len; - } -} - -static void *emDM_getTessFaceDataArray(DerivedMesh *dm, int type) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BMesh *bm = bmdm->em->bm; - void *datalayer; - - datalayer = DM_get_tessface_data_layer(dm, type); - if (datalayer) - return datalayer; - - /* layers are store per face for editmesh, we convert to a temporary - * data layer array in the derivedmesh when these are requested */ - if (type == CD_MTFACE || type == CD_MCOL) { - const char *bmdata; - char *data; - - bool has_type_source = CustomData_has_layer(&bm->ldata, (type == CD_MTFACE) ? CD_MLOOPUV : CD_MLOOPCOL); - - if (has_type_source) { - /* offset = bm->pdata.layers[index].offset; */ /* UNUSED */ - BMLoop *(*looptris)[3] = bmdm->em->looptris; - const int size = CustomData_sizeof(type); - int i, j; - - DM_add_tessface_layer(dm, type, CD_CALLOC, NULL); - const int index = CustomData_get_layer_index(&dm->faceData, type); - dm->faceData.layers[index].flag |= CD_FLAG_TEMPORARY; - - data = datalayer = DM_get_tessface_data_layer(dm, type); - - if (type == CD_MTFACE) { - const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV); - - for (i = 0; i < bmdm->em->tottri; i++, data += size) { - for (j = 0; j < 3; j++) { - // bmdata = CustomData_bmesh_get(&bm->ldata, looptris[i][j]->head.data, CD_MLOOPUV); - bmdata = BM_ELEM_CD_GET_VOID_P(looptris[i][j], cd_loop_uv_offset); - copy_v2_v2(((MTFace *)data)->uv[j], ((const MLoopUV *)bmdata)->uv); - } - } - } - else { - const int cd_loop_color_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPCOL); - for (i = 0; i < bmdm->em->tottri; i++, data += size) { - for (j = 0; j < 3; j++) { - // bmdata = CustomData_bmesh_get(&bm->ldata, looptris[i][j]->head.data, CD_MLOOPCOL); - bmdata = BM_ELEM_CD_GET_VOID_P(looptris[i][j], cd_loop_color_offset); - MESH_MLOOPCOL_TO_MCOL(((const MLoopCol *)bmdata), (((MCol *)data) + j)); - } - } - } - } - } - - /* Special handling for CD_TESSLOOPNORMAL, we generate it on demand as well. */ - if (type == CD_TESSLOOPNORMAL) { - const float (*lnors)[3] = dm->getLoopDataArray(dm, CD_NORMAL); - - if (lnors) { - BMLoop *(*looptris)[3] = bmdm->em->looptris; - short (*tlnors)[4][3], (*tlnor)[4][3]; - int index, i, j; - - DM_add_tessface_layer(dm, type, CD_CALLOC, NULL); - index = CustomData_get_layer_index(&dm->faceData, type); - dm->faceData.layers[index].flag |= CD_FLAG_TEMPORARY; - - tlnor = tlnors = DM_get_tessface_data_layer(dm, type); - - BM_mesh_elem_index_ensure(bm, BM_LOOP); - - for (i = 0; i < bmdm->em->tottri; i++, tlnor++, looptris++) { - for (j = 0; j < 3; j++) { - normal_float_to_short_v3((*tlnor)[j], lnors[BM_elem_index_get((*looptris)[j])]); - } - } - } - } - - return datalayer; -} - -static void emDM_getVertCos(DerivedMesh *dm, float (*r_cos)[3]) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BMesh *bm = bmdm->em->bm; - BMVert *eve; - BMIter iter; - int i; - - if (bmdm->emd.vertexCos) { - BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) { - copy_v3_v3(r_cos[i], bmdm->emd.vertexCos[i]); - } - } - else { - BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) { - copy_v3_v3(r_cos[i], eve->co); - } - } -} - -static void emDM_release(DerivedMesh *dm) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - - if (DM_release(dm)) { - if (bmdm->emd.vertexCos) { - MEM_freeN((void *)bmdm->emd.vertexCos); - if (bmdm->emd.vertexNos) { - MEM_freeN((void *)bmdm->emd.vertexNos); - } - if (bmdm->emd.polyNos) { - MEM_freeN((void *)bmdm->emd.polyNos); - } - } - - if (bmdm->emd.polyCos) { - MEM_freeN((void *)bmdm->emd.polyCos); - } - - MEM_freeN(bmdm); - } -} - -static CustomData *bmDm_getVertDataLayout(DerivedMesh *dm) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - - return &bmdm->em->bm->vdata; -} - -static CustomData *bmDm_getEdgeDataLayout(DerivedMesh *dm) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - - return &bmdm->em->bm->edata; -} - -static CustomData *bmDm_getTessFaceDataLayout(DerivedMesh *dm) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - - return &bmdm->dm.faceData; -} - -static CustomData *bmDm_getLoopDataLayout(DerivedMesh *dm) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - - return &bmdm->em->bm->ldata; -} - -static CustomData *bmDm_getPolyDataLayout(DerivedMesh *dm) -{ - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - - return &bmdm->em->bm->pdata; -} - -/** - * \note This may be called per-draw, - * avoid allocating large arrays where possible and keep this a thin wrapper for #BMesh. - */ -DerivedMesh *getEditDerivedBMesh( - BMEditMesh *em, struct Object *UNUSED(ob), - CustomDataMask data_mask, - float (*vertexCos)[3]) -{ - EditDerivedBMesh *bmdm = MEM_callocN(sizeof(*bmdm), __func__); - BMesh *bm = em->bm; - - bmdm->em = em; - - DM_init((DerivedMesh *)bmdm, DM_TYPE_EDITBMESH, bm->totvert, - bm->totedge, em->tottri, bm->totloop, bm->totface); - - /* could also get from the objects mesh directly */ - bmdm->dm.cd_flag = BM_mesh_cd_flag_from_bmesh(bm); - - bmdm->dm.getVertCos = emDM_getVertCos; - bmdm->dm.getMinMax = emDM_getMinMax; - - bmdm->dm.getVertDataLayout = bmDm_getVertDataLayout; - bmdm->dm.getEdgeDataLayout = bmDm_getEdgeDataLayout; - bmdm->dm.getTessFaceDataLayout = bmDm_getTessFaceDataLayout; - bmdm->dm.getLoopDataLayout = bmDm_getLoopDataLayout; - bmdm->dm.getPolyDataLayout = bmDm_getPolyDataLayout; - - bmdm->dm.getNumVerts = emDM_getNumVerts; - bmdm->dm.getNumEdges = emDM_getNumEdges; - bmdm->dm.getNumTessFaces = emDM_getNumTessFaces; - bmdm->dm.getNumLoops = emDM_getNumLoops; - bmdm->dm.getNumPolys = emDM_getNumPolys; - - bmdm->dm.getVert = emDM_getVert; - bmdm->dm.getVertCo = emDM_getVertCo; - bmdm->dm.getVertNo = emDM_getVertNo; - bmdm->dm.getPolyNo = emDM_getPolyNo; - bmdm->dm.getEdge = emDM_getEdge; - bmdm->dm.getTessFace = emDM_getTessFace; - bmdm->dm.copyVertArray = emDM_copyVertArray; - bmdm->dm.copyEdgeArray = emDM_copyEdgeArray; - bmdm->dm.copyTessFaceArray = emDM_copyTessFaceArray; - bmdm->dm.copyLoopArray = emDM_copyLoopArray; - bmdm->dm.copyPolyArray = emDM_copyPolyArray; - - bmdm->dm.getTessFaceDataArray = emDM_getTessFaceDataArray; - - bmdm->dm.calcNormals = emDM_calcNormals; - bmdm->dm.calcLoopNormals = emDM_calcLoopNormals; - bmdm->dm.calcLoopNormalsSpaceArray = emDM_calcLoopNormalsSpaceArray; - bmdm->dm.calcLoopTangents = emDM_calc_loop_tangents; - bmdm->dm.recalcTessellation = emDM_recalcTessellation; - bmdm->dm.recalcLoopTri = emDM_recalcLoopTri; - - bmdm->dm.foreachMappedVert = emDM_foreachMappedVert; - bmdm->dm.foreachMappedLoop = emDM_foreachMappedLoop; - bmdm->dm.foreachMappedEdge = emDM_foreachMappedEdge; - bmdm->dm.foreachMappedFaceCenter = emDM_foreachMappedFaceCenter; - - bmdm->dm.release = emDM_release; - - bmdm->emd.vertexCos = (const float (*)[3])vertexCos; - bmdm->dm.deformedOnly = (vertexCos != NULL); - - const int cd_dvert_offset = (data_mask & CD_MASK_MDEFORMVERT) ? - CustomData_get_offset(&bm->vdata, CD_MDEFORMVERT) : -1; - - if (cd_dvert_offset != -1) { - BMIter iter; - BMVert *eve; - int i; - - DM_add_vert_layer(&bmdm->dm, CD_MDEFORMVERT, CD_CALLOC, NULL); - - BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) { - DM_set_vert_data(&bmdm->dm, i, CD_MDEFORMVERT, - BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset)); - } - } - - const int cd_skin_offset = (data_mask & CD_MASK_MVERT_SKIN) ? - CustomData_get_offset(&bm->vdata, CD_MVERT_SKIN) : -1; - - if (cd_skin_offset != -1) { - BMIter iter; - BMVert *eve; - int i; - - DM_add_vert_layer(&bmdm->dm, CD_MVERT_SKIN, CD_CALLOC, NULL); - - BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) { - DM_set_vert_data(&bmdm->dm, i, CD_MVERT_SKIN, - BM_ELEM_CD_GET_VOID_P(eve, cd_skin_offset)); - } - } - - return (DerivedMesh *)bmdm; -} - - - /* -------------------------------------------------------------------- */ /* StatVis Functions */ @@ -1418,18 +440,15 @@ static void statvis_calc_sharp( } void BKE_editmesh_statvis_calc( - BMEditMesh *em, DerivedMesh *dm, + BMEditMesh *em, EditMeshData *emd, const MeshStatVis *statvis) { - EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; - BLI_assert(dm == NULL || dm->type == DM_TYPE_EDITBMESH); - switch (statvis->type) { case SCE_STATVIS_OVERHANG: { BKE_editmesh_color_ensure(em, BM_FACE); statvis_calc_overhang( - em, bmdm ? bmdm->emd.polyNos : NULL, + em, emd ? emd->polyNos : NULL, statvis->overhang_min / (float)M_PI, statvis->overhang_max / (float)M_PI, statvis->overhang_axis, @@ -1441,7 +460,7 @@ void BKE_editmesh_statvis_calc( const float scale = 1.0f / mat4_to_scale(em->ob->obmat); BKE_editmesh_color_ensure(em, BM_FACE); statvis_calc_thickness( - em, bmdm ? bmdm->emd.vertexCos : NULL, + em, emd ? emd->vertexCos : NULL, statvis->thickness_min * scale, statvis->thickness_max * scale, statvis->thickness_samples, @@ -1452,7 +471,7 @@ void BKE_editmesh_statvis_calc( { BKE_editmesh_color_ensure(em, BM_FACE); statvis_calc_intersect( - em, bmdm ? bmdm->emd.vertexCos : NULL, + em, emd ? emd->vertexCos : NULL, em->derivedFaceColor); break; } @@ -1460,11 +479,12 @@ void BKE_editmesh_statvis_calc( { BKE_editmesh_color_ensure(em, BM_FACE); - if (bmdm) - emDM_ensurePolyNormals(bmdm); + if (emd) { + BKE_editmesh_cache_ensure_poly_normals(em, emd); + } statvis_calc_distort( - em, bmdm ? bmdm->emd.vertexCos : NULL, bmdm ? bmdm->emd.polyNos : NULL, + em, emd ? emd->vertexCos : NULL, emd ? emd->polyNos : NULL, statvis->distort_min, statvis->distort_max, em->derivedFaceColor); @@ -1474,7 +494,7 @@ void BKE_editmesh_statvis_calc( { BKE_editmesh_color_ensure(em, BM_VERT); statvis_calc_sharp( - em, bmdm ? bmdm->emd.vertexCos : NULL, + em, emd ? emd->vertexCos : NULL, statvis->sharp_min, statvis->sharp_max, /* in this case they are vertex colors */ @@ -1509,12 +529,12 @@ static void cage_mapped_verts_callback( float (*BKE_editmesh_vertexCos_get(struct Depsgraph *depsgraph, BMEditMesh *em, Scene *scene, int *r_numVerts))[3] { - DerivedMesh *cage, *final; + Mesh *cage, *final; BLI_bitmap *visit_bitmap; struct CageUserData data; float (*cos_cage)[3]; - cage = editbmesh_get_derived_cage_and_final(depsgraph, scene, em->ob, em, CD_MASK_BAREMESH, &final); + cage = editbmesh_get_eval_cage_and_final(depsgraph, scene, em->ob, em, CD_MASK_BAREMESH, &final); cos_cage = MEM_callocN(sizeof(*cos_cage) * em->bm->totvert, "bmbvh cos_cage"); /* when initializing cage verts, we only want the first cage coordinate for each vertex, @@ -1525,7 +545,7 @@ float (*BKE_editmesh_vertexCos_get(struct Depsgraph *depsgraph, BMEditMesh *em, data.cos_cage = cos_cage; data.visit_bitmap = visit_bitmap; - cage->foreachMappedVert(cage, cage_mapped_verts_callback, &data, DM_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert(cage, cage_mapped_verts_callback, &data, MESH_FOREACH_NOP); MEM_freeN(visit_bitmap); diff --git a/source/blender/blenkernel/intern/editmesh.c b/source/blender/blenkernel/intern/editmesh.c index 9e1713dc805..0d09f4be39f 100644 --- a/source/blender/blenkernel/intern/editmesh.c +++ b/source/blender/blenkernel/intern/editmesh.c @@ -39,6 +39,7 @@ #include "BKE_editmesh.h" #include "BKE_cdderivedmesh.h" +#include "BKE_library.h" BMEditMesh *BKE_editmesh_create(BMesh *bm, const bool do_tessellate) @@ -58,7 +59,7 @@ BMEditMesh *BKE_editmesh_copy(BMEditMesh *em) BMEditMesh *em_copy = MEM_callocN(sizeof(BMEditMesh), __func__); *em_copy = *em; - em_copy->derivedCage = em_copy->derivedFinal = NULL; + em_copy->mesh_eval_cage = em_copy->mesh_eval_final = NULL; em_copy->derivedVertColor = NULL; em_copy->derivedVertColorLen = 0; @@ -169,16 +170,13 @@ void BKE_editmesh_tessface_calc(BMEditMesh *em) void BKE_editmesh_free_derivedmesh(BMEditMesh *em) { - if (em->derivedCage) { - em->derivedCage->needsFree = 1; - em->derivedCage->release(em->derivedCage); + if (em->mesh_eval_cage) { + BKE_id_free(NULL, em->mesh_eval_cage); } - if (em->derivedFinal && em->derivedFinal != em->derivedCage) { - em->derivedFinal->needsFree = 1; - em->derivedFinal->release(em->derivedFinal); + if (em->mesh_eval_final && em->mesh_eval_final != em->mesh_eval_cage) { + BKE_id_free(NULL, em->mesh_eval_final); } - - em->derivedCage = em->derivedFinal = NULL; + em->mesh_eval_cage = em->mesh_eval_final = NULL; } /*does not free the BMEditMesh struct itself*/ diff --git a/source/blender/blenkernel/intern/editmesh_cache.c b/source/blender/blenkernel/intern/editmesh_cache.c new file mode 100644 index 00000000000..f0af0ede9b1 --- /dev/null +++ b/source/blender/blenkernel/intern/editmesh_cache.c @@ -0,0 +1,120 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/blenkernel/intern/editmesh_cache.c + * \ingroup bke + * + * Manage edit mesh cache: #EditMeshData + */ + +#include "MEM_guardedalloc.h" + +#include "DNA_mesh_types.h" + +#include "BLI_math.h" + +#include "BKE_editmesh.h" +#include "BKE_editmesh_cache.h" /* own include */ + +void BKE_editmesh_cache_ensure_poly_normals(BMEditMesh *em, EditMeshData *emd) +{ + if (!(emd->vertexCos && (emd->polyNos == NULL))) { + return; + } + + BMesh *bm = em->bm; + const float (*vertexCos)[3]; + float (*polyNos)[3]; + + BMFace *efa; + BMIter fiter; + int i; + + BM_mesh_elem_index_ensure(bm, BM_VERT); + + polyNos = MEM_mallocN(sizeof(*polyNos) * bm->totface, __func__); + + vertexCos = emd->vertexCos; + + BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) { + BM_elem_index_set(efa, i); /* set_inline */ + BM_face_calc_normal_vcos(bm, efa, polyNos[i], vertexCos); + } + bm->elem_index_dirty &= ~BM_FACE; + + emd->polyNos = (const float (*)[3])polyNos; +} + +void BKE_editmesh_cache_ensure_vert_normals(BMEditMesh *em, EditMeshData *emd) +{ + if (!(emd->vertexCos && (emd->vertexNos == NULL))) { + return; + } + + BMesh *bm = em->bm; + const float (*vertexCos)[3], (*polyNos)[3]; + float (*vertexNos)[3]; + + /* calculate vertex normals from poly normals */ + BKE_editmesh_cache_ensure_poly_normals(em, emd); + + BM_mesh_elem_index_ensure(bm, BM_FACE); + + polyNos = emd->polyNos; + vertexCos = emd->vertexCos; + vertexNos = MEM_callocN(sizeof(*vertexNos) * bm->totvert, __func__); + + BM_verts_calc_normal_vcos(bm, polyNos, vertexCos, vertexNos); + + emd->vertexNos = (const float (*)[3])vertexNos; +} + +void BKE_editmesh_cache_ensure_poly_centers(BMEditMesh *em, EditMeshData *emd) +{ + if (emd->polyCos != NULL) { + return; + } + BMesh *bm = em->bm; + float (*polyCos)[3]; + + BMFace *efa; + BMIter fiter; + int i; + + polyCos = MEM_mallocN(sizeof(*polyCos) * bm->totface, __func__); + + if (emd->vertexCos) { + const float (*vertexCos)[3]; + vertexCos = emd->vertexCos; + + BM_mesh_elem_index_ensure(bm, BM_VERT); + + BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) { + BM_face_calc_center_mean_vcos(bm, efa, polyCos[i], vertexCos); + } + } + else { + BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) { + BM_face_calc_center_mean(efa, polyCos[i]); + } + } + + emd->polyCos = (const float (*)[3])polyCos; +} diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c index b81d633f156..51ab82fd593 100644 --- a/source/blender/blenkernel/intern/font.c +++ b/source/blender/blenkernel/intern/font.c @@ -1118,7 +1118,7 @@ makebreak: /* Note: Only OB_CURVE objects could have a path */ if (cu->textoncurve && cu->textoncurve->type == OB_CURVE) { BLI_assert(cu->textoncurve->runtime.curve_cache != NULL); - if (cu->textoncurve->runtime.curve_cache->path) { + if (cu->textoncurve->runtime.curve_cache != NULL && cu->textoncurve->runtime.curve_cache->path != NULL) { float distfac, imat[4][4], imat3[3][3], cmat[3][3]; float minx, maxx, miny, maxy; float timeofs, sizefac; diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c index ae78dd8d175..33c2587e800 100644 --- a/source/blender/blenkernel/intern/gpencil.c +++ b/source/blender/blenkernel/intern/gpencil.c @@ -1108,22 +1108,35 @@ bool BKE_gpencil_stroke_minmax( } /* get min/max bounds of all strokes in GP datablock */ -static void gpencil_minmax(bGPdata *gpd, float r_min[3], float r_max[3]) +bool BKE_gpencil_data_minmax(Object *ob, const bGPdata *gpd, float r_min[3], float r_max[3]) { + float bmat[3][3]; + bool changed = false; + INIT_MINMAX(r_min, r_max); if (gpd == NULL) - return; + return changed; for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) { bGPDframe *gpf = gpl->actframe; if (gpf != NULL) { for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) { - BKE_gpencil_stroke_minmax(gps, false, r_min, r_max); + changed = BKE_gpencil_stroke_minmax(gps, false, r_min, r_max); } } } + + if ((changed) && (ob)) { + copy_m3_m4(bmat, ob->obmat); + mul_m3_v3(bmat, r_min); + add_v3_v3(r_min, ob->obmat[3]); + mul_m3_v3(bmat, r_max); + add_v3_v3(r_max, ob->obmat[3]); + } + + return changed; } /* compute center of bounding box */ @@ -1131,7 +1144,7 @@ void BKE_gpencil_centroid_3D(bGPdata *gpd, float r_centroid[3]) { float min[3], max[3], tot[3]; - gpencil_minmax(gpd, min, max); + BKE_gpencil_data_minmax(NULL, gpd, min, max); add_v3_v3v3(tot, min, max); mul_v3_v3fl(r_centroid, tot, 0.5f); @@ -1152,7 +1165,7 @@ static void boundbox_gpencil(Object *ob) bb = ob->bb; gpd = ob->data; - gpencil_minmax(gpd, min, max); + BKE_gpencil_data_minmax(NULL, gpd, min, max); BKE_boundbox_init_from_minmax(bb, min, max); bb->flag &= ~BOUNDBOX_DIRTY; diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 59ce3b4dd8a..b7885e08a60 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -68,7 +68,6 @@ #include "BLI_timecode.h" /* for stamp timecode format */ #include "BLI_utildefines.h" -#include "BKE_bmfont.h" #include "BKE_colortools.h" #include "BKE_global.h" #include "BKE_icons.h" @@ -3450,9 +3449,6 @@ static ImBuf *load_image_single( image_initialize_after_load(ima, ibuf); *r_assign = true; - /* check if the image is a font image... */ - detectBitmapFont(ibuf); - /* make packed file for autopack */ if ((has_packed == false) && (G.fileflags & G_AUTOPACK)) { ImagePackedFile *imapf = MEM_mallocN(sizeof(ImagePackedFile), "Image Packefile"); diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c index a209b2ac1d7..84aa0ed962b 100644 --- a/source/blender/blenkernel/intern/library.c +++ b/source/blender/blenkernel/intern/library.c @@ -1373,6 +1373,9 @@ void BKE_libblock_init_empty(ID *id) /* Should not be needed - animation from lib pre-2.5 is broken anyway. */ BLI_assert(0); break; + case ID_PAL: + BKE_palette_init((Palette *)id); + break; default: BLI_assert(0); /* Should never reach this point... */ } diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 374365cc58a..81214f3bb9c 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -576,6 +576,7 @@ void BKE_mesh_copy_data(Main *bmain, Mesh *me_dst, const Mesh *me_src, const int /* This is a direct copy of a main mesh, so for now it has the same topology. */ me_dst->runtime.deformed_only = 1; } + me_dst->runtime.is_original = false; me_dst->mselect = MEM_dupallocN(me_dst->mselect); me_dst->bb = MEM_dupallocN(me_dst->bb); @@ -685,7 +686,7 @@ static Mesh *mesh_new_nomain_from_template_ex( return me_dst; } -Mesh * BKE_mesh_new_nomain_from_template( +Mesh *BKE_mesh_new_nomain_from_template( const Mesh *me_src, int verts_len, int edges_len, int tessface_len, int loops_len, int polys_len) @@ -709,7 +710,7 @@ Mesh *BKE_mesh_copy_for_eval(struct Mesh *source, bool reference) } Mesh *result; - BKE_id_copy_ex( NULL, &source->id, (ID **)&result, flags, false); + BKE_id_copy_ex(NULL, &source->id, (ID **)&result, flags, false); return result; } @@ -748,7 +749,7 @@ BMesh *BKE_mesh_to_bmesh( }); } -Mesh *BKE_bmesh_to_mesh_nomain(BMesh *bm, const struct BMeshToMeshParams *params) +Mesh *BKE_mesh_from_bmesh_nomain(BMesh *bm, const struct BMeshToMeshParams *params) { BLI_assert(params->calc_object_remap == false); Mesh *mesh = BKE_id_new_nomain(ID_ME, NULL); @@ -756,6 +757,31 @@ Mesh *BKE_bmesh_to_mesh_nomain(BMesh *bm, const struct BMeshToMeshParams *params return mesh; } +Mesh *BKE_mesh_from_bmesh_for_eval_nomain(BMesh *bm, const int64_t cd_mask_extra) +{ + Mesh *mesh = BKE_id_new_nomain(ID_ME, NULL); + BM_mesh_bm_to_me_for_eval(bm, mesh, cd_mask_extra); + return mesh; +} + +/** + * TODO(campbell): support mesh with only an edit-mesh which is lazy initialized. + */ +Mesh *BKE_mesh_from_editmesh_with_coords_thin_wrap( + BMEditMesh *em, CustomDataMask data_mask, float (*vertexCos)[3]) +{ + Mesh *me = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, data_mask); + /* Use editmesh directly where possible. */ + me->runtime.is_original = true; + if (vertexCos) { + /* We will own this array in the future. */ + BKE_mesh_apply_vert_coords(me, vertexCos); + MEM_freeN(vertexCos); + me->runtime.is_original = false; + } + return me; +} + void BKE_mesh_make_local(Main *bmain, Mesh *me, const bool lib_local) { BKE_id_make_local_generic(bmain, &me->id, true, lib_local); diff --git a/source/blender/blenkernel/intern/mesh_convert.c b/source/blender/blenkernel/intern/mesh_convert.c index 7cc7095361c..b64cb8a1d0f 100644 --- a/source/blender/blenkernel/intern/mesh_convert.c +++ b/source/blender/blenkernel/intern/mesh_convert.c @@ -549,7 +549,7 @@ void BKE_mesh_from_nurbs_displist( Main *bmain, Object *ob, ListBase *dispbase, const bool use_orco_uv, const char *obdata_name, bool temporary) { Object *ob1; - DerivedMesh *dm = ob->derivedFinal; + Mesh *me_eval = ob->runtime.mesh_eval; Mesh *me; Curve *cu; MVert *allvert = NULL; @@ -561,7 +561,7 @@ void BKE_mesh_from_nurbs_displist( cu = ob->data; - if (dm == NULL) { + if (me_eval == NULL) { if (BKE_mesh_nurbs_displist_to_mdata( ob, dispbase, &allvert, &totvert, &alledge, &totedge, &allloop, @@ -593,7 +593,8 @@ void BKE_mesh_from_nurbs_displist( } else { me = BKE_mesh_add(bmain, obdata_name); - DM_to_mesh(dm, me, ob, CD_MASK_MESH, false); + ob->runtime.mesh_eval = NULL; + BKE_mesh_nomain_to_mesh(me_eval, me, ob, CD_MASK_MESH, false); } me->totcol = cu->totcol; @@ -840,7 +841,7 @@ void BKE_mesh_to_curve(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object * /* settings: 1 - preview, 2 - render */ Mesh *BKE_mesh_new_from_object( Depsgraph *depsgraph, Main *bmain, Scene *sce, Object *ob, - const bool apply_modifiers, const bool calc_tessface, const bool calc_undeformed) + const bool apply_modifiers, const bool calc_undeformed) { Mesh *tmpmesh; Curve *tmpcu = NULL, *copycu; @@ -976,7 +977,7 @@ Mesh *BKE_mesh_new_from_object( /* if not getting the original caged mesh, get final derived mesh */ else { /* Make a dummy mesh, saves copying */ - DerivedMesh *dm; + Mesh *me_eval; /* CustomDataMask mask = CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL; */ CustomDataMask mask = CD_MASK_MESH; /* this seems more suitable, exporter, * for example, needs CD_MASK_MDEFORMVERT */ @@ -984,14 +985,15 @@ Mesh *BKE_mesh_new_from_object( if (calc_undeformed) mask |= CD_MASK_ORCO; - /* Write the display mesh into the dummy mesh */ - if (render) - dm = mesh_create_derived_render(depsgraph, sce, ob, mask); - else - dm = mesh_create_derived_view(depsgraph, sce, ob, mask); + if (render) { + me_eval = mesh_create_eval_final_render(depsgraph, sce, ob, mask); + } + else { + me_eval = mesh_create_eval_final_view(depsgraph, sce, ob, mask); + } tmpmesh = BKE_mesh_add(bmain, ((ID *)ob->data)->name + 2); - DM_to_mesh(dm, tmpmesh, ob, mask, true); + BKE_mesh_nomain_to_mesh(me_eval, tmpmesh, ob, mask, true); /* Copy autosmooth settings from original mesh. */ Mesh *me = (Mesh *)ob->data; @@ -1069,11 +1071,6 @@ Mesh *BKE_mesh_new_from_object( break; } /* end copy materials */ - if (calc_tessface) { - /* cycles and exporters rely on this still */ - BKE_mesh_tessface_ensure(tmpmesh); - } - return tmpmesh; } diff --git a/source/blender/blenkernel/intern/mesh_evaluate.c b/source/blender/blenkernel/intern/mesh_evaluate.c index f20d17c7917..f9ced904536 100644 --- a/source/blender/blenkernel/intern/mesh_evaluate.c +++ b/source/blender/blenkernel/intern/mesh_evaluate.c @@ -354,6 +354,35 @@ void BKE_mesh_ensure_normals(Mesh *mesh) BLI_assert((mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL) == 0); } +/** + * Called after calculating all modifiers. + */ +void BKE_mesh_ensure_normals_for_display(Mesh *mesh) +{ + /* Note: mesh *may* have a poly CD_NORMAL layer (generated by a modifier needing poly normals e.g.). + * We do not use it here, though. And it should be tagged as temp! + */ + /* BLI_assert((CustomData_has_layer(&mesh->pdata, CD_NORMAL) == false)); */ + + if (mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL || !CustomData_has_layer(&mesh->pdata, CD_NORMAL)) { + float (*poly_nors)[3] = NULL; + poly_nors = MEM_malloc_arrayN((size_t)mesh->totpoly, sizeof(*poly_nors), __func__); + + /* if normals are dirty we want to calculate vertex normals too */ + bool only_face_normals = !(mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL); + + /* calculate face normals */ + BKE_mesh_calc_normals_poly( + mesh->mvert, NULL, mesh->totvert, mesh->mloop, mesh->mpoly, + mesh->totloop, mesh->totpoly, poly_nors, + only_face_normals); + + CustomData_add_layer(&mesh->pdata, CD_NORMAL, CD_ASSIGN, poly_nors, mesh->totpoly); + + mesh->runtime.cd_dirty_vert &= ~CD_MASK_NORMAL; + } +} + /* Note that this does not update the CD_NORMAL layer, but does update the normals in the CD_MVERT layer. */ void BKE_mesh_calc_normals(Mesh *mesh) { diff --git a/source/blender/blenkernel/intern/mesh_iterators.c b/source/blender/blenkernel/intern/mesh_iterators.c index f96a91c6e4d..73dcd912f48 100644 --- a/source/blender/blenkernel/intern/mesh_iterators.c +++ b/source/blender/blenkernel/intern/mesh_iterators.c @@ -45,20 +45,21 @@ void BKE_mesh_foreach_mapped_vert( void *userData, MeshForeachFlag flag) { - MVert *mv = mesh->mvert; + const MVert *mv = mesh->mvert; const int *index = CustomData_get_layer(&mesh->vdata, CD_ORIGINDEX); - int i; if (index) { - for (i = 0; i < mesh->totvert; i++, mv++) { + for (int i = 0; i < mesh->totvert; i++, mv++) { const short *no = (flag & MESH_FOREACH_USE_NORMAL) ? mv->no : NULL; const int orig = *index++; - if (orig == ORIGINDEX_NONE) continue; + if (orig == ORIGINDEX_NONE) { + continue; + } func(userData, orig, mv->co, NULL, no); } } else { - for (i = 0; i < mesh->totvert; i++, mv++) { + for (int i = 0; i < mesh->totvert; i++, mv++) { const short *no = (flag & MESH_FOREACH_USE_NORMAL) ? mv->no : NULL; func(userData, i, mv->co, NULL, no); } @@ -71,18 +72,23 @@ void BKE_mesh_foreach_mapped_edge( void (*func)(void *userData, int index, const float v0co[3], const float v1co[3]), void *userData) { - MVert *mv = mesh->mvert; - MEdge *med = mesh->medge; - int i, orig, *index = CustomData_get_layer(&mesh->edata, CD_ORIGINDEX); - - for (i = 0; i < mesh->totedge; i++, med++) { - if (index) { - orig = *index++; - if (orig == ORIGINDEX_NONE) continue; + const MVert *mv = mesh->mvert; + const MEdge *med = mesh->medge; + const int *index = CustomData_get_layer(&mesh->edata, CD_ORIGINDEX); + + if (index) { + for (int i = 0; i < mesh->totedge; i++, med++) { + const int orig = *index++; + if (orig == ORIGINDEX_NONE) { + continue; + } func(userData, orig, mv[med->v1].co, mv[med->v2].co); } - else + } + else { + for (int i = 0; i < mesh->totedge; i++, med++) { func(userData, i, mv[med->v1].co, mv[med->v2].co); + } } } @@ -104,12 +110,25 @@ void BKE_mesh_foreach_mapped_loop( const int *f_index = CustomData_get_layer(&mesh->pdata, CD_ORIGINDEX); int p_idx, i; - for (p_idx = 0; p_idx < mesh->totpoly; ++p_idx, ++mp) { - for (i = 0; i < mp->totloop; ++i, ++ml) { - const int v_idx = v_index ? v_index[ml->v] : ml->v; - const int f_idx = f_index ? f_index[p_idx] : p_idx; - const float *no = lnors ? *lnors++ : NULL; - if (!ELEM(ORIGINDEX_NONE, v_idx, f_idx)) { + if (v_index || f_index) { + for (p_idx = 0; p_idx < mesh->totpoly; p_idx++, mp++) { + for (i = 0; i < mp->totloop; i++, ml++) { + const int v_idx = v_index ? v_index[ml->v] : ml->v; + const int f_idx = f_index ? f_index[p_idx] : p_idx; + const float *no = lnors ? *lnors++ : NULL; + if (ELEM(ORIGINDEX_NONE, v_idx, f_idx)) { + continue; + } + func(userData, v_idx, f_idx, mv[ml->v].co, no); + } + } + } + else { + for (p_idx = 0; p_idx < mesh->totpoly; p_idx++, mp++) { + for (i = 0; i < mp->totloop; i++, ml++) { + const int v_idx = ml->v; + const int f_idx = p_idx; + const float *no = lnors ? *lnors++ : NULL; func(userData, v_idx, f_idx, mv[ml->v].co, no); } } @@ -123,38 +142,39 @@ void BKE_mesh_foreach_mapped_face_center( void *userData, MeshForeachFlag flag) { - MVert *mvert = mesh->mvert; - MPoly *mp; - MLoop *ml; - int i, orig, *index; - - index = CustomData_get_layer(&mesh->pdata, CD_ORIGINDEX); - mp = mesh->mpoly; - for (i = 0; i < mesh->totpoly; i++, mp++) { - float cent[3]; - float *no, _no[3]; - - if (index) { - orig = *index++; - if (orig == ORIGINDEX_NONE) continue; - } - else { - orig = i; - } - - ml = &mesh->mloop[mp->loopstart]; - BKE_mesh_calc_poly_center(mp, ml, mvert, cent); + const MVert *mvert = mesh->mvert; + const MPoly *mp = mesh->mpoly; + const MLoop *ml; + float _no_buf[3]; + float *no = (flag & MESH_FOREACH_USE_NORMAL) ? _no_buf : NULL; + const int *index = CustomData_get_layer(&mesh->pdata, CD_ORIGINDEX); - if (flag & MESH_FOREACH_USE_NORMAL) { - BKE_mesh_calc_poly_normal(mp, ml, mvert, (no = _no)); + if (index) { + for (int i = 0; i < mesh->totpoly; i++, mp++) { + const int orig = *index++; + if (orig == ORIGINDEX_NONE) { + continue; + } + float cent[3]; + ml = &mesh->mloop[mp->loopstart]; + BKE_mesh_calc_poly_center(mp, ml, mvert, cent); + if (flag & MESH_FOREACH_USE_NORMAL) { + BKE_mesh_calc_poly_normal(mp, ml, mvert, no); + } + func(userData, orig, cent, no); } - else { - no = NULL; + } + else { + for (int i = 0; i < mesh->totpoly; i++, mp++) { + float cent[3]; + ml = &mesh->mloop[mp->loopstart]; + BKE_mesh_calc_poly_center(mp, ml, mvert, cent); + if (flag & MESH_FOREACH_USE_NORMAL) { + BKE_mesh_calc_poly_normal(mp, ml, mvert, no); + } + func(userData, i, cent, no); } - - func(userData, orig, cent, no); } - } diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 1863e454397..41c35de8aea 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -826,58 +826,59 @@ void modifier_path_init(char *path, int path_maxlen, const char *name) /* wrapper around ModifierTypeInfo.applyModifier that ensures valid normals */ -struct DerivedMesh *modwrap_applyModifier( +struct Mesh *modwrap_applyModifier( ModifierData *md, const ModifierEvalContext *ctx, - struct DerivedMesh *dm) + struct Mesh *me) { const ModifierTypeInfo *mti = modifierType_getInfo(md->type); - BLI_assert(CustomData_has_layer(&dm->polyData, CD_NORMAL) == false); + BLI_assert(CustomData_has_layer(&me->pdata, CD_NORMAL) == false); if (mti->dependsOnNormals && mti->dependsOnNormals(md)) { - DM_ensure_normals(dm); + BKE_mesh_calc_normals(me); } - return modifier_applyModifier_DM_deprecated(md, ctx, dm); + return mti->applyModifier(md, ctx, me); } -struct DerivedMesh *modwrap_applyModifierEM( +struct Mesh *modwrap_applyModifierEM( ModifierData *md, const ModifierEvalContext *ctx, - struct BMEditMesh *em, DerivedMesh *dm) + struct BMEditMesh *em, Mesh *me) { const ModifierTypeInfo *mti = modifierType_getInfo(md->type); - BLI_assert(CustomData_has_layer(&dm->polyData, CD_NORMAL) == false); + BLI_assert(CustomData_has_layer(&me->pdata, CD_NORMAL) == false); if (mti->dependsOnNormals && mti->dependsOnNormals(md)) { - DM_ensure_normals(dm); + BKE_mesh_calc_normals(me); } - return modifier_applyModifierEM_DM_deprecated(md, ctx, em, dm); + return mti->applyModifierEM(md, ctx, em, me); } void modwrap_deformVerts( ModifierData *md, const ModifierEvalContext *ctx, - DerivedMesh *dm, float (*vertexCos)[3], int numVerts) + Mesh *me, float (*vertexCos)[3], int numVerts) { const ModifierTypeInfo *mti = modifierType_getInfo(md->type); - BLI_assert(!dm || CustomData_has_layer(&dm->polyData, CD_NORMAL) == false); + BLI_assert(!me || CustomData_has_layer(&me->pdata, CD_NORMAL) == false); - if (dm && mti->dependsOnNormals && mti->dependsOnNormals(md)) { - DM_ensure_normals(dm); + if (me && mti->dependsOnNormals && mti->dependsOnNormals(md)) { + BKE_mesh_calc_normals(me); } - modifier_deformVerts_DM_deprecated(md, ctx, dm, vertexCos, numVerts); + mti->deformVerts(md, ctx, me, vertexCos, numVerts); } void modwrap_deformVertsEM( ModifierData *md, const ModifierEvalContext *ctx, - struct BMEditMesh *em, DerivedMesh *dm, + struct BMEditMesh *em, Mesh *me, float (*vertexCos)[3], int numVerts) { const ModifierTypeInfo *mti = modifierType_getInfo(md->type); - BLI_assert(!dm || CustomData_has_layer(&dm->polyData, CD_NORMAL) == false); + BLI_assert(!me || CustomData_has_layer(&me->pdata, CD_NORMAL) == false); - if (dm && mti->dependsOnNormals && mti->dependsOnNormals(md)) { - DM_ensure_normals(dm); + if (me && mti->dependsOnNormals && mti->dependsOnNormals(md)) { + BKE_mesh_calc_normals(me); } - modifier_deformVertsEM_DM_deprecated(md, ctx, em, dm, vertexCos, numVerts); + mti->deformVertsEM(md, ctx, em, me, vertexCos, numVerts); } + /* end modifier callback wrappers */ @@ -885,116 +886,11 @@ void modwrap_deformVertsEM( * depending on if the modifier has been ported to Mesh or is still using DerivedMesh */ -void modifier_deformVerts_ensure_normals(struct ModifierData *md, const ModifierEvalContext *ctx, - struct Mesh *mesh, - float (*vertexCos)[3], int numVerts) -{ - const ModifierTypeInfo *mti = modifierType_getInfo(md->type); - BLI_assert(!mesh || CustomData_has_layer(&mesh->pdata, CD_NORMAL) == false); - - if (mesh && mti->dependsOnNormals && mti->dependsOnNormals(md)) { - BKE_mesh_calc_normals(mesh); - } - mti->deformVerts(md, ctx, mesh, vertexCos, numVerts); -} - -struct Mesh *modifier_applyModifier_ensure_normals(struct ModifierData *md, const ModifierEvalContext *ctx, - struct Mesh *mesh) -{ - const ModifierTypeInfo *mti = modifierType_getInfo(md->type); - BLI_assert(CustomData_has_layer(&mesh->pdata, CD_NORMAL) == false); - - if (mti->dependsOnNormals && mti->dependsOnNormals(md)) { - BKE_mesh_calc_normals(mesh); - } - return mti->applyModifier(md, ctx, mesh); -} - /* deprecated variants of above that accept DerivedMesh */ -void modifier_deformVerts_DM_deprecated(struct ModifierData *md, const ModifierEvalContext *ctx, - struct DerivedMesh *dm, - float (*vertexCos)[3], int numVerts) -{ - const ModifierTypeInfo *mti = modifierType_getInfo(md->type); - - /* TODO(sybren): deduplicate all the copies of this code in this file. */ - Mesh *mesh = NULL; - if (dm != NULL) { - mesh = BKE_id_new_nomain(ID_ME, NULL); - DM_to_mesh(dm, mesh, ctx->object, CD_MASK_EVERYTHING, false); - } - - mti->deformVerts(md, ctx, mesh, vertexCos, numVerts); - - if (mesh != NULL) { - BKE_id_free(NULL, mesh); - } -} - -void modifier_deformMatrices_DM_deprecated(struct ModifierData *md, const ModifierEvalContext *ctx, - struct DerivedMesh *dm, - float (*vertexCos)[3], float (*defMats)[3][3], int numVerts) -{ - - const ModifierTypeInfo *mti = modifierType_getInfo(md->type); - - /* TODO(sybren): deduplicate all the copies of this code in this file. */ - Mesh *mesh = NULL; - if (dm != NULL) { - mesh = BKE_id_new_nomain(ID_ME, NULL); - DM_to_mesh(dm, mesh, ctx->object, CD_MASK_EVERYTHING, false); - } - - mti->deformMatrices(md, ctx, mesh, vertexCos, defMats, numVerts); - - if (mesh != NULL) { - BKE_id_free(NULL, mesh); - } -} - -void modifier_deformVertsEM_DM_deprecated(struct ModifierData *md, const ModifierEvalContext *ctx, - struct BMEditMesh *editData, struct DerivedMesh *dm, - float (*vertexCos)[3], int numVerts) -{ - const ModifierTypeInfo *mti = modifierType_getInfo(md->type); - - /* TODO(sybren): deduplicate all the copies of this code in this file. */ - Mesh *mesh = NULL; - if (dm != NULL) { - mesh = BKE_id_new_nomain(ID_ME, NULL); - DM_to_mesh(dm, mesh, ctx->object, CD_MASK_EVERYTHING, false); - } - - mti->deformVertsEM(md, ctx, editData, mesh, vertexCos, numVerts); - - if (mesh != NULL) { - BKE_id_free(NULL, mesh); - } -} - -void modifier_deformMatricesEM_DM_deprecated(struct ModifierData *md, const ModifierEvalContext *ctx, - struct BMEditMesh *editData, struct DerivedMesh *dm, - float (*vertexCos)[3], float (*defMats)[3][3], int numVerts) -{ - const ModifierTypeInfo *mti = modifierType_getInfo(md->type); - - /* TODO(sybren): deduplicate all the copies of this code in this file. */ - Mesh *mesh = NULL; - if (dm != NULL) { - mesh = BKE_id_new_nomain(ID_ME, NULL); - DM_to_mesh(dm, mesh, ctx->object, CD_MASK_EVERYTHING, false); - } - - mti->deformMatricesEM(md, ctx, editData, mesh, vertexCos, defMats, numVerts); - - if (mesh != NULL) { - BKE_id_free(NULL, mesh); - } -} - -struct DerivedMesh *modifier_applyModifier_DM_deprecated(struct ModifierData *md, const ModifierEvalContext *ctx, - struct DerivedMesh *dm) +struct DerivedMesh *modifier_applyModifier_DM_deprecated( + struct ModifierData *md, const ModifierEvalContext *ctx, + struct DerivedMesh *dm) { const ModifierTypeInfo *mti = modifierType_getInfo(md->type); @@ -1021,35 +917,6 @@ struct DerivedMesh *modifier_applyModifier_DM_deprecated(struct ModifierData *md } -struct DerivedMesh *modifier_applyModifierEM_DM_deprecated(struct ModifierData *md, const ModifierEvalContext *ctx, - struct BMEditMesh *editData, - struct DerivedMesh *dm) -{ - const ModifierTypeInfo *mti = modifierType_getInfo(md->type); - - /* TODO(sybren): deduplicate all the copies of this code in this file. */ - Mesh *mesh = NULL; - if (dm != NULL) { - mesh = BKE_id_new_nomain(ID_ME, NULL); - DM_to_mesh(dm, mesh, ctx->object, CD_MASK_EVERYTHING, false); - } - - struct Mesh *new_mesh = mti->applyModifierEM(md, ctx, editData, mesh); - - /* Make a DM that doesn't reference new_mesh so we can free the latter. */ - DerivedMesh *ndm = CDDM_from_mesh_ex(new_mesh, CD_DUPLICATE, CD_MASK_EVERYTHING); - - if (new_mesh != mesh) { - BKE_id_free(NULL, new_mesh); - } - if (mesh != NULL) { - BKE_id_free(NULL, mesh); - } - - return ndm; - -} - /** * Get evaluated mesh for other evaluated object, which is used as an operand for the modifier, * e.g. second operand for boolean modifier. @@ -1063,7 +930,7 @@ Mesh *BKE_modifier_get_evaluated_mesh_from_evaluated_object(Object *ob_eval, boo /* Note: currently we have no equivalent to derived cagemesh or even final dm in BMEditMesh... * This is TODO in core depsgraph/modifier stack code still. */ BMEditMesh *em = BKE_editmesh_from_object(ob_eval); - me = BKE_bmesh_to_mesh_nomain(em->bm, &(struct BMeshToMeshParams){0}); + me = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, 0); *r_free_mesh = true; } else { diff --git a/source/blender/blenkernel/intern/multires_reshape.c b/source/blender/blenkernel/intern/multires_reshape.c index dcd439e82dc..b14010f3a90 100644 --- a/source/blender/blenkernel/intern/multires_reshape.c +++ b/source/blender/blenkernel/intern/multires_reshape.c @@ -944,7 +944,7 @@ bool multiresModifier_reshapeFromDeformModifier( .depsgraph = depsgraph, .object = object, .flag = MOD_APPLY_USECACHE | MOD_APPLY_IGNORE_SIMPLIFY}; - modifier_deformVerts_ensure_normals( + modwrap_deformVerts( md, &modifier_ctx, multires_mesh, deformed_verts, multires_mesh->totvert); BKE_id_free(NULL, multires_mesh); diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index cf6f2e5d842..cd564238a20 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -727,7 +727,7 @@ bool BKE_object_is_mode_compat(const struct Object *ob, eObjectMode object_mode) /** * Return if the object is visible, as evaluated by depsgraph */ -bool BKE_object_is_visible(Object *ob, const eObjectVisibilityCheck mode) +bool BKE_object_is_visible(const Object *ob, const eObjectVisibilityCheck mode) { if ((ob->base_flag & BASE_VISIBLE) == 0) { return false; @@ -2052,7 +2052,11 @@ static void give_parvert(Object *par, int nr, float vec[3]) BMEditMesh *em = me->edit_btmesh; DerivedMesh *dm; +#if 0 /* FIXME(campbell): use mesh for both. */ dm = (em) ? em->derivedFinal : par->derivedFinal; +#else + dm = par->derivedFinal; +#endif if (dm) { int count = 0; @@ -3749,12 +3753,12 @@ KDTree *BKE_object_as_kdtree(Object *ob, int *r_tot) Mesh *me = ob->data; unsigned int i; - DerivedMesh *dm = ob->derivedDeform ? ob->derivedDeform : ob->derivedFinal; + Mesh *me_eval = ob->runtime.mesh_deform_eval ? ob->runtime.mesh_deform_eval : ob->runtime.mesh_deform_eval; const int *index; - if (dm && (index = CustomData_get_layer(&dm->vertData, CD_ORIGINDEX))) { - MVert *mvert = dm->getVertArray(dm); - unsigned int totvert = dm->getNumVerts(dm); + if (me_eval && (index = CustomData_get_layer(&me_eval->vdata, CD_ORIGINDEX))) { + MVert *mvert = me_eval->mvert; + uint totvert = me_eval->totvert; /* tree over-allocs in case where some verts have ORIGINDEX_NONE */ tot = 0; diff --git a/source/blender/blenkernel/intern/object_dupli.c b/source/blender/blenkernel/intern/object_dupli.c index 6d9520dad1e..d9aa6407474 100644 --- a/source/blender/blenkernel/intern/object_dupli.c +++ b/source/blender/blenkernel/intern/object_dupli.c @@ -488,7 +488,7 @@ static void make_duplis_verts(const DupliContext *ctx) /* We do not need any render-smecific handling anymore, depsgraph takes care of that. */ if (vdd.edit_btmesh != NULL) { - /* XXX TODO replace with equivalent of editbmesh_get_derived_cage when available. */ + /* XXX TODO replace with equivalent of editbmesh_get_eval_cage when available. */ vdd.me_eval = mesh_get_eval_deform(ctx->depsgraph, scene, parent, dm_mask); } else { @@ -758,7 +758,7 @@ static void make_duplis_faces(const DupliContext *ctx) /* We do not need any render-smecific handling anymore, depsgraph takes care of that. */ if (em != NULL) { - /* XXX TODO replace with equivalent of editbmesh_get_derived_cage when available. */ + /* XXX TODO replace with equivalent of editbmesh_get_eval_cage when available. */ fdd.me_eval = mesh_get_eval_deform(ctx->depsgraph, scene, parent, dm_mask); } else { diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c index 070f5daa019..545581e65ec 100644 --- a/source/blender/blenkernel/intern/paint.c +++ b/source/blender/blenkernel/intern/paint.c @@ -398,10 +398,6 @@ void BKE_palette_clear(Palette *palette) Palette *BKE_palette_add(Main *bmain, const char *name) { Palette *palette = BKE_id_new(bmain, ID_PAL, name); - - /* enable fake user by default */ - id_fake_user_set(&palette->id); - return palette; } @@ -430,6 +426,12 @@ void BKE_palette_make_local(Main *bmain, Palette *palette, const bool lib_local) BKE_id_make_local_generic(bmain, &palette->id, true, lib_local); } +void BKE_palette_init(Palette *palette) +{ + /* Enable fake user by default. */ + id_fake_user_set(&palette->id); +} + /** Free (or release) any data used by this palette (does not free the palette itself). */ void BKE_palette_free(Palette *palette) { diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 802c1c6b6b9..7a217f59536 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -307,7 +307,7 @@ static PTCacheEdit *psys_orig_edit_get(ParticleSystem *psys) return psys->orig_psys->edit; } -bool psys_in_edit_mode(Depsgraph *depsgraph, ParticleSystem *psys) +bool psys_in_edit_mode(Depsgraph *depsgraph, const ParticleSystem *psys) { const ViewLayer *view_layer = DEG_get_input_view_layer(depsgraph); if (view_layer->basact == NULL) { @@ -319,7 +319,7 @@ bool psys_in_edit_mode(Depsgraph *depsgraph, ParticleSystem *psys) if (object->mode != OB_MODE_PARTICLE_EDIT) { return false; } - ParticleSystem *psys_orig = psys_orig_get(psys); + const ParticleSystem *psys_orig = psys_orig_get((ParticleSystem *)psys); return (psys_orig->edit || psys->pointcache->edit) && (use_render_params == false); } diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c index b3f1cbf6a1f..f5dd7ef794b 100644 --- a/source/blender/blenkernel/intern/smoke.c +++ b/source/blender/blenkernel/intern/smoke.c @@ -664,6 +664,7 @@ void smokeModifier_copy(const struct SmokeModifierData *smd, struct SmokeModifie tsds->data_depth = sds->data_depth; tsds->cache_file_format = sds->cache_file_format; + tsds->display_thickness = sds->display_thickness; tsds->slice_method = sds->slice_method; tsds->axis_slice_method = sds->axis_slice_method; tsds->slice_per_voxel = sds->slice_per_voxel; @@ -673,6 +674,8 @@ void smokeModifier_copy(const struct SmokeModifierData *smd, struct SmokeModifie tsds->vector_draw_type = sds->vector_draw_type; tsds->vector_scale = sds->vector_scale; + tsds->use_coba = sds->use_coba; + tsds->coba_field = sds->coba_field; if (sds->coba) { tsds->coba = MEM_dupallocN(sds->coba); } diff --git a/source/blender/blenlib/BLI_link_utils.h b/source/blender/blenlib/BLI_link_utils.h index 5322547ac08..7a1a13a6b31 100644 --- a/source/blender/blenlib/BLI_link_utils.h +++ b/source/blender/blenlib/BLI_link_utils.h @@ -47,6 +47,15 @@ (list)->last = link; \ } (void)0 +/* Use for inserting after a certain element. */ +#define BLI_LINKS_INSERT_AFTER(list, node, link) { \ + if ((node)->next == NULL) { \ + (list)->last = link; \ + } \ + (link)->next = (node)->next; \ + (node)->next = link; \ +} (void)0 + #define BLI_LINKS_FREE(list) { \ while (list) { \ void *next = list->next; \ diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c index b3ab33312ba..52bc27caa1f 100644 --- a/source/blender/blenlib/intern/path_util.c +++ b/source/blender/blenlib/intern/path_util.c @@ -1202,12 +1202,12 @@ bool BLI_path_program_search( do { temp = strchr(path, separator); if (temp) { - strncpy(filename, path, temp - path); + memcpy(filename, path, temp - path); filename[temp - path] = 0; path = temp + 1; } else { - strncpy(filename, path, sizeof(filename)); + BLI_strncpy(filename, path, sizeof(filename)); } BLI_path_append(filename, maxlen, name); diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 275d14dbca3..bae71fba036 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -5168,6 +5168,9 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb) smd->domain->tex = NULL; smd->domain->tex_shadow = NULL; smd->domain->tex_flame = NULL; + smd->domain->tex_flame_coba = NULL; + smd->domain->tex_coba = NULL; + smd->domain->tex_field = NULL; smd->domain->tex_velocity_x = NULL; smd->domain->tex_velocity_y = NULL; smd->domain->tex_velocity_z = NULL; diff --git a/source/blender/blenloader/intern/versioning_userdef.c b/source/blender/blenloader/intern/versioning_userdef.c index cf5087b848b..b04acf6016c 100644 --- a/source/blender/blenloader/intern/versioning_userdef.c +++ b/source/blender/blenloader/intern/versioning_userdef.c @@ -57,6 +57,14 @@ static void do_versions_theme(UserDef *userdef, bTheme *btheme) copy_v4_v4_char(btheme->tnla.anim_preview_range, btheme->tnla.anim_active); copy_v4_v4_char(btheme->tipo.anim_preview_range, btheme->tact.anim_active); } + + if (!USER_VERSION_ATLEAST(280, 26)) { + copy_v4_v4_char(btheme->tui.icon_collection, U_theme_default.tui.icon_collection); + copy_v4_v4_char(btheme->tui.icon_object, U_theme_default.tui.icon_object); + copy_v4_v4_char(btheme->tui.icon_object_data, U_theme_default.tui.icon_object_data); + copy_v4_v4_char(btheme->tui.icon_modifier, U_theme_default.tui.icon_modifier); + copy_v4_v4_char(btheme->tui.icon_shading, U_theme_default.tui.icon_shading); + } #undef USER_VERSION_ATLEAST } diff --git a/source/blender/bmesh/intern/bmesh_mesh_conv.c b/source/blender/bmesh/intern/bmesh_mesh_conv.c index 7e1e1c53a8f..52d9d2cf445 100644 --- a/source/blender/bmesh/intern/bmesh_mesh_conv.c +++ b/source/blender/bmesh/intern/bmesh_mesh_conv.c @@ -946,3 +946,152 @@ void BM_mesh_bm_to_me( /* to be removed as soon as COW is enabled by default. */ BKE_mesh_runtime_clear_geometry(me); } + +/** + * A version of #BM_mesh_bm_to_me intended for getting the mesh to pass to the modifier stack for evaluation, + * instad of mode switching (where we make sure all data is kept and do expensive lookups to maintain shape keys). + * + * Key differences: + * + * - Don't support merging with existing mesh. + * - Ignore shape-keys. + * - Ignore vertex-parents. + * - Ignore selection history. + * - Uses simpler method to calculate #ME_EDGEDRAW + * - Uses #CD_MASK_DERIVEDMESH instead of #CD_MASK_MESH. + * + * \note Was `cddm_from_bmesh_ex` in 2.7x, removed `MFace` support. + */ +void BM_mesh_bm_to_me_for_eval(BMesh *bm, Mesh *dm, const int64_t cd_mask_extra) +{ + /* must be an empty mesh. */ + BLI_assert(dm->totvert == 0); + BLI_assert((cd_mask_extra & CD_MASK_SHAPEKEY) == 0); + + dm->totvert = bm->totvert; + dm->totedge = bm->totedge; + dm->totface = 0; + dm->totloop = bm->totloop; + dm->totpoly = bm->totface; + + CustomData_add_layer(&dm->vdata, CD_ORIGINDEX, CD_CALLOC, NULL, bm->totvert); + CustomData_add_layer(&dm->edata, CD_ORIGINDEX, CD_CALLOC, NULL, bm->totedge); + CustomData_add_layer(&dm->pdata, CD_ORIGINDEX, CD_CALLOC, NULL, bm->totface); + + CustomData_add_layer(&dm->vdata, CD_MVERT, CD_CALLOC, NULL, bm->totvert); + CustomData_add_layer(&dm->edata, CD_MEDGE, CD_CALLOC, NULL, bm->totedge); + CustomData_add_layer(&dm->ldata, CD_MLOOP, CD_CALLOC, NULL, bm->totloop); + CustomData_add_layer(&dm->pdata, CD_MPOLY, CD_CALLOC, NULL, bm->totface); + + BKE_mesh_update_customdata_pointers(dm, false); + + BMIter iter; + BMVert *eve; + BMEdge *eed; + BMFace *efa; + MVert *mvert = dm->mvert; + MEdge *medge = dm->medge; + MLoop *mloop = dm->mloop; + MPoly *mpoly = dm->mpoly; + int *index, add_orig; + unsigned int i, j; + + const int cd_vert_bweight_offset = CustomData_get_offset(&bm->vdata, CD_BWEIGHT); + const int cd_edge_bweight_offset = CustomData_get_offset(&bm->edata, CD_BWEIGHT); + const int cd_edge_crease_offset = CustomData_get_offset(&bm->edata, CD_CREASE); + + dm->runtime.deformed_only = true; + + /* don't add origindex layer if one already exists */ + add_orig = !CustomData_has_layer(&bm->pdata, CD_ORIGINDEX); + + /* don't process shapekeys, we only feed them through the modifier stack as needed, + * e.g. for applying modifiers or the like*/ + const CustomDataMask mask = (CD_MASK_DERIVEDMESH | cd_mask_extra) & ~CD_MASK_SHAPEKEY; + CustomData_merge(&bm->vdata, &dm->vdata, mask, CD_CALLOC, dm->totvert); + CustomData_merge(&bm->edata, &dm->edata, mask, CD_CALLOC, dm->totedge); + CustomData_merge(&bm->ldata, &dm->ldata, mask, CD_CALLOC, dm->totloop); + CustomData_merge(&bm->pdata, &dm->pdata, mask, CD_CALLOC, dm->totpoly); + + index = CustomData_get_layer(&dm->vdata, CD_ORIGINDEX); + + BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) { + MVert *mv = &mvert[i]; + + copy_v3_v3(mv->co, eve->co); + + BM_elem_index_set(eve, i); /* set_inline */ + + normal_float_to_short_v3(mv->no, eve->no); + + mv->flag = BM_vert_flag_to_mflag(eve); + + if (cd_vert_bweight_offset != -1) mv->bweight = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eve, cd_vert_bweight_offset); + + if (add_orig) *index++ = i; + + CustomData_from_bmesh_block(&bm->vdata, &dm->vdata, eve->head.data, i); + } + bm->elem_index_dirty &= ~BM_VERT; + + index = CustomData_get_layer(&dm->edata, CD_ORIGINDEX); + BM_ITER_MESH_INDEX (eed, &iter, bm, BM_EDGES_OF_MESH, i) { + MEdge *med = &medge[i]; + + BM_elem_index_set(eed, i); /* set_inline */ + + med->v1 = BM_elem_index_get(eed->v1); + med->v2 = BM_elem_index_get(eed->v2); + + med->flag = BM_edge_flag_to_mflag(eed); + + /* handle this differently to editmode switching, + * only enable draw for single user edges rather then calculating angle */ + if ((med->flag & ME_EDGEDRAW) == 0) { + if (eed->l && eed->l == eed->l->radial_next) { + med->flag |= ME_EDGEDRAW; + } + } + + if (cd_edge_crease_offset != -1) med->crease = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eed, cd_edge_crease_offset); + if (cd_edge_bweight_offset != -1) med->bweight = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eed, cd_edge_bweight_offset); + + CustomData_from_bmesh_block(&bm->edata, &dm->edata, eed->head.data, i); + if (add_orig) *index++ = i; + } + bm->elem_index_dirty &= ~BM_EDGE; + + index = CustomData_get_layer(&dm->pdata, CD_ORIGINDEX); + j = 0; + BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, i) { + BMLoop *l_iter; + BMLoop *l_first; + MPoly *mp = &mpoly[i]; + + BM_elem_index_set(efa, i); /* set_inline */ + + mp->totloop = efa->len; + mp->flag = BM_face_flag_to_mflag(efa); + mp->loopstart = j; + mp->mat_nr = efa->mat_nr; + + l_iter = l_first = BM_FACE_FIRST_LOOP(efa); + do { + mloop->v = BM_elem_index_get(l_iter->v); + mloop->e = BM_elem_index_get(l_iter->e); + CustomData_from_bmesh_block(&bm->ldata, &dm->ldata, l_iter->head.data, j); + + BM_elem_index_set(l_iter, j); /* set_inline */ + + j++; + mloop++; + } while ((l_iter = l_iter->next) != l_first); + + CustomData_from_bmesh_block(&bm->pdata, &dm->pdata, efa->head.data, i); + + if (add_orig) *index++ = i; + } + bm->elem_index_dirty &= ~(BM_FACE | BM_LOOP); + + dm->cd_flag = BM_mesh_cd_flag_from_bmesh(bm); +} diff --git a/source/blender/bmesh/intern/bmesh_mesh_conv.h b/source/blender/bmesh/intern/bmesh_mesh_conv.h index 008960e7f6e..a8bef1ee2a2 100644 --- a/source/blender/bmesh/intern/bmesh_mesh_conv.h +++ b/source/blender/bmesh/intern/bmesh_mesh_conv.h @@ -65,4 +65,9 @@ void BM_mesh_bm_to_me( const struct BMeshToMeshParams *params) ATTR_NONNULL(2, 3, 4); +void BM_mesh_bm_to_me_for_eval( + BMesh *bm, struct Mesh *me, const int64_t cd_mask_extra) +ATTR_NONNULL(1, 2); + + #endif /* __BMESH_MESH_CONV_H__ */ diff --git a/source/blender/bmesh/operators/bmo_subdivide.c b/source/blender/bmesh/operators/bmo_subdivide.c index c8ba2134a73..66730f8c837 100644 --- a/source/blender/bmesh/operators/bmo_subdivide.c +++ b/source/blender/bmesh/operators/bmo_subdivide.c @@ -182,15 +182,12 @@ static void interp_slerp_co_no_v3( /* calculate sphere 'center' */ { /* use point on plane to */ - float plane_a[4], plane_b[4], plane_c[4]; float no_mid[3], no_ortho[3]; /* pass this as an arg instead */ #if 0 float no_dir[3]; #endif - float v_a_no_ortho[3], v_b_no_ortho[3]; - add_v3_v3v3(no_mid, no_a, no_b); normalize_v3(no_mid); @@ -200,24 +197,28 @@ static void interp_slerp_co_no_v3( #endif /* axis of slerp */ + bool center_ok = false; cross_v3_v3v3(no_ortho, no_mid, no_dir); - normalize_v3(no_ortho); - - /* create planes */ - cross_v3_v3v3(v_a_no_ortho, no_ortho, no_a); - cross_v3_v3v3(v_b_no_ortho, no_ortho, no_b); - project_v3_plane(v_a_no_ortho, no_ortho, v_a_no_ortho); - project_v3_plane(v_b_no_ortho, no_ortho, v_b_no_ortho); - - plane_from_point_normal_v3(plane_a, co_a, v_a_no_ortho); - plane_from_point_normal_v3(plane_b, co_b, v_b_no_ortho); - plane_from_point_normal_v3(plane_c, co_b, no_ortho); - - /* find the sphere center from 3 planes */ - if (isect_plane_plane_plane_v3(plane_a, plane_b, plane_c, center)) { - /* pass */ + if (normalize_v3(no_ortho) != 0.0f) { + float plane_a[4], plane_b[4], plane_c[4]; + float v_a_no_ortho[3], v_b_no_ortho[3]; + + /* create planes */ + cross_v3_v3v3(v_a_no_ortho, no_ortho, no_a); + cross_v3_v3v3(v_b_no_ortho, no_ortho, no_b); + project_v3_plane(v_a_no_ortho, no_ortho, v_a_no_ortho); + project_v3_plane(v_b_no_ortho, no_ortho, v_b_no_ortho); + + plane_from_point_normal_v3(plane_a, co_a, v_a_no_ortho); + plane_from_point_normal_v3(plane_b, co_b, v_b_no_ortho); + plane_from_point_normal_v3(plane_c, co_b, no_ortho); + + /* find the sphere center from 3 planes */ + if (isect_plane_plane_plane_v3(plane_a, plane_b, plane_c, center)) { + center_ok = true; + } } - else { + if (center_ok == false) { mid_v3_v3v3(center, co_a, co_b); } } diff --git a/source/blender/collada/AnimationImporter.h b/source/blender/collada/AnimationImporter.h index f63329158f0..ff49bc369cf 100644 --- a/source/blender/collada/AnimationImporter.h +++ b/source/blender/collada/AnimationImporter.h @@ -181,11 +181,12 @@ public: // prerequisites: // animlist_map - map animlist id -> animlist // curve_map - map anim id -> curve(s) - Object * translate_animation_OLD(Main *bmain, COLLADAFW::Node *node, - std::map<COLLADAFW::UniqueId, Object*>& object_map, - std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& root_map, - COLLADAFW::Transformation::TransformationType tm_type, - Object *par_job = NULL); + Object *translate_animation_OLD( + Main *bmain, COLLADAFW::Node *node, + std::map<COLLADAFW::UniqueId, Object*>& object_map, + std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& root_map, + COLLADAFW::Transformation::TransformationType tm_type, + Object *par_job = NULL); void find_frames( std::vector<float>* frames, std::vector<FCurve*>* curves ); void find_frames_old( std::vector<float>* frames, COLLADAFW::Node * node, COLLADAFW::Transformation::TransformationType tm_type ); diff --git a/source/blender/collada/ArmatureExporter.cpp b/source/blender/collada/ArmatureExporter.cpp index 85b9d3297ca..a77385c8d00 100644 --- a/source/blender/collada/ArmatureExporter.cpp +++ b/source/blender/collada/ArmatureExporter.cpp @@ -69,7 +69,7 @@ void ArmatureExporter::add_armature_bones(bContext *C, Depsgraph *depsgraph, Obj Main *bmain = CTX_data_main(C); // write bone nodes - bArmature * armature = (bArmature *)ob_arm->data; + bArmature *armature = (bArmature *)ob_arm->data; bool is_edited = armature->edbo != NULL; if (!is_edited) diff --git a/source/blender/collada/ArmatureImporter.cpp b/source/blender/collada/ArmatureImporter.cpp index a2c367e5076..32c7363a994 100644 --- a/source/blender/collada/ArmatureImporter.cpp +++ b/source/blender/collada/ArmatureImporter.cpp @@ -463,11 +463,11 @@ void ArmatureImporter::create_armature_bones(Main *bmain, std::vector<Object *> if (!ob_arm) continue; - bArmature * armature = (bArmature *)ob_arm->data; + bArmature *armature = (bArmature *)ob_arm->data; if (!armature) continue; - char * bone_name = (char *)bc_get_joint_name(*ri); + char *bone_name = (char *)bc_get_joint_name(*ri); Bone *bone = BKE_armature_find_bone_name(armature, bone_name); if (bone) { fprintf(stderr, "Reuse of child bone [%s] as root bone in same Armature is not supported.\n", bone_name); @@ -592,7 +592,7 @@ Object *ArmatureImporter::create_armature_bones(Main *bmain, SkinInfo& skin) } // enter armature edit mode - bArmature * armature = (bArmature *)ob_arm->data; + bArmature *armature = (bArmature *)ob_arm->data; ED_armature_to_edit(armature); totbone = 0; diff --git a/source/blender/collada/ControllerExporter.cpp b/source/blender/collada/ControllerExporter.cpp index cb8903200f1..84812451c05 100644 --- a/source/blender/collada/ControllerExporter.cpp +++ b/source/blender/collada/ControllerExporter.cpp @@ -403,7 +403,7 @@ void ControllerExporter::add_weight_extras(Key *key) // can also try the base element and param alternative COLLADASW::BaseExtraTechnique extra; - KeyBlock * kb = (KeyBlock *)key->block.first; + KeyBlock *kb = (KeyBlock *)key->block.first; //skip the basis kb = kb->next; for (; kb; kb = kb->next) { diff --git a/source/blender/collada/GeometryExporter.cpp b/source/blender/collada/GeometryExporter.cpp index 0beded56b3b..b155160697b 100644 --- a/source/blender/collada/GeometryExporter.cpp +++ b/source/blender/collada/GeometryExporter.cpp @@ -151,9 +151,9 @@ void GeometryExporter::operator()(Object *ob) closeGeometry(); if (this->export_settings->include_shapekeys) { - Key * key = BKE_key_from_object(ob); + Key *key = BKE_key_from_object(ob); if (key) { - KeyBlock * kb = (KeyBlock *)key->block.first; + KeyBlock *kb = (KeyBlock *)key->block.first; //skip the basis kb = kb->next; for (; kb; kb = kb->next) { diff --git a/source/blender/collada/GeometryExporter.h b/source/blender/collada/GeometryExporter.h index 5d74124b07a..e47b3f4eee8 100644 --- a/source/blender/collada/GeometryExporter.h +++ b/source/blender/collada/GeometryExporter.h @@ -128,7 +128,7 @@ private: const ExportSettings *export_settings; - Mesh * get_mesh(Scene *sce, Object *ob, int apply_modifiers); + Mesh *get_mesh(Scene *sce, Object *ob, int apply_modifiers); }; struct GeometryFunctor { diff --git a/source/blender/collada/collada_utils.cpp b/source/blender/collada/collada_utils.cpp index aa97622cd66..4fae65fab38 100644 --- a/source/blender/collada/collada_utils.cpp +++ b/source/blender/collada/collada_utils.cpp @@ -610,7 +610,7 @@ inline bool isInteger(const std::string & s) { if (s.empty() || ((!isdigit(s[0])) && (s[0] != '-') && (s[0] != '+'))) return false; - char * p; + char *p; strtol(s.c_str(), &p, 10); return (*p == 0); diff --git a/source/blender/compositor/intern/COM_NodeOperation.cpp b/source/blender/compositor/intern/COM_NodeOperation.cpp index 1063386aa58..09b05313898 100644 --- a/source/blender/compositor/intern/COM_NodeOperation.cpp +++ b/source/blender/compositor/intern/COM_NodeOperation.cpp @@ -171,7 +171,7 @@ bool NodeOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOper rcti tempOutput; bool first = true; for (int i = 0; i < getNumberOfInputSockets(); i ++) { - NodeOperation * inputOperation = this->getInputOperation(i); + NodeOperation *inputOperation = this->getInputOperation(i); if (inputOperation && inputOperation->determineDependingAreaOfInterest(input, readOperation, &tempOutput)) { if (first) { output->xmin = tempOutput.xmin; diff --git a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp index a252af053cc..b40051440af 100644 --- a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp @@ -288,7 +288,7 @@ void InverseSearchRadiusOperation::initExecution() void *InverseSearchRadiusOperation::initializeTileData(rcti *rect) { - MemoryBuffer * data = new MemoryBuffer(COM_DT_COLOR, rect); + MemoryBuffer *data = new MemoryBuffer(COM_DT_COLOR, rect); float *buffer = data->getBuffer(); int x, y; int width = this->m_inputRadius->getWidth(); diff --git a/source/blender/datatoc/datatoc_icon_split.py b/source/blender/datatoc/datatoc_icon_split.py index 87f3fdae478..44fedca4398 100755 --- a/source/blender/datatoc/datatoc_icon_split.py +++ b/source/blender/datatoc/datatoc_icon_split.py @@ -140,6 +140,7 @@ def dice_icon_name( if match: if l.find('DEF_ICON_BLANK') == -1: icon_name = match.group(1).lower() + print(icon_name) _dice_icon_name_cache[count] = icon_name count += 1 # ---- Done with icon cache diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc index 5b52843c1fe..d7575c35e45 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc @@ -466,8 +466,8 @@ void update_mesh_edit_mode_pointers(const Depsgraph *depsgraph, mesh_cow->edit_btmesh = (BMEditMesh *)MEM_dupallocN(mesh_orig->edit_btmesh); mesh_cow->edit_btmesh->ob = (Object *)depsgraph->get_cow_id(&mesh_orig->edit_btmesh->ob->id); - mesh_cow->edit_btmesh->derivedFinal = NULL; - mesh_cow->edit_btmesh->derivedCage = NULL; + mesh_cow->edit_btmesh->mesh_eval_cage = NULL; + mesh_cow->edit_btmesh->mesh_eval_final = NULL; } /* Edit data is stored and owned by original datablocks, copied ones diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index 4f9a90ba4f0..be742868cd6 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -269,7 +269,7 @@ data_to_c_simple(modes/shaders/edit_mesh_overlay_frag.glsl SRC) data_to_c_simple(modes/shaders/edit_mesh_overlay_vert.glsl SRC) data_to_c_simple(modes/shaders/edit_mesh_overlay_geom_tri.glsl SRC) data_to_c_simple(modes/shaders/edit_mesh_overlay_geom_edge.glsl SRC) -data_to_c_simple(modes/shaders/edit_mesh_overlay_loosevert_vert.glsl SRC) +data_to_c_simple(modes/shaders/edit_mesh_overlay_points_vert.glsl SRC) data_to_c_simple(modes/shaders/edit_mesh_overlay_facedot_frag.glsl SRC) data_to_c_simple(modes/shaders/edit_mesh_overlay_facedot_vert.glsl SRC) data_to_c_simple(modes/shaders/edit_mesh_overlay_ghost_clear_vert.glsl SRC) @@ -337,6 +337,8 @@ data_to_c_simple(engines/gpencil/shaders/gpencil_edit_point_frag.glsl SRC) data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl SRC) data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_colorize_frag.glsl SRC) data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_flip_frag.glsl SRC) +data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_glow_prepare_frag.glsl SRC) +data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_glow_resolve_frag.glsl SRC) data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_light_frag.glsl SRC) data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_pixel_frag.glsl SRC) data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_rim_prepare_frag.glsl SRC) diff --git a/source/blender/draw/engines/basic/basic_engine.c b/source/blender/draw/engines/basic/basic_engine.c index 2e3fdf37bdb..9dc8c8f2f34 100644 --- a/source/blender/draw/engines/basic/basic_engine.c +++ b/source/blender/draw/engines/basic/basic_engine.c @@ -112,7 +112,9 @@ static void basic_cache_populate(void *vedata, Object *ob) { BASIC_StorageList *stl = ((BASIC_Data *)vedata)->stl; - if (!DRW_object_is_renderable(ob)) { + /* TODO(fclem) fix selection of smoke domains. */ + + if (!DRW_object_is_renderable(ob) || (ob->dt < OB_SOLID)) { return; } @@ -125,7 +127,7 @@ static void basic_cache_populate(void *vedata, Object *ob) if (!psys_check_enabled(ob, psys, false)) { continue; } - if (!DRW_check_psys_visible_within_active_context(ob, psys)) { + if (!DRW_object_is_visible_psys_in_active_context(ob, psys)) { continue; } ParticleSettings *part = psys->part; diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c index 32de4266c82..bea7d000181 100644 --- a/source/blender/draw/engines/eevee/eevee_engine.c +++ b/source/blender/draw/engines/eevee/eevee_engine.c @@ -137,7 +137,7 @@ void EEVEE_cache_populate(void *vedata, Object *ob) } if (DRW_object_is_renderable(ob) && - DRW_check_object_visible_within_active_context(ob)) + DRW_object_is_visible_in_active_context(ob)) { if (ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) { EEVEE_materials_cache_populate(vedata, sldata, ob, &cast_shadow); diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c index a458be040fc..7319572d7eb 100644 --- a/source/blender/draw/engines/eevee/eevee_lights.c +++ b/source/blender/draw/engines/eevee/eevee_lights.c @@ -628,12 +628,12 @@ static void eevee_light_setup(Object *ob, EEVEE_Light *evli) evli->radius = max_ff(0.001f, la->area_size); } else if (la->type == LA_AREA) { - evli->sizex = max_ff(0.0001f, la->area_size * scale[0] * 0.5f); + evli->sizex = max_ff(0.003f, la->area_size * scale[0] * 0.5f); if (ELEM(la->area_shape, LA_AREA_RECT, LA_AREA_ELLIPSE)) { - evli->sizey = max_ff(0.0001f, la->area_sizey * scale[1] * 0.5f); + evli->sizey = max_ff(0.003f, la->area_sizey * scale[1] * 0.5f); } else { - evli->sizey = max_ff(0.0001f, la->area_size * scale[1] * 0.5f); + evli->sizey = max_ff(0.003f, la->area_size * scale[1] * 0.5f); } } else { diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c index 2d27bb8e705..38c2fb50f81 100644 --- a/source/blender/draw/engines/eevee/eevee_materials.c +++ b/source/blender/draw/engines/eevee/eevee_materials.c @@ -1080,23 +1080,23 @@ void EEVEE_materials_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) } } -#define ADD_SHGROUP_CALL(shgrp, ob, geom, oedata) do { \ +#define ADD_SHGROUP_CALL(shgrp, ob, ma, geom, oedata) do { \ if (is_sculpt_mode_draw) { \ DRW_shgroup_call_sculpt_add(shgrp, ob, ob->obmat); \ } \ else { \ if (oedata) { \ - DRW_shgroup_call_object_add_with_callback(shgrp, geom, ob, EEVEE_lightprobes_obj_visibility_cb, oedata); \ + DRW_shgroup_call_object_add_with_callback(shgrp, geom, ob, ma, EEVEE_lightprobes_obj_visibility_cb, oedata); \ } \ else { \ - DRW_shgroup_call_object_add(shgrp, geom, ob); \ + DRW_shgroup_call_object_add_ex(shgrp, geom, ob, ma, false); \ } \ } \ } while (0) -#define ADD_SHGROUP_CALL_SAFE(shgrp, ob, geom, oedata) do { \ +#define ADD_SHGROUP_CALL_SAFE(shgrp, ob, ma, geom, oedata) do { \ if (shgrp) { \ - ADD_SHGROUP_CALL(shgrp, ob, geom, oedata); \ + ADD_SHGROUP_CALL(shgrp, ob, ma, geom, oedata); \ } \ } while (0) @@ -1498,95 +1498,97 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sld */ bool use_volume_material = (gpumat_array[0] && GPU_material_use_domain_volume(gpumat_array[0])); - /* Get per-material split surface */ - char *auto_layer_names; - int *auto_layer_is_srgb; - int auto_layer_count; - struct GPUBatch **mat_geom = DRW_cache_object_surface_material_get( - ob, gpumat_array, materials_len, - &auto_layer_names, - &auto_layer_is_srgb, - &auto_layer_count); - if (mat_geom) { - for (int i = 0; i < materials_len; ++i) { - if (mat_geom[i] == NULL) { - continue; - } - EEVEE_ObjectEngineData *oedata = NULL; - Material *ma = give_current_material(ob, i + 1); - - if (ma == NULL) - ma = &defmaterial; - - /* Do not render surface if we are rendering a volume object - * and do not have a surface closure. */ - if (use_volume_material && - (gpumat_array[i] && !GPU_material_use_domain_surface(gpumat_array[i]))) - { - continue; - } + if (ob->dt >= OB_SOLID) { + /* Get per-material split surface */ + char *auto_layer_names; + int *auto_layer_is_srgb; + int auto_layer_count; + struct GPUBatch **mat_geom = DRW_cache_object_surface_material_get( + ob, gpumat_array, materials_len, + &auto_layer_names, + &auto_layer_is_srgb, + &auto_layer_count); + if (mat_geom) { + for (int i = 0; i < materials_len; ++i) { + if (mat_geom[i] == NULL) { + continue; + } + EEVEE_ObjectEngineData *oedata = NULL; + Material *ma = give_current_material(ob, i + 1); + + if (ma == NULL) + ma = &defmaterial; + + /* Do not render surface if we are rendering a volume object + * and do not have a surface closure. */ + if (use_volume_material && + (gpumat_array[i] && !GPU_material_use_domain_surface(gpumat_array[i]))) + { + continue; + } - /* XXX TODO rewrite this to include the dupli objects. - * This means we cannot exclude dupli objects from reflections!!! */ - if ((ob->base_flag & BASE_FROMDUPLI) == 0) { - oedata = EEVEE_object_data_ensure(ob); - oedata->ob = ob; - oedata->test_data = &sldata->probes->vis_data; - } + /* XXX TODO rewrite this to include the dupli objects. + * This means we cannot exclude dupli objects from reflections!!! */ + if ((ob->base_flag & BASE_FROMDUPLI) == 0) { + oedata = EEVEE_object_data_ensure(ob); + oedata->ob = ob; + oedata->test_data = &sldata->probes->vis_data; + } - /* Shading pass */ - ADD_SHGROUP_CALL(shgrp_array[i], ob, mat_geom[i], oedata); + /* Shading pass */ + ADD_SHGROUP_CALL(shgrp_array[i], ob, ma, mat_geom[i], oedata); - /* Depth Prepass */ - ADD_SHGROUP_CALL_SAFE(shgrp_depth_array[i], ob, mat_geom[i], oedata); - ADD_SHGROUP_CALL_SAFE(shgrp_depth_clip_array[i], ob, mat_geom[i], oedata); + /* Depth Prepass */ + ADD_SHGROUP_CALL_SAFE(shgrp_depth_array[i], ob, ma, mat_geom[i], oedata); + ADD_SHGROUP_CALL_SAFE(shgrp_depth_clip_array[i], ob, ma, mat_geom[i], oedata); - char *name = auto_layer_names; - for (int j = 0; j < auto_layer_count; ++j) { - /* TODO don't add these uniform when not needed (default pass shaders). */ - if (shgrp_array[i]) { - DRW_shgroup_uniform_bool(shgrp_array[i], name, &auto_layer_is_srgb[j], 1); - } - if (shgrp_depth_array[i]) { - DRW_shgroup_uniform_bool(shgrp_depth_array[i], name, &auto_layer_is_srgb[j], 1); - } - if (shgrp_depth_clip_array[i]) { - DRW_shgroup_uniform_bool(shgrp_depth_clip_array[i], name, &auto_layer_is_srgb[j], 1); + char *name = auto_layer_names; + for (int j = 0; j < auto_layer_count; ++j) { + /* TODO don't add these uniform when not needed (default pass shaders). */ + if (shgrp_array[i]) { + DRW_shgroup_uniform_bool(shgrp_array[i], name, &auto_layer_is_srgb[j], 1); + } + if (shgrp_depth_array[i]) { + DRW_shgroup_uniform_bool(shgrp_depth_array[i], name, &auto_layer_is_srgb[j], 1); + } + if (shgrp_depth_clip_array[i]) { + DRW_shgroup_uniform_bool(shgrp_depth_clip_array[i], name, &auto_layer_is_srgb[j], 1); + } + /* Go to next layer name. */ + while (*name != '\0') { name++; } + name += 1; } - /* Go to next layer name. */ - while (*name != '\0') { name++; } - name += 1; - } - /* Shadow Pass */ - if (ma->use_nodes && ma->nodetree && (ma->blend_method != MA_BM_SOLID)) { - struct GPUMaterial *gpumat; - switch (ma->blend_shadow) { - case MA_BS_SOLID: - EEVEE_lights_cache_shcaster_add( - sldata, stl, mat_geom[i], ob); - *cast_shadow = true; - break; - case MA_BS_CLIP: - gpumat = EEVEE_material_mesh_depth_get(scene, ma, false, true); - EEVEE_lights_cache_shcaster_material_add( - sldata, psl, gpumat, mat_geom[i], ob, &ma->alpha_threshold); - *cast_shadow = true; - break; - case MA_BS_HASHED: - gpumat = EEVEE_material_mesh_depth_get(scene, ma, true, true); - EEVEE_lights_cache_shcaster_material_add( - sldata, psl, gpumat, mat_geom[i], ob, NULL); - *cast_shadow = true; - break; - case MA_BS_NONE: - default: - break; + /* Shadow Pass */ + if (ma->use_nodes && ma->nodetree && (ma->blend_method != MA_BM_SOLID)) { + struct GPUMaterial *gpumat; + switch (ma->blend_shadow) { + case MA_BS_SOLID: + EEVEE_lights_cache_shcaster_add( + sldata, stl, mat_geom[i], ob); + *cast_shadow = true; + break; + case MA_BS_CLIP: + gpumat = EEVEE_material_mesh_depth_get(scene, ma, false, true); + EEVEE_lights_cache_shcaster_material_add( + sldata, psl, gpumat, mat_geom[i], ob, &ma->alpha_threshold); + *cast_shadow = true; + break; + case MA_BS_HASHED: + gpumat = EEVEE_material_mesh_depth_get(scene, ma, true, true); + EEVEE_lights_cache_shcaster_material_add( + sldata, psl, gpumat, mat_geom[i], ob, NULL); + *cast_shadow = true; + break; + case MA_BS_NONE: + default: + break; + } + } + else { + EEVEE_lights_cache_shcaster_add(sldata, stl, mat_geom[i], ob); + *cast_shadow = true; } - } - else { - EEVEE_lights_cache_shcaster_add(sldata, stl, mat_geom[i], ob); - *cast_shadow = true; } } } @@ -1617,7 +1619,7 @@ void EEVEE_hair_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata, if (!psys_check_enabled(ob, psys, false)) { continue; } - if (!DRW_check_psys_visible_within_active_context(ob, psys)) { + if (!DRW_object_is_visible_psys_in_active_context(ob, psys)) { continue; } ParticleSettings *part = psys->part; diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c index 80d8c066a44..e24142e3f71 100644 --- a/source/blender/draw/engines/eevee/eevee_render.c +++ b/source/blender/draw/engines/eevee/eevee_render.c @@ -163,7 +163,7 @@ void EEVEE_render_cache( EEVEE_hair_cache_populate(vedata, sldata, ob, &cast_shadow); } - if (DRW_check_object_visible_within_active_context(ob)) { + if (DRW_object_is_visible_in_active_context(ob)) { if (ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) { EEVEE_materials_cache_populate(vedata, sldata, ob, &cast_shadow); } @@ -191,6 +191,12 @@ static void eevee_render_result_combined( rect->xmin, rect->ymin, BLI_rcti_size_x(rect), BLI_rcti_size_y(rect), 4, 0, rp->rect); + + /* Premult alpha */ + int pixels_len = BLI_rcti_size_x(rect) * BLI_rcti_size_y(rect); + for (int i = 0; i < pixels_len * 4; i += 4) { + mul_v3_fl(rp->rect + i, rp->rect[i + 3]); + } } static void eevee_render_result_subsurface( @@ -543,6 +549,9 @@ void EEVEE_render_draw(EEVEE_Data *vedata, RenderEngine *engine, RenderLayer *rl /* Post Process */ EEVEE_draw_effects(sldata, vedata); + /* XXX Seems to fix TDR issue with NVidia drivers on linux. */ + glFinish(); + RE_engine_update_progress(engine, (float)(render_samples++) / (float)tot_sample); } diff --git a/source/blender/draw/engines/eevee/eevee_volumes.c b/source/blender/draw/engines/eevee/eevee_volumes.c index 256838609a6..4fffa3f285c 100644 --- a/source/blender/draw/engines/eevee/eevee_volumes.c +++ b/source/blender/draw/engines/eevee/eevee_volumes.c @@ -46,6 +46,7 @@ #include "eevee_private.h" #include "GPU_draw.h" #include "GPU_texture.h" +#include "GPU_material.h" static struct { char *volumetric_common_lib; @@ -471,13 +472,13 @@ void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata, EEVEE_Data *ved struct GPUMaterial *mat = EEVEE_material_mesh_volume_get(scene, ma); - DRWShadingGroup *grp = DRW_shgroup_material_empty_tri_batch_create(mat, vedata->psl->volumetric_objects_ps, sldata->common_data.vol_tex_size[2]); - /* If shader failed to compile or is currently compiling. */ - if (grp == NULL) { + if (GPU_material_status(mat) != GPU_MAT_SUCCESS) { return; } + DRWShadingGroup *grp = DRW_shgroup_material_empty_tri_batch_create(mat, vedata->psl->volumetric_objects_ps, sldata->common_data.vol_tex_size[2]); + /* Making sure it's updated. */ invert_m4_m4(ob->imat, ob->obmat); diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl index 5f641c5d490..36c4562e137 100644 --- a/source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl @@ -75,10 +75,11 @@ vec3 light_volume(LightData ld, vec4 l_vector) } else if (ld.l_type == SUN) { power = (4.0f * ld.l_radius * ld.l_radius * M_2PI) * (1.0 / 12.5); /* Removing area light power*/ - power *= M_2PI * 0.78; /* Matching cycles with point light. */ + power *= M_PI * 0.5; /* Matching cycles. */ } else { power = (4.0 * ld.l_radius * ld.l_radius) * (1.0 /10.0); + power *= M_2PI; /* Matching cycles with point light. */ } /* OPTI: find a better way than calculating this on the fly */ diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c index 40245810f42..8e7d16e60ba 100644 --- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c +++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c @@ -414,7 +414,7 @@ GPUBatch *DRW_gpencil_get_fill_geom(Object *ob, bGPDstroke *gps, const float col /* Calculate triangles cache for filling area (must be done only after changes) */ if ((gps->flag & GP_STROKE_RECALC_CACHES) || (gps->tot_triangles == 0) || (gps->triangles == NULL)) { - DRW_gpencil_triangulate_stroke_fill(gps); + DRW_gpencil_triangulate_stroke_fill(ob, gps); ED_gpencil_calc_stroke_uv(ob, gps); } @@ -703,6 +703,7 @@ GPUBatch *DRW_gpencil_get_grid(Object *ob) const float grid_h = gpd->grid.scale[1] * ED_scene_grid_scale(scene, &grid_unit); const float space_w = (grid_w / gridlines); const float space_h = (grid_h / gridlines); + const float offset[2] = { gpd->grid.offset[0], gpd->grid.offset[1] }; const uint vertex_len = 2 * (gridlines * 4 + 2); @@ -722,34 +723,34 @@ GPUBatch *DRW_gpencil_get_grid(Object *ob) const float line_w = a * space_w; const float line_h = a * space_h; - set_grid_point(vbo, idx, col_grid, pos_id, color_id, -grid_w, -line_h, axis); + set_grid_point(vbo, idx, col_grid, pos_id, color_id, -grid_w + offset[0], -line_h + offset[1], axis); idx++; - set_grid_point(vbo, idx, col_grid, pos_id, color_id, +grid_w, -line_h, axis); + set_grid_point(vbo, idx, col_grid, pos_id, color_id, +grid_w + offset[0], -line_h + offset[1], axis); idx++; - set_grid_point(vbo, idx, col_grid, pos_id, color_id, -grid_w, +line_h, axis); + set_grid_point(vbo, idx, col_grid, pos_id, color_id, -grid_w + offset[0], +line_h + offset[1], axis); idx++; - set_grid_point(vbo, idx, col_grid, pos_id, color_id, +grid_w, +line_h, axis); + set_grid_point(vbo, idx, col_grid, pos_id, color_id, +grid_w + offset[0], +line_h + offset[1], axis); idx++; - set_grid_point(vbo, idx, col_grid, pos_id, color_id, -line_w, -grid_h, axis); + set_grid_point(vbo, idx, col_grid, pos_id, color_id, -line_w + offset[0], -grid_h + offset[1], axis); idx++; - set_grid_point(vbo, idx, col_grid, pos_id, color_id, -line_w, +grid_h, axis); + set_grid_point(vbo, idx, col_grid, pos_id, color_id, -line_w + offset[0], +grid_h + offset[1], axis); idx++; - set_grid_point(vbo, idx, col_grid, pos_id, color_id, +line_w, -grid_h, axis); + set_grid_point(vbo, idx, col_grid, pos_id, color_id, +line_w + offset[0], -grid_h + offset[1], axis); idx++; - set_grid_point(vbo, idx, col_grid, pos_id, color_id, +line_w, +grid_h, axis); + set_grid_point(vbo, idx, col_grid, pos_id, color_id, +line_w + offset[0], +grid_h + offset[1], axis); idx++; } /* center lines */ if (do_center) { - set_grid_point(vbo, idx, col_grid, pos_id, color_id, -grid_w, 0.0f, axis); + set_grid_point(vbo, idx, col_grid, pos_id, color_id, -grid_w + offset[0], 0.0f + offset[1], axis); idx++; - set_grid_point(vbo, idx, col_grid, pos_id, color_id, +grid_w, 0.0f, axis); + set_grid_point(vbo, idx, col_grid, pos_id, color_id, +grid_w + offset[0], 0.0f + offset[1], axis); idx++; - set_grid_point(vbo, idx, col_grid, pos_id, color_id, 0.0f, -grid_h, axis); + set_grid_point(vbo, idx, col_grid, pos_id, color_id, 0.0f + offset[0], -grid_h + offset[1], axis); idx++; - set_grid_point(vbo, idx, col_grid, pos_id, color_id, 0.0f, +grid_h, axis); + set_grid_point(vbo, idx, col_grid, pos_id, color_id, 0.0f + offset[0], +grid_h + offset[1], axis); idx++; } return GPU_batch_create_ex(GPU_PRIM_LINES, vbo, NULL, GPU_BATCH_OWNS_VBO); diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_utils.c b/source/blender/draw/engines/gpencil/gpencil_draw_utils.c index f7823a2fced..03a6f7342ab 100644 --- a/source/blender/draw/engines/gpencil/gpencil_draw_utils.c +++ b/source/blender/draw/engines/gpencil/gpencil_draw_utils.c @@ -92,7 +92,7 @@ static bool gpencil_can_draw_stroke( /* calc bounding box in 2d using flat projection data */ static void gpencil_calc_2d_bounding_box( - const float(*points2d)[2], int totpoints, float minv[2], float maxv[2], bool expand) + const float(*points2d)[2], int totpoints, float minv[2], float maxv[2]) { minv[0] = points2d[0][0]; minv[1] = points2d[0][1]; @@ -115,14 +115,12 @@ static void gpencil_calc_2d_bounding_box( maxv[1] = points2d[i][1]; } } - /* If not expanded, use a perfect square */ - if (expand == false) { - if (maxv[0] > maxv[1]) { - maxv[1] = maxv[0]; - } - else { - maxv[0] = maxv[1]; - } + /* use a perfect square */ + if (maxv[0] > maxv[1]) { + maxv[1] = maxv[0]; + } + else { + maxv[0] = maxv[1]; } } @@ -184,10 +182,12 @@ static void gpencil_stroke_2d_flat(const bGPDspoint *points, int totpoints, floa } /* Triangulate stroke for high quality fill (this is done only if cache is null or stroke was modified) */ -void DRW_gpencil_triangulate_stroke_fill(bGPDstroke *gps) +void DRW_gpencil_triangulate_stroke_fill(Object *ob, bGPDstroke *gps) { BLI_assert(gps->totpoints >= 3); + bGPdata *gpd = (bGPdata *)ob->data; + /* allocate memory for temporary areas */ gps->tot_triangles = gps->totpoints - 2; uint(*tmp_triangles)[3] = MEM_mallocN(sizeof(*tmp_triangles) * gps->tot_triangles, "GP Stroke temp triangulation"); @@ -204,7 +204,14 @@ void DRW_gpencil_triangulate_stroke_fill(bGPDstroke *gps) float minv[2]; float maxv[2]; /* first needs bounding box data */ - gpencil_calc_2d_bounding_box(points2d, gps->totpoints, minv, maxv, false); + if (gpd->flag & GP_DATA_UV_ADAPTATIVE) { + gpencil_calc_2d_bounding_box(points2d, gps->totpoints, minv, maxv); + } + else { + ARRAY_SET_ITEMS(minv, -1.0f, -1.0f); + ARRAY_SET_ITEMS(maxv, 1.0f, 1.0f); + } + /* calc uv data */ gpencil_calc_stroke_fill_uv(points2d, gps->totpoints, minv, maxv, uv); @@ -256,7 +263,7 @@ static void DRW_gpencil_recalc_geometry_caches(Object *ob, MaterialGPencilStyle if ((gps->totpoints > 2) && ((gp_style->fill_rgba[3] > GPENCIL_ALPHA_OPACITY_THRESH) || (gp_style->fill_style > 0))) { - DRW_gpencil_triangulate_stroke_fill(gps); + DRW_gpencil_triangulate_stroke_fill(ob, gps); } } diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c index 0b318bd974e..d854336cfd0 100644 --- a/source/blender/draw/engines/gpencil/gpencil_engine.c +++ b/source/blender/draw/engines/gpencil/gpencil_engine.c @@ -549,7 +549,7 @@ static void gpencil_add_draw_data(void *vedata, Object *ob) void GPENCIL_cache_populate(void *vedata, Object *ob) { /* object must be visible */ - if (!DRW_check_object_visible_within_active_context(ob)) { + if (!DRW_object_is_visible_in_active_context(ob)) { return; } diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h index df051f4697b..b8844d3c3e9 100644 --- a/source/blender/draw/engines/gpencil/gpencil_engine.h +++ b/source/blender/draw/engines/gpencil/gpencil_engine.h @@ -73,6 +73,7 @@ typedef struct tGPencilObjectCache { DRWShadingGroup *fx_pixel_sh; DRWShadingGroup *fx_rim_sh; DRWShadingGroup *fx_shadow_sh; + DRWShadingGroup *fx_glow_sh; DRWShadingGroup *fx_swirl_sh; DRWShadingGroup *fx_flip_sh; DRWShadingGroup *fx_light_sh; @@ -231,6 +232,8 @@ typedef struct GPENCIL_e_data { struct GPUShader *gpencil_fx_blur_sh; struct GPUShader *gpencil_fx_colorize_sh; struct GPUShader *gpencil_fx_flip_sh; + struct GPUShader *gpencil_fx_glow_prepare_sh; + struct GPUShader *gpencil_fx_glow_resolve_sh; struct GPUShader *gpencil_fx_light_sh; struct GPUShader *gpencil_fx_pixel_sh; struct GPUShader *gpencil_fx_rim_prepare_sh; @@ -303,7 +306,7 @@ void DRW_gpencil_populate_buffer_strokes( void DRW_gpencil_populate_multiedit( struct GPENCIL_e_data *e_data, void *vedata, struct Scene *scene, struct Object *ob, struct tGPencilObjectCache *cache_ob); -void DRW_gpencil_triangulate_stroke_fill(struct bGPDstroke *gps); +void DRW_gpencil_triangulate_stroke_fill(struct Object *ob, struct bGPDstroke *gps); void DRW_gpencil_multisample_ensure(struct GPENCIL_Data *vedata, int rect_w, int rect_h); diff --git a/source/blender/draw/engines/gpencil/gpencil_render.c b/source/blender/draw/engines/gpencil/gpencil_render.c index 41f0c601a13..8dc15472a20 100644 --- a/source/blender/draw/engines/gpencil/gpencil_render.c +++ b/source/blender/draw/engines/gpencil/gpencil_render.c @@ -130,7 +130,7 @@ static void GPENCIL_render_cache( void *vedata, struct Object *ob, struct RenderEngine *UNUSED(engine), struct Depsgraph *UNUSED(depsgraph)) { - if ((ob == NULL) || (DRW_check_object_visible_within_active_context(ob) == false)) { + if ((ob == NULL) || (DRW_object_is_visible_in_active_context(ob) == false)) { return; } diff --git a/source/blender/draw/engines/gpencil/gpencil_shader_fx.c b/source/blender/draw/engines/gpencil/gpencil_shader_fx.c index 9e04365fe1d..2165fb251dc 100644 --- a/source/blender/draw/engines/gpencil/gpencil_shader_fx.c +++ b/source/blender/draw/engines/gpencil/gpencil_shader_fx.c @@ -50,6 +50,8 @@ extern char datatoc_gpencil_fx_rim_prepare_frag_glsl[]; extern char datatoc_gpencil_fx_rim_resolve_frag_glsl[]; extern char datatoc_gpencil_fx_shadow_prepare_frag_glsl[]; extern char datatoc_gpencil_fx_shadow_resolve_frag_glsl[]; +extern char datatoc_gpencil_fx_glow_prepare_frag_glsl[]; +extern char datatoc_gpencil_fx_glow_resolve_frag_glsl[]; extern char datatoc_gpencil_fx_swirl_frag_glsl[]; extern char datatoc_gpencil_fx_wave_frag_glsl[]; @@ -208,7 +210,7 @@ static void DRW_gpencil_fx_blur( } } - struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get(); + GPUBatch *fxquad = DRW_cache_fullscreen_quad_get(); fx_shgrp = DRW_shgroup_create( e_data->gpencil_fx_blur_sh, @@ -236,7 +238,7 @@ static void DRW_gpencil_fx_colorize( GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl; DRWShadingGroup *fx_shgrp; - struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get(); + GPUBatch *fxquad = DRW_cache_fullscreen_quad_get(); fx_shgrp = DRW_shgroup_create(e_data->gpencil_fx_colorize_sh, psl->fx_shader_pass); DRW_shgroup_call_add(fx_shgrp, fxquad, NULL); DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a); @@ -269,7 +271,7 @@ static void DRW_gpencil_fx_flip( fxd->flipmode += 1; } - struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get(); + GPUBatch *fxquad = DRW_cache_fullscreen_quad_get(); fx_shgrp = DRW_shgroup_create(e_data->gpencil_fx_flip_sh, psl->fx_shader_pass); DRW_shgroup_call_add(fx_shgrp, fxquad, NULL); DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a); @@ -298,7 +300,7 @@ static void DRW_gpencil_fx_light( GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl; DRWShadingGroup *fx_shgrp; - struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get(); + GPUBatch *fxquad = DRW_cache_fullscreen_quad_get(); fx_shgrp = DRW_shgroup_create(e_data->gpencil_fx_light_sh, psl->fx_shader_pass); DRW_shgroup_call_add(fx_shgrp, fxquad, NULL); DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a); @@ -351,7 +353,7 @@ static void DRW_gpencil_fx_pixel( fxd->size[2] = (int)fxd->flag & FX_PIXEL_USE_LINES; - struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get(); + GPUBatch *fxquad = DRW_cache_fullscreen_quad_get(); fx_shgrp = DRW_shgroup_create(e_data->gpencil_fx_pixel_sh, psl->fx_shader_pass); DRW_shgroup_call_add(fx_shgrp, fxquad, NULL); DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a); @@ -380,7 +382,7 @@ static void DRW_gpencil_fx_rim( GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl; DRWShadingGroup *fx_shgrp; - struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get(); + GPUBatch *fxquad = DRW_cache_fullscreen_quad_get(); /* prepare pass */ fx_shgrp = DRW_shgroup_create( e_data->gpencil_fx_rim_prepare_sh, @@ -431,8 +433,8 @@ static void DRW_gpencil_fx_rim( /* Shadow FX */ static void DRW_gpencil_fx_shadow( - ShaderFxData *fx, GPENCIL_e_data *e_data, GPENCIL_Data *vedata, - tGPencilObjectCache *cache) + ShaderFxData *fx, GPENCIL_e_data *e_data, GPENCIL_Data *vedata, + tGPencilObjectCache *cache) { if (fx == NULL) { return; @@ -446,7 +448,7 @@ static void DRW_gpencil_fx_shadow( GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl; DRWShadingGroup *fx_shgrp; - struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get(); + GPUBatch *fxquad = DRW_cache_fullscreen_quad_get(); /* prepare pass */ fx_shgrp = DRW_shgroup_create( e_data->gpencil_fx_shadow_prepare_sh, @@ -512,10 +514,71 @@ static void DRW_gpencil_fx_shadow( fxd->runtime.fx_sh_c = fx_shgrp; } +/* Glow FX */ +static void DRW_gpencil_fx_glow( + ShaderFxData *fx, GPENCIL_e_data *e_data, GPENCIL_Data *vedata, + tGPencilObjectCache *cache) +{ + if (fx == NULL) { + return; + } + GlowShaderFxData *fxd = (GlowShaderFxData *)fx; + + GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl; + GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl; + DRWShadingGroup *fx_shgrp; + + GPUBatch *fxquad = DRW_cache_fullscreen_quad_get(); + /* prepare pass */ + fx_shgrp = DRW_shgroup_create( + e_data->gpencil_fx_glow_prepare_sh, + psl->fx_shader_pass_blend); + DRW_shgroup_call_add(fx_shgrp, fxquad, NULL); + DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a); + DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeDepth", &e_data->temp_depth_tx_a); + + DRW_shgroup_uniform_vec3(fx_shgrp, "glow_color", &fxd->glow_color[0], 1); + DRW_shgroup_uniform_vec3(fx_shgrp, "select_color", &fxd->select_color[0], 1); + DRW_shgroup_uniform_int(fx_shgrp, "mode", &fxd->mode, 1); + DRW_shgroup_uniform_float(fx_shgrp, "threshold", &fxd->threshold, 1); + + fxd->runtime.fx_sh = fx_shgrp; + + /* blur pass */ + fx_shgrp = DRW_shgroup_create( + e_data->gpencil_fx_blur_sh, + psl->fx_shader_pass_blend); + DRW_shgroup_call_add(fx_shgrp, fxquad, NULL); + DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_fx); + DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeDepth", &e_data->temp_depth_tx_fx); + DRW_shgroup_uniform_int(fx_shgrp, "blur", &fxd->blur[0], 2); + + DRW_shgroup_uniform_vec3(fx_shgrp, "loc", &cache->loc[0], 1); + DRW_shgroup_uniform_float(fx_shgrp, "pixsize", stl->storage->pixsize, 1); + DRW_shgroup_uniform_float(fx_shgrp, "pixfactor", &cache->pixfactor, 1); + + fxd->runtime.fx_sh_b = fx_shgrp; + + /* resolve pass */ + fx_shgrp = DRW_shgroup_create( + e_data->gpencil_fx_glow_resolve_sh, + psl->fx_shader_pass_blend); + DRW_shgroup_call_add(fx_shgrp, fxquad, NULL); + DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a); + DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeDepth", &e_data->temp_depth_tx_a); + DRW_shgroup_uniform_texture_ref(fx_shgrp, "glowColor", &e_data->temp_color_tx_fx); + DRW_shgroup_uniform_texture_ref(fx_shgrp, "glowDepth", &e_data->temp_depth_tx_fx); + + /* reuse field */ + DRW_shgroup_uniform_int(fx_shgrp, "alpha_mode", &fxd->blur[1], 1); + + fxd->runtime.fx_sh_c = fx_shgrp; +} + /* Swirl FX */ static void DRW_gpencil_fx_swirl( ShaderFxData *fx, GPENCIL_e_data *e_data, GPENCIL_Data *vedata, - tGPencilObjectCache *cache) + tGPencilObjectCache *cache) { if (fx == NULL) { return; @@ -531,7 +594,7 @@ static void DRW_gpencil_fx_swirl( fxd->transparent = (int)fxd->flag & FX_SWIRL_MAKE_TRANSPARENT; - struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get(); + GPUBatch *fxquad = DRW_cache_fullscreen_quad_get(); fx_shgrp = DRW_shgroup_create(e_data->gpencil_fx_swirl_sh, psl->fx_shader_pass); DRW_shgroup_call_add(fx_shgrp, fxquad, NULL); DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a); @@ -562,7 +625,7 @@ static void DRW_gpencil_fx_wave( WaveShaderFxData *fxd = (WaveShaderFxData *)fx; GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl; - struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get(); + GPUBatch *fxquad = DRW_cache_fullscreen_quad_get(); DRWShadingGroup *fx_shgrp = DRW_shgroup_create(e_data->gpencil_fx_wave_sh, psl->fx_shader_pass); DRW_shgroup_call_add(fx_shgrp, fxquad, NULL); @@ -617,6 +680,13 @@ void GPENCIL_create_fx_shaders(GPENCIL_e_data *e_data) e_data->gpencil_fx_shadow_resolve_sh = DRW_shader_create_fullscreen( datatoc_gpencil_fx_shadow_resolve_frag_glsl, NULL); } + if (!e_data->gpencil_fx_glow_prepare_sh) { + e_data->gpencil_fx_glow_prepare_sh = DRW_shader_create_fullscreen( + datatoc_gpencil_fx_glow_prepare_frag_glsl, NULL); + + e_data->gpencil_fx_glow_resolve_sh = DRW_shader_create_fullscreen( + datatoc_gpencil_fx_glow_resolve_frag_glsl, NULL); + } if (!e_data->gpencil_fx_swirl_sh) { e_data->gpencil_fx_swirl_sh = DRW_shader_create_fullscreen( datatoc_gpencil_fx_swirl_frag_glsl, NULL); @@ -639,6 +709,8 @@ void GPENCIL_delete_fx_shaders(GPENCIL_e_data *e_data) DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_rim_resolve_sh); DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_shadow_prepare_sh); DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_shadow_resolve_sh); + DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_glow_prepare_sh); + DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_glow_resolve_sh); DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_swirl_sh); DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_wave_sh); } @@ -659,8 +731,8 @@ void GPENCIL_create_fx_passes(GPENCIL_PassList *psl) /* prepare fx shading groups */ void DRW_gpencil_fx_prepare( - struct GPENCIL_e_data *e_data, struct GPENCIL_Data *vedata, - struct tGPencilObjectCache *cache) + GPENCIL_e_data *e_data, GPENCIL_Data *vedata, + tGPencilObjectCache *cache) { GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl; int ob_idx = cache->idx; @@ -693,6 +765,9 @@ void DRW_gpencil_fx_prepare( case eShaderFxType_Shadow: DRW_gpencil_fx_shadow(fx, e_data, vedata, cache); break; + case eShaderFxType_Glow: + DRW_gpencil_fx_glow(fx, e_data, vedata, cache); + break; case eShaderFxType_Swirl: DRW_gpencil_fx_swirl(fx, e_data, vedata, cache); break; @@ -718,8 +793,7 @@ static void gpencil_draw_fx_pass( return; } - static float clearcol[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; - + const float clearcol[4] = {0.0f}; GPU_framebuffer_bind(fbl->temp_fb_b); GPU_framebuffer_clear_color_depth(fbl->temp_fb_b, clearcol, 1.0f); @@ -743,9 +817,9 @@ static void gpencil_draw_fx_pass( /* helper to manage gaussian blur passes */ static void draw_gpencil_blur_passes( - struct GPENCIL_e_data *e_data, - struct GPENCIL_Data *vedata, - struct BlurShaderFxData *fxd) + GPENCIL_e_data *e_data, + GPENCIL_Data *vedata, + BlurShaderFxData *fxd) { if (fxd->runtime.fx_sh == NULL) { return; @@ -782,19 +856,19 @@ static void draw_gpencil_blur_passes( } } -static void draw_gpencil_rim_blur( - struct GPENCIL_e_data *UNUSED(e_data), - struct GPENCIL_Data *vedata, - struct RimShaderFxData *fxd) +/* blur intermediate pass */ +static void draw_gpencil_midpass_blur( + GPENCIL_Data *vedata, + ShaderFxData_Runtime *runtime) { GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl; GPENCIL_FramebufferList *fbl = ((GPENCIL_Data *)vedata)->fbl; - static float clearcol[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; + const float clearcol[4] = {0.0f}; GPU_framebuffer_bind(fbl->temp_fb_b); GPU_framebuffer_clear_color_depth(fbl->temp_fb_b, clearcol, 1.0f); DRW_draw_pass_subset(psl->fx_shader_pass_blend, - fxd->runtime.fx_sh_b, fxd->runtime.fx_sh_b); + runtime->fx_sh_b, runtime->fx_sh_b); /* copy pass from b for ping-pong frame buffers */ GPU_framebuffer_bind(fbl->temp_fb_fx); @@ -802,11 +876,40 @@ static void draw_gpencil_rim_blur( DRW_draw_pass(psl->mix_pass_noblend); } +/* do blur of mid passes */ +static void draw_gpencil_do_blur( + GPENCIL_e_data *e_data, + GPENCIL_Data *vedata, + ShaderFxData_Runtime *runtime, + int samples, int bx, int by, int blur[2]) +{ + e_data->input_depth_tx = e_data->temp_depth_tx_b; + e_data->input_color_tx = e_data->temp_color_tx_b; + + if ((samples > 0) && ((bx > 0) || (by > 0))) { + for (int x = 0; x < samples * 4; x++) { + + /* horizontal */ + blur[0] = bx; + blur[1] = 0; + draw_gpencil_midpass_blur(vedata, runtime); + + /* Vertical */ + blur[0] = 0; + blur[1] = by; + draw_gpencil_midpass_blur(vedata, runtime); + + blur[0] = bx; + blur[1] = by; + } + } +} + /* helper to draw RIM passes */ static void draw_gpencil_rim_passes( - struct GPENCIL_e_data *e_data, - struct GPENCIL_Data *vedata, - struct RimShaderFxData *fxd) + GPENCIL_e_data *e_data, + GPENCIL_Data *vedata, + RimShaderFxData *fxd) { if (fxd->runtime.fx_sh_b == NULL) { return; @@ -815,9 +918,7 @@ static void draw_gpencil_rim_passes( GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl; GPENCIL_FramebufferList *fbl = ((GPENCIL_Data *)vedata)->fbl; - static float clearcol[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; - int bx = fxd->blur[0]; - int by = fxd->blur[1]; + const float clearcol[4] = {0.0f}; /* prepare mask */ GPU_framebuffer_bind(fbl->temp_fb_fx); @@ -827,26 +928,11 @@ static void draw_gpencil_rim_passes( fxd->runtime.fx_sh, fxd->runtime.fx_sh); /* blur rim */ - e_data->input_depth_tx = e_data->temp_depth_tx_b; - e_data->input_color_tx = e_data->temp_color_tx_b; - - if ((fxd->samples > 0) && ((bx > 0) || (by > 0))) { - for (int x = 0; x < fxd->samples; x++) { - - /* horizontal */ - fxd->blur[0] = bx; - fxd->blur[1] = 0; - draw_gpencil_rim_blur(e_data, vedata, fxd); - - /* Vertical */ - fxd->blur[0] = 0; - fxd->blur[1] = by; - draw_gpencil_rim_blur(e_data, vedata, fxd); - - fxd->blur[0] = bx; - fxd->blur[1] = by; - } - } + draw_gpencil_do_blur( + e_data, vedata, &fxd->runtime, + fxd->samples, + fxd->blur[0], fxd->blur[1], + &fxd->blur[0]); /* resolve */ GPU_framebuffer_bind(fbl->temp_fb_b); @@ -864,32 +950,55 @@ static void draw_gpencil_rim_passes( DRW_draw_pass(psl->mix_pass_noblend); } -/* blur shadow */ -static void draw_gpencil_shadow_blur( - struct GPENCIL_e_data *UNUSED(e_data), - struct GPENCIL_Data *vedata, - struct ShadowShaderFxData *fxd) +/* helper to draw SHADOW passes */ +static void draw_gpencil_shadow_passes( + GPENCIL_e_data *e_data, + GPENCIL_Data *vedata, + ShadowShaderFxData *fxd) { + if (fxd->runtime.fx_sh_b == NULL) { + return; + } + GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl; GPENCIL_FramebufferList *fbl = ((GPENCIL_Data *)vedata)->fbl; - static float clearcol[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; + const float clearcol[4] = {0.0f}; + + /* prepare shadow */ + GPU_framebuffer_bind(fbl->temp_fb_fx); + GPU_framebuffer_clear_color_depth(fbl->temp_fb_fx, clearcol, 1.0f); + DRW_draw_pass_subset( + psl->fx_shader_pass_blend, + fxd->runtime.fx_sh, fxd->runtime.fx_sh); + + /* blur shadow */ + draw_gpencil_do_blur( + e_data, vedata, &fxd->runtime, + fxd->samples, + fxd->blur[0], fxd->blur[1], + &fxd->blur[0]); + /* resolve */ GPU_framebuffer_bind(fbl->temp_fb_b); GPU_framebuffer_clear_color_depth(fbl->temp_fb_b, clearcol, 1.0f); - DRW_draw_pass_subset(psl->fx_shader_pass_blend, - fxd->runtime.fx_sh_b, fxd->runtime.fx_sh_b); + DRW_draw_pass_subset( + psl->fx_shader_pass_blend, + fxd->runtime.fx_sh_c, fxd->runtime.fx_sh_c); - /* copy pass from b for ping-pong frame buffers */ - GPU_framebuffer_bind(fbl->temp_fb_fx); - GPU_framebuffer_clear_color_depth(fbl->temp_fb_fx, clearcol, 1.0f); + /* copy pass from b to a for ping-pong frame buffers */ + e_data->input_depth_tx = e_data->temp_depth_tx_b; + e_data->input_color_tx = e_data->temp_color_tx_b; + + GPU_framebuffer_bind(fbl->temp_fb_a); + GPU_framebuffer_clear_color_depth(fbl->temp_fb_a, clearcol, 1.0f); DRW_draw_pass(psl->mix_pass_noblend); } -/* helper to draw SHADOW passes */ -static void draw_gpencil_shadow_passes( - struct GPENCIL_e_data *e_data, - struct GPENCIL_Data *vedata, - struct ShadowShaderFxData *fxd) +/* helper to draw GLOW passes */ +static void draw_gpencil_glow_passes( + GPENCIL_e_data *e_data, + GPENCIL_Data *vedata, + GlowShaderFxData *fxd) { if (fxd->runtime.fx_sh_b == NULL) { return; @@ -898,42 +1007,29 @@ static void draw_gpencil_shadow_passes( GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl; GPENCIL_FramebufferList *fbl = ((GPENCIL_Data *)vedata)->fbl; - static float clearcol[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; - int bx = fxd->blur[0]; - int by = fxd->blur[1]; + const float clearcol[4] = {0.0f}; - /* prepare shadow */ + /* prepare glow */ GPU_framebuffer_bind(fbl->temp_fb_fx); GPU_framebuffer_clear_color_depth(fbl->temp_fb_fx, clearcol, 1.0f); DRW_draw_pass_subset( psl->fx_shader_pass_blend, fxd->runtime.fx_sh, fxd->runtime.fx_sh); - /* blur shadow */ - e_data->input_depth_tx = e_data->temp_depth_tx_b; - e_data->input_color_tx = e_data->temp_color_tx_b; - - if ((fxd->samples > 0) && ((bx > 0) || (by > 0))) { - for (int x = 0; x < fxd->samples; x++) { - - /* horizontal */ - fxd->blur[0] = bx; - fxd->blur[1] = 0; - draw_gpencil_shadow_blur(e_data, vedata, fxd); - - /* Vertical */ - fxd->blur[0] = 0; - fxd->blur[1] = by; - draw_gpencil_shadow_blur(e_data, vedata, fxd); - - fxd->blur[0] = bx; - fxd->blur[1] = by; - } - } + /* blur glow */ + draw_gpencil_do_blur( + e_data, vedata, &fxd->runtime, + fxd->samples, + fxd->blur[0], fxd->blur[0], + &fxd->blur[0]); /* resolve */ GPU_framebuffer_bind(fbl->temp_fb_b); GPU_framebuffer_clear_color_depth(fbl->temp_fb_b, clearcol, 1.0f); + + /* reuses blur field to keep alpha mode */ + fxd->blur[1] = (fxd->flag & FX_GLOW_USE_ALPHA) ? 1 : 0; + DRW_draw_pass_subset( psl->fx_shader_pass_blend, fxd->runtime.fx_sh_c, fxd->runtime.fx_sh_c); @@ -949,8 +1045,8 @@ static void draw_gpencil_shadow_passes( /* apply all object fx effects */ void DRW_gpencil_fx_draw( - struct GPENCIL_e_data *e_data, - struct GPENCIL_Data *vedata, struct tGPencilObjectCache *cache) + GPENCIL_e_data *e_data, + GPENCIL_Data *vedata, tGPencilObjectCache *cache) { GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl; GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl; @@ -1003,6 +1099,12 @@ void DRW_gpencil_fx_draw( draw_gpencil_shadow_passes(e_data, vedata, fxd); break; } + case eShaderFxType_Glow: + { + GlowShaderFxData *fxd = (GlowShaderFxData *)fx; + draw_gpencil_glow_passes(e_data, vedata, fxd); + break; + } case eShaderFxType_Swirl: { SwirlShaderFxData *fxd = (SwirlShaderFxData *)fx; diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl index c2bf1dbc1a7..c8bc5e1fe91 100644 --- a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl +++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl @@ -56,4 +56,7 @@ void main() outcolor += texelFetch(strokeColor, ivec2(uv.x + 1.0 * dx, uv.y - 1.0 * dy), 0) * 0.0947416; FragColor = clamp(outcolor, 0, 1.0); + + if (outcolor.a < 0.02f) + discard; } diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_prepare_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_prepare_frag.glsl new file mode 100644 index 00000000000..237cdf15627 --- /dev/null +++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_prepare_frag.glsl @@ -0,0 +1,68 @@ +uniform mat4 ProjectionMatrix; +uniform mat4 ViewMatrix; + +/* ******************************************************************* */ +/* create glow mask */ +/* ******************************************************************* */ +uniform sampler2D strokeColor; +uniform sampler2D strokeDepth; + +uniform vec3 glow_color; +uniform vec3 select_color; +uniform float threshold; +uniform int mode; + +out vec4 FragColor; + +#define MODE_LUMINANCE 0 +#define MODE_COLOR 1 + +/* calc luminance */ +float luma( vec3 color ) { + /* the color is linear, so do not apply tonemapping */ + return (color.r + color.g + color.b) / 3.0; +} + +bool check_color(vec3 color_a, vec3 color_b) +{ + /* need round the number to avoid precision errors */ + if ((floor(color_a.r * 100) == floor(color_b.r * 100)) && + (floor(color_a.g * 100) == floor(color_b.g * 100)) && + (floor(color_a.b * 100) == floor(color_b.b * 100))) + { + return true; + } + + return false; +} + +void main() +{ + vec2 uv = vec2(gl_FragCoord.xy); + + float stroke_depth = texelFetch(strokeDepth, ivec2(uv.xy), 0).r; + vec4 src_pixel= texelFetch(strokeColor, ivec2(uv.xy), 0); + vec4 outcolor; + + /* is transparent */ + if (src_pixel.a == 0.0f) { + discard; + } + + if (mode == MODE_LUMINANCE) { + if (luma(src_pixel.rgb) < threshold) { + discard; + } + } + else if (mode == MODE_COLOR) { + if (!check_color(src_pixel.rgb, select_color.rgb)) { + discard; + } + } + else { + discard; + } + + gl_FragDepth = stroke_depth; + FragColor = vec4(glow_color.rgb, 1.0); +} diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_resolve_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_resolve_frag.glsl new file mode 100644 index 00000000000..010c4ef4a88 --- /dev/null +++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_resolve_frag.glsl @@ -0,0 +1,46 @@ +/* ******************************************************************* */ +/* Resolve GLOW pass */ +/* ******************************************************************* */ +uniform sampler2D strokeColor; +uniform sampler2D strokeDepth; +uniform sampler2D glowColor; +uniform sampler2D glowDepth; +uniform int alpha_mode; + +out vec4 FragColor; + +void main() +{ + vec4 outcolor; + ivec2 uv = ivec2(gl_FragCoord.xy); + + float stroke_depth = texelFetch(strokeDepth, uv.xy, 0).r; + vec4 src_pixel= texelFetch(strokeColor, uv.xy, 0); + vec4 glow_pixel= texelFetch(glowColor, uv.xy, 0); + float glow_depth = texelFetch(glowDepth, uv.xy, 0).r; + + if (alpha_mode == 0) { + outcolor = src_pixel + glow_pixel; + } + else { + if ((src_pixel.a < 0.1) || (glow_pixel.a < 0.1)) { + outcolor = src_pixel + glow_pixel; + } + else { + outcolor = src_pixel; + } + } + + if (src_pixel.a < glow_pixel.a) { + gl_FragDepth = glow_depth; + } + else { + gl_FragDepth = stroke_depth; + } + + if (outcolor.a < 0.001) { + discard; + } + + FragColor = outcolor; +} diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl index 882b2cf59f1..df5248c7791 100644 --- a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl +++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl @@ -37,4 +37,7 @@ void main() FragColor = outcolor; gl_FragDepth = stroke_depth; + + if (outcolor.a < 0.02f) + discard; } diff --git a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl index 1f14e506dcf..5b949a6d952 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl @@ -3,9 +3,15 @@ uniform mat4 ProjectionMatrix; uniform mat4 ModelMatrixInverse; uniform mat4 ModelViewMatrixInverse; uniform mat4 ModelMatrix; +uniform vec3 OrcoTexCoFactors[2]; uniform sampler2D depthBuffer; + uniform sampler3D densityTexture; +uniform sampler3D shadowTexture; +uniform sampler3D flameTexture; +uniform sampler1D flameColorTexture; +uniform sampler1D transferTexture; uniform int samplesLen = 256; uniform float stepLength; /* Step length in local space. */ @@ -62,15 +68,35 @@ float line_unit_box_intersect_dist(vec3 lineorigin, vec3 linedirection) void volume_properties(vec3 ls_pos, out vec3 scattering, out float extinction) { - scattering = vec3(0.0); - extinction = 1e-8; + vec3 co = ls_pos * 0.5 + 0.5; +#ifdef USE_COBA + float val = texture(densityTexture, co).r; + vec4 tval = texture(transferTexture, val) * densityScale; + tval.rgb = pow(tval.rgb, vec3(2.2)); + scattering = tval.rgb * 1500.0; + extinction = max(1e-4, tval.a * 50.0); +#else + float flame = texture(flameTexture, co).r; + vec4 emission = texture(flameColorTexture, flame); + float shadows = texture(shadowTexture, co).r; + vec4 density = texture(densityTexture, co); /* rgb: color, a: density */ + + scattering = density.rgb * density.a * densityScale; + extinction = max(1e-4, dot(scattering, vec3(0.33333))); - vec4 density = texture(densityTexture, ls_pos * 0.5 + 0.5); - density.rgb /= density.a; - density *= densityScale; + scattering *= shadows * M_PI; + /* 800 is arbitrary and here to mimic old viewport. TODO make it a parameter */ + scattering += pow(emission.rgb, vec3(2.2)) * emission.a * 800.0; +#endif +} - scattering = density.rgb; - extinction = max(1e-8, density.a); +void eval_volume_step(inout vec3 Lscat, float extinction, float step_len, out float Tr) +{ + Lscat *= phase_function_isotropic(); + /* Evaluate Scattering */ + Tr = exp(-extinction * step_len); + /* integrate along the current step segment */ + Lscat = (Lscat - Lscat * Tr) / extinction; } #define P(x) ((x + 0.5) * (1.0 / 16.0)) @@ -96,18 +122,15 @@ vec4 volume_integration( vec3 ls_pos = ray_ori + ray_dir * ray_len; vec3 Lscat; - float s_extinction; + float s_extinction, Tr; volume_properties(ls_pos, Lscat, s_extinction); - /* Evaluate Scattering */ - float Tr = exp(-s_extinction * step_len); - /* integrate along the current step segment */ - Lscat = (Lscat - Lscat * Tr) / s_extinction; + eval_volume_step(Lscat, s_extinction, step_len, Tr); /* accumulate and also take into account the transmittance from previous steps */ final_scattering += final_transmittance * Lscat; final_transmittance *= Tr; } - return vec4(final_scattering, 1.0 - final_transmittance); + return vec4(final_scattering, final_transmittance); } void main() @@ -134,15 +157,11 @@ void main() step_len = 1.0 / step_len; vec3 Lscat; - float s_extinction; + float s_extinction, Tr; volume_properties(localPos, Lscat, s_extinction); - /* Evaluate Scattering */ - float Tr = exp(-s_extinction * step_len); - /* integrate along the current step segment */ - Lscat = (Lscat - Lscat * Tr) / s_extinction; - - fragColor = vec4(Lscat, 1.0 - Tr); + eval_volume_step(Lscat, s_extinction, step_len, Tr); + fragColor = vec4(Lscat, Tr); #else vec2 screen_uv = gl_FragCoord.xy / vec2(textureSize(depthBuffer, 0).xy); bool is_persp = ProjectionMatrix[3][3] == 0.0; @@ -156,10 +175,13 @@ void main() vec3 vs_ray_dir = (is_persp) ? (vs_ray_end - vs_ray_ori) : vec3(0.0, 0.0, -1.0); vs_ray_dir /= abs(vs_ray_dir.z); - vec3 ls_ray_dir = mat3(ModelViewMatrixInverse) * vs_ray_dir; + vec3 ls_ray_dir = mat3(ModelViewMatrixInverse) * vs_ray_dir * OrcoTexCoFactors[1] * 2.0; vec3 ls_ray_ori = (ModelViewMatrixInverse * vec4(vs_ray_ori, 1.0)).xyz; vec3 ls_ray_end = (ModelViewMatrixInverse * vec4(vs_ray_end, 1.0)).xyz; + ls_ray_ori = (OrcoTexCoFactors[0] + ls_ray_ori * OrcoTexCoFactors[1]) * 2.0 - 1.0; + ls_ray_end = (OrcoTexCoFactors[0] + ls_ray_end * OrcoTexCoFactors[1]) * 2.0 - 1.0; + /* TODO: Align rays to volume center so that it mimics old behaviour of slicing the volume. */ float dist = line_unit_box_intersect_dist(ls_ray_ori, ls_ray_dir); diff --git a/source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl index 90a22d9d02f..7ce21c3d5ca 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl @@ -1,5 +1,6 @@ uniform mat4 ModelViewProjectionMatrix; +uniform vec3 OrcoTexCoFactors[2]; uniform float slicePosition; uniform int sliceAxis; /* -1 is no slice, 0 is X, 1 is Y, 2 is Z. */ @@ -23,9 +24,10 @@ void main() else { localPos = vec3(pos.xy, slicePosition * 2.0 - 1.0); } - - gl_Position = ModelViewProjectionMatrix * vec4(localPos, 1.0); + vec3 final_pos = localPos; #else - gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0); + vec3 final_pos = pos; #endif + final_pos = ((final_pos * 0.5 + 0.5) - OrcoTexCoFactors[0]) / OrcoTexCoFactors[1]; + gl_Position = ModelViewProjectionMatrix * vec4(final_pos, 1.0); } diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c index 7fbe928d29e..a1345afcf11 100644 --- a/source/blender/draw/engines/workbench/workbench_deferred.c +++ b/source/blender/draw/engines/workbench/workbench_deferred.c @@ -649,7 +649,7 @@ static void workbench_cache_populate_particles(WORKBENCH_Data *vedata, Object *o if (!psys_check_enabled(ob, psys, false)) { continue; } - if (!DRW_check_psys_visible_within_active_context(ob, psys)) { + if (!DRW_object_is_visible_psys_in_active_context(ob, psys)) { continue; } ParticleSettings *part = psys->part; @@ -701,7 +701,7 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob) return; /* Do not draw solid in this case. */ } - if (!DRW_check_object_visible_within_active_context(ob)) { + if (!DRW_object_is_visible_in_active_context(ob) || (ob->dt < OB_SOLID)) { return; } diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c index 0d4329c9699..cb11864df54 100644 --- a/source/blender/draw/engines/workbench/workbench_forward.c +++ b/source/blender/draw/engines/workbench/workbench_forward.c @@ -420,7 +420,7 @@ static void workbench_forward_cache_populate_particles(WORKBENCH_Data *vedata, O if (!psys_check_enabled(ob, psys, false)) { continue; } - if (!DRW_check_psys_visible_within_active_context(ob, psys)) { + if (!DRW_object_is_visible_psys_in_active_context(ob, psys)) { continue; } ParticleSettings *part = psys->part; @@ -487,7 +487,7 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob) return; /* Do not draw solid in this case. */ } - if (!DRW_check_object_visible_within_active_context(ob)) { + if (!DRW_object_is_visible_in_active_context(ob) || (ob->dt < OB_SOLID)) { return; } diff --git a/source/blender/draw/engines/workbench/workbench_volume.c b/source/blender/draw/engines/workbench/workbench_volume.c index ea4152486af..b0c08a2dc28 100644 --- a/source/blender/draw/engines/workbench/workbench_volume.c +++ b/source/blender/draw/engines/workbench/workbench_volume.c @@ -35,7 +35,11 @@ static struct { struct GPUShader *volume_sh; + struct GPUShader *volume_coba_sh; struct GPUShader *volume_slice_sh; + struct GPUShader *volume_slice_coba_sh; + struct GPUTexture *dummy_tex; + struct GPUTexture *dummy_coba_tex; } e_data = {NULL}; extern char datatoc_workbench_volume_vert_glsl[]; @@ -47,21 +51,39 @@ void workbench_volume_engine_init(void) e_data.volume_sh = DRW_shader_create( datatoc_workbench_volume_vert_glsl, NULL, datatoc_workbench_volume_frag_glsl, NULL); + e_data.volume_coba_sh = DRW_shader_create( + datatoc_workbench_volume_vert_glsl, NULL, + datatoc_workbench_volume_frag_glsl, + "#define USE_COBA\n"); e_data.volume_slice_sh = DRW_shader_create( datatoc_workbench_volume_vert_glsl, NULL, - datatoc_workbench_volume_frag_glsl, "#define VOLUME_SLICE"); + datatoc_workbench_volume_frag_glsl, + "#define VOLUME_SLICE\n"); + e_data.volume_slice_coba_sh = DRW_shader_create( + datatoc_workbench_volume_vert_glsl, NULL, + datatoc_workbench_volume_frag_glsl, + "#define VOLUME_SLICE\n" + "#define USE_COBA\n"); + + float pixel[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + e_data.dummy_tex = GPU_texture_create_3D(1, 1, 1, GPU_RGBA8, pixel, NULL); + e_data.dummy_coba_tex = GPU_texture_create_1D(1, GPU_RGBA8, pixel, NULL); } } void workbench_volume_engine_free(void) { DRW_SHADER_FREE_SAFE(e_data.volume_sh); + DRW_SHADER_FREE_SAFE(e_data.volume_coba_sh); DRW_SHADER_FREE_SAFE(e_data.volume_slice_sh); + DRW_SHADER_FREE_SAFE(e_data.volume_slice_coba_sh); + DRW_TEXTURE_FREE_SAFE(e_data.dummy_tex); + DRW_TEXTURE_FREE_SAFE(e_data.dummy_coba_tex); } void workbench_volume_cache_init(WORKBENCH_Data *vedata) { - vedata->psl->volume_pass = DRW_pass_create("Volumes", DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_PREMUL | DRW_STATE_CULL_FRONT); + vedata->psl->volume_pass = DRW_pass_create("Volumes", DRW_STATE_WRITE_COLOR | DRW_STATE_TRANSMISSION | DRW_STATE_CULL_FRONT); } void workbench_volume_cache_populate(WORKBENCH_Data *vedata, Scene *scene, Object *ob, ModifierData *md) @@ -70,6 +92,7 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, Scene *scene, Objec SmokeDomainSettings *sds = smd->domain; WORKBENCH_PrivateData *wpd = vedata->stl->g_data; DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); + DRWShadingGroup *grp = NULL; /* Don't show smoke before simulation starts, this could be made an option in the future. */ if (!sds->fluid || CFRA < sds->point_cache[0]->startframe) { @@ -77,21 +100,26 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, Scene *scene, Objec } wpd->volumes_do = true; - - if (!sds->wt || !(sds->viewsettings & MOD_SMOKE_VIEW_SHOWBIG)) { + if (sds->use_coba) { + GPU_create_smoke_coba_field(smd); + } + else if (!sds->wt || !(sds->viewsettings & MOD_SMOKE_VIEW_SHOWBIG)) { GPU_create_smoke(smd, 0); } else if (sds->wt && (sds->viewsettings & MOD_SMOKE_VIEW_SHOWBIG)) { GPU_create_smoke(smd, 1); } - if (sds->tex == NULL) { + if ((!sds->use_coba && sds->tex == NULL) || + (sds->use_coba && sds->tex_field == NULL)) + { return; } - if (sds->slice_method == MOD_SMOKE_SLICE_AXIS_ALIGNED && - sds->axis_slice_method == AXIS_SLICE_SINGLE) - { + const bool use_slice = (sds->slice_method == MOD_SMOKE_SLICE_AXIS_ALIGNED && + sds->axis_slice_method == AXIS_SLICE_SINGLE); + + if (use_slice) { float invviewmat[4][4]; DRW_viewport_matrix_get(invviewmat, DRW_MAT_VIEWINV); @@ -99,41 +127,46 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, Scene *scene, Objec ? axis_dominant_v3_single(invviewmat[2]) : sds->slice_axis - 1; - DRWShadingGroup *grp = DRW_shgroup_create(e_data.volume_slice_sh, vedata->psl->volume_pass); - DRW_shgroup_uniform_texture(grp, "densityTexture", sds->tex); - DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); - DRW_shgroup_uniform_float_copy(grp, "densityScale", 10.0f * sds->display_thickness); + GPUShader *sh = (sds->use_coba) ? e_data.volume_slice_coba_sh : e_data.volume_slice_sh; + grp = DRW_shgroup_create(sh, vedata->psl->volume_pass); DRW_shgroup_uniform_float_copy(grp, "slicePosition", sds->slice_depth); DRW_shgroup_uniform_int_copy(grp, "sliceAxis", axis); - DRW_shgroup_state_disable(grp, DRW_STATE_CULL_FRONT); - BLI_addtail(&wpd->smoke_domains, BLI_genericNodeN(smd)); - - /* TODO Flame rendering */ - /* TODO COBA Rendering */ - - DRW_shgroup_call_object_add(grp, DRW_cache_quad_get(), ob); } else { int max_slices = max_iii(sds->res[0], sds->res[1], sds->res[2]) * sds->slice_per_voxel; - DRWShadingGroup *grp = DRW_shgroup_create(e_data.volume_sh, vedata->psl->volume_pass); + GPUShader *sh = (sds->use_coba) ? e_data.volume_coba_sh : e_data.volume_sh; + grp = DRW_shgroup_create(sh, vedata->psl->volume_pass); DRW_shgroup_uniform_vec4(grp, "viewvecs[0]", (float *)wpd->viewvecs, 3); - DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); - DRW_shgroup_uniform_texture(grp, "densityTexture", sds->tex); - DRW_shgroup_uniform_float_copy(grp, "densityScale", 10.0f * sds->display_thickness); DRW_shgroup_uniform_int_copy(grp, "samplesLen", max_slices); /* TODO FIXME : This step size is in object space but the ray itself * is NOT unit length in object space so the required number of subdivisions * is tricky to get. */ DRW_shgroup_uniform_float_copy(grp, "stepLength", 8.0f / max_slices); - DRW_shgroup_state_enable(grp, DRW_STATE_CULL_FRONT); - BLI_addtail(&wpd->smoke_domains, BLI_genericNodeN(smd)); + } - /* TODO Flame rendering */ - /* TODO COBA Rendering */ + if (sds->use_coba) { + DRW_shgroup_uniform_texture(grp, "densityTexture", sds->tex_field); + DRW_shgroup_uniform_texture(grp, "transferTexture", sds->tex_coba); + } + else { + DRW_shgroup_uniform_texture(grp, "densityTexture", sds->tex); + DRW_shgroup_uniform_texture(grp, "shadowTexture", sds->tex_shadow); + DRW_shgroup_uniform_texture(grp, "flameTexture", (sds->tex_flame) ? sds->tex_flame : e_data.dummy_tex); + DRW_shgroup_uniform_texture(grp, "flameColorTexture", (sds->tex_flame) ? sds->tex_flame_coba : e_data.dummy_coba_tex); + } + DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); + DRW_shgroup_uniform_float_copy(grp, "densityScale", 10.0f * sds->display_thickness); + DRW_shgroup_state_disable(grp, DRW_STATE_CULL_FRONT); + if (use_slice) { + DRW_shgroup_call_object_add(grp, DRW_cache_quad_get(), ob); + } + else { DRW_shgroup_call_object_add(grp, DRW_cache_cube_get(), ob); } + + BLI_addtail(&wpd->smoke_domains, BLI_genericNodeN(smd)); } void workbench_volume_smoke_textures_free(WORKBENCH_PrivateData *wpd) diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index 193c2416215..17304dde802 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -325,6 +325,7 @@ struct GPUVertFormat *DRW_shgroup_instance_format_array(const DRWInstanceAttribF } while (0) DRWShadingGroup *DRW_shgroup_create(struct GPUShader *shader, DRWPass *pass); +DRWShadingGroup *DRW_shgroup_create_sub(DRWShadingGroup *shgroup); DRWShadingGroup *DRW_shgroup_material_create(struct GPUMaterial *material, DRWPass *pass); DRWShadingGroup *DRW_shgroup_material_instance_create( struct GPUMaterial *material, DRWPass *pass, struct GPUBatch *geom, struct Object *ob, @@ -363,11 +364,12 @@ void DRW_shgroup_call_procedural_points_add(DRWShadingGroup *shgroup, uint point void DRW_shgroup_call_procedural_lines_add(DRWShadingGroup *shgroup, uint line_count, float (*obmat)[4]); void DRW_shgroup_call_procedural_triangles_add(DRWShadingGroup *shgroup, uint tria_count, float (*obmat)[4]); void DRW_shgroup_call_object_procedural_triangles_culled_add(DRWShadingGroup *shgroup, uint tria_count, struct Object *ob); -void DRW_shgroup_call_object_add_ex(DRWShadingGroup *shgroup, struct GPUBatch *geom, struct Object *ob, bool bypass_culling); -#define DRW_shgroup_call_object_add(shgroup, geom, ob) DRW_shgroup_call_object_add_ex(shgroup, geom, ob, false) -#define DRW_shgroup_call_object_add_no_cull(shgroup, geom, ob) DRW_shgroup_call_object_add_ex(shgroup, geom, ob, true) +void DRW_shgroup_call_object_add_ex( + DRWShadingGroup *shgroup, struct GPUBatch *geom, struct Object *ob, struct Material *ma, bool bypass_culling); +#define DRW_shgroup_call_object_add(shgroup, geom, ob) DRW_shgroup_call_object_add_ex(shgroup, geom, ob, NULL, false) +#define DRW_shgroup_call_object_add_no_cull(shgroup, geom, ob) DRW_shgroup_call_object_add_ex(shgroup, geom, ob, NULL, true) void DRW_shgroup_call_object_add_with_callback( - DRWShadingGroup *shgroup, struct GPUBatch *geom, struct Object *ob, + DRWShadingGroup *shgroup, struct GPUBatch *geom, struct Object *ob, struct Material *ma, DRWCallVisibilityFn *callback, void *user_data); /* Used for drawing a batch with instancing without instance attribs. */ void DRW_shgroup_call_instances_add( @@ -507,11 +509,11 @@ DrawData *DRW_drawdata_ensure( DrawDataFreeCb free_cb); /* Settings */ -bool DRW_object_is_renderable(struct Object *ob); -bool DRW_check_object_visible_within_active_context(struct Object *ob); +bool DRW_object_is_renderable(const struct Object *ob); +bool DRW_object_is_visible_in_active_context(const struct Object *ob); bool DRW_object_is_flat_normal(const struct Object *ob); -bool DRW_check_psys_visible_within_active_context(struct Object *object, struct ParticleSystem *psys); +bool DRW_object_is_visible_psys_in_active_context(const struct Object *object, const struct ParticleSystem *psys); /* Draw commands */ void DRW_draw_pass(DRWPass *pass); diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c index 9f0306f32a3..20ead73e0f5 100644 --- a/source/blender/draw/intern/draw_cache.c +++ b/source/blender/draw/intern/draw_cache.c @@ -2986,7 +2986,8 @@ GPUBatch *DRW_cache_mesh_surface_overlay_get(Object *ob) void DRW_cache_mesh_wire_overlay_get( Object *ob, - GPUBatch **r_tris, GPUBatch **r_ledges, GPUBatch **r_lverts) + GPUBatch **r_tris, GPUBatch **r_ledges, GPUBatch **r_lverts, + struct GPUTexture **r_data_tex) { BLI_assert(ob->type == OB_MESH); @@ -2995,6 +2996,7 @@ void DRW_cache_mesh_wire_overlay_get( *r_tris = DRW_mesh_batch_cache_get_overlay_triangles(me); *r_ledges = DRW_mesh_batch_cache_get_overlay_loose_edges(me); *r_lverts = DRW_mesh_batch_cache_get_overlay_loose_verts(me); + *r_data_tex = DRW_mesh_batch_cache_get_overlay_data_tex(me); } void DRW_cache_mesh_normals_overlay_get( diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h index 5999dc25338..4860b438bb1 100644 --- a/source/blender/draw/intern/draw_cache.h +++ b/source/blender/draw/intern/draw_cache.h @@ -128,7 +128,8 @@ struct GPUBatch *DRW_cache_bone_dof_lines_get(void); struct GPUBatch *DRW_cache_mesh_surface_overlay_get(struct Object *ob); void DRW_cache_mesh_wire_overlay_get( struct Object *ob, - struct GPUBatch **r_tris, struct GPUBatch **r_ledges, struct GPUBatch **r_lverts); + struct GPUBatch **r_tris, struct GPUBatch **r_ledges, struct GPUBatch **r_lverts, + struct GPUTexture **r_data_tex); void DRW_cache_mesh_normals_overlay_get( struct Object *ob, struct GPUBatch **r_tris, struct GPUBatch **r_ledges, struct GPUBatch **r_lverts); diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h index 1aaedd39c85..575670319d8 100644 --- a/source/blender/draw/intern/draw_cache_impl.h +++ b/source/blender/draw/intern/draw_cache_impl.h @@ -143,10 +143,12 @@ struct GPUBatch *DRW_mesh_batch_cache_get_fancy_edges(struct Mesh *me); struct GPUBatch *DRW_mesh_batch_cache_get_edge_detection(struct Mesh *me, bool *r_is_manifold); struct GPUBatch *DRW_mesh_batch_cache_get_overlay_triangles(struct Mesh *me); struct GPUBatch *DRW_mesh_batch_cache_get_overlay_triangles_nor(struct Mesh *me); +struct GPUBatch *DRW_mesh_batch_cache_get_overlay_verts(struct Mesh *me); struct GPUBatch *DRW_mesh_batch_cache_get_overlay_loose_edges(struct Mesh *me); struct GPUBatch *DRW_mesh_batch_cache_get_overlay_loose_edges_nor(struct Mesh *me); struct GPUBatch *DRW_mesh_batch_cache_get_overlay_loose_verts(struct Mesh *me); struct GPUBatch *DRW_mesh_batch_cache_get_overlay_facedots(struct Mesh *me); +struct GPUTexture *DRW_mesh_batch_cache_get_overlay_data_tex(struct Mesh *me); /* edit-mesh selection (use generic function for faces) */ struct GPUBatch *DRW_mesh_batch_cache_get_facedots_with_select_id(struct Mesh *me, uint select_id_offset); struct GPUBatch *DRW_mesh_batch_cache_get_edges_with_select_id(struct Mesh *me, uint select_id_offset); @@ -178,9 +180,10 @@ void DRW_mesh_cache_uvedit( enum { VFLAG_VERTEX_ACTIVE = 1 << 0, VFLAG_VERTEX_SELECTED = 1 << 1, - VFLAG_FACE_ACTIVE = 1 << 2, - VFLAG_FACE_SELECTED = 1 << 3, - VFLAG_FACE_FREESTYLE = 1 << 4, + VFLAG_VERTEX_EXISTS = 1 << 2, + VFLAG_FACE_ACTIVE = 1 << 3, + VFLAG_FACE_SELECTED = 1 << 4, + VFLAG_FACE_FREESTYLE = 1 << 5, /* Beware to not go over 1 << 7 (it's a byte flag) * (see gpu_shader_edit_mesh_overlay_geom.glsl) */ }; diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c index b2ec0632db2..6013c8eef91 100644 --- a/source/blender/draw/intern/draw_cache_impl_mesh.c +++ b/source/blender/draw/intern/draw_cache_impl_mesh.c @@ -48,10 +48,13 @@ #include "BKE_customdata.h" #include "BKE_deform.h" #include "BKE_editmesh.h" +#include "BKE_editmesh_cache.h" #include "BKE_editmesh_tangent.h" #include "BKE_mesh.h" #include "BKE_mesh_tangent.h" +#include "BKE_mesh_runtime.h" #include "BKE_colorband.h" +#include "BKE_cdderivedmesh.h" #include "bmesh.h" @@ -142,13 +145,40 @@ typedef struct MeshRenderData { int loose_vert_len; int loose_edge_len; + /* Support for mapped mesh data. */ + struct { + /* Must be set if we want to get mapped data. */ + bool use; + bool supported; + + Mesh *me_cage; + + int vert_len; + int edge_len; + int tri_len; + int loop_len; + int poly_len; + + int *loose_verts; + int loose_vert_len; + + int *loose_edges; + int loose_edge_len; + + /* origindex layers */ + int *v_origindex; + int *e_origindex; + int *l_origindex; + int *p_origindex; + } mapped; + BMEditMesh *edit_bmesh; struct EditMeshData *edit_data; MVert *mvert; - MEdge *medge; - MLoop *mloop; - MPoly *mpoly; + const MEdge *medge; + const MLoop *mloop; + const MPoly *mpoly; float (*orco)[3]; /* vertex coordinates normalized to bounding box */ bool is_orco_allocated; MDeformVert *dvert; @@ -180,6 +210,10 @@ typedef struct MeshRenderData { int bweight; int *uv; int *vcol; +#ifdef WITH_FREESTYLE + int freestyle_edge; + int freestyle_face; +#endif } offset; struct { @@ -409,6 +443,36 @@ static MeshRenderData *mesh_render_data_create_ex( rdata->edit_bmesh = embm; rdata->edit_data = me->runtime.edit_data; + if (embm->mesh_eval_cage && (embm->mesh_eval_cage->runtime.is_original == false)) { + Mesh *me_cage = embm->mesh_eval_cage; + + rdata->mapped.me_cage = me_cage; + if (types & MR_DATATYPE_VERT) { + rdata->mapped.vert_len = me_cage->totvert; + } + if (types & MR_DATATYPE_EDGE) { + rdata->mapped.edge_len = me_cage->totedge; + } + if (types & MR_DATATYPE_LOOP) { + rdata->mapped.loop_len = me_cage->totloop; + } + if (types & MR_DATATYPE_POLY) { + rdata->mapped.poly_len = me_cage->totpoly; + } + if (types & MR_DATATYPE_LOOPTRI) { + rdata->mapped.tri_len = poly_to_tri_count(me_cage->totpoly, me_cage->totloop); + } + + rdata->mapped.v_origindex = CustomData_get_layer(&me_cage->vdata, CD_ORIGINDEX); + rdata->mapped.e_origindex = CustomData_get_layer(&me_cage->edata, CD_ORIGINDEX); + rdata->mapped.l_origindex = CustomData_get_layer(&me_cage->ldata, CD_ORIGINDEX); + rdata->mapped.p_origindex = CustomData_get_layer(&me_cage->pdata, CD_ORIGINDEX); + rdata->mapped.supported = ( + rdata->mapped.v_origindex && + rdata->mapped.e_origindex && + rdata->mapped.p_origindex); + } + int bm_ensure_types = 0; if (types & MR_DATATYPE_VERT) { rdata->vert_len = bm->totvert; @@ -419,17 +483,7 @@ static MeshRenderData *mesh_render_data_create_ex( bm_ensure_types |= BM_EDGE; } if (types & MR_DATATYPE_LOOPTRI) { - BKE_editmesh_tessface_calc(embm); - int tottri = embm->tottri; - rdata->mlooptri = MEM_mallocN(sizeof(*rdata->mlooptri) * embm->tottri, __func__); - for (int index = 0; index < tottri ; index ++ ) { - BMLoop **bmtri = embm->looptris[index]; - MLoopTri *mtri = &rdata->mlooptri[index]; - mtri->tri[0] = BM_elem_index_get(bmtri[0]); - mtri->tri[1] = BM_elem_index_get(bmtri[1]); - mtri->tri[2] = BM_elem_index_get(bmtri[2]); - } - rdata->tri_len = tottri; + bm_ensure_types |= BM_LOOP; } if (types & MR_DATATYPE_LOOP) { int totloop = bm->totloop; @@ -453,6 +507,11 @@ static MeshRenderData *mesh_render_data_create_ex( rdata->eve_act = BM_mesh_active_vert_get(bm); rdata->cd.offset.crease = CustomData_get_offset(&bm->edata, CD_CREASE); rdata->cd.offset.bweight = CustomData_get_offset(&bm->edata, CD_BWEIGHT); + +#ifdef WITH_FREESTYLE + rdata->cd.offset.freestyle_edge = CustomData_get_offset(&bm->edata, CD_FREESTYLE_EDGE); + rdata->cd.offset.freestyle_face = CustomData_get_offset(&bm->pdata, CD_FREESTYLE_FACE); +#endif } if (types & (MR_DATATYPE_DVERT)) { bm_ensure_types |= BM_VERT; @@ -463,13 +522,28 @@ static MeshRenderData *mesh_render_data_create_ex( BM_mesh_elem_index_ensure(bm, bm_ensure_types); BM_mesh_elem_table_ensure(bm, bm_ensure_types & ~BM_LOOP); + + if (types & MR_DATATYPE_LOOPTRI) { + /* Edit mode ensures this is valid, no need to calculate. */ + BLI_assert((bm->totloop == 0) || (embm->looptris != NULL)); + int tottri = embm->tottri; + MLoopTri *mlooptri = MEM_mallocN(sizeof(*rdata->mlooptri) * embm->tottri, __func__); + for (int index = 0; index < tottri ; index ++ ) { + BMLoop **bmtri = embm->looptris[index]; + MLoopTri *mtri = &mlooptri[index]; + mtri->tri[0] = BM_elem_index_get(bmtri[0]); + mtri->tri[1] = BM_elem_index_get(bmtri[1]); + mtri->tri[2] = BM_elem_index_get(bmtri[2]); + } + rdata->mlooptri = mlooptri; + rdata->tri_len = tottri; + } + if (types & MR_DATATYPE_OVERLAY) { rdata->loose_vert_len = rdata->loose_edge_len = 0; - int *lverts = rdata->loose_verts = MEM_mallocN(rdata->vert_len * sizeof(int), "Loose Vert"); - int *ledges = rdata->loose_edges = MEM_mallocN(rdata->edge_len * sizeof(int), "Loose Edges"); - { + int *lverts = MEM_mallocN(rdata->vert_len * sizeof(int), __func__); BLI_assert((bm->elem_table_dirty & BM_VERT) == 0); BMVert **vtable = bm->vtable; for (int i = 0; i < bm->totvert; i++) { @@ -481,9 +555,11 @@ static MeshRenderData *mesh_render_data_create_ex( } } } + rdata->loose_verts = MEM_reallocN(lverts, rdata->loose_vert_len * sizeof(int)); } { + int *ledges = MEM_mallocN(rdata->edge_len * sizeof(int), __func__); BLI_assert((bm->elem_table_dirty & BM_EDGE) == 0); BMEdge **etable = bm->etable; for (int i = 0; i < bm->totedge; i++) { @@ -495,10 +571,49 @@ static MeshRenderData *mesh_render_data_create_ex( } } } + rdata->loose_edges = MEM_reallocN(ledges, rdata->loose_edge_len * sizeof(int)); } - rdata->loose_verts = MEM_reallocN(rdata->loose_verts, rdata->loose_vert_len * sizeof(int)); - rdata->loose_edges = MEM_reallocN(rdata->loose_edges, rdata->loose_edge_len * sizeof(int)); + if (rdata->mapped.supported) { + Mesh *me_cage = embm->mesh_eval_cage; + rdata->mapped.loose_vert_len = rdata->mapped.loose_edge_len = 0; + + if (rdata->loose_vert_len) { + int *lverts = MEM_mallocN(me_cage->totvert * sizeof(int), __func__); + const int *v_origindex = rdata->mapped.v_origindex; + for (int i = 0; i < me_cage->totvert; i++) { + const int v_orig = v_origindex[i]; + if (v_orig != ORIGINDEX_NONE) { + BMVert *eve = BM_vert_at_index(bm, v_orig); + if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) { + /* Loose vert */ + if (eve->e == NULL || !bm_vert_has_visible_edge(eve)) { + lverts[rdata->mapped.loose_vert_len++] = i; + } + } + } + } + rdata->mapped.loose_verts = MEM_reallocN(lverts, rdata->mapped.loose_vert_len * sizeof(int)); + } + + if (rdata->loose_edge_len) { + int *ledges = MEM_mallocN(me_cage->totedge * sizeof(int), __func__); + const int *e_origindex = rdata->mapped.e_origindex; + for (int i = 0; i < me_cage->totedge; i++) { + const int e_orig = e_origindex[i]; + if (e_orig != ORIGINDEX_NONE) { + BMEdge *eed = BM_edge_at_index(bm, e_orig); + if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) { + /* Loose edge */ + if (eed->l == NULL || !bm_edge_has_visible_face(eed)) { + ledges[rdata->mapped.loose_edge_len++] = i; + } + } + } + } + rdata->mapped.loose_edges = MEM_reallocN(ledges, rdata->mapped.loose_edge_len * sizeof(int)); + } + } } } else { @@ -512,8 +627,9 @@ static MeshRenderData *mesh_render_data_create_ex( } if (types & MR_DATATYPE_LOOPTRI) { const int tri_len = rdata->tri_len = poly_to_tri_count(me->totpoly, me->totloop); - rdata->mlooptri = MEM_mallocN(sizeof(*rdata->mlooptri) * tri_len, __func__); - BKE_mesh_recalc_looptri(me->mloop, me->mpoly, me->mvert, me->totloop, me->totpoly, rdata->mlooptri); + MLoopTri *mlooptri = MEM_mallocN(sizeof(*mlooptri) * tri_len, __func__); + BKE_mesh_recalc_looptri(me->mloop, me->mpoly, me->mvert, me->totloop, me->totpoly, mlooptri); + rdata->mlooptri = mlooptri; } if (types & MR_DATATYPE_LOOP) { rdata->loop_len = me->totloop; @@ -856,6 +972,9 @@ static void mesh_render_data_free(MeshRenderData *rdata) MEM_SAFE_FREE(rdata->edge_select_bool); MEM_SAFE_FREE(rdata->vert_color); + MEM_SAFE_FREE(rdata->mapped.loose_verts); + MEM_SAFE_FREE(rdata->mapped.loose_edges); + CustomData_free(&rdata->cd.output.ldata, rdata->loop_len); MEM_freeN(rdata); @@ -909,30 +1028,55 @@ static int mesh_render_data_verts_len_get(const MeshRenderData *rdata) BLI_assert(rdata->types & MR_DATATYPE_VERT); return rdata->vert_len; } +static int mesh_render_data_verts_len_get_maybe_mapped(const MeshRenderData *rdata) +{ + BLI_assert(rdata->types & MR_DATATYPE_VERT); + return ((rdata->mapped.use == false) ? rdata->vert_len : rdata->mapped.vert_len); +} -static int mesh_render_data_loose_verts_len_get(const MeshRenderData *rdata) +static int UNUSED_FUNCTION(mesh_render_data_loose_verts_len_get)(const MeshRenderData *rdata) { BLI_assert(rdata->types & MR_DATATYPE_OVERLAY); return rdata->loose_vert_len; } +static int mesh_render_data_loose_verts_len_get_maybe_mapped(const MeshRenderData *rdata) +{ + BLI_assert(rdata->types & MR_DATATYPE_OVERLAY); + return ((rdata->mapped.use == false) ? rdata->loose_vert_len : rdata->mapped.loose_vert_len); +} static int mesh_render_data_edges_len_get(const MeshRenderData *rdata) { BLI_assert(rdata->types & MR_DATATYPE_EDGE); return rdata->edge_len; } +static int mesh_render_data_edges_len_get_maybe_mapped(const MeshRenderData *rdata) +{ + BLI_assert(rdata->types & MR_DATATYPE_EDGE); + return ((rdata->mapped.use == false) ? rdata->edge_len : rdata->mapped.edge_len); +} -static int mesh_render_data_loose_edges_len_get(const MeshRenderData *rdata) +static int UNUSED_FUNCTION(mesh_render_data_loose_edges_len_get)(const MeshRenderData *rdata) { BLI_assert(rdata->types & MR_DATATYPE_OVERLAY); return rdata->loose_edge_len; } +static int mesh_render_data_loose_edges_len_get_maybe_mapped(const MeshRenderData *rdata) +{ + BLI_assert(rdata->types & MR_DATATYPE_OVERLAY); + return ((rdata->mapped.use == false) ? rdata->loose_edge_len : rdata->mapped.loose_edge_len); +} static int mesh_render_data_looptri_len_get(const MeshRenderData *rdata) { BLI_assert(rdata->types & MR_DATATYPE_LOOPTRI); return rdata->tri_len; } +static int mesh_render_data_looptri_len_get_maybe_mapped(const MeshRenderData *rdata) +{ + BLI_assert(rdata->types & MR_DATATYPE_LOOPTRI); + return ((rdata->mapped.use == false) ? rdata->tri_len : rdata->mapped.tri_len); +} static int mesh_render_data_mat_len_get(const MeshRenderData *rdata) { @@ -951,6 +1095,11 @@ static int mesh_render_data_polys_len_get(const MeshRenderData *rdata) BLI_assert(rdata->types & MR_DATATYPE_POLY); return rdata->poly_len; } +static int mesh_render_data_polys_len_get_maybe_mapped(const MeshRenderData *rdata) +{ + BLI_assert(rdata->types & MR_DATATYPE_POLY); + return ((rdata->mapped.use == false) ? rdata->poly_len : rdata->mapped.poly_len); +} /** \} */ @@ -972,8 +1121,17 @@ static void mesh_render_data_ensure_poly_normals_pack(MeshRenderData *rdata) int i; pnors_pack = rdata->poly_normals_pack = MEM_mallocN(sizeof(*pnors_pack) * rdata->poly_len, __func__); - BM_ITER_MESH_INDEX(efa, &fiter, bm, BM_FACES_OF_MESH, i) { - pnors_pack[i] = GPU_normal_convert_i10_v3(efa->no); + if (rdata->edit_data && rdata->edit_data->vertexCos != NULL) { + BKE_editmesh_cache_ensure_poly_normals(rdata->edit_bmesh, rdata->edit_data); + const float (*pnors)[3] = rdata->edit_data->polyNos; + for (i = 0; i < bm->totface; i++) { + pnors_pack[i] = GPU_normal_convert_i10_v3(pnors[i]); + } + } + else { + BM_ITER_MESH_INDEX(efa, &fiter, bm, BM_FACES_OF_MESH, i) { + pnors_pack[i] = GPU_normal_convert_i10_v3(efa->no); + } } } else { @@ -1177,11 +1335,11 @@ static void mesh_render_data_ensure_edge_select_bool(MeshRenderData *rdata, bool MEM_callocN(sizeof(*edge_select_bool) * rdata->edge_len, __func__); for (int i = 0; i < rdata->poly_len; i++) { - MPoly *poly = &rdata->mpoly[i]; + const MPoly *poly = &rdata->mpoly[i]; if (poly->flag & ME_FACE_SEL) { for (int j = 0; j < poly->totloop; j++) { - MLoop *loop = &rdata->mloop[poly->loopstart + j]; + const MLoop *loop = &rdata->mloop[poly->loopstart + j]; if (use_wire) { edge_select_bool[loop->e] = true; } @@ -1213,8 +1371,14 @@ static bool mesh_render_data_pnors_pcenter_select_get( if (BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) { return false; } - BM_face_calc_center_mean(efa, r_center); - copy_v3_v3(r_pnors, efa->no); + if (rdata->edit_data && rdata->edit_data->vertexCos) { + copy_v3_v3(r_center, rdata->edit_data->polyCos[poly]); + copy_v3_v3(r_pnors, rdata->edit_data->polyNos[poly]); + } + else { + BM_face_calc_center_mean(efa, r_center); + copy_v3_v3(r_pnors, efa->no); + } *r_selected = (BM_elem_flag_test(efa, BM_ELEM_SELECT) != 0) ? true : false; } else { @@ -1230,6 +1394,40 @@ static bool mesh_render_data_pnors_pcenter_select_get( return true; } +static bool mesh_render_data_pnors_pcenter_select_get_mapped( + MeshRenderData *rdata, const int poly, + float r_pnors[3], float r_center[3], bool *r_selected) +{ + BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOP | MR_DATATYPE_POLY)); + const int *p_origindex = rdata->mapped.p_origindex; + const int p_orig = p_origindex[poly]; + if (p_orig == ORIGINDEX_NONE) { + return false; + } + BMEditMesh *em = rdata->edit_bmesh; + const BMFace *efa = BM_face_at_index(rdata->edit_bmesh->bm, p_orig); + if (BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) { + return false; + } + + Mesh *me_cage = em->mesh_eval_cage; + const MVert *mvert = me_cage->mvert; +#if 0 + const MEdge *medge = me_cage->medge; +#endif + const MLoop *mloop = me_cage->mloop; + const MPoly *mpoly = me_cage->mpoly; + + const MPoly *mp = mpoly + poly; + const MLoop *ml = mloop + mp->loopstart; + + BKE_mesh_calc_poly_center(mp, ml, mvert, r_center); + BKE_mesh_calc_poly_normal(mp, ml, mvert, r_pnors); + + *r_selected = (BM_elem_flag_test(efa, BM_ELEM_SELECT) != 0) ? true : false; + + return true; +} static bool mesh_render_data_edge_vcos_manifold_pnors( MeshRenderData *rdata, const int edge_index, @@ -1263,7 +1461,7 @@ static bool mesh_render_data_edge_vcos_manifold_pnors( } else { MVert *mvert = rdata->mvert; - MEdge *medge = rdata->medge; + const MEdge *medge = rdata->medge; EdgeAdjacentPolys *eap = rdata->edges_adjacent_polys; float (*pnors)[3] = rdata->poly_normals; @@ -1349,12 +1547,11 @@ static uchar mesh_render_data_looptri_flag(MeshRenderData *rdata, const BMFace * fflag |= VFLAG_FACE_SELECTED; #ifdef WITH_FREESTYLE - BMesh *bm = rdata->edit_bmesh->bm; - if (CustomData_has_layer(&bm->pdata, CD_FREESTYLE_FACE)) { - FreestyleFace *ffa = CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_FREESTYLE_FACE); - - if (ffa->flag & FREESTYLE_FACE_MARK) + if (rdata->cd.offset.freestyle_face != -1) { + const FreestyleFace *ffa = BM_ELEM_CD_GET_VOID_P(efa, rdata->cd.offset.freestyle_face); + if (ffa->flag & FREESTYLE_FACE_MARK) { fflag |= VFLAG_FACE_FREESTYLE; + } } #endif @@ -1379,16 +1576,6 @@ static void mesh_render_data_edge_flag( if (!BM_elem_flag_test(eed, BM_ELEM_SMOOTH)) eattr->e_flag |= VFLAG_EDGE_SHARP; -#ifdef WITH_FREESTYLE - BMesh *bm = rdata->edit_bmesh->bm; - if (CustomData_has_layer(&bm->edata, CD_FREESTYLE_EDGE)) { - FreestyleEdge *fed = CustomData_bmesh_get(&bm->edata, eed->head.data, CD_FREESTYLE_EDGE); - - if (fed->flag & FREESTYLE_EDGE_MARK) - eattr->e_flag |= VFLAG_EDGE_FREESTYLE; - } -#endif - /* Use a byte for value range */ if (rdata->cd.offset.crease != -1) { float crease = BM_ELEM_CD_GET_FLOAT(eed, rdata->cd.offset.crease); @@ -1404,11 +1591,20 @@ static void mesh_render_data_edge_flag( eattr->bweight = (uchar)(bweight * 255.0f); } } + +#ifdef WITH_FREESTYLE + if (rdata->cd.offset.freestyle_edge != -1) { + const FreestyleEdge *fed = BM_ELEM_CD_GET_VOID_P(eed, rdata->cd.offset.freestyle_edge); + if (fed->flag & FREESTYLE_EDGE_MARK) { + eattr->e_flag |= VFLAG_EDGE_FREESTYLE; + } + } +#endif } static uchar mesh_render_data_vertex_flag(MeshRenderData *rdata, const BMVert *eve) { - uchar vflag = 0; + uchar vflag = VFLAG_VERTEX_EXISTS; /* Current vertex */ if (eve == rdata->eve_act) @@ -1421,13 +1617,20 @@ static uchar mesh_render_data_vertex_flag(MeshRenderData *rdata, const BMVert *e } static void add_overlay_tri( - MeshRenderData *rdata, GPUVertBuf *vbo_pos, GPUVertBuf *vbo_nor, GPUVertBuf *vbo_data, + MeshRenderData *rdata, GPUVertBuf *vbo_pos, GPUVertBuf *vbo_nor, GPUVertBuf *vbo_data, GPUIndexBufBuilder *elb, const uint pos_id, const uint vnor_id, const uint lnor_id, const uint data_id, const BMLoop **bm_looptri, const int base_vert_idx) { uchar fflag; uchar vflag; + for (int i = 0; i < 3; ++i) { + if (!BM_elem_flag_test(bm_looptri[i]->v, BM_ELEM_TAG)) { + BM_elem_flag_enable(bm_looptri[i]->v, BM_ELEM_TAG); + GPU_indexbuf_add_generic_vert(elb, base_vert_idx + i); + } + } + if (vbo_pos) { /* TODO(sybren): deduplicate this and all the other places it's pasted to in this file. */ if (rdata->edit_data && rdata->edit_data->vertexCos) { @@ -1457,18 +1660,109 @@ static void add_overlay_tri( if (vbo_data) { fflag = mesh_render_data_looptri_flag(rdata, bm_looptri[0]->f); - uint i_prev = 1, i = 2; - for (uint i_next = 0; i_next < 3; i_next++) { + for (uint i = 0; i < 3; i++) { + const int i_next = (i + 1) % 3; + const int i_prev = (i + 2) % 3; vflag = mesh_render_data_vertex_flag(rdata, bm_looptri[i]->v); + /* Opposite edge to the vertex at 'i'. */ EdgeDrawAttr eattr = {0}; - if (bm_looptri[i_next] == bm_looptri[i_prev]->prev) { + const bool is_edge_real = (bm_looptri[i_next] == bm_looptri[i_prev]->prev); + if (is_edge_real) { mesh_render_data_edge_flag(rdata, bm_looptri[i_next]->e, &eattr); } eattr.v_flag = fflag | vflag; GPU_vertbuf_attr_set(vbo_data, data_id, base_vert_idx + i, &eattr); + } + } +} +static void add_overlay_tri_mapped( + MeshRenderData *rdata, GPUVertBuf *vbo_pos, GPUVertBuf *vbo_nor, GPUVertBuf *vbo_data, GPUIndexBufBuilder *elb, + const uint pos_id, const uint vnor_id, const uint lnor_id, const uint data_id, + BMFace *efa, const MLoopTri *mlt, const float poly_normal[3], const int base_vert_idx) +{ + BMEditMesh *embm = rdata->edit_bmesh; + BMesh *bm = embm->bm; + Mesh *me_cage = embm->mesh_eval_cage; + + const MVert *mvert = me_cage->mvert; + const MEdge *medge = me_cage->medge; + const MLoop *mloop = me_cage->mloop; +#if 0 + const MPoly *mpoly = me_cage->mpoly; +#endif - i_prev = i; - i = i_next; + const int *v_origindex = rdata->mapped.v_origindex; + const int *e_origindex = rdata->mapped.e_origindex; +#if 0 + const int *l_origindex = rdata->mapped.l_origindex; + const int *p_origindex = rdata->mapped.p_origindex; +#endif + + uchar fflag; + uchar vflag; + + if (elb) { + for (int i = 0; i < 3; ++i) { + const int v_orig = v_origindex[mloop[mlt->tri[i]].v]; + if (v_orig == ORIGINDEX_NONE) { + continue; + } + BMVert *v = BM_vert_at_index(bm, v_orig); + if (!BM_elem_flag_test(v, BM_ELEM_TAG)) { + BM_elem_flag_enable(v, BM_ELEM_TAG); + GPU_indexbuf_add_generic_vert(elb, base_vert_idx + i); + } + } + } + + if (vbo_pos) { + for (uint i = 0; i < 3; i++) { + const float *pos = mvert[mloop[mlt->tri[i]].v].co; + GPU_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx + i, pos); + } + } + + if (vbo_nor) { + /* TODO real loop normal */ + GPUPackedNormal lnor = GPU_normal_convert_i10_v3(poly_normal); + for (uint i = 0; i < 3; i++) { + GPUPackedNormal vnor = GPU_normal_convert_i10_s3(mvert[mloop[mlt->tri[i]].v].no); + GPU_vertbuf_attr_set(vbo_nor, vnor_id, base_vert_idx + i, &vnor); + GPU_vertbuf_attr_set(vbo_nor, lnor_id, base_vert_idx + i, &lnor); + } + } + + if (vbo_data) { + fflag = mesh_render_data_looptri_flag(rdata, efa); + for (uint i = 0; i < 3; i++) { + const int i_next = (i + 1) % 3; + const int i_prev = (i + 2) % 3; + const int v_orig = v_origindex[mloop[mlt->tri[i]].v]; + if (v_orig != ORIGINDEX_NONE) { + BMVert *v = BM_vert_at_index(bm, v_orig); + vflag = mesh_render_data_vertex_flag(rdata, v); + } + else { + /* Importantly VFLAG_VERTEX_EXISTS is not set. */ + vflag = 0; + } + /* Opposite edge to the vertex at 'i'. */ + EdgeDrawAttr eattr = {0}; + const int e_idx = mloop[mlt->tri[i_next]].e; + const int e_orig = e_origindex[e_idx]; + if (e_orig != ORIGINDEX_NONE) { + const MEdge *ed = &medge[e_idx]; + const uint tri_edge[2] = {mloop[mlt->tri[i_prev]].v, mloop[mlt->tri[i_next]].v}; + const bool is_edge_real = ( + ((ed->v1 == tri_edge[0]) && (ed->v2 == tri_edge[1])) || + ((ed->v1 == tri_edge[1]) && (ed->v2 == tri_edge[0]))); + if (is_edge_real) { + BMEdge *eed = BM_edge_at_index(bm, e_orig); + mesh_render_data_edge_flag(rdata, eed, &eattr); + } + } + eattr.v_flag = fflag | vflag; + GPU_vertbuf_attr_set(vbo_data, data_id, base_vert_idx + i, &eattr); } } } @@ -1488,7 +1782,7 @@ static void add_overlay_loose_edge( } } else { - for (int i = 0; i < 2; ++i) { + for (int i = 0; i < 2; i++) { const float *pos = (&eed->v1)[i]->co; GPU_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx + i, pos); } @@ -1496,7 +1790,7 @@ static void add_overlay_loose_edge( } if (vbo_nor) { - for (int i = 0; i < 2; ++i) { + for (int i = 0; i < 2; i++) { GPUPackedNormal vnor = GPU_normal_convert_i10_v3((&eed->v1)[i]->no); GPU_vertbuf_attr_set(vbo_nor, vnor_id, base_vert_idx + i, &vnor); } @@ -1505,12 +1799,42 @@ static void add_overlay_loose_edge( if (vbo_data) { EdgeDrawAttr eattr = {0}; mesh_render_data_edge_flag(rdata, eed, &eattr); - for (int i = 0; i < 2; ++i) { + for (int i = 0; i < 2; i++) { eattr.v_flag = mesh_render_data_vertex_flag(rdata, (&eed->v1)[i]); GPU_vertbuf_attr_set(vbo_data, data_id, base_vert_idx + i, &eattr); } } } +static void add_overlay_loose_edge_mapped( + MeshRenderData *rdata, GPUVertBuf *vbo_pos, GPUVertBuf *vbo_nor, GPUVertBuf *vbo_data, + const uint pos_id, const uint vnor_id, const uint data_id, + BMEdge *eed, const MVert *mvert, const MEdge *ed, const int base_vert_idx) +{ + if (vbo_pos) { + /* TODO(sybren): deduplicate this and all the other places it's pasted to in this file. */ + for (int i = 0; i < 2; i++) { + const float *pos = mvert[*(&ed->v1 + i)].co; + GPU_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx + i, pos); + } + } + + if (vbo_nor) { + for (int i = 0; i < 2; i++) { + GPUPackedNormal vnor = GPU_normal_convert_i10_s3(mvert[*(&ed->v1 + i)].no); + GPU_vertbuf_attr_set(vbo_nor, vnor_id, base_vert_idx + i, &vnor); + } + } + + if (vbo_data) { + EdgeDrawAttr eattr = {0}; + mesh_render_data_edge_flag(rdata, eed, &eattr); + for (int i = 0; i < 2; i++) { + const int v_orig = rdata->mapped.v_origindex[*(&ed->v1 + i)]; + eattr.v_flag = (v_orig != ORIGINDEX_NONE) ? mesh_render_data_vertex_flag(rdata, (&eed->v1)[i]) : 0; + GPU_vertbuf_attr_set(vbo_data, data_id, base_vert_idx + i, &eattr); + } + } +} static void add_overlay_loose_vert( MeshRenderData *rdata, GPUVertBuf *vbo_pos, GPUVertBuf *vbo_nor, GPUVertBuf *vbo_data, @@ -1541,6 +1865,27 @@ static void add_overlay_loose_vert( GPU_vertbuf_attr_set(vbo_data, data_id, base_vert_idx, vflag); } } +static void add_overlay_loose_vert_mapped( + MeshRenderData *rdata, GPUVertBuf *vbo_pos, GPUVertBuf *vbo_nor, GPUVertBuf *vbo_data, + const uint pos_id, const uint vnor_id, const uint data_id, + const BMVert *eve, const MVert *mv, const int base_vert_idx) +{ + if (vbo_pos) { + const float *pos = mv->co; + GPU_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx, pos); + } + + if (vbo_nor) { + GPUPackedNormal vnor = GPU_normal_convert_i10_s3(mv->no); + GPU_vertbuf_attr_set(vbo_nor, vnor_id, base_vert_idx, &vnor); + } + + if (vbo_data) { + uchar vflag[4] = {0, 0, 0, 0}; + vflag[0] = mesh_render_data_vertex_flag(rdata, eve); + GPU_vertbuf_attr_set(vbo_data, data_id, base_vert_idx, vflag); + } +} /** \} */ @@ -1659,6 +2004,8 @@ typedef struct MeshBatchCache { GPUVertBuf *ed_tri_pos; GPUVertBuf *ed_tri_nor; /* LoopNor, VertNor */ GPUVertBuf *ed_tri_data; + GPUTexture *ed_tri_data_tx; + GPUIndexBuf *ed_tri_verts; GPUVertBuf *ed_ledge_pos; GPUVertBuf *ed_ledge_nor; /* VertNor */ @@ -1817,18 +2164,24 @@ static void mesh_batch_cache_discard_shaded_tri(MeshBatchCache *cache) { GPU_VERTBUF_DISCARD_SAFE(cache->shaded_triangles_data); if (cache->shaded_triangles_in_order) { - for (int i = 0; i < cache->mat_len; ++i) { + for (int i = 0; i < cache->mat_len; i++) { GPU_INDEXBUF_DISCARD_SAFE(cache->shaded_triangles_in_order[i]); } } if (cache->shaded_triangles) { - for (int i = 0; i < cache->mat_len; ++i) { + for (int i = 0; i < cache->mat_len; i++) { GPU_BATCH_DISCARD_SAFE(cache->shaded_triangles[i]); } } - + if (cache->texpaint_triangles) { + for (int i = 0; i < cache->mat_len; i++) { + /* They use shaded_triangles_in_order */ + GPU_BATCH_DISCARD_SAFE(cache->texpaint_triangles[i]); + } + } MEM_SAFE_FREE(cache->shaded_triangles_in_order); MEM_SAFE_FREE(cache->shaded_triangles); + MEM_SAFE_FREE(cache->texpaint_triangles); MEM_SAFE_FREE(cache->auto_layer_names); MEM_SAFE_FREE(cache->auto_layer_is_srgb); @@ -1882,11 +2235,15 @@ void DRW_mesh_batch_cache_dirty_tag(Mesh *me, int mode) GPU_VERTBUF_DISCARD_SAFE(cache->ed_fcenter_pos_with_nor_and_sel); /* Contains select flag */ GPU_VERTBUF_DISCARD_SAFE(cache->ed_edge_pos); GPU_VERTBUF_DISCARD_SAFE(cache->ed_vert_pos); + GPU_INDEXBUF_DISCARD_SAFE(cache->ed_tri_verts); + DRW_TEXTURE_FREE_SAFE(cache->ed_tri_data_tx); GPU_BATCH_DISCARD_SAFE(cache->overlay_triangles); GPU_BATCH_DISCARD_SAFE(cache->overlay_loose_verts); GPU_BATCH_DISCARD_SAFE(cache->overlay_loose_edges); GPU_BATCH_DISCARD_SAFE(cache->overlay_facedots); + GPU_BATCH_DISCARD_SAFE(cache->overlay_triangles_nor); + GPU_BATCH_DISCARD_SAFE(cache->overlay_loose_edges_nor); /* Edit mode selection. */ GPU_BATCH_DISCARD_SAFE(cache->facedot_with_select_id); GPU_BATCH_DISCARD_SAFE(cache->edges_with_select_id); @@ -1937,13 +2294,13 @@ static void mesh_batch_cache_clear_selective(Mesh *me, GPUVertBuf *vert) GPU_BATCH_DISCARD_SAFE(cache->points_with_normals); GPU_BATCH_DISCARD_SAFE(cache->ledges_with_normals); if (cache->shaded_triangles) { - for (int i = 0; i < cache->mat_len; ++i) { + for (int i = 0; i < cache->mat_len; i++) { GPU_BATCH_DISCARD_SAFE(cache->shaded_triangles[i]); } } MEM_SAFE_FREE(cache->shaded_triangles); if (cache->texpaint_triangles) { - for (int i = 0; i < cache->mat_len; ++i) { + for (int i = 0; i < cache->mat_len; i++) { GPU_BATCH_DISCARD_SAFE(cache->texpaint_triangles[i]); } } @@ -1983,11 +2340,13 @@ static void mesh_batch_cache_clear(Mesh *me) GPU_VERTBUF_DISCARD_SAFE(cache->ed_lvert_pos); GPU_VERTBUF_DISCARD_SAFE(cache->ed_lvert_nor); GPU_VERTBUF_DISCARD_SAFE(cache->ed_lvert_data); + GPU_INDEXBUF_DISCARD_SAFE(cache->ed_tri_verts); GPU_BATCH_DISCARD_SAFE(cache->overlay_triangles); GPU_BATCH_DISCARD_SAFE(cache->overlay_triangles_nor); GPU_BATCH_DISCARD_SAFE(cache->overlay_loose_verts); GPU_BATCH_DISCARD_SAFE(cache->overlay_loose_edges); GPU_BATCH_DISCARD_SAFE(cache->overlay_loose_edges_nor); + DRW_TEXTURE_FREE_SAFE(cache->ed_tri_data_tx); GPU_BATCH_DISCARD_SAFE(cache->overlay_weight_faces); GPU_BATCH_DISCARD_SAFE(cache->overlay_weight_verts); @@ -2023,7 +2382,7 @@ static void mesh_batch_cache_clear(Mesh *me) mesh_batch_cache_discard_uvedit(cache); if (cache->texpaint_triangles) { - for (int i = 0; i < cache->mat_len; ++i) { + for (int i = 0; i < cache->mat_len; i++) { GPU_BATCH_DISCARD_SAFE(cache->texpaint_triangles[i]); } } @@ -2356,7 +2715,7 @@ static GPUVertBuf *mesh_batch_cache_get_tri_pos_and_normals_ex( attr_id.nor = GPU_vertformat_attr_add(&format, "nor", GPU_COMP_I10, 3, GPU_FETCH_INT_TO_FLOAT_UNIT); } - const int tri_len = mesh_render_data_looptri_len_get(rdata); + const int tri_len = mesh_render_data_looptri_len_get_maybe_mapped(rdata); GPUVertBuf *vbo = *r_vbo = GPU_vertbuf_create_with_format(&format); @@ -2368,103 +2727,170 @@ static GPUVertBuf *mesh_batch_cache_get_tri_pos_and_normals_ex( GPU_vertbuf_attr_get_raw_data(vbo, attr_id.pos, &pos_step); GPU_vertbuf_attr_get_raw_data(vbo, attr_id.nor, &nor_step); - float (*lnors)[3] = rdata->loop_normals; - - if (rdata->edit_bmesh) { - GPUPackedNormal *pnors_pack, *vnors_pack; + if (rdata->mapped.use == false) { + float (*lnors)[3] = rdata->loop_normals; + if (rdata->edit_bmesh) { + GPUPackedNormal *pnors_pack, *vnors_pack; - if (lnors == NULL) { - mesh_render_data_ensure_poly_normals_pack(rdata); - mesh_render_data_ensure_vert_normals_pack(rdata); + if (lnors == NULL) { + mesh_render_data_ensure_poly_normals_pack(rdata); + mesh_render_data_ensure_vert_normals_pack(rdata); - pnors_pack = rdata->poly_normals_pack; - vnors_pack = rdata->vert_normals_pack; - } + pnors_pack = rdata->poly_normals_pack; + vnors_pack = rdata->vert_normals_pack; + } - for (int i = 0; i < tri_len; i++) { - const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[i]; - const BMFace *bm_face = bm_looptri[0]->f; + for (int i = 0; i < tri_len; i++) { + const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[i]; + const BMFace *bm_face = bm_looptri[0]->f; - /* use_hide always for edit-mode */ - if (BM_elem_flag_test(bm_face, BM_ELEM_HIDDEN)) { - continue; - } + /* use_hide always for edit-mode */ + if (BM_elem_flag_test(bm_face, BM_ELEM_HIDDEN)) { + continue; + } - if (lnors) { - for (uint t = 0; t < 3; t++) { - const float *nor = lnors[BM_elem_index_get(bm_looptri[t])]; - *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_v3(nor); + if (lnors) { + for (uint t = 0; t < 3; t++) { + const float *nor = lnors[BM_elem_index_get(bm_looptri[t])]; + *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_v3(nor); + } } - } - else if (BM_elem_flag_test(bm_face, BM_ELEM_SMOOTH)) { - for (uint t = 0; t < 3; t++) { - *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = vnors_pack[BM_elem_index_get(bm_looptri[t]->v)]; + else if (BM_elem_flag_test(bm_face, BM_ELEM_SMOOTH)) { + for (uint t = 0; t < 3; t++) { + *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = vnors_pack[BM_elem_index_get(bm_looptri[t]->v)]; + } } - } - else { - const GPUPackedNormal *snor_pack = &pnors_pack[BM_elem_index_get(bm_face)]; - for (uint t = 0; t < 3; t++) { - *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = *snor_pack; + else { + const GPUPackedNormal *snor_pack = &pnors_pack[BM_elem_index_get(bm_face)]; + for (uint t = 0; t < 3; t++) { + *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = *snor_pack; + } } - } - /* TODO(sybren): deduplicate this and all the other places it's pasted to in this file. */ - if (rdata->edit_data && rdata->edit_data->vertexCos) { - for (uint t = 0; t < 3; t++) { - int vidx = BM_elem_index_get(bm_looptri[t]->v); - const float *pos = rdata->edit_data->vertexCos[vidx]; - copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), pos); + /* TODO(sybren): deduplicate this and all the other places it's pasted to in this file. */ + if (rdata->edit_data && rdata->edit_data->vertexCos) { + for (uint t = 0; t < 3; t++) { + int vidx = BM_elem_index_get(bm_looptri[t]->v); + const float *pos = rdata->edit_data->vertexCos[vidx]; + copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), pos); + } } - } - else { - for (uint t = 0; t < 3; t++) { - copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), bm_looptri[t]->v->co); + else { + for (uint t = 0; t < 3; t++) { + copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), bm_looptri[t]->v->co); + } } } } - } - else { - if (lnors == NULL) { - /* Use normals from vertex. */ - mesh_render_data_ensure_poly_normals_pack(rdata); - } + else { + if (lnors == NULL) { + /* Use normals from vertex. */ + mesh_render_data_ensure_poly_normals_pack(rdata); + } - for (int i = 0; i < tri_len; i++) { - const MLoopTri *mlt = &rdata->mlooptri[i]; - const MPoly *mp = &rdata->mpoly[mlt->poly]; + for (int i = 0; i < tri_len; i++) { + const MLoopTri *mlt = &rdata->mlooptri[i]; + const MPoly *mp = &rdata->mpoly[mlt->poly]; - if (use_hide && (mp->flag & ME_HIDE)) { - continue; - } + if (use_hide && (mp->flag & ME_HIDE)) { + continue; + } - const uint vtri[3] = { - rdata->mloop[mlt->tri[0]].v, - rdata->mloop[mlt->tri[1]].v, - rdata->mloop[mlt->tri[2]].v, - }; + const uint vtri[3] = { + rdata->mloop[mlt->tri[0]].v, + rdata->mloop[mlt->tri[1]].v, + rdata->mloop[mlt->tri[2]].v, + }; - if (lnors) { - for (uint t = 0; t < 3; t++) { - const float *nor = lnors[mlt->tri[t]]; - *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_v3(nor); + if (lnors) { + for (uint t = 0; t < 3; t++) { + const float *nor = lnors[mlt->tri[t]]; + *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_v3(nor); + } } - } - else if (mp->flag & ME_SMOOTH) { - for (uint t = 0; t < 3; t++) { - const MVert *mv = &rdata->mvert[vtri[t]]; - *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_s3(mv->no); + else if (mp->flag & ME_SMOOTH) { + for (uint t = 0; t < 3; t++) { + const MVert *mv = &rdata->mvert[vtri[t]]; + *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_s3(mv->no); + } } - } - else { - const GPUPackedNormal *pnors_pack = &rdata->poly_normals_pack[mlt->poly]; + else { + const GPUPackedNormal *pnors_pack = &rdata->poly_normals_pack[mlt->poly]; + for (uint t = 0; t < 3; t++) { + *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = *pnors_pack; + } + } + for (uint t = 0; t < 3; t++) { - *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = *pnors_pack; + const MVert *mv = &rdata->mvert[vtri[t]]; + copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), mv->co); } } + } + } + else { + /* Note: mapped doesn't support lnors yet. */ + BMesh *bm = rdata->edit_bmesh->bm; + Mesh *me_cage = rdata->mapped.me_cage; + + /* TODO(campbell): unlike non-mapped modes we don't generate these on demand, just use if they exist. + * this seems like a low priority TODO since mapped meshes typically + * use the final mesh evaluated mesh for showing faces. */ + const float (*lnors)[3] = CustomData_get_layer(&me_cage->ldata, CD_NORMAL); + + /* TODO(campbell): this is quite an expensive operation for something + * that's not used unless 'normal' display option is enabled. */ + if (!CustomData_has_layer(&me_cage->pdata, CD_NORMAL)) { + /* TODO(campbell): this is quite an expensive operation for something + * that's not used unless 'normal' display option is enabled. */ + BKE_mesh_ensure_normals_for_display(me_cage); + } + const float (*polynors)[3] = CustomData_get_layer(&me_cage->pdata, CD_NORMAL); - for (uint t = 0; t < 3; t++) { - const MVert *mv = &rdata->mvert[vtri[t]]; - copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), mv->co); + const MVert *mvert = rdata->mapped.me_cage->mvert; + const MLoop *mloop = rdata->mapped.me_cage->mloop; + const MPoly *mpoly = rdata->mapped.me_cage->mpoly; + + const MLoopTri *mlooptri = BKE_mesh_runtime_looptri_ensure(me_cage); + for (int i = 0; i < tri_len; i++) { + const MLoopTri *mlt = &mlooptri[i]; + const int p_orig = rdata->mapped.p_origindex[mlt->poly]; + if (p_orig != ORIGINDEX_NONE) { + /* Assume 'use_hide' */ + BMFace *efa = BM_face_at_index(bm, p_orig); + if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) { + const MPoly *mp = &mpoly[mlt->poly]; + const uint vtri[3] = { + mloop[mlt->tri[0]].v, + mloop[mlt->tri[1]].v, + mloop[mlt->tri[2]].v, + }; + + if (lnors) { + for (uint t = 0; t < 3; t++) { + const float *nor = lnors[mlt->tri[t]]; + *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_v3(nor); + } + } + else if (mp->flag & ME_SMOOTH) { + for (uint t = 0; t < 3; t++) { + const MVert *mv = &mvert[vtri[t]]; + *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_s3(mv->no); + } + } + else { + /* we don't have cached 'rdata->poly_normals_pack'. */ + const GPUPackedNormal pnor = GPU_normal_convert_i10_v3(polynors[mlt->poly]); + for (uint t = 0; t < 3; t++) { + *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = pnor; + } + } + + for (uint t = 0; t < 3; t++) { + const MVert *mv = &mvert[vtri[t]]; + copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), mv->co); + } + } } } } @@ -2507,26 +2933,43 @@ static GPUVertBuf *mesh_batch_cache_get_facedot_pos_with_normals_and_flag( attr_id.pos = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); attr_id.data = GPU_vertformat_attr_add(&format, "norAndFlag", GPU_COMP_I10, 4, GPU_FETCH_INT_TO_FLOAT_UNIT); } - - const int vbo_len_capacity = mesh_render_data_polys_len_get(rdata); + const int vbo_len_capacity = mesh_render_data_polys_len_get_maybe_mapped(rdata); int vidx = 0; GPUVertBuf *vbo = cache->ed_fcenter_pos_with_nor_and_sel = GPU_vertbuf_create_with_format(&format); GPU_vertbuf_data_alloc(vbo, vbo_len_capacity); - for (int i = 0; i < vbo_len_capacity; ++i) { - float pcenter[3], pnor[3]; - bool selected = false; - - if (mesh_render_data_pnors_pcenter_select_get(rdata, i, pnor, pcenter, &selected)) { - - GPUPackedNormal nor = { .x = 0, .y = 0, .z = -511 }; - nor = GPU_normal_convert_i10_v3(pnor); - nor.w = selected ? 1 : 0; - GPU_vertbuf_attr_set(vbo, attr_id.data, vidx, &nor); - GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, pcenter); + if (rdata->edit_bmesh) { + if (rdata->edit_data && rdata->edit_data->vertexCos != NULL) { + BKE_editmesh_cache_ensure_poly_normals(rdata->edit_bmesh, rdata->edit_data); + BKE_editmesh_cache_ensure_poly_centers(rdata->edit_bmesh, rdata->edit_data); + } + } - vidx += 1; + if (rdata->mapped.use == false) { + for (int i = 0; i < vbo_len_capacity; i++) { + float pcenter[3], pnor[3]; + bool selected = false; + if (mesh_render_data_pnors_pcenter_select_get(rdata, i, pnor, pcenter, &selected)) { + GPUPackedNormal nor = GPU_normal_convert_i10_v3(pnor); + nor.w = selected ? 1 : 0; + GPU_vertbuf_attr_set(vbo, attr_id.data, vidx, &nor); + GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, pcenter); + vidx += 1; + } + } + } + else { + for (int i = 0; i < vbo_len_capacity; i++) { + float pcenter[3], pnor[3]; + bool selected = false; + if (mesh_render_data_pnors_pcenter_select_get_mapped(rdata, i, pnor, pcenter, &selected)) { + GPUPackedNormal nor = GPU_normal_convert_i10_v3(pnor); + nor.w = selected ? 1 : 0; + GPU_vertbuf_attr_set(vbo, attr_id.data, vidx, &nor); + GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, pcenter); + vidx += 1; + } } } const int vbo_len_used = vidx; @@ -2551,28 +2994,50 @@ static GPUVertBuf *mesh_batch_cache_get_edges_visible( attr_id.pos = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); } - const int vbo_len_capacity = mesh_render_data_edges_len_get(rdata) * 2; + const int vbo_len_capacity = mesh_render_data_edges_len_get_maybe_mapped(rdata) * 2; int vidx = 0; GPUVertBuf *vbo = cache->ed_edge_pos = GPU_vertbuf_create_with_format(&format); GPU_vertbuf_data_alloc(vbo, vbo_len_capacity); - if (rdata->edit_bmesh) { - BMesh *bm = rdata->edit_bmesh->bm; - BMIter iter; - BMEdge *eed; - BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) { - if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) { - GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, eed->v1->co); - vidx += 1; - GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, eed->v2->co); - vidx += 1; + if (rdata->mapped.use == false) { + if (rdata->edit_bmesh) { + BMesh *bm = rdata->edit_bmesh->bm; + BMIter iter; + BMEdge *eed; + + BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) { + if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) { + GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, eed->v1->co); + vidx += 1; + GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, eed->v2->co); + vidx += 1; + } } } + else { + /* not yet done! */ + BLI_assert(0); + } } else { - /* not yet done! */ - BLI_assert(0); + BMesh *bm = rdata->edit_bmesh->bm; + const MVert *mvert = rdata->mapped.me_cage->mvert; + const MEdge *medge = rdata->mapped.me_cage->medge; + const int *e_origindex = rdata->mapped.e_origindex; + for (int i = 0; i < rdata->mapped.edge_len; i++) { + const int e_orig = e_origindex[i]; + if (e_orig != ORIGINDEX_NONE) { + BMEdge *eed = BM_edge_at_index(bm, e_orig); + if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) { + const MEdge *ed = &medge[i]; + GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, mvert[ed->v1].co); + vidx += 1; + GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, mvert[ed->v2].co); + vidx += 1; + } + } + } } const int vbo_len_used = vidx; if (vbo_len_used != vbo_len_capacity) { @@ -2596,29 +3061,47 @@ static GPUVertBuf *mesh_batch_cache_get_verts_visible( attr_id.pos = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); } - const int vbo_len_capacity = mesh_render_data_verts_len_get(rdata); + const int vbo_len_capacity = mesh_render_data_verts_len_get_maybe_mapped(rdata); uint vidx = 0; GPUVertBuf *vbo = cache->ed_vert_pos = GPU_vertbuf_create_with_format(&format); GPU_vertbuf_data_alloc(vbo, vbo_len_capacity); - if (rdata->edit_bmesh) { - BMesh *bm = rdata->edit_bmesh->bm; - BMIter iter; - BMVert *eve; + if (rdata->mapped.use == false) { + if (rdata->edit_bmesh) { + BMesh *bm = rdata->edit_bmesh->bm; + BMIter iter; + BMVert *eve; - BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) { - if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) { - GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, eve->co); - vidx += 1; + BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) { + if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) { + GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, eve->co); + vidx += 1; + } + } + } + else { + for (int i = 0; i < vbo_len_capacity; i++) { + const MVert *mv = &rdata->mvert[i]; + if (!(mv->flag & ME_HIDE)) { + GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, mv->co); + vidx += 1; + } } } } else { + BMesh *bm = rdata->edit_bmesh->bm; + const MVert *mvert = rdata->mapped.me_cage->mvert; + const int *v_origindex = rdata->mapped.v_origindex; for (int i = 0; i < vbo_len_capacity; i++) { - const MVert *mv = &rdata->mvert[i]; - if (!(mv->flag & ME_HIDE)) { - GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, mv->co); - vidx += 1; + const int v_orig = v_origindex[i]; + if (v_orig != ORIGINDEX_NONE) { + BMVert *eve = BM_vert_at_index(bm, v_orig); + if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) { + const MVert *mv = &mvert[i]; + GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, mv->co); + vidx += 1; + } } } } @@ -2694,33 +3177,54 @@ static GPUVertBuf *mesh_create_edges_select_id( attr_id.col = GPU_vertformat_attr_add(&format, "color", GPU_COMP_I32, 1, GPU_FETCH_INT); } - const int vbo_len_capacity = mesh_render_data_edges_len_get(rdata) * 2; + const int vbo_len_capacity = mesh_render_data_edges_len_get_maybe_mapped(rdata) * 2; int vidx = 0; vbo = GPU_vertbuf_create_with_format(&format); GPU_vertbuf_data_alloc(vbo, vbo_len_capacity); - uint select_index = select_id_offset; - if (rdata->edit_bmesh) { - BMesh *bm = rdata->edit_bmesh->bm; - BMIter iter; - BMEdge *eed; + if (rdata->mapped.use == false) { + uint select_index = select_id_offset; + if (rdata->edit_bmesh) { + BMesh *bm = rdata->edit_bmesh->bm; + BMIter iter; + BMEdge *eed; - BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) { - if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) { - int select_id; - GPU_select_index_get(select_index, &select_id); - GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id); - vidx += 1; - GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id); - vidx += 1; + BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) { + if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) { + int select_id; + GPU_select_index_get(select_index, &select_id); + GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id); + vidx += 1; + GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id); + vidx += 1; + } + select_index += 1; } - select_index += 1; + } + else { + /* not yet done! */ + BLI_assert(0); } } else { - /* not yet done! */ - BLI_assert(0); + BMesh *bm = rdata->edit_bmesh->bm; + const int *e_origindex = rdata->mapped.e_origindex; + for (int i = 0; i < rdata->mapped.edge_len; i++) { + const int e_orig = e_origindex[i]; + if (e_orig != ORIGINDEX_NONE) { + BMEdge *eed = BM_edge_at_index(bm, e_orig); + if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) { + uint select_index = select_id_offset + e_orig; + int select_id; + GPU_select_index_get(select_index, &select_id); + GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id); + vidx += 1; + GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id); + vidx += 1; + } + } + } } const int vbo_len_used = vidx; if (vbo_len_used != vbo_len_capacity) { @@ -2744,38 +3248,57 @@ static GPUVertBuf *mesh_create_verts_select_id( attr_id.col = GPU_vertformat_attr_add(&format, "color", GPU_COMP_I32, 1, GPU_FETCH_INT); } - const int vbo_len_capacity = mesh_render_data_verts_len_get(rdata); + const int vbo_len_capacity = mesh_render_data_verts_len_get_maybe_mapped(rdata); int vidx = 0; vbo = GPU_vertbuf_create_with_format(&format); GPU_vertbuf_data_alloc(vbo, vbo_len_capacity); - uint select_index = select_id_offset; - if (rdata->edit_bmesh) { - BMesh *bm = rdata->edit_bmesh->bm; - BMIter iter; - BMVert *eve; + if (rdata->mapped.use == false) { + uint select_index = select_id_offset; + if (rdata->edit_bmesh) { + BMesh *bm = rdata->edit_bmesh->bm; + BMIter iter; + BMVert *eve; - BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) { - if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) { - int select_id; - GPU_select_index_get(select_index, &select_id); - GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id); - vidx += 1; + BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) { + if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) { + int select_id; + GPU_select_index_get(select_index, &select_id); + GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id); + vidx += 1; + } + select_index += 1; + } + } + else { + for (int i = 0; i < vbo_len_capacity; i++) { + const MVert *mv = &rdata->mvert[i]; + if (!(mv->flag & ME_HIDE)) { + int select_id; + GPU_select_index_get(select_index, &select_id); + GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id); + vidx += 1; + } + select_index += 1; } - select_index += 1; } } else { + BMesh *bm = rdata->edit_bmesh->bm; + const int *v_origindex = rdata->mapped.v_origindex; for (int i = 0; i < vbo_len_capacity; i++) { - const MVert *mv = &rdata->mvert[i]; - if (!(mv->flag & ME_HIDE)) { - int select_id; - GPU_select_index_get(select_index, &select_id); - GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id); - vidx += 1; + const int v_orig = v_origindex[i]; + if (v_orig != ORIGINDEX_NONE) { + BMVert *eve = BM_vert_at_index(bm, v_orig); + if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) { + uint select_index = select_id_offset + v_orig; + int select_id; + GPU_select_index_get(select_index, &select_id); + GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id); + vidx += 1; + } } - select_index += 1; } } const int vbo_len_used = vidx; @@ -2924,7 +3447,7 @@ static GPUVertBuf *mesh_create_tri_select_id( attr_id.col = GPU_vertformat_attr_add(&format, "color", GPU_COMP_I32, 1, GPU_FETCH_INT); } - const int tri_len = mesh_render_data_looptri_len_get(rdata); + const int tri_len = mesh_render_data_looptri_len_get_maybe_mapped(rdata); vbo = GPU_vertbuf_create_with_format(&format); @@ -2932,29 +3455,52 @@ static GPUVertBuf *mesh_create_tri_select_id( int vbo_len_used = 0; GPU_vertbuf_data_alloc(vbo, vbo_len_capacity); - if (rdata->edit_bmesh) { - for (int i = 0; i < tri_len; i++) { - const BMLoop **ltri = (const BMLoop **)rdata->edit_bmesh->looptris[i]; - /* Assume 'use_hide' */ - if (!BM_elem_flag_test(ltri[0]->f, BM_ELEM_HIDDEN)) { - const int poly_index = BM_elem_index_get(ltri[0]->f); - int select_id; - GPU_select_index_get(poly_index + select_id_offset, &select_id); - for (uint tri_corner = 0; tri_corner < 3; tri_corner++) { - GPU_vertbuf_attr_set(vbo, attr_id.col, cidx++, &select_id); + + if (rdata->mapped.use == false) { + if (rdata->edit_bmesh) { + for (int i = 0; i < tri_len; i++) { + const BMLoop **ltri = (const BMLoop **)rdata->edit_bmesh->looptris[i]; + /* Assume 'use_hide' */ + if (!BM_elem_flag_test(ltri[0]->f, BM_ELEM_HIDDEN)) { + const int poly_index = BM_elem_index_get(ltri[0]->f); + int select_id; + GPU_select_index_get(poly_index + select_id_offset, &select_id); + for (uint tri_corner = 0; tri_corner < 3; tri_corner++) { + GPU_vertbuf_attr_set(vbo, attr_id.col, cidx++, &select_id); + } + } + } + } + else { + for (int i = 0; i < tri_len; i++) { + const MLoopTri *mlt = &rdata->mlooptri[i]; + const int poly_index = mlt->poly; + if (!(use_hide && (rdata->mpoly[poly_index].flag & ME_HIDE))) { + int select_id; + GPU_select_index_get(poly_index + select_id_offset, &select_id); + for (uint tri_corner = 0; tri_corner < 3; tri_corner++) { + GPU_vertbuf_attr_set(vbo, attr_id.col, cidx++, &select_id); + } } } } } else { + BMesh *bm = rdata->edit_bmesh->bm; + Mesh *me_cage = rdata->mapped.me_cage; + const MLoopTri *mlooptri = BKE_mesh_runtime_looptri_ensure(me_cage); for (int i = 0; i < tri_len; i++) { - const MLoopTri *mlt = &rdata->mlooptri[i]; - const int poly_index = mlt->poly; - if (!(use_hide && (rdata->mpoly[poly_index].flag & ME_HIDE))) { - int select_id; - GPU_select_index_get(poly_index + select_id_offset, &select_id); - for (uint tri_corner = 0; tri_corner < 3; tri_corner++) { - GPU_vertbuf_attr_set(vbo, attr_id.col, cidx++, &select_id); + const MLoopTri *mlt = &mlooptri[i]; + const int p_orig = rdata->mapped.p_origindex[mlt->poly]; + if (p_orig != ORIGINDEX_NONE) { + /* Assume 'use_hide' */ + BMFace *efa = BM_face_at_index(bm, p_orig); + if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) { + int select_id; + GPU_select_index_get(select_id_offset + p_orig, &select_id); + for (uint tri_corner = 0; tri_corner < 3; tri_corner++) { + GPU_vertbuf_attr_set(vbo, attr_id.col, cidx++, &select_id); + } } } } @@ -2983,28 +3529,42 @@ static GPUVertBuf *mesh_batch_cache_get_vert_pos_and_nor_in_order( } GPUVertBuf *vbo = cache->pos_in_order = GPU_vertbuf_create_with_format(&format); - const int vbo_len_capacity = mesh_render_data_verts_len_get(rdata); + const int vbo_len_capacity = mesh_render_data_verts_len_get_maybe_mapped(rdata); GPU_vertbuf_data_alloc(vbo, vbo_len_capacity); - if (rdata->edit_bmesh) { - BMesh *bm = rdata->edit_bmesh->bm; - BMIter iter; - BMVert *eve; - uint i; + if (rdata->mapped.use == false) { + if (rdata->edit_bmesh) { + BMesh *bm = rdata->edit_bmesh->bm; + BMIter iter; + BMVert *eve; + uint i; - BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) { - static short no_short[4]; - normal_float_to_short_v3(no_short, eve->no); + BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) { + static short no_short[4]; + normal_float_to_short_v3(no_short, eve->no); - GPU_vertbuf_attr_set(vbo, attr_id.pos, i, eve->co); - GPU_vertbuf_attr_set(vbo, attr_id.nor, i, no_short); + GPU_vertbuf_attr_set(vbo, attr_id.pos, i, eve->co); + GPU_vertbuf_attr_set(vbo, attr_id.nor, i, no_short); + } + BLI_assert(i == vbo_len_capacity); + } + else { + for (int i = 0; i < vbo_len_capacity; i++) { + GPU_vertbuf_attr_set(vbo, attr_id.pos, i, rdata->mvert[i].co); + GPU_vertbuf_attr_set(vbo, attr_id.nor, i, rdata->mvert[i].no); /* XXX actually reading 4 shorts */ + } } - BLI_assert(i == vbo_len_capacity); } else { - for (int i = 0; i < vbo_len_capacity; ++i) { - GPU_vertbuf_attr_set(vbo, attr_id.pos, i, rdata->mvert[i].co); - GPU_vertbuf_attr_set(vbo, attr_id.nor, i, rdata->mvert[i].no); /* XXX actually reading 4 shorts */ + const MVert *mvert = rdata->mapped.me_cage->mvert; + const int *v_origindex = rdata->mapped.v_origindex; + for (int i = 0; i < vbo_len_capacity; i++) { + const int v_orig = v_origindex[i]; + if (v_orig != ORIGINDEX_NONE) { + const MVert *mv = &mvert[i]; + GPU_vertbuf_attr_set(vbo, attr_id.pos, i, mv->co); + GPU_vertbuf_attr_set(vbo, attr_id.nor, i, mv->no); /* XXX actually reading 4 shorts */ + } } } } @@ -3059,11 +3619,14 @@ static void mesh_batch_cache_create_overlay_tri_buffers( MeshRenderData *rdata, MeshBatchCache *cache) { BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI)); - - const int tri_len = mesh_render_data_looptri_len_get(rdata); + BMesh *bm = rdata->edit_bmesh->bm; + BMIter iter; + BMVert *ev; + const int tri_len = mesh_render_data_looptri_len_get_maybe_mapped(rdata); const int vbo_len_capacity = tri_len * 3; int vbo_len_used = 0; + int points_len = bm->totvert; /* Positions */ GPUVertBuf *vbo_pos = NULL; @@ -3090,18 +3653,59 @@ static void mesh_batch_cache_create_overlay_tri_buffers( GPU_vertbuf_data_alloc(vbo_data, vbo_len_capacity); } - for (int i = 0; i < tri_len; i++) { - const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[i]; - if (!BM_elem_flag_test(bm_looptri[0]->f, BM_ELEM_HIDDEN)) { - add_overlay_tri( - rdata, vbo_pos, vbo_nor, vbo_data, - attr_id.pos, attr_id.vnor, attr_id.lnor, attr_id.data, - bm_looptri, vbo_len_used); + /* Verts IBO */ + GPUIndexBufBuilder elb, *elbp = NULL; + if (cache->ed_tri_verts == NULL) { + elbp = &elb; + GPU_indexbuf_init(elbp, GPU_PRIM_POINTS, points_len, vbo_len_capacity); + } - vbo_len_used += 3; + /* Clear tag */ + BM_ITER_MESH(ev, &iter, bm, BM_VERTS_OF_MESH) { + BM_elem_flag_disable(ev, BM_ELEM_TAG); + } + + if (rdata->mapped.use == false) { + for (int i = 0; i < tri_len; i++) { + const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[i]; + if (!BM_elem_flag_test(bm_looptri[0]->f, BM_ELEM_HIDDEN)) { + add_overlay_tri( + rdata, vbo_pos, vbo_nor, vbo_data, elbp, + attr_id.pos, attr_id.vnor, attr_id.lnor, attr_id.data, + bm_looptri, vbo_len_used); + vbo_len_used += 3; + } + } + } + else { + Mesh *me_cage = rdata->mapped.me_cage; + const MLoopTri *mlooptri = BKE_mesh_runtime_looptri_ensure(me_cage); + if (!CustomData_has_layer(&me_cage->pdata, CD_NORMAL)) { + /* TODO(campbell): this is quite an expensive operation for something + * that's not used unless 'normal' display option is enabled. */ + BKE_mesh_ensure_normals_for_display(me_cage); + } + const float (*polynors)[3] = CustomData_get_layer(&me_cage->pdata, CD_NORMAL); + for (int i = 0; i < tri_len; i++) { + const MLoopTri *mlt = &mlooptri[i]; + const int p_orig = rdata->mapped.p_origindex[mlt->poly]; + if (p_orig != ORIGINDEX_NONE) { + BMFace *efa = BM_face_at_index(bm, p_orig); + if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) { + add_overlay_tri_mapped( + rdata, vbo_pos, vbo_nor, vbo_data, elbp, + attr_id.pos, attr_id.vnor, attr_id.lnor, attr_id.data, + efa, mlt, polynors[mlt->poly], vbo_len_used); + vbo_len_used += 3; + } + } } } + if (elbp != NULL) { + cache->ed_tri_verts = GPU_indexbuf_build(elbp); + } + /* Finish */ if (vbo_len_used != vbo_len_capacity) { if (vbo_pos != NULL) { @@ -3114,6 +3718,10 @@ static void mesh_batch_cache_create_overlay_tri_buffers( GPU_vertbuf_data_resize(vbo_data, vbo_len_used); } } + + /* Upload data early because we need to create the texture for it. */ + GPU_vertbuf_use(vbo_data); + cache->ed_tri_data_tx = GPU_texture_create_from_vertbuf(vbo_data); } static void mesh_batch_cache_create_overlay_ledge_buffers( @@ -3121,7 +3729,7 @@ static void mesh_batch_cache_create_overlay_ledge_buffers( { BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI)); - const int ledge_len = mesh_render_data_loose_edges_len_get(rdata); + const int ledge_len = mesh_render_data_loose_edges_len_get_maybe_mapped(rdata); const int vbo_len_capacity = ledge_len * 2; int vbo_len_used = 0; @@ -3151,19 +3759,39 @@ static void mesh_batch_cache_create_overlay_ledge_buffers( GPU_vertbuf_data_alloc(vbo_data, vbo_len_capacity); } - if (rdata->edit_bmesh) { - BMesh *bm = rdata->edit_bmesh->bm; - for (uint i = 0; i < ledge_len; i++) { - const BMEdge *eed = BM_edge_at_index(bm, rdata->loose_edges[i]); - if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) { - add_overlay_loose_edge( - rdata, vbo_pos, vbo_nor, vbo_data, - attr_id.pos, attr_id.vnor, attr_id.data, - eed, vbo_len_used); - vbo_len_used += 2; + if (rdata->mapped.use == false) { + if (rdata->edit_bmesh) { + BMesh *bm = rdata->edit_bmesh->bm; + for (uint i = 0; i < ledge_len; i++) { + const BMEdge *eed = BM_edge_at_index(bm, rdata->loose_edges[i]); + if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) { + add_overlay_loose_edge( + rdata, vbo_pos, vbo_nor, vbo_data, + attr_id.pos, attr_id.vnor, attr_id.data, + eed, vbo_len_used); + vbo_len_used += 2; + } } } } + else { + BMesh *bm = rdata->edit_bmesh->bm; + Mesh *me_cage = rdata->mapped.me_cage; + const MVert *mvert = me_cage->mvert; + const MEdge *medge = me_cage->medge; + const int *e_origindex = rdata->mapped.e_origindex; + for (uint i_iter = 0; i_iter < ledge_len; i_iter++) { + const int i = rdata->mapped.loose_edges[i_iter]; + const int e_orig = e_origindex[i]; + const MEdge *ed = &medge[i]; + BMEdge *eed = BM_edge_at_index(bm, e_orig); + add_overlay_loose_edge_mapped( + rdata, vbo_pos, vbo_nor, vbo_data, + attr_id.pos, attr_id.vnor, attr_id.data, + eed, mvert, ed, vbo_len_used); + vbo_len_used += 2; + } + } /* Finish */ if (vbo_len_used != vbo_len_capacity) { @@ -3185,7 +3813,7 @@ static void mesh_batch_cache_create_overlay_lvert_buffers( BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI)); BMesh *bm = rdata->edit_bmesh->bm; - const int lvert_len = mesh_render_data_loose_verts_len_get(rdata); + const int lvert_len = mesh_render_data_loose_verts_len_get_maybe_mapped(rdata); const int vbo_len_capacity = lvert_len; int vbo_len_used = 0; @@ -3216,13 +3844,31 @@ static void mesh_batch_cache_create_overlay_lvert_buffers( GPU_vertbuf_data_alloc(vbo_data, vbo_len_capacity); } - for (uint i = 0; i < lvert_len; i++) { - BMVert *eve = BM_vert_at_index(bm, rdata->loose_verts[i]); - add_overlay_loose_vert( - rdata, vbo_pos, vbo_nor, vbo_data, - attr_id.pos, attr_id.vnor, attr_id.data, - eve, vbo_len_used); - vbo_len_used += 1; + if (rdata->mapped.use == false) { + for (uint i = 0; i < lvert_len; i++) { + BMVert *eve = BM_vert_at_index(bm, rdata->loose_verts[i]); + add_overlay_loose_vert( + rdata, vbo_pos, vbo_nor, vbo_data, + attr_id.pos, attr_id.vnor, attr_id.data, + eve, vbo_len_used); + vbo_len_used += 1; + } + } + else { + Mesh *me_cage = rdata->mapped.me_cage; + const MVert *mvert = me_cage->mvert; + const int *v_origindex = rdata->mapped.v_origindex; + for (uint i_iter = 0; i_iter < lvert_len; i_iter++) { + const int i = rdata->mapped.loose_verts[i_iter]; + const int v_orig = v_origindex[i]; + const MVert *mv = &mvert[i]; + BMVert *eve = BM_vert_at_index(bm, v_orig); + add_overlay_loose_vert_mapped( + rdata, vbo_pos, vbo_nor, vbo_data, + attr_id.pos, attr_id.vnor, attr_id.data, + eve, mv, vbo_len_used); + vbo_len_used += 1; + } } /* Finish */ @@ -3258,6 +3904,9 @@ static GPUVertBuf *mesh_batch_cache_get_edit_ledge_pos( BLI_assert(rdata->types & MR_DATATYPE_VERT); if (cache->ed_ledge_pos == NULL) { + if (rdata->mapped.supported) { + rdata->mapped.use = true; + } mesh_batch_cache_create_overlay_ledge_buffers(rdata, cache); } @@ -3270,12 +3919,28 @@ static GPUVertBuf *mesh_batch_cache_get_edit_lvert_pos( BLI_assert(rdata->types & MR_DATATYPE_VERT); if (cache->ed_lvert_pos == NULL) { + if (rdata->mapped.supported) { + rdata->mapped.use = true; + } mesh_batch_cache_create_overlay_lvert_buffers(rdata, cache); } return cache->ed_lvert_pos; } +/* Indices */ +static GPUIndexBuf *mesh_batch_cache_get_edit_tri_indices( + MeshRenderData *rdata, MeshBatchCache *cache) +{ + BLI_assert(rdata->types & MR_DATATYPE_VERT); + + if (cache->ed_tri_verts == NULL) { + mesh_batch_cache_create_overlay_tri_buffers(rdata, cache); + } + + return cache->ed_tri_verts; +} + /* Normal */ static GPUVertBuf *mesh_batch_cache_get_edit_tri_nor( MeshRenderData *rdata, MeshBatchCache *cache) @@ -3283,6 +3948,9 @@ static GPUVertBuf *mesh_batch_cache_get_edit_tri_nor( BLI_assert(rdata->types & MR_DATATYPE_VERT); if (cache->ed_tri_nor == NULL) { + if (rdata->mapped.supported) { + rdata->mapped.use = true; + } mesh_batch_cache_create_overlay_tri_buffers(rdata, cache); } @@ -3295,6 +3963,9 @@ static GPUVertBuf *mesh_batch_cache_get_edit_ledge_nor( BLI_assert(rdata->types & MR_DATATYPE_VERT); if (cache->ed_ledge_nor == NULL) { + if (rdata->mapped.supported) { + rdata->mapped.use = true; + } mesh_batch_cache_create_overlay_ledge_buffers(rdata, cache); } @@ -3307,6 +3978,9 @@ static GPUVertBuf *mesh_batch_cache_get_edit_lvert_nor( BLI_assert(rdata->types & MR_DATATYPE_VERT); if (cache->ed_lvert_nor == NULL) { + if (rdata->mapped.supported) { + rdata->mapped.use = true; + } mesh_batch_cache_create_overlay_lvert_buffers(rdata, cache); } @@ -3332,6 +4006,9 @@ static GPUVertBuf *mesh_batch_cache_get_edit_ledge_data( BLI_assert(rdata->types & MR_DATATYPE_VERT); if (cache->ed_ledge_data == NULL) { + if (rdata->mapped.supported) { + rdata->mapped.use = true; + } mesh_batch_cache_create_overlay_ledge_buffers(rdata, cache); } @@ -3344,6 +4021,9 @@ static GPUVertBuf *mesh_batch_cache_get_edit_lvert_data( BLI_assert(rdata->types & MR_DATATYPE_VERT); if (cache->ed_lvert_data == NULL) { + if (rdata->mapped.supported) { + rdata->mapped.use = true; + } mesh_batch_cache_create_overlay_lvert_buffers(rdata, cache); } @@ -3403,7 +4083,7 @@ static GPUIndexBuf *mesh_batch_cache_get_edges_adjacency(MeshRenderData *rdata, EdgeHash *eh = BLI_edgehash_new_ex(__func__, tri_len * 3); /* Create edges for each pair of triangles sharing an edge. */ for (int i = 0; i < tri_len; i++) { - for (int e = 0; e < 3; ++e) { + for (int e = 0; e < 3; e++) { uint v0, v1, v2; if (rdata->edit_bmesh) { const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[i]; @@ -3415,8 +4095,8 @@ static GPUIndexBuf *mesh_batch_cache_get_edges_adjacency(MeshRenderData *rdata, v2 = BM_elem_index_get(bm_looptri[(e + 2) % 3]->v); } else { - MLoop *mloop = rdata->mloop; - MLoopTri *mlt = rdata->mlooptri + i; + const MLoop *mloop = rdata->mloop; + const MLoopTri *mlt = rdata->mlooptri + i; v0 = mloop[mlt->tri[e]].v; v1 = mloop[mlt->tri[(e + 1) % 3]].v; v2 = mloop[mlt->tri[(e + 2) % 3]].v; @@ -3485,7 +4165,7 @@ static EdgeHash *create_looptri_edge_adjacency_hash(MeshRenderData *rdata) EdgeHash *eh = BLI_edgehash_new_ex(__func__, tri_len * 3); /* Create edges for each pair of triangles sharing an edge. */ for (int i = 0; i < tri_len; i++) { - for (int e = 0; e < 3; ++e) { + for (int e = 0; e < 3; e++) { uint v0, v1, v2; if (rdata->edit_bmesh) { const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[i]; @@ -3497,8 +4177,8 @@ static EdgeHash *create_looptri_edge_adjacency_hash(MeshRenderData *rdata) v2 = BM_elem_index_get(bm_looptri[(e + 2) % 3]->v); } else { - MLoop *mloop = rdata->mloop; - MLoopTri *mlt = rdata->mlooptri + i; + const MLoop *mloop = rdata->mloop; + const MLoopTri *mlt = rdata->mlooptri + i; v0 = mloop[mlt->tri[e]].v; v1 = mloop[mlt->tri[(e + 1) % 3]].v; v2 = mloop[mlt->tri[(e + 2) % 3]].v; @@ -3540,25 +4220,23 @@ static GPUVertBuf *mesh_batch_cache_create_edges_overlay_texture_buf(MeshRenderD eh = create_looptri_edge_adjacency_hash(rdata); for (int i = 0; i < tri_len; i++) { - bool edge_is_real[3] = {false, false, false}; + bool edge_is_real[3]; - MEdge *medge = rdata->medge; - MLoop *mloop = rdata->mloop; - MLoopTri *mlt = rdata->mlooptri + i; + const MEdge *medge = rdata->medge; + const MLoop *mloop = rdata->mloop; + const MLoopTri *mlt = rdata->mlooptri + i; int j, j_next; for (j = 2, j_next = 0; j_next < 3; j = j_next++) { - MEdge *ed = &medge[mloop[mlt->tri[j]].e]; - uint tri_edge[2] = {mloop[mlt->tri[j]].v, mloop[mlt->tri[j_next]].v}; - - if (((ed->v1 == tri_edge[0]) && (ed->v2 == tri_edge[1])) || - ((ed->v1 == tri_edge[1]) && (ed->v2 == tri_edge[0]))) - { - edge_is_real[j] = true; - } + const MEdge *ed = &medge[mloop[mlt->tri[j]].e]; + const uint tri_edge[2] = {mloop[mlt->tri[j]].v, mloop[mlt->tri[j_next]].v}; + const bool is_edge_real = ( + ((ed->v1 == tri_edge[0]) && (ed->v2 == tri_edge[1])) || + ((ed->v1 == tri_edge[1]) && (ed->v2 == tri_edge[0]))); + edge_is_real[j] = is_edge_real; } - for (int e = 0; e < 3; ++e) { + for (int e = 0; e < 3; e++) { int v0 = mloop[mlt->tri[e]].v; int v1 = mloop[mlt->tri[(e + 1) % 3]].v; EdgeAdjacentVerts *eav = BLI_edgehash_lookup(eh, v0, v1); @@ -3569,7 +4247,7 @@ static GPUVertBuf *mesh_batch_cache_create_edges_overlay_texture_buf(MeshRenderD } /* Non-manifold edge */ if (eav->vert_index[1] == -1) { - value |= (1 << 31); + value |= (1u << 31); } GPU_vertbuf_attr_set(vbo, index_id, vidx++, &value); } @@ -3631,7 +4309,7 @@ static GPUIndexBuf *mesh_batch_cache_get_triangles_in_order(MeshRenderData *rdat GPU_indexbuf_init(&elb, GPU_PRIM_TRIS, tri_len, vert_len); if (rdata->edit_bmesh) { - for (int i = 0; i < tri_len; ++i) { + for (int i = 0; i < tri_len; i++) { const BMLoop **ltri = (const BMLoop **)rdata->edit_bmesh->looptris[i]; if (!BM_elem_flag_test(ltri[0]->f, BM_ELEM_HIDDEN)) { for (uint tri_corner = 0; tri_corner < 3; tri_corner++) { @@ -3641,7 +4319,7 @@ static GPUIndexBuf *mesh_batch_cache_get_triangles_in_order(MeshRenderData *rdat } } else { - for (int i = 0; i < tri_len; ++i) { + for (int i = 0; i < tri_len; i++) { const MLoopTri *mlt = &rdata->mlooptri[i]; for (uint tri_corner = 0; tri_corner < 3; tri_corner++) { GPU_indexbuf_add_generic_vert(&elb, mlt->tri[tri_corner]); @@ -3660,31 +4338,42 @@ static GPUIndexBuf *mesh_batch_cache_get_loose_edges(MeshRenderData *rdata, Mesh BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI)); if (cache->ledges_in_order == NULL) { - const int vert_len = mesh_render_data_verts_len_get(rdata); - const int edge_len = mesh_render_data_edges_len_get(rdata); + const int vert_len = mesh_render_data_verts_len_get_maybe_mapped(rdata); + const int edge_len = mesh_render_data_edges_len_get_maybe_mapped(rdata); /* Alloc max (edge_len) and upload only needed range. */ GPUIndexBufBuilder elb; GPU_indexbuf_init(&elb, GPU_PRIM_LINES, edge_len, vert_len); - if (rdata->edit_bmesh) { - /* No need to support since edit mesh already draw them. - * But some engines may want them ... */ - BMesh *bm = rdata->edit_bmesh->bm; - BMIter eiter; - BMEdge *eed; - BM_ITER_MESH(eed, &eiter, bm, BM_EDGES_OF_MESH) { - if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN) && BM_edge_is_wire(eed)) { - GPU_indexbuf_add_line_verts(&elb, BM_elem_index_get(eed->v1), BM_elem_index_get(eed->v2)); + if (rdata->mapped.use == false) { + if (rdata->edit_bmesh) { + /* No need to support since edit mesh already draw them. + * But some engines may want them ... */ + BMesh *bm = rdata->edit_bmesh->bm; + BMIter eiter; + BMEdge *eed; + BM_ITER_MESH(eed, &eiter, bm, BM_EDGES_OF_MESH) { + if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN) && !bm_edge_has_visible_face(eed)) { + GPU_indexbuf_add_line_verts(&elb, BM_elem_index_get(eed->v1), BM_elem_index_get(eed->v2)); + } + } + } + else { + for (int i = 0; i < edge_len; i++) { + const MEdge *medge = &rdata->medge[i]; + if (medge->flag & ME_LOOSEEDGE) { + GPU_indexbuf_add_line_verts(&elb, medge->v1, medge->v2); + } } } } else { - for (int i = 0; i < edge_len; ++i) { - const MEdge *medge = &rdata->medge[i]; - if (medge->flag & ME_LOOSEEDGE) { - GPU_indexbuf_add_line_verts(&elb, medge->v1, medge->v2); - } + /* Hidden checks are already done when creating the loose edge list. */ + Mesh *me_cage = rdata->mapped.me_cage; + for (int i_iter = 0; i_iter < rdata->mapped.loose_edge_len; i_iter++) { + const int i = rdata->mapped.loose_edges[i_iter]; + const MEdge *medge = &me_cage->medge[i]; + GPU_indexbuf_add_line_verts(&elb, medge->v1, medge->v2); } } cache->ledges_in_order = GPU_indexbuf_build(&elb); @@ -3730,7 +4419,7 @@ static GPUIndexBuf **mesh_batch_cache_get_triangles_in_order_split_by_material( } /* Init ELBs. */ - for (int i = 0; i < mat_len; ++i) { + for (int i = 0; i < mat_len; i++) { GPU_indexbuf_init(&elb[i], GPU_PRIM_TRIS, mat_tri_len[i], tri_len * 3); } @@ -3763,7 +4452,7 @@ static GPUIndexBuf **mesh_batch_cache_get_triangles_in_order_split_by_material( } /* Build ELBs. */ - for (int i = 0; i < mat_len; ++i) { + for (int i = 0; i < mat_len; i++) { cache->shaded_triangles_in_order[i] = GPU_indexbuf_build(&elb[i]); } @@ -3846,7 +4535,7 @@ static GPUIndexBuf *mesh_create_tri_overlay_weight_faces( GPUIndexBufBuilder elb; GPU_indexbuf_init(&elb, GPU_PRIM_TRIS, tri_len, vert_len); - for (int i = 0; i < tri_len; ++i) { + for (int i = 0; i < tri_len; i++) { const MLoopTri *mlt = &rdata->mlooptri[i]; if (!(rdata->mpoly[mlt->poly].flag & (ME_FACE_SEL | ME_HIDE))) { for (uint tri_corner = 0; tri_corner < 3; tri_corner++) { @@ -3969,6 +4658,9 @@ GPUBatch *DRW_mesh_batch_cache_get_loose_edges_with_normals(Mesh *me) if (cache->ledges_with_normals == NULL) { const int datatype = MR_DATATYPE_VERT | MR_DATATYPE_EDGE | MR_DATATYPE_LOOPTRI | MR_DATATYPE_LOOP | MR_DATATYPE_POLY; MeshRenderData *rdata = mesh_render_data_create(me, datatype); + if (rdata->mapped.supported) { + rdata->mapped.use = true; + } cache->ledges_with_normals = GPU_batch_create( GPU_PRIM_LINES, mesh_batch_cache_get_vert_pos_and_nor_in_order(rdata, cache), @@ -4049,6 +4741,9 @@ struct GPUBatch *DRW_mesh_batch_cache_get_triangles_with_select_id( const int datatype = MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI | MR_DATATYPE_LOOP | MR_DATATYPE_POLY; MeshRenderData *rdata = mesh_render_data_create(me, datatype); + if (rdata->mapped.supported) { + rdata->mapped.use = true; + } cache->triangles_with_select_id = GPU_batch_create_ex( GPU_PRIM_TRIS, mesh_create_tri_select_id(rdata, use_hide, select_id_offset), NULL, GPU_BATCH_OWNS_VBO); @@ -4075,6 +4770,9 @@ struct GPUBatch *DRW_mesh_batch_cache_get_triangles_with_select_mask(struct Mesh const int datatype = MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI | MR_DATATYPE_LOOP | MR_DATATYPE_POLY; MeshRenderData *rdata = mesh_render_data_create(me, datatype); + if (rdata->mapped.supported) { + rdata->mapped.use = true; + } GPUVertBuf *vbo_tris = use_hide ? mesh_create_tri_pos_and_normals_visible_only(rdata) : @@ -4147,7 +4845,7 @@ GPUBatch *DRW_mesh_batch_cache_get_fancy_edges(Mesh *me) const int vbo_len_capacity = edge_len * 2; /* these are PRIM_LINE verts, not mesh verts */ int vbo_len_used = 0; GPU_vertbuf_data_alloc(vbo, vbo_len_capacity); - for (int i = 0; i < edge_len; ++i) { + for (int i = 0; i < edge_len; i++) { float *vcos1, *vcos2; float *pnor1 = NULL, *pnor2 = NULL; bool is_manifold; @@ -4244,6 +4942,10 @@ static void mesh_batch_cache_create_overlay_batches(Mesh *me) MeshBatchCache *cache = mesh_batch_cache_get(me); MeshRenderData *rdata = mesh_render_data_create(me, options); + if (rdata->mapped.supported) { + rdata->mapped.use = true; + } + if (cache->overlay_triangles == NULL) { cache->overlay_triangles = GPU_batch_create( GPU_PRIM_TRIS, mesh_batch_cache_get_edit_tri_pos(rdata, cache), NULL); @@ -4265,16 +4967,20 @@ static void mesh_batch_cache_create_overlay_batches(Mesh *me) GPU_batch_vertbuf_add(cache->overlay_loose_verts, mesh_batch_cache_get_edit_lvert_data(rdata, cache)); } + /* Also used for vertices display */ if (cache->overlay_triangles_nor == NULL) { cache->overlay_triangles_nor = GPU_batch_create( - GPU_PRIM_POINTS, mesh_batch_cache_get_edit_tri_pos(rdata, cache), NULL); + GPU_PRIM_POINTS, mesh_batch_cache_get_edit_tri_pos(rdata, cache), + mesh_batch_cache_get_edit_tri_indices(rdata, cache)); GPU_batch_vertbuf_add(cache->overlay_triangles_nor, mesh_batch_cache_get_edit_tri_nor(rdata, cache)); + GPU_batch_vertbuf_add(cache->overlay_triangles_nor, mesh_batch_cache_get_edit_tri_data(rdata, cache)); } if (cache->overlay_loose_edges_nor == NULL) { cache->overlay_loose_edges_nor = GPU_batch_create( GPU_PRIM_POINTS, mesh_batch_cache_get_edit_ledge_pos(rdata, cache), NULL); GPU_batch_vertbuf_add(cache->overlay_loose_edges_nor, mesh_batch_cache_get_edit_ledge_nor(rdata, cache)); + GPU_batch_vertbuf_add(cache->overlay_loose_edges_nor, mesh_batch_cache_get_edit_ledge_data(rdata, cache)); } mesh_render_data_free(rdata); @@ -4291,6 +4997,17 @@ GPUBatch *DRW_mesh_batch_cache_get_overlay_triangles(Mesh *me) return cache->overlay_triangles; } +GPUTexture *DRW_mesh_batch_cache_get_overlay_data_tex(Mesh *me) +{ + MeshBatchCache *cache = mesh_batch_cache_get(me); + + if (cache->ed_tri_data_tx == NULL) { + mesh_batch_cache_create_overlay_batches(me); + } + + return cache->ed_tri_data_tx; +} + GPUBatch *DRW_mesh_batch_cache_get_overlay_loose_edges(Mesh *me) { MeshBatchCache *cache = mesh_batch_cache_get(me); @@ -4389,6 +5106,9 @@ GPUBatch *DRW_mesh_batch_cache_get_edges_with_select_id(Mesh *me, uint select_id if (cache->edges_with_select_id == NULL) { MeshRenderData *rdata = mesh_render_data_create(me, MR_DATATYPE_VERT | MR_DATATYPE_EDGE); + if (rdata->mapped.supported) { + rdata->mapped.use = true; + } cache->edges_with_select_id = GPU_batch_create( GPU_PRIM_LINES, mesh_batch_cache_get_edges_visible(rdata, cache), NULL); @@ -4414,6 +5134,9 @@ GPUBatch *DRW_mesh_batch_cache_get_verts_with_select_id(Mesh *me, uint select_id if (cache->verts_with_select_id == NULL) { MeshRenderData *rdata = mesh_render_data_create(me, MR_DATATYPE_VERT); + if (rdata->mapped.supported) { + rdata->mapped.use = true; + } cache->verts_with_select_id = GPU_batch_create( GPU_PRIM_POINTS, mesh_batch_cache_get_verts_visible(rdata, cache), NULL); @@ -4435,6 +5158,20 @@ GPUBatch **DRW_mesh_batch_cache_get_surface_shaded( MeshBatchCache *cache = mesh_batch_cache_get(me); if (cache->shaded_triangles == NULL) { + + /* Hack to show the final result. */ + const bool use_em_final = ( + me->edit_btmesh && + me->edit_btmesh->mesh_eval_final && + (me->edit_btmesh->mesh_eval_final->runtime.is_original == false)); + Mesh me_fake; + if (use_em_final) { + me_fake = *me->edit_btmesh->mesh_eval_final; + me_fake.mat = me->mat; + me_fake.totcol = me->totcol; + me = &me_fake; + } + /* create batch from DM */ const int datatype = MR_DATATYPE_VERT | MR_DATATYPE_LOOP | MR_DATATYPE_LOOPTRI | @@ -4450,7 +5187,7 @@ GPUBatch **DRW_mesh_batch_cache_get_surface_shaded( GPUVertBuf *vbo = mesh_batch_cache_get_tri_pos_and_normals(rdata, cache); GPUVertBuf *vbo_shading = mesh_batch_cache_get_tri_shading_data(rdata, cache); - for (int i = 0; i < mat_len; ++i) { + for (int i = 0; i < mat_len; i++) { cache->shaded_triangles[i] = GPU_batch_create( GPU_PRIM_TRIS, vbo, el[i]); if (vbo_shading) { @@ -4487,7 +5224,7 @@ GPUBatch **DRW_mesh_batch_cache_get_surface_texpaint(Mesh *me) GPUIndexBuf **el = mesh_batch_cache_get_triangles_in_order_split_by_material(rdata, cache); GPUVertBuf *vbo = mesh_batch_cache_get_tri_pos_and_normals(rdata, cache); - for (int i = 0; i < mat_len; ++i) { + for (int i = 0; i < mat_len; i++) { cache->texpaint_triangles[i] = GPU_batch_create( GPU_PRIM_TRIS, vbo, el[i]); GPUVertBuf *vbo_uv = mesh_batch_cache_get_tri_uv_active(rdata, cache); @@ -4556,7 +5293,7 @@ GPUBatch *DRW_mesh_batch_cache_get_texpaint_loop_wire(Mesh *me) GPUVertBuf *vbo = GPU_vertbuf_create_with_format(&format); GPU_vertbuf_data_alloc(vbo, vert_len); - MPoly *mpoly = rdata->mpoly; + const MPoly *mpoly = rdata->mpoly; for (int a = 0; a < poly_len; a++, mpoly++) { const MLoopUV *mloopuv = mloopuv_base + mpoly->loopstart; for (int b = 0; b < mpoly->totloop; b++, mloopuv++) { diff --git a/source/blender/draw/intern/draw_debug.c b/source/blender/draw/intern/draw_debug.c index 053d266ec34..366da92cf50 100644 --- a/source/blender/draw/intern/draw_debug.c +++ b/source/blender/draw/intern/draw_debug.c @@ -161,10 +161,10 @@ static void drw_debug_draw_lines(void) while (DST.debug.lines) { void *next = DST.debug.lines->next; - immAttrib4fv(col, DST.debug.lines->color); + immAttr4fv(col, DST.debug.lines->color); immVertex3fv(pos, DST.debug.lines->pos[0]); - immAttrib4fv(col, DST.debug.lines->color); + immAttr4fv(col, DST.debug.lines->color); immVertex3fv(pos, DST.debug.lines->pos[1]); MEM_freeN(DST.debug.lines); diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 0566abd3436..512100d3ded 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -148,13 +148,10 @@ struct DRWTextStore *DRW_text_cache_ensure(void) /** \name Settings * \{ */ -bool DRW_object_is_renderable(Object *ob) +bool DRW_object_is_renderable(const Object *ob) { BLI_assert(BKE_object_is_visible(ob, OB_VISIBILITY_CHECK_UNKNOWN_RENDER_MODE)); - if (ob->dt < OB_SOLID) - return false; - if (ob->type == OB_MESH) { if ((ob == DST.draw_ctx.object_edit) || BKE_object_is_in_editmode(ob)) { View3D *v3d = DST.draw_ctx.v3d; @@ -173,7 +170,7 @@ bool DRW_object_is_renderable(Object *ob) * Return whether this object is visible depending if * we are rendering or drawing in the viewport. */ -bool DRW_check_object_visible_within_active_context(Object *ob) +bool DRW_object_is_visible_in_active_context(const Object *ob) { const eObjectVisibilityCheck mode = DRW_state_is_scene_render() ? OB_VISIBILITY_CHECK_FOR_RENDER : @@ -192,9 +189,9 @@ bool DRW_object_is_flat_normal(const Object *ob) return true; } -bool DRW_check_psys_visible_within_active_context( - Object *object, - struct ParticleSystem *psys) +bool DRW_object_is_visible_psys_in_active_context( + const Object *object, + const ParticleSystem *psys) { const DRWContextState *draw_ctx = DRW_context_state_get(); const Scene *scene = draw_ctx->scene; @@ -270,13 +267,13 @@ void DRW_transform_to_display(GPUTexture *tex, bool use_view_settings) /* Full screen triangle */ immBegin(GPU_PRIM_TRIS, 3); - immAttrib2f(texco, 0.0f, 0.0f); + immAttr2f(texco, 0.0f, 0.0f); immVertex2f(pos, -1.0f, -1.0f); - immAttrib2f(texco, 2.0f, 0.0f); + immAttr2f(texco, 2.0f, 0.0f); immVertex2f(pos, 3.0f, -1.0f); - immAttrib2f(texco, 0.0f, 2.0f); + immAttr2f(texco, 0.0f, 2.0f); immVertex2f(pos, -1.0f, 3.0f); immEnd(); @@ -1284,7 +1281,7 @@ static void drw_engines_enable(ViewLayer *view_layer, RenderEngineType *engine_t { Object *obact = OBACT(view_layer); const int mode = CTX_data_mode_enum_ex(DST.draw_ctx.object_edit, obact, DST.draw_ctx.object_mode); - View3D * v3d = DST.draw_ctx.v3d; + View3D *v3d = DST.draw_ctx.v3d; const int drawtype = v3d->shading.type; const bool use_xray = XRAY_ENABLED(v3d); @@ -1660,7 +1657,7 @@ static bool DRW_render_check_grease_pencil(Depsgraph *depsgraph) { DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN(depsgraph, ob) { - if ((ob->type == OB_GPENCIL) && (DRW_check_object_visible_within_active_context(ob))) { + if ((ob->type == OB_GPENCIL) && (DRW_object_is_visible_in_active_context(ob))) { return true; } } @@ -2201,16 +2198,16 @@ static void draw_depth_texture_to_screen(GPUTexture *texture) immBegin(GPU_PRIM_TRI_STRIP, 4); - immAttrib2f(texcoord, 0.0f, 0.0f); + immAttr2f(texcoord, 0.0f, 0.0f); immVertex2f(pos, 0.0f, 0.0f); - immAttrib2f(texcoord, 1.0f, 0.0f); + immAttr2f(texcoord, 1.0f, 0.0f); immVertex2f(pos, w, 0.0f); - immAttrib2f(texcoord, 0.0f, 1.0f); + immAttr2f(texcoord, 0.0f, 1.0f); immVertex2f(pos, 0.0f, h); - immAttrib2f(texcoord, 1.0f, 1.0f); + immAttr2f(texcoord, 1.0f, 1.0f); immVertex2f(pos, w, h); immEnd(); diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h index 5916b45aa27..c8a7816c402 100644 --- a/source/blender/draw/intern/draw_manager.h +++ b/source/blender/draw/intern/draw_manager.h @@ -101,6 +101,7 @@ enum { DRW_CALL_NORMALWORLD = (1 << 5), DRW_CALL_ORCOTEXFAC = (1 << 6), DRW_CALL_EYEVEC = (1 << 7), + DRW_CALL_OBJECTINFO = (1 << 8), }; typedef struct DRWCallState { @@ -122,6 +123,7 @@ typedef struct DRWCallState { float normalview[3][3]; float normalworld[3][3]; /* Not view dependent */ float orcotexfac[2][3]; /* Not view dependent */ + float objectinfo[2]; float eyevec[3]; } DRWCallState; @@ -140,6 +142,7 @@ typedef struct DRWCall { union { struct { /* type == DRW_CALL_SINGLE */ GPUBatch *geometry; + short ma_index; } single; struct { /* type == DRW_CALL_RANGE */ GPUBatch *geometry; @@ -257,14 +260,13 @@ struct DRWShadingGroup { int orcotexfac; int eye; int callid; + int objectinfo; uint16_t matflag; /* Matrices needed, same as DRWCall.flag */ + DRWPass *pass_parent; /* backlink to pass we're in */ #ifndef NDEBUG char attribs_count; #endif -#if !defined(NDEBUG) || defined(USE_GPU_SELECT) - DRWPass *pass_parent; /* backlink to pass we're in */ -#endif #ifdef USE_GPU_SELECT GPUVertBuf *inst_selectid; int override_selectid; /* Override for single object instances. */ diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c index 371bd9dd189..3823d081adc 100644 --- a/source/blender/draw/intern/draw_manager_data.c +++ b/source/blender/draw/intern/draw_manager_data.c @@ -36,6 +36,7 @@ #include "DNA_mesh_types.h" #include "DNA_meta_types.h" +#include "BLI_hash.h" #include "BLI_link_utils.h" #include "BLI_mempool.h" @@ -344,6 +345,22 @@ static DRWCallState *drw_call_state_create(DRWShadingGroup *shgroup, float (*obm state->matflag &= ~DRW_CALL_ORCOTEXFAC; } + if ((state->matflag & DRW_CALL_OBJECTINFO) != 0) { + state->objectinfo[0] = ob ? ob->index : 0; + unsigned int random; +#if 0 /* TODO(fclem) handle dupli objects */ + if (GMS.dob) { + random = GMS.dob->random_id; + } + else +#endif + { + random = BLI_hash_int_2d(BLI_hash_string(ob->id.name + 2), 0); + } + state->objectinfo[1] = random * (1.0f / (float)0xFFFFFFFF); + state->matflag &= ~DRW_CALL_OBJECTINFO; + } + return state; } @@ -440,7 +457,7 @@ void DRW_shgroup_call_object_procedural_triangles_culled_add(DRWShadingGroup *sh } /* These calls can be culled and are optimized for redraw */ -void DRW_shgroup_call_object_add_ex(DRWShadingGroup *shgroup, GPUBatch *geom, Object *ob, bool bypass_culling) +void DRW_shgroup_call_object_add_ex(DRWShadingGroup *shgroup, GPUBatch *geom, Object *ob, Material *ma, bool bypass_culling) { BLI_assert(geom != NULL); BLI_assert(ELEM(shgroup->type, DRW_SHG_NORMAL, DRW_SHG_FEEDBACK_TRANSFORM)); @@ -449,6 +466,7 @@ void DRW_shgroup_call_object_add_ex(DRWShadingGroup *shgroup, GPUBatch *geom, Ob call->state = drw_call_state_object(shgroup, ob->obmat, ob); call->type = DRW_CALL_SINGLE; call->single.geometry = geom; + call->single.ma_index = ma ? ma->index : 0; #ifdef USE_GPU_SELECT call->select_id = DST.select_id; #endif @@ -460,7 +478,7 @@ void DRW_shgroup_call_object_add_ex(DRWShadingGroup *shgroup, GPUBatch *geom, Ob } void DRW_shgroup_call_object_add_with_callback( - DRWShadingGroup *shgroup, GPUBatch *geom, Object *ob, + DRWShadingGroup *shgroup, GPUBatch *geom, Object *ob, Material *ma, DRWCallVisibilityFn *callback, void *user_data) { BLI_assert(geom != NULL); @@ -472,6 +490,7 @@ void DRW_shgroup_call_object_add_with_callback( call->state->user_data = user_data; call->type = DRW_CALL_SINGLE; call->single.geometry = geom; + call->single.ma_index = ma ? ma->index : 0; #ifdef USE_GPU_SELECT call->select_id = DST.select_id; #endif @@ -635,6 +654,7 @@ static void drw_shgroup_init(DRWShadingGroup *shgroup, GPUShader *shader) shgroup->normalview = GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_NORMAL); shgroup->normalworld = GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_WORLDNORMAL); shgroup->orcotexfac = GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_ORCO); + shgroup->objectinfo = GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_OBJECT_INFO); shgroup->eye = GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_EYE); shgroup->callid = GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_CALLID); @@ -653,6 +673,8 @@ static void drw_shgroup_init(DRWShadingGroup *shgroup, GPUShader *shader) shgroup->matflag |= DRW_CALL_NORMALWORLD; if (shgroup->orcotexfac > -1) shgroup->matflag |= DRW_CALL_ORCOTEXFAC; + if (shgroup->objectinfo > -1) + shgroup->matflag |= DRW_CALL_OBJECTINFO; if (shgroup->eye > -1) shgroup->matflag |= DRW_CALL_EYEVEC; } @@ -746,10 +768,7 @@ static DRWShadingGroup *drw_shgroup_create_ex(struct GPUShader *shader, DRWPass shgroup->instance_geom = NULL; shgroup->instance_vbo = NULL; #endif - -#if !defined(NDEBUG) || defined(USE_GPU_SELECT) shgroup->pass_parent = pass; -#endif return shgroup; } @@ -1013,6 +1032,23 @@ bool DRW_shgroup_is_empty(DRWShadingGroup *shgroup) return true; } +DRWShadingGroup *DRW_shgroup_create_sub(DRWShadingGroup *shgroup) +{ + /* Remove this assertion if needed but implement the other cases first! */ + BLI_assert(shgroup->type == DRW_SHG_NORMAL); + + DRWShadingGroup *shgroup_new = BLI_mempool_alloc(DST.vmempool->shgroups); + + *shgroup_new = *shgroup; + shgroup_new->uniforms = NULL; /* Not sure about that.. Should we copy them instead? */ + shgroup_new->calls.first = NULL; + shgroup_new->calls.last = NULL; + + BLI_LINKS_INSERT_AFTER(&shgroup->pass_parent->shgroups, shgroup, shgroup_new); + + return shgroup; +} + /** \} */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c index 938dda2eec9..7a4edc4e7fe 100644 --- a/source/blender/draw/intern/draw_manager_exec.c +++ b/source/blender/draw/intern/draw_manager_exec.c @@ -801,10 +801,16 @@ static void draw_matrices_model_prepare(DRWCallState *st) } } -static void draw_geometry_prepare(DRWShadingGroup *shgroup, DRWCallState *state) +static void draw_geometry_prepare(DRWShadingGroup *shgroup, DRWCall *call) { /* step 1 : bind object dependent matrices */ - if (state != NULL) { + if (call != NULL) { + DRWCallState *state = call->state; + float objectinfo[3]; + objectinfo[0] = state->objectinfo[0]; + objectinfo[1] = call->single.ma_index; /* WATCH this is only valid for single drawcalls. */ + objectinfo[2] = state->objectinfo[1]; + GPU_shader_uniform_vector(shgroup->shader, shgroup->model, 16, 1, (float *)state->model); GPU_shader_uniform_vector(shgroup->shader, shgroup->modelinverse, 16, 1, (float *)state->modelinverse); GPU_shader_uniform_vector(shgroup->shader, shgroup->modelview, 16, 1, (float *)state->modelview); @@ -812,6 +818,7 @@ static void draw_geometry_prepare(DRWShadingGroup *shgroup, DRWCallState *state) GPU_shader_uniform_vector(shgroup->shader, shgroup->modelviewprojection, 16, 1, (float *)state->modelviewprojection); GPU_shader_uniform_vector(shgroup->shader, shgroup->normalview, 9, 1, (float *)state->normalview); GPU_shader_uniform_vector(shgroup->shader, shgroup->normalworld, 9, 1, (float *)state->normalworld); + GPU_shader_uniform_vector(shgroup->shader, shgroup->objectinfo, 3, 1, (float *)objectinfo); GPU_shader_uniform_vector(shgroup->shader, shgroup->orcotexfac, 3, 2, (float *)state->orcotexfac); GPU_shader_uniform_vector(shgroup->shader, shgroup->eye, 3, 1, (float *)state->eyevec); } @@ -825,6 +832,7 @@ static void draw_geometry_prepare(DRWShadingGroup *shgroup, DRWCallState *state) GPU_shader_uniform_vector(shgroup->shader, shgroup->modelview, 16, 1, (float *)DST.view_data.matstate.mat[DRW_MAT_VIEW]); GPU_shader_uniform_vector(shgroup->shader, shgroup->modelviewinverse, 16, 1, (float *)DST.view_data.matstate.mat[DRW_MAT_VIEWINV]); GPU_shader_uniform_vector(shgroup->shader, shgroup->modelviewprojection, 16, 1, (float *)DST.view_data.matstate.mat[DRW_MAT_PERS]); + GPU_shader_uniform_vector(shgroup->shader, shgroup->objectinfo, 3, 1, (float *)unitmat); GPU_shader_uniform_vector(shgroup->shader, shgroup->orcotexfac, 3, 2, (float *)shgroup->instance_orcofac); } } @@ -1205,7 +1213,7 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state) } GPU_SELECT_LOAD_IF_PICKSEL_CALL(call); - draw_geometry_prepare(shgroup, call->state); + draw_geometry_prepare(shgroup, call); switch (call->type) { case DRW_CALL_SINGLE: diff --git a/source/blender/draw/intern/draw_view.c b/source/blender/draw/intern/draw_view.c index d77620bc47b..545c4af878c 100644 --- a/source/blender/draw/intern/draw_view.c +++ b/source/blender/draw/intern/draw_view.c @@ -108,11 +108,11 @@ void DRW_draw_background(void) UI_GetThemeColor3ubv(TH_HIGH_GRAD, col_hi); immBegin(GPU_PRIM_TRI_FAN, 4); - immAttrib3ubv(color, col_lo); + immAttr3ubv(color, col_lo); immVertex2f(pos, -1.0f, -1.0f); immVertex2f(pos, 1.0f, -1.0f); - immAttrib3ubv(color, col_hi); + immAttr3ubv(color, col_hi); immVertex2f(pos, 1.0f, 1.0f); immVertex2f(pos, -1.0f, 1.0f); immEnd(); diff --git a/source/blender/draw/modes/edit_mesh_mode.c b/source/blender/draw/modes/edit_mesh_mode.c index aa19769bcac..609d6b2edb6 100644 --- a/source/blender/draw/modes/edit_mesh_mode.c +++ b/source/blender/draw/modes/edit_mesh_mode.c @@ -56,7 +56,7 @@ extern char datatoc_edit_mesh_overlay_frag_glsl[]; extern char datatoc_edit_mesh_overlay_vert_glsl[]; extern char datatoc_edit_mesh_overlay_geom_tri_glsl[]; extern char datatoc_edit_mesh_overlay_geom_edge_glsl[]; -extern char datatoc_edit_mesh_overlay_loosevert_vert_glsl[]; +extern char datatoc_edit_mesh_overlay_points_vert_glsl[]; extern char datatoc_edit_mesh_overlay_facedot_frag_glsl[]; extern char datatoc_edit_mesh_overlay_facedot_vert_glsl[]; extern char datatoc_edit_mesh_overlay_ghost_clear_vert_glsl[]; @@ -68,6 +68,8 @@ extern char datatoc_edit_normals_geom_glsl[]; extern char datatoc_common_globals_lib_glsl[]; extern char datatoc_gpu_shader_uniform_color_frag_glsl[]; +extern char datatoc_gpu_shader_flat_color_frag_glsl[]; +extern char datatoc_gpu_shader_point_varying_color_frag_glsl[]; /* *********** LISTS *********** */ typedef struct EDIT_MESH_PassList { @@ -110,6 +112,7 @@ static struct { GPUShader *overlay_loose_edge_sh_cache[MAX_SHADERS]; GPUShader *overlay_vert_sh; + GPUShader *overlay_lvert_sh; GPUShader *overlay_facedot_sh; GPUShader *overlay_mix_sh; GPUShader *overlay_facefill_sh; @@ -133,11 +136,13 @@ typedef struct EDIT_MESH_PrivateData { DRWShadingGroup *lnormals_shgrp; DRWShadingGroup *face_overlay_shgrp; + DRWShadingGroup *verts_overlay_shgrp; DRWShadingGroup *ledges_overlay_shgrp; DRWShadingGroup *lverts_overlay_shgrp; DRWShadingGroup *facedot_overlay_shgrp; DRWShadingGroup *face_occluded_shgrp; + DRWShadingGroup *verts_occluded_shgrp; DRWShadingGroup *ledges_occluded_shgrp; DRWShadingGroup *lverts_occluded_shgrp; DRWShadingGroup *facedot_occluded_shgrp; @@ -182,7 +187,7 @@ static char *EDIT_MESH_sh_defines(ToolSettings *tsettings, RegionView3D *rv3d, b BLI_dynstr_append(ds, "#define FACE_SELECTION\n"); } - if (!fast_mode) { + if (!fast_mode || looseedge) { BLI_dynstr_append(ds, "#define EDGE_FIX\n"); } @@ -211,9 +216,11 @@ static char *EDIT_MESH_sh_lib(void) return str; } -static GPUShader *EDIT_MESH_ensure_shader(ToolSettings *tsettings, RegionView3D *rv3d, bool fast_mode, bool looseedge) +static GPUShader *EDIT_MESH_ensure_shader( + ToolSettings *tsettings, RegionView3D *rv3d, bool supports_fast_mode, bool looseedge) { - const int index = EDIT_MESH_sh_index(tsettings, rv3d, fast_mode); + const int index = EDIT_MESH_sh_index(tsettings, rv3d, supports_fast_mode); + const int fast_mode = rv3d->rflag & RV3D_NAVIGATING; if (looseedge) { if (!e_data.overlay_loose_edge_sh_cache[index]) { char *defines = EDIT_MESH_sh_defines(tsettings, rv3d, true, true); @@ -235,7 +242,7 @@ static GPUShader *EDIT_MESH_ensure_shader(ToolSettings *tsettings, RegionView3D char *lib = EDIT_MESH_sh_lib(); e_data.overlay_tri_sh_cache[index] = DRW_shader_create_with_lib( datatoc_edit_mesh_overlay_vert_glsl, - datatoc_edit_mesh_overlay_geom_tri_glsl, + fast_mode ? NULL : datatoc_edit_mesh_overlay_geom_tri_glsl, datatoc_edit_mesh_overlay_frag_glsl, lib, defines); @@ -273,10 +280,13 @@ static void EDIT_MESH_engine_init(void *vedata) if (!e_data.overlay_vert_sh) { char *lib = EDIT_MESH_sh_lib(); e_data.overlay_vert_sh = DRW_shader_create_with_lib( - datatoc_edit_mesh_overlay_loosevert_vert_glsl, NULL, - datatoc_edit_mesh_overlay_frag_glsl, - lib, - "#define VERTEX_SELECTION\n"); + datatoc_edit_mesh_overlay_points_vert_glsl, NULL, + datatoc_gpu_shader_point_varying_color_frag_glsl, lib, + "#define VERTEX_FACING\n"); + e_data.overlay_lvert_sh = DRW_shader_create_with_lib( + datatoc_edit_mesh_overlay_points_vert_glsl, NULL, + datatoc_gpu_shader_point_varying_color_frag_glsl, lib, + NULL); MEM_freeN(lib); } if (!e_data.overlay_facedot_sh) { @@ -328,7 +338,7 @@ static void EDIT_MESH_engine_init(void *vedata) static DRWPass *edit_mesh_create_overlay_pass( float *face_alpha, float *edge_width_scale, int *data_mask, bool do_edges, DRWState statemod, - DRWShadingGroup **r_face_shgrp, DRWShadingGroup **r_ledges_shgrp, + DRWShadingGroup **r_face_shgrp, DRWShadingGroup **r_verts_shgrp, DRWShadingGroup **r_ledges_shgrp, DRWShadingGroup **r_lverts_shgrp, DRWShadingGroup **r_facedot_shgrp) { GPUShader *tri_sh, *ledge_sh; @@ -360,10 +370,15 @@ static DRWPass *edit_mesh_create_overlay_pass( DRW_shgroup_uniform_bool_copy(*r_ledges_shgrp, "doEdges", do_edges); if ((tsettings->selectmode & SCE_SELECT_VERTEX) != 0) { - *r_lverts_shgrp = DRW_shgroup_create(e_data.overlay_vert_sh, pass); + *r_lverts_shgrp = DRW_shgroup_create(e_data.overlay_lvert_sh, pass); DRW_shgroup_uniform_block(*r_lverts_shgrp, "globalsBlock", globals_ubo); DRW_shgroup_uniform_vec2(*r_lverts_shgrp, "viewportSize", DRW_viewport_size_get(), 1); DRW_shgroup_uniform_float(*r_lverts_shgrp, "edgeScale", edge_width_scale, 1); + + *r_verts_shgrp = DRW_shgroup_create(e_data.overlay_vert_sh, pass); + DRW_shgroup_uniform_block(*r_verts_shgrp, "globalsBlock", globals_ubo); + DRW_shgroup_uniform_vec2(*r_verts_shgrp, "viewportSize", DRW_viewport_size_get(), 1); + DRW_shgroup_uniform_float(*r_verts_shgrp, "edgeScale", edge_width_scale, 1); } if ((tsettings->selectmode & SCE_SELECT_FACE) != 0) { @@ -499,16 +514,22 @@ static void EDIT_MESH_cache_init(void *vedata) psl->edit_face_overlay = edit_mesh_create_overlay_pass( &face_mod, &stl->g_data->edge_width_scale, stl->g_data->data_mask, stl->g_data->do_edges, DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND, - &stl->g_data->face_overlay_shgrp, &stl->g_data->ledges_overlay_shgrp, - &stl->g_data->lverts_overlay_shgrp, &stl->g_data->facedot_overlay_shgrp); + &stl->g_data->face_overlay_shgrp, + &stl->g_data->verts_overlay_shgrp, + &stl->g_data->ledges_overlay_shgrp, + &stl->g_data->lverts_overlay_shgrp, + &stl->g_data->facedot_overlay_shgrp); } else { /* We render all wires with depth and opaque to a new fbo and blend the result based on depth values */ psl->edit_face_occluded = edit_mesh_create_overlay_pass( &zero, &stl->g_data->edge_width_scale, stl->g_data->data_mask, stl->g_data->do_edges, DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_WRITE_DEPTH, - &stl->g_data->face_occluded_shgrp, &stl->g_data->ledges_occluded_shgrp, - &stl->g_data->lverts_occluded_shgrp, &stl->g_data->facedot_occluded_shgrp); + &stl->g_data->face_occluded_shgrp, + &stl->g_data->verts_occluded_shgrp, + &stl->g_data->ledges_occluded_shgrp, + &stl->g_data->lverts_occluded_shgrp, + &stl->g_data->facedot_occluded_shgrp); /* however we loose the front faces value (because we need the depth of occluded wires and * faces are alpha blended ) so we recover them in a new pass. */ @@ -535,14 +556,24 @@ static void EDIT_MESH_cache_init(void *vedata) } static void edit_mesh_add_ob_to_pass( - Scene *scene, Object *ob, DRWShadingGroup *face_shgrp, DRWShadingGroup *ledges_shgrp, - DRWShadingGroup *lverts_shgrp, DRWShadingGroup *facedot_shgrp, DRWShadingGroup *facefill_shgrp) + Scene *scene, Object *ob, + DRWShadingGroup *face_shgrp, + DRWShadingGroup *verts_shgrp, + DRWShadingGroup *ledges_shgrp, + DRWShadingGroup *lverts_shgrp, + DRWShadingGroup *facedot_shgrp, + DRWShadingGroup *facefill_shgrp) { - struct GPUBatch *geo_ovl_tris, *geo_ovl_ledges, *geo_ovl_lverts, *geo_ovl_fcenter; + struct GPUBatch *geo_ovl_tris, *geo_ovl_verts, *geo_ovl_ledges, *geo_ovl_lverts, *geo_ovl_fcenter; + struct GPUTexture *data_texture; ToolSettings *tsettings = scene->toolsettings; - DRW_cache_mesh_wire_overlay_get(ob, &geo_ovl_tris, &geo_ovl_ledges, &geo_ovl_lverts); + DRW_cache_mesh_wire_overlay_get(ob, &geo_ovl_tris, &geo_ovl_ledges, &geo_ovl_lverts, &data_texture); + + face_shgrp = DRW_shgroup_create_sub(face_shgrp); + DRW_shgroup_uniform_texture(face_shgrp, "dataBuffer", data_texture); DRW_shgroup_call_add(face_shgrp, geo_ovl_tris, ob->obmat); + DRW_shgroup_call_add(ledges_shgrp, geo_ovl_ledges, ob->obmat); if (facefill_shgrp) { @@ -550,6 +581,10 @@ static void edit_mesh_add_ob_to_pass( } if ((tsettings->selectmode & SCE_SELECT_VERTEX) != 0) { + /* Thoses are point batches. */ + DRW_cache_mesh_normals_overlay_get(ob, &geo_ovl_verts, &geo_ovl_ledges, &geo_ovl_lverts); + DRW_shgroup_call_add(verts_shgrp, geo_ovl_verts, ob->obmat); + DRW_shgroup_call_add(lverts_shgrp, geo_ovl_ledges, ob->obmat); DRW_shgroup_call_add(lverts_shgrp, geo_ovl_lverts, ob->obmat); } @@ -631,6 +666,7 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob) edit_mesh_add_ob_to_pass( scene, ob, stl->g_data->face_occluded_shgrp, + stl->g_data->verts_occluded_shgrp, stl->g_data->ledges_occluded_shgrp, stl->g_data->lverts_occluded_shgrp, stl->g_data->facedot_occluded_shgrp, @@ -640,6 +676,7 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob) edit_mesh_add_ob_to_pass( scene, ob, stl->g_data->face_overlay_shgrp, + stl->g_data->verts_overlay_shgrp, stl->g_data->ledges_overlay_shgrp, stl->g_data->lverts_overlay_shgrp, (show_face_dots) ? stl->g_data->facedot_overlay_shgrp : NULL, @@ -727,6 +764,7 @@ static void EDIT_MESH_engine_free(void) DRW_SHADER_FREE_SAFE(e_data.weight_face_shader); DRW_SHADER_FREE_SAFE(e_data.overlay_vert_sh); + DRW_SHADER_FREE_SAFE(e_data.overlay_lvert_sh); DRW_SHADER_FREE_SAFE(e_data.overlay_facedot_sh); DRW_SHADER_FREE_SAFE(e_data.overlay_mix_sh); DRW_SHADER_FREE_SAFE(e_data.overlay_facefill_sh); diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c index 2df2ad57073..20abfbf3348 100644 --- a/source/blender/draw/modes/object_mode.c +++ b/source/blender/draw/modes/object_mode.c @@ -634,7 +634,7 @@ static void OBJECT_engine_init(void *vedata) } float dist; - if (rv3d->persp == RV3D_CAMOB && v3d->camera) { + if (rv3d->persp == RV3D_CAMOB && v3d->camera && v3d->camera->type == OB_CAMERA) { Object *camera_object = DEG_get_evaluated_object(draw_ctx->depsgraph, v3d->camera); dist = ((Camera *)(camera_object->data))->clipend; } @@ -2040,7 +2040,7 @@ static void volumes_free_smoke_textures(void) * all viewport in a redraw at least. */ for (LinkData *link = e_data.smoke_domains.first; link; link = link->next) { SmokeModifierData *smd = (SmokeModifierData *)link->data; - GPU_free_smoke(smd); + GPU_free_smoke_velocity(smd); } BLI_freelistN(&e_data.smoke_domains); } @@ -2281,7 +2281,7 @@ static void DRW_shgroup_relationship_lines( Scene *scene, Object *ob) { - if (ob->parent && DRW_check_object_visible_within_active_context(ob->parent)) { + if (ob->parent && DRW_object_is_visible_in_active_context(ob->parent)) { DRW_shgroup_call_dynamic_add(sgl->relationship_lines, ob->parent->obmat[3]); DRW_shgroup_call_dynamic_add(sgl->relationship_lines, ob->obmat[3]); } @@ -2289,11 +2289,11 @@ static void DRW_shgroup_relationship_lines( if (ob->rigidbody_constraint) { Object *rbc_ob1 = ob->rigidbody_constraint->ob1; Object *rbc_ob2 = ob->rigidbody_constraint->ob2; - if (rbc_ob1 && DRW_check_object_visible_within_active_context(rbc_ob1)) { + if (rbc_ob1 && DRW_object_is_visible_in_active_context(rbc_ob1)) { DRW_shgroup_call_dynamic_add(sgl->relationship_lines, rbc_ob1->obmat[3]); DRW_shgroup_call_dynamic_add(sgl->relationship_lines, ob->obmat[3]); } - if (rbc_ob2 && DRW_check_object_visible_within_active_context(rbc_ob2)) { + if (rbc_ob2 && DRW_object_is_visible_in_active_context(rbc_ob2)) { DRW_shgroup_call_dynamic_add(sgl->relationship_lines, rbc_ob2->obmat[3]); DRW_shgroup_call_dynamic_add(sgl->relationship_lines, ob->obmat[3]); } @@ -2538,7 +2538,7 @@ static void OBJECT_cache_populate_particles(Object *ob, if (!psys_check_enabled(ob, psys, false)) { continue; } - if (!DRW_check_psys_visible_within_active_context(ob, psys)) { + if (!DRW_object_is_visible_psys_in_active_context(ob, psys)) { continue; } @@ -2624,7 +2624,7 @@ static void OBJECT_cache_populate(void *vedata, Object *ob) OBJECT_cache_populate_particles(ob, psl); } - if (DRW_check_object_visible_within_active_context(ob) == false) { + if (DRW_object_is_visible_in_active_context(ob) == false) { return; } diff --git a/source/blender/draw/modes/overlay_mode.c b/source/blender/draw/modes/overlay_mode.c index 166b2a12d7b..3fa2f1d48e2 100644 --- a/source/blender/draw/modes/overlay_mode.c +++ b/source/blender/draw/modes/overlay_mode.c @@ -88,7 +88,7 @@ extern struct GlobalsUboStorage ts; /* draw_common.c */ /* Functions */ static void overlay_engine_init(void *vedata) { - OVERLAY_Data * data = (OVERLAY_Data *)vedata; + OVERLAY_Data *data = vedata; OVERLAY_StorageList *stl = data->stl; if (!stl->g_data) { @@ -149,7 +149,7 @@ static void overlay_engine_init(void *vedata) static void overlay_cache_init(void *vedata) { - OVERLAY_Data * data = (OVERLAY_Data *)vedata; + OVERLAY_Data *data = vedata; OVERLAY_PassList *psl = data->psl; OVERLAY_StorageList *stl = data->stl; @@ -223,7 +223,7 @@ static void overlay_cache_init(void *vedata) static void overlay_cache_populate(void *vedata, Object *ob) { - OVERLAY_Data * data = (OVERLAY_Data *)vedata; + OVERLAY_Data *data = vedata; OVERLAY_StorageList *stl = data->stl; OVERLAY_PrivateData *pd = stl->g_data; OVERLAY_PassList *psl = data->psl; @@ -322,7 +322,7 @@ static void overlay_cache_populate(void *vedata, Object *ob) static void overlay_cache_finish(void *vedata) { - OVERLAY_Data * data = (OVERLAY_Data *)vedata; + OVERLAY_Data *data = vedata; OVERLAY_PassList *psl = data->psl; OVERLAY_StorageList *stl = data->stl; @@ -340,7 +340,7 @@ static void overlay_cache_finish(void *vedata) static void overlay_draw_scene(void *vedata) { - OVERLAY_Data * data = (OVERLAY_Data *)vedata; + OVERLAY_Data *data = vedata; OVERLAY_PassList *psl = data->psl; DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); diff --git a/source/blender/draw/modes/paint_weight_mode.c b/source/blender/draw/modes/paint_weight_mode.c index f5394e4e925..9060a97f412 100644 --- a/source/blender/draw/modes/paint_weight_mode.c +++ b/source/blender/draw/modes/paint_weight_mode.c @@ -140,6 +140,8 @@ static void PAINT_WEIGHT_cache_init(void *vedata) stl->g_data->fweights_shgrp = DRW_shgroup_create(e_data.weight_face_shader, psl->weight_faces); + DRW_shgroup_uniform_bool_copy(stl->g_data->fweights_shgrp, "drawContours", (v3d->overlay.wpaint_flag & V3D_OVERLAY_WPAINT_CONTOURS) != 0); + DRW_shgroup_uniform_float(stl->g_data->fweights_shgrp, "opacity", &v3d->overlay.weight_paint_mode_opacity, 1); DRW_shgroup_uniform_texture(stl->g_data->fweights_shgrp, "colorramp", globals_weight_ramp); DRW_shgroup_uniform_block(stl->g_data->fweights_shgrp, "globalsBlock", globals_ubo); diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl index 87ee0d7f00f..b37862f2037 100644 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl +++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl @@ -6,9 +6,15 @@ #define EDGE_FREESTYLE (1 << 5) #define EDGE_VERTEX_ACTIVE (1 << (0 + 8)) #define EDGE_VERTEX_SELECTED (1 << (1 + 8)) +#define EDGE_VERTEX_EXISTS (1 << (2 + 8)) #define VERTEX_ACTIVE (1 << 0) #define VERTEX_SELECTED (1 << 1) +#define VERTEX_EXISTS (1 << 2) + +#define FACE_ACTIVE (1 << 3) +#define FACE_SELECTED (1 << 4) +#define FACE_FREESTYLE (1 << 5) uniform bool doEdges = true; diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_vert.glsl index 068dc3369fb..eb68eb9b0dc 100644 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_vert.glsl +++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_vert.glsl @@ -7,9 +7,9 @@ in ivec4 data; flat out vec4 faceColor; -#define FACE_ACTIVE (1 << 2) -#define FACE_SELECTED (1 << 3) -#define FACE_FREESTYLE (1 << 4) +#define FACE_ACTIVE (1 << 3) +#define FACE_SELECTED (1 << 4) +#define FACE_FREESTYLE (1 << 5) void main() { diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl index 7f985cd2c43..31cebc84461 100644 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl +++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl @@ -2,13 +2,6 @@ /* Solid Wirefram implementation * Mike Erwin, Clément Foucault */ -/* This shader follows the principles of - * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */ - -/* This is not perfect. Only a subset of intel gpus are affected. - * This fix have some performance impact. - * TODO Refine the range to only affect GPUs. */ - uniform float faceAlphaMod; uniform float edgeScale; @@ -23,12 +16,12 @@ in vec3 vertexColor; in float facing; #endif -flat in vec2 ssPos[3]; +in vec3 barycentric; out vec4 FragColor; /* Vertex flag is shifted and combined with the edge flag */ -#define FACE_ACTIVE (1 << (2 + 8)) +#define FACE_ACTIVE_ (FACE_ACTIVE << 8) #define LARGE_EDGE_SIZE 3.0 @@ -61,12 +54,15 @@ void colorDistEdge(vec4 color, float dist) void main() { - vec3 e, p; - /* Step 1 : Computing Distances */ - distToEdgeAndPoint((ssPos[1] - ssPos[0]) + 1e-8, ssPos[0], e.z, p.x); - distToEdgeAndPoint((ssPos[2] - ssPos[1]) + 1e-8, ssPos[1], e.x, p.y); - distToEdgeAndPoint((ssPos[0] - ssPos[2]) + 1e-8, ssPos[2], e.y, p.z); + vec3 dx = dFdx(barycentric); + vec3 dy = dFdy(barycentric); + vec3 d = vec3( + length(vec2(dx.x, dy.x)), + length(vec2(dx.y, dy.y)), + length(vec2(dx.z, dy.z)) + ); + vec3 e = abs(vec3(barycentric / d)); /* Step 2 : coloring (order dependent) */ @@ -82,7 +78,7 @@ void main() /* Outer large edge */ float largeEdge = e[v] - sizeEdgeFinal * LARGE_EDGE_SIZE; - vec4 large_edge_color = EDIT_MESH_edge_color_outer(flag[v], (flag[0]& FACE_ACTIVE) != 0, edgesCrease[v], edgesBweight[v]); + vec4 large_edge_color = EDIT_MESH_edge_color_outer(flag[v], (flag[0] & FACE_ACTIVE_) != 0, edgesCrease[v], edgesBweight[v]); if (large_edge_color.a != 0.0) { colorDistEdge(large_edge_color, largeEdge); @@ -97,29 +93,35 @@ void main() #ifdef VERTEX_SELECTION colorDistEdge(vec4(vertexColor, 1.0), innerEdge); #else - vec4 inner_edge_color = EDIT_MESH_edge_color_inner(flag[v], (flag[0]& FACE_ACTIVE) != 0); + vec4 inner_edge_color = EDIT_MESH_edge_color_inner(flag[v], (flag[0] & FACE_ACTIVE_) != 0); colorDistEdge(inner_edge_color, innerEdge); #endif } } +#if 0 /* Points */ #ifdef VERTEX_SELECTION for (int v = 0; v < 3; ++v) { - float size = p[v] - sizeVertex; + if ((flag[v] & EDGE_VERTEX_EXISTS) == 0) { + /* Leave as-is, no vertex. */ + } + else { + float size = p[v] - sizeVertex; - vec4 point_color = colorVertex; - point_color = ((flag[v] & EDGE_VERTEX_SELECTED) != 0) ? colorVertexSelect : point_color; - point_color = ((flag[v] & EDGE_VERTEX_ACTIVE) != 0) ? vec4(colorEditMeshActive.xyz, 1.0) : point_color; + vec4 point_color = colorVertex; + point_color = ((flag[v] & EDGE_VERTEX_SELECTED) != 0) ? colorVertexSelect : point_color; + point_color = ((flag[v] & EDGE_VERTEX_ACTIVE) != 0) ? vec4(colorEditMeshActive.xyz, 1.0) : point_color; - colorDist(point_color, size); + colorDist(point_color, size); + } } #endif +#endif #ifdef VERTEX_FACING FragColor.a *= 1.0 - abs(facing) * 0.4; #endif - /* don't write depth if not opaque */ if (FragColor.a == 0.0) discard; } diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl index 88cb6c07a94..0368f170cb1 100644 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl +++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl @@ -2,11 +2,8 @@ /* Solid Wirefram implementation * Mike Erwin, Clément Foucault */ -/* This shader follows the principles of - * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */ - layout(lines) in; -layout(triangle_strip, max_vertices=6) out; +layout(triangle_strip, max_vertices=4) out; uniform mat4 ProjectionMatrix; uniform vec2 viewportSize; @@ -24,6 +21,7 @@ flat out vec3 edgesCrease; flat out vec3 edgesBweight; flat out vec4 faceColor; flat out ivec3 flag; +out vec3 barycentric; #ifdef VERTEX_SELECTION out vec3 vertexColor; #endif @@ -34,9 +32,6 @@ out float facing; /* See fragment shader */ flat out vec2 ssPos[3]; -#define FACE_ACTIVE (1 << 2) -#define FACE_SELECTED (1 << 3) - /* project to screen space */ vec2 proj(vec4 pos) { @@ -94,20 +89,21 @@ void main() ssPos[1] = pos[1]; flag[0] = flag[2] = (vData[0].x << 8); flag[1] = (vData[1].x << 8); - - doVertex(0, pPos[0] + vec4(-dirs1.xy, 0.0, 0.0)); + barycentric = vec3(1.0); doVertex(0, pPos[0] + vec4( dirs1.zw, 0.0, 0.0)); + + barycentric[2] = -1.0; doVertex(0, pPos[0] + vec4(-dirs1.zw, 0.0, 0.0)); flag[2] |= vData[0].y; edgesCrease[2] = vData[0].z / 255.0; edgesBweight[2] = vData[0].w / 255.0; + barycentric = vec3(1.0); doVertex(1, pPos[1] + vec4( dirs2.zw, 0.0, 0.0)); - doVertex(1, pPos[1] + vec4(-dirs2.zw, 0.0, 0.0)); - flag[2] = 0; - doVertex(1, pPos[1] + vec4( dirs2.xy, 0.0, 0.0)); + barycentric[2] = -1.0; + doVertex(1, pPos[1] + vec4(-dirs2.zw, 0.0, 0.0)); EndPrimitive(); } diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl index 7d6c64afabc..94b16ee02fa 100644 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl +++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl @@ -2,30 +2,14 @@ /* Solid Wirefram implementation * Mike Erwin, Clément Foucault */ -/* This shader follows the principles of - * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */ - layout(triangles) in; -/* This is not perfect. Only a subset of intel gpus are affected. - * This fix have some performance impact. - * TODO Refine the range to only affect GPUs. */ - -#ifdef EDGE_FIX /* To fix the edge artifacts, we render * an outline strip around the screenspace * triangle. Order is important. * TODO diagram */ - -#ifdef VERTEX_SELECTION -layout(triangle_strip, max_vertices=23) out; -#else -layout(triangle_strip, max_vertices=17) out; -#endif -#else -layout(triangle_strip, max_vertices=3) out; -#endif +layout(triangle_strip, max_vertices=15) out; uniform mat4 ProjectionMatrix; uniform vec2 viewportSize; @@ -43,7 +27,8 @@ flat out vec3 edgesCrease; flat out vec3 edgesBweight; flat out vec4 faceColor; flat out ivec3 flag; -flat out int clipCase; + +out vec3 barycentric; #ifdef VERTEX_SELECTION out vec3 vertexColor; #endif @@ -51,13 +36,6 @@ out vec3 vertexColor; out float facing; #endif -/* See fragment shader */ -flat out vec2 ssPos[3]; - -#define FACE_ACTIVE (1 << 2) -#define FACE_SELECTED (1 << 3) -#define FACE_FREESTYLE (1 << 4) - /* project to screen space */ vec2 proj(vec4 pos) { @@ -73,8 +51,9 @@ void doVertex(int v) #ifdef VERTEX_FACING facing = vFacing[v]; #endif - gl_Position = pPos[v]; + barycentric = vec3(0.0); + barycentric[v % 3] = 1.0; EmitVertex(); } @@ -84,6 +63,7 @@ void doLoopStrip(int v, vec3 offset) doVertex(v); gl_Position.xyz += offset; + barycentric = vec3(1.0); EmitVertex(); } @@ -115,6 +95,7 @@ void main() faceColor = colorFace; /* Vertex */ + vec2 ssPos[3]; ssPos[0] = proj(pPos[0]); ssPos[1] = proj(pPos[1]); ssPos[2] = proj(pPos[2]); @@ -123,10 +104,10 @@ void main() doVertex(1); doVertex(2); -#ifdef EDGE_FIX + EndPrimitive(); + vec2 fixvec[6]; vec2 fixvecaf[6]; - vec2 cornervec[3]; /* This fix the case when 2 vertices are perfectly aligned * and corner vectors have nowhere to go. @@ -150,8 +131,6 @@ void main() vec2 dir = normalize(v2 - v1); vec2 dir2 = normalize(v3 - v1); - cornervec[i] = -normalize(dir + dir2); - /* perpendicular to dir */ vec2 perp = vec2(-dir.y, dir.x); @@ -162,7 +141,6 @@ void main() /* Make it view independent */ perp *= sizeEdgeFix / viewportSize; - cornervec[i] *= sizeEdgeFix / viewportSize; fixvec[i] = fixvecaf[i] = perp; /* Perspective */ @@ -171,7 +149,6 @@ void main() * our fixvec to be flipped */ fixvec[i] *= -vPos[i].z; fixvecaf[i] *= -vPos[i1].z; - cornervec[i] *= -vPos[i].z; } } @@ -195,16 +172,6 @@ void main() flag[v] &= ~EDGE_EXISTS; doLoopStrip(vaf, vec3(fixvecaf[v], Z_OFFSET)); - /* corner vertices should not draw edges but draw point only */ - flag[vbe] &= ~EDGE_EXISTS; -#ifdef VERTEX_SELECTION - doLoopStrip(vaf, vec3(cornervec[vaf], Z_OFFSET)); -#endif + EndPrimitive(); } - - /* finish the loop strip */ - doLoopStrip(2, vec3(fixvec[2], Z_OFFSET)); -#endif - - EndPrimitive(); } diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl deleted file mode 100644 index 13d824c2410..00000000000 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl +++ /dev/null @@ -1,52 +0,0 @@ - -/* Solid Wirefram implementation - * Mike Erwin, Clément Foucault */ - -/* This shader follows the principles of - * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */ - -uniform mat4 ModelViewProjectionMatrix; -uniform vec2 viewportSize; - -in vec3 pos; -in ivec4 data; - -/* these are the same for all vertices - * and does not need interpolation */ -flat out vec3 edgesCrease; -flat out vec3 edgesBweight; -flat out vec4 faceColor; -flat out ivec3 flag; -#ifdef VERTEX_SELECTION -out vec3 vertexColor; -#endif - -/* See fragment shader */ -flat out vec2 ssPos[3]; - -/* project to screen space */ -vec2 proj(vec4 pos) -{ - return (0.5 * (pos.xy / pos.w) + 0.5) * viewportSize; -} - -void main() -{ - edgesCrease = vec3(0.0); - edgesBweight = vec3(0.0); - - vec4 pPos = ModelViewProjectionMatrix * vec4(pos, 1.0); - - /* there is no face */ - faceColor = vec4(0.0); - -#ifdef VERTEX_SELECTION - vertexColor = vec3(0.0); -#endif - - ssPos[0] = ssPos[1] = ssPos[2] = proj(pPos); - flag[0] = flag[1] = flag[2] = (data.x << 8); - - gl_PointSize = sizeEdgeFix; - gl_Position = pPos; -} diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_points_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_points_vert.glsl new file mode 100644 index 00000000000..484a017e171 --- /dev/null +++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_points_vert.glsl @@ -0,0 +1,41 @@ + +uniform mat3 NormalMatrix; +uniform mat4 ProjectionMatrix; +uniform mat4 ModelViewMatrix; +uniform mat4 ModelViewProjectionMatrix; +uniform float ofs = 5e-5; + +in vec3 pos; +in ivec4 data; +#ifdef VERTEX_FACING +in vec3 vnor; +#endif + +out vec4 finalColor; + +void main() +{ + finalColor = colorVertex; + finalColor = ((data.x & VERTEX_SELECTED) != 0) ? colorVertexSelect : finalColor; + finalColor = ((data.x & VERTEX_ACTIVE) != 0) ? vec4(colorEditMeshActive.xyz, 1.0) : finalColor; + + gl_PointSize = sizeVertex * 2.0; + gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0); + gl_Position -= ofs; + +#ifdef VERTEX_FACING + vec4 vPos = ModelViewMatrix * vec4(pos, 1.0); + vec3 view_normal = normalize(NormalMatrix * vnor); + vec3 view_vec = (ProjectionMatrix[3][3] == 0.0) + ? normalize(vPos.xyz) + : vec3(0.0, 0.0, 1.0); + float facing = dot(view_vec, view_normal); + + finalColor.a *= 1.0 - abs(facing) * 0.4; +#endif + + if ((data.x & VERTEX_EXISTS) == 0) { + gl_Position = vec4(0.0); + gl_PointSize = 0.0; + } +} diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl index 7cab2a5035f..8715ab69181 100644 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl +++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl @@ -2,38 +2,103 @@ /* Solid Wirefram implementation * Mike Erwin, Clément Foucault */ -/* This shader follows the principles of - * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */ - +uniform mat3 NormalMatrix; +uniform mat4 ProjectionMatrix; uniform mat4 ModelViewMatrix; uniform mat4 ModelViewProjectionMatrix; uniform ivec4 dataMask = ivec4(0xFF); +uniform float ofs = 1e-5; + +uniform isamplerBuffer dataBuffer; + in vec3 pos; +#ifdef VERTEX_FACING +in vec3 vnor; +#endif + +#ifdef EDGE_FIX in ivec4 data; out vec4 vPos; out vec4 pPos; out ivec4 vData; - -#ifdef VERTEX_FACING -uniform mat4 ProjectionMatrix; -uniform mat3 NormalMatrix; - -in vec3 vnor; +# ifdef VERTEX_FACING out float vFacing; -#endif +# endif void main() { vPos = ModelViewMatrix * vec4(pos, 1.0); pPos = ModelViewProjectionMatrix * vec4(pos, 1.0); + pPos.z -= ofs; vData = data & dataMask; -#ifdef VERTEX_FACING +# ifdef VERTEX_FACING vec3 view_normal = normalize(NormalMatrix * vnor); vec3 view_vec = (ProjectionMatrix[3][3] == 0.0) ? normalize(vPos.xyz) : vec3(0.0, 0.0, 1.0); vFacing = dot(view_vec, view_normal); -#endif +# endif } + +#else /* EDGE_FIX */ + +flat out vec3 edgesCrease; +flat out vec3 edgesBweight; +flat out vec4 faceColor; +flat out ivec3 flag; +# ifdef VERTEX_SELECTION +out vec3 vertexColor; +# endif +# ifdef VERTEX_FACING +out float facing; +# endif + +out vec3 barycentric; + +void main() +{ + gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0); + gl_Position.z -= ofs; + + int v_0 = (gl_VertexID / 3) * 3; + int vidx = gl_VertexID % 3; + barycentric = vec3(0.0); + barycentric[vidx] = 1.0; + + /* Edge */ + ivec4 vData[3], data = ivec4(0); + ivec3 eflag; + for (int v = 0; v < 3; ++v) { + data = texelFetch(dataBuffer, v_0 + v); + vData[v] = data & dataMask; + flag[v] = eflag[v] = vData[v].y | (vData[v].x << 8); + edgesCrease[v] = vData[v].z / 255.0; + edgesBweight[v] = vData[v].w / 255.0; + } + + /* Face */ + if ((vData[0].x & FACE_ACTIVE) != 0) + faceColor = colorFaceSelect; + else if ((vData[0].x & FACE_SELECTED) != 0) + faceColor = colorFaceSelect; + else if ((vData[0].x & FACE_FREESTYLE) != 0) + faceColor = colorFaceFreestyle; + else + faceColor = colorFace; + +# ifdef VERTEX_SELECTION + vertexColor = EDIT_MESH_vertex_color(vData[vidx].x).rgb; +# endif +# ifdef VERTEX_FACING + vec4 vPos = ModelViewMatrix * vec4(pos, 1.0); + vec3 view_normal = normalize(NormalMatrix * vnor); + vec3 view_vec = (ProjectionMatrix[3][3] == 0.0) + ? normalize(vPos.xyz) + : vec3(0.0, 0.0, 1.0); + facing = dot(view_vec, view_normal); +# endif +} + +#endif
\ No newline at end of file diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl index ca41ed1ac6c..75bfe04aa8b 100644 --- a/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl +++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl @@ -2,10 +2,8 @@ uniform vec3 wireColor; uniform vec3 rimColor; -flat in vec3 ssVec0; -flat in vec3 ssVec1; -flat in vec3 ssVec2; in float facing; +in vec3 barycentric; # ifdef LIGHT_EDGES flat in vec3 edgeSharpness; @@ -28,12 +26,14 @@ const float rim_alpha = 0.75; void main() { #ifndef SELECT_EDGES - vec3 ss_pos = vec3(gl_FragCoord.xy, 1.0); - vec3 dist_to_edge = vec3( - dot(ss_pos, ssVec0), - dot(ss_pos, ssVec1), - dot(ss_pos, ssVec2) + vec3 dx = dFdx(barycentric); + vec3 dy = dFdy(barycentric); + vec3 d = vec3( + length(vec2(dx.x, dy.x)), + length(vec2(dx.y, dy.y)), + length(vec2(dx.z, dy.z)) ); + vec3 dist_to_edge = barycentric / d; # ifdef LIGHT_EDGES vec3 fac = abs(dist_to_edge); diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl index a508b59b9f0..742bcab80c0 100644 --- a/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl +++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl @@ -15,9 +15,7 @@ in vec2 ssPos[]; in float facingOut[]; #ifndef SELECT_EDGES -flat out vec3 ssVec0; -flat out vec3 ssVec1; -flat out vec3 ssVec2; +out vec3 barycentric; out float facing; #endif @@ -33,14 +31,6 @@ flat out vec3 edgeSharpness; #define NO_EDGE vec3(10000.0); -/* TODO(fclem) remove code duplication. */ -vec3 compute_vec(vec2 v0, vec2 v1) -{ - vec2 v = normalize(v1 - v0); - v = vec2(-v.y, v.x); - return vec3(v, -dot(v, v0)); -} - vec3 get_edge_normal(vec3 n1, vec3 n2, vec3 edge) { edge = normalize(edge); @@ -55,17 +45,25 @@ float get_edge_sharpness(vec3 fnor, vec3 vnor) return smoothstep(wireStepParam.x, wireStepParam.y, sharpness); } +vec3 get_barycentric(bvec3 do_edge, const int v) +{ + int v_n = v; + int v_n1 = (v + 1) % 3; + int v_n2 = (v + 2) % 3; + vec3 barycentric; + barycentric[v_n] = do_edge[v_n] ? 0.0 : 1.0; + barycentric[v_n1] = 1.0; + barycentric[v_n2] = do_edge[v_n2] ? 0.0 : 1.0; + return barycentric; +} + void main(void) { vec3 facings = vec3(facingOut[0], facingOut[1], facingOut[2]); bvec3 do_edge = greaterThan(abs(facings), vec3(1.0)); facings = fract(facings) - clamp(-sign(facings), 0.0, 1.0); -#ifndef SELECT_EDGES - ssVec0 = do_edge.x ? compute_vec(ssPos[0], ssPos[1]) : NO_EDGE; - ssVec1 = do_edge.y ? compute_vec(ssPos[1], ssPos[2]) : NO_EDGE; - ssVec2 = do_edge.z ? compute_vec(ssPos[2], ssPos[0]) : NO_EDGE; -#else +#ifdef SELECT_EDGES vec3 edgeSharpness; #endif @@ -110,15 +108,17 @@ void main(void) EndPrimitive(); } #else - + barycentric = get_barycentric(do_edge, 0); gl_Position = gl_in[0].gl_Position; facing = facings.x; EmitVertex(); + barycentric = get_barycentric(do_edge, 1); gl_Position = gl_in[1].gl_Position; facing = facings.y; EmitVertex(); + barycentric = get_barycentric(do_edge, 2); gl_Position = gl_in[2].gl_Position; facing = facings.z; EmitVertex(); diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl index 5016ceed09e..460bed14a8b 100644 --- a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl +++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl @@ -16,39 +16,6 @@ in vec3 pos; in vec3 nor; #endif -#ifdef USE_GEOM_SHADER -out vec2 ssPos; -out float facingOut; /* abs(facing) > 1.0 if we do edge */ -#else -flat out vec3 ssVec0; -flat out vec3 ssVec1; -flat out vec3 ssVec2; -out float facing; -#endif - -#ifdef LIGHT_EDGES -# ifdef USE_GEOM_SHADER -out vec3 obPos; -out vec3 vNor; -out float forceEdge; -# else -flat out vec3 edgeSharpness; -# endif -#endif - -/* project to screen space */ -vec2 proj(vec4 pos) -{ - return (0.5 * (pos.xy / pos.w) + 0.5) * viewportSize; -} - -vec3 compute_vec(vec2 v0, vec2 v1) -{ - vec2 v = normalize(v1 - v0); - v = vec2(-v.y, v.x); - return vec3(v, -dot(v, v0)); -} - float short_to_unit_float(uint s) { int value = int(s) & 0x7FFF; @@ -99,12 +66,18 @@ float get_edge_sharpness(vec3 fnor, vec3 vnor) return smoothstep(wireStepParam.x, wireStepParam.y, sharpness); } -#define NO_EDGE vec3(10000.0); +#ifdef USE_GEOM_SHADER + +# ifdef LIGHT_EDGES +out vec3 obPos; +out vec3 vNor; +out float forceEdge; +# endif +out float facingOut; /* abs(facing) > 1.0 if we do edge */ void main() { -#ifdef USE_GEOM_SHADER -#ifndef USE_SCULPT +# ifndef USE_SCULPT uint v_id = texelFetch(faceIds, gl_VertexID).r; bool do_edge = (v_id & (1u << 30u)) != 0u; @@ -113,26 +86,37 @@ void main() vec3 pos = get_vertex_pos(v_id); vec3 nor = get_vertex_nor(v_id); -#else +# else const bool do_edge = true; const bool force_edge = false; -#endif +# endif facingOut = normalize(NormalMatrix * nor).z; facingOut += (do_edge) ? ((facingOut > 0.0) ? 2.0 : -2.0) : 0.0; gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0); - ssPos = proj(gl_Position); # ifdef LIGHT_EDGES obPos = pos; vNor = nor; forceEdge = float(force_edge); /* meh, could try to also encode it in facingOut */ # endif +} + +#else /* USE_GEOM_SHADER */ -#else +# ifdef LIGHT_EDGES +flat out vec3 edgeSharpness; +# endif +out float facing; +out vec3 barycentric; + +void main() +{ int v_0 = (gl_VertexID / 3) * 3; int v_n = gl_VertexID % 3; + int v_n1 = (gl_VertexID + 1) % 3; + int v_n2 = (gl_VertexID + 2) % 3; /* Getting the same positions for each of the 3 verts. */ uvec3 v_id; @@ -150,30 +134,24 @@ void main() v_id = (v_id << 2u) >> 2u; vec3 pos[3]; - pos[0] = get_vertex_pos(v_id.x); - pos[1] = get_vertex_pos(v_id.y); - pos[2] = get_vertex_pos(v_id.z); - vec4 p_pos[3]; - p_pos[0] = ModelViewProjectionMatrix * vec4(pos[0], 1.0); - p_pos[1] = ModelViewProjectionMatrix * vec4(pos[1], 1.0); - p_pos[2] = ModelViewProjectionMatrix * vec4(pos[2], 1.0); - - vec2 ss_pos[3]; - ss_pos[0] = proj(p_pos[0]); - ss_pos[1] = proj(p_pos[1]); - ss_pos[2] = proj(p_pos[2]); - /* Compute the edges screen vectors */ - ssVec0 = do_edge.x ? compute_vec(ss_pos[0], ss_pos[1]) : NO_EDGE; - ssVec1 = do_edge.y ? compute_vec(ss_pos[1], ss_pos[2]) : NO_EDGE; - ssVec2 = do_edge.z ? compute_vec(ss_pos[2], ss_pos[0]) : NO_EDGE; + pos[v_n] = get_vertex_pos(v_id[v_n]); + gl_Position = p_pos[v_n] = ModelViewProjectionMatrix * vec4(pos[v_n], 1.0); - gl_Position = p_pos[v_n]; + barycentric[v_n] = do_edge[v_n] ? 0.0 : 1.0; + barycentric[v_n1] = 1.0; + barycentric[v_n2] = do_edge[v_n2] ? 0.0 : 1.0; # ifndef LIGHT_EDGES vec3 nor = get_vertex_nor(v_id[v_n]); # else + p_pos[v_n1] = ModelViewProjectionMatrix * vec4(pos[v_n1], 1.0); + p_pos[v_n2] = ModelViewProjectionMatrix * vec4(pos[v_n2], 1.0); + + pos[v_n1] = get_vertex_pos(v_id[v_n1]); + pos[v_n2] = get_vertex_pos(v_id[v_n2]); + vec3 edges[3]; edges[0] = pos[1] - pos[0]; edges[1] = pos[2] - pos[1]; @@ -195,6 +173,6 @@ void main() # endif facing = normalize(NormalMatrix * nor).z; - -#endif } + +#endif /* USE_GEOM_SHADER */ diff --git a/source/blender/draw/modes/shaders/paint_weight_frag.glsl b/source/blender/draw/modes/shaders/paint_weight_frag.glsl index bb0834e9cd4..faa36f5535e 100644 --- a/source/blender/draw/modes/shaders/paint_weight_frag.glsl +++ b/source/blender/draw/modes/shaders/paint_weight_frag.glsl @@ -6,13 +6,71 @@ out vec4 fragColor; uniform float opacity = 1.0; uniform sampler1D colorramp; +uniform bool drawContours = false; + +float contours(float value, float steps, float width_px, float max_rel_width, float gradient) +{ + /* Minimum visible and minimum full strength line width in screen space for fade out. */ + const float min_width_px = 1.3, fade_width_px = 2.3; + /* Line is thinner towards the increase in the weight gradient by this factor. */ + const float hi_bias = 2.0; + + /* Don't draw lines at 0 or 1. */ + float rel_value = value * steps; + + if (rel_value < 0.5 || rel_value > steps - 0.5) + return 0.0; + + /* Check if completely invisible due to fade out. */ + float rel_gradient = gradient * steps; + float rel_min_width = min_width_px * rel_gradient; + + if (max_rel_width <= rel_min_width) + return 0.0; + + /* Main shape of the line, accounting for width bias and maximum weight space width. */ + float rel_width = width_px * rel_gradient; + + float offset = fract(rel_value + 0.5) - 0.5; + + float base_alpha = 1.0 - max(offset * hi_bias, -offset) / min(max_rel_width, rel_width); + + /* Line fadeout when too thin in screen space. */ + float rel_fade_width = fade_width_px * rel_gradient; + + float fade_alpha = (max_rel_width - rel_min_width) / (rel_fade_width - rel_min_width); + + return clamp(base_alpha, 0.0, 1.0) * clamp(fade_alpha, 0.0, 1.0); +} + +vec4 contour_grid(float weight, float weight_gradient) +{ + /* Fade away when the gradient is too low to avoid big fills and noise. */ + float flt_eps = max(1e-8, 1e-6 * weight); + + if (weight_gradient <= flt_eps) + return vec4(0.0); + + /* Three levels of grid lines */ + float grid10 = contours(weight, 10.0, 5.0, 0.3, weight_gradient); + float grid100 = contours(weight, 100.0, 3.5, 0.35, weight_gradient) * 0.6; + float grid1000 = contours(weight, 1000.0, 2.5, 0.4, weight_gradient) * 0.25; + + /* White lines for 0.1 and 0.01, and black for 0.001 */ + vec4 grid = vec4(1.0) * max(grid10, grid100); + + grid.a = max(grid.a, grid1000); + + return grid * clamp((weight_gradient - flt_eps) / flt_eps, 0.0, 1.0); +} + void main() { float alert = weight_interp.y; vec4 color; - /* Missing vertex group alert color */ - if (alert > 1.0) { + /* Missing vertex group alert color. Uniform in practice. */ + if (alert > 1.1) { color = colorVertexMissingData; } /* Weights are available */ @@ -20,6 +78,16 @@ void main() float weight = weight_interp.x; vec4 weight_color = texture(colorramp, weight, 0); + /* Contour display */ + if (drawContours) { + /* This must be executed uniformly for all fragments */ + float weight_gradient = length(vec2(dFdx(weight), dFdy(weight))); + + vec4 grid = contour_grid(weight, weight_gradient); + + weight_color = grid + weight_color * (1 - grid.a); + } + /* Zero weight alert color. Nonlinear blend to reduce impact. */ color = mix(weight_color, colorVertexUnreferenced, alert * alert); } diff --git a/source/blender/editors/animation/keyframes_draw.c b/source/blender/editors/animation/keyframes_draw.c index a8b63e01ac1..1941e98b865 100644 --- a/source/blender/editors/animation/keyframes_draw.c +++ b/source/blender/editors/animation/keyframes_draw.c @@ -332,8 +332,15 @@ static void add_bezt_to_keyblocks_list(DLRBT_Tree *blocks, BezTriple *first_bezt */ if (IS_EQF(beztn->vec[1][1], prev->vec[1][1]) == 0) return; - if (IS_EQF(beztn->vec[1][1], beztn->vec[0][1]) == 0) return; - if (IS_EQF(prev->vec[1][1], prev->vec[2][1]) == 0) return; + /* Only check handles in case of actual bezier interpolation. */ + if (prev->ipo == BEZT_IPO_BEZ) { + if (IS_EQF(beztn->vec[1][1], beztn->vec[0][1]) == 0) return; + if (IS_EQF(prev->vec[1][1], prev->vec[2][1]) == 0) return; + } + /* This interpolation type induces movement even between identical keys. */ + else if (ELEM(prev->ipo, BEZT_IPO_ELASTIC)) { + return; + } } /* if there are no blocks already, just add as root */ @@ -552,9 +559,9 @@ void draw_keyframe_shape(float x, float y, float size, bool sel, short key_type, } } - immAttrib1f(size_id, size); - immAttrib4ubv(color_id, fill_col); - immAttrib4ubv(outline_color_id, outline_col); + immAttr1f(size_id, size); + immAttr4ubv(color_id, fill_col); + immAttr4ubv(outline_color_id, outline_col); immVertex2f(pos_id, x, y); } diff --git a/source/blender/editors/armature/armature_add.c b/source/blender/editors/armature/armature_add.c index ee9ef9debaf..5ed3fb67ec2 100644 --- a/source/blender/editors/armature/armature_add.c +++ b/source/blender/editors/armature/armature_add.c @@ -869,7 +869,7 @@ static int armature_extrude_exec(bContext *C, wmOperator *op) { ViewLayer *view_layer = CTX_data_view_layer(C); const bool forked = RNA_boolean_get(op->ptr, "forked"); - bool multi_changed = false; + bool changed_multi = false; uint objects_len = 0; Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len); @@ -1019,7 +1019,7 @@ static int armature_extrude_exec(bContext *C, wmOperator *op) continue; } - multi_changed = true; + changed_multi = true; /* Transform the endpoints */ ED_armature_edit_sync_selection(arm->edbo); @@ -1028,7 +1028,7 @@ static int armature_extrude_exec(bContext *C, wmOperator *op) } MEM_freeN(objects); - return multi_changed ? OPERATOR_FINISHED : OPERATOR_CANCELLED; + return changed_multi ? OPERATOR_FINISHED : OPERATOR_CANCELLED; } void ARMATURE_OT_extrude(wmOperatorType *ot) diff --git a/source/blender/editors/armature/armature_edit.c b/source/blender/editors/armature/armature_edit.c index 16e5450423b..d3aa451fa6e 100644 --- a/source/blender/editors/armature/armature_edit.c +++ b/source/blender/editors/armature/armature_edit.c @@ -1618,28 +1618,39 @@ void ARMATURE_OT_dissolve(wmOperatorType *ot) static int armature_hide_exec(bContext *C, wmOperator *op) { - Object *obedit = CTX_data_edit_object(C); - bArmature *arm = obedit->data; - EditBone *ebone; + ViewLayer *view_layer = CTX_data_view_layer(C); const int invert = RNA_boolean_get(op->ptr, "unselected") ? BONE_SELECTED : 0; /* cancel if nothing selected */ if (CTX_DATA_COUNT(C, selected_bones) == 0) return OPERATOR_CANCELLED; - for (ebone = arm->edbo->first; ebone; ebone = ebone->next) { - if (EBONE_VISIBLE(arm, ebone)) { - if ((ebone->flag & BONE_SELECTED) != invert) { - ebone->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL); - ebone->flag |= BONE_HIDDEN_A; + uint objects_len = 0; + Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len); + for (uint ob_index = 0; ob_index < objects_len; ob_index++) { + Object *obedit = objects[ob_index]; + bArmature *arm = obedit->data; + bool changed = false; + + for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) { + if (EBONE_VISIBLE(arm, ebone)) { + if ((ebone->flag & BONE_SELECTED) != invert) { + ebone->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL); + ebone->flag |= BONE_HIDDEN_A; + changed = true; + } } } - } - ED_armature_edit_validate_active(arm); - ED_armature_edit_sync_selection(arm->edbo); - WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit); + if (!changed) { + continue; + } + ED_armature_edit_validate_active(arm); + ED_armature_edit_sync_selection(arm->edbo); + WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit); + } + MEM_freeN(objects); return OPERATOR_FINISHED; } @@ -1663,26 +1674,35 @@ void ARMATURE_OT_hide(wmOperatorType *ot) static int armature_reveal_exec(bContext *C, wmOperator *op) { - Object *obedit = CTX_data_edit_object(C); - bArmature *arm = obedit->data; - EditBone *ebone; + ViewLayer *view_layer = CTX_data_view_layer(C); const bool select = RNA_boolean_get(op->ptr, "select"); + uint objects_len = 0; + Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len); + for (uint ob_index = 0; ob_index < objects_len; ob_index++) { + Object *obedit = objects[ob_index]; + bArmature *arm = obedit->data; + bool changed = false; - for (ebone = arm->edbo->first; ebone; ebone = ebone->next) { - if (arm->layer & ebone->layer) { - if (ebone->flag & BONE_HIDDEN_A) { - if (!(ebone->flag & BONE_UNSELECTABLE)) { - SET_FLAG_FROM_TEST(ebone->flag, select, (BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL)); + for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) { + if (arm->layer & ebone->layer) { + if (ebone->flag & BONE_HIDDEN_A) { + if (!(ebone->flag & BONE_UNSELECTABLE)) { + SET_FLAG_FROM_TEST(ebone->flag, select, (BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL)); + } + ebone->flag &= ~BONE_HIDDEN_A; + changed = true; } - ebone->flag &= ~BONE_HIDDEN_A; } } - } - ED_armature_edit_validate_active(arm); - ED_armature_edit_sync_selection(arm->edbo); - WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit); + if (changed) { + ED_armature_edit_validate_active(arm); + ED_armature_edit_sync_selection(arm->edbo); + WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit); + } + } + MEM_freeN(objects); return OPERATOR_FINISHED; } diff --git a/source/blender/editors/armature/armature_naming.c b/source/blender/editors/armature/armature_naming.c index 15247399401..3d5ed47655c 100644 --- a/source/blender/editors/armature/armature_naming.c +++ b/source/blender/editors/armature/armature_naming.c @@ -487,7 +487,7 @@ static int armature_autoside_names_exec(bContext *C, wmOperator *op) Main *bmain = CTX_data_main(C); char newname[MAXBONENAME]; const short axis = RNA_enum_get(op->ptr, "type"); - bool multi_changed = false; + bool changed_multi = false; uint objects_len = 0; Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len); @@ -529,7 +529,7 @@ static int armature_autoside_names_exec(bContext *C, wmOperator *op) continue; } - multi_changed = true; + changed_multi = true; /* Since we renamed stuff... */ DEG_id_tag_update(&ob->id, OB_RECALC_DATA); @@ -538,7 +538,7 @@ static int armature_autoside_names_exec(bContext *C, wmOperator *op) WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); } MEM_freeN(objects); - return multi_changed ? OPERATOR_FINISHED : OPERATOR_CANCELLED; + return changed_multi ? OPERATOR_FINISHED : OPERATOR_CANCELLED; } void ARMATURE_OT_autoside_names(wmOperatorType *ot) diff --git a/source/blender/editors/armature/armature_select.c b/source/blender/editors/armature/armature_select.c index 15ccc24ebe2..b47416b5d5f 100644 --- a/source/blender/editors/armature/armature_select.c +++ b/source/blender/editors/armature/armature_select.c @@ -288,16 +288,15 @@ void *get_nearest_bone( /* called in space.c */ /* previously "selectconnected_armature" */ -static int armature_select_linked_invoke(bContext *C, wmOperator *op, const wmEvent *event) +static int armature_select_linked_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *event) { bArmature *arm; EditBone *bone, *curBone, *next; - const bool extend = RNA_boolean_get(op->ptr, "extend"); view3d_operator_needs_opengl(C); Base *base = NULL; - bone = get_nearest_bone(C, event->mval, !extend, &base); + bone = get_nearest_bone(C, event->mval, true, &base); if (!bone) return OPERATOR_CANCELLED; @@ -307,12 +306,7 @@ static int armature_select_linked_invoke(bContext *C, wmOperator *op, const wmEv /* Select parents */ for (curBone = bone; curBone; curBone = next) { if ((curBone->flag & BONE_UNSELECTABLE) == 0) { - if (extend) { - curBone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL); - } - else { - curBone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL); - } + curBone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL); } if (curBone->flag & BONE_CONNECTED) @@ -327,10 +321,7 @@ static int armature_select_linked_invoke(bContext *C, wmOperator *op, const wmEv next = curBone->next; if ((curBone->parent == bone) && (curBone->flag & BONE_UNSELECTABLE) == 0) { if (curBone->flag & BONE_CONNECTED) { - if (extend) - curBone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL); - else - curBone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL); + curBone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL); bone = curBone; break; } @@ -370,9 +361,6 @@ void ARMATURE_OT_select_linked(wmOperatorType *ot) /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - - /* properties */ - RNA_def_boolean(ot->srna, "extend", false, "Extend", "Extend selection instead of deselecting everything first"); } /* utility function for get_nearest_editbonepoint */ @@ -902,7 +890,7 @@ static int armature_de_select_more_exec(bContext *C, wmOperator *UNUSED(op)) uint objects_len = 0; Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len); for (uint ob_index = 0; ob_index < objects_len; ob_index++) { - Object * ob = objects[ob_index]; + Object *ob = objects[ob_index]; armature_select_more_less(ob, true); WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob); } @@ -931,7 +919,7 @@ static int armature_de_select_less_exec(bContext *C, wmOperator *UNUSED(op)) uint objects_len = 0; Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len); for (uint ob_index = 0; ob_index < objects_len; ob_index++) { - Object * ob = objects[ob_index]; + Object *ob = objects[ob_index]; armature_select_more_less(ob, false); WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob); } @@ -1003,8 +991,8 @@ static void select_similar_length(bContext *C, const float thresh) uint objects_len = 0; Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len); for (uint ob_index = 0; ob_index < objects_len; ob_index++) { - Object * ob = objects[ob_index]; - bArmature * arm = ob->data; + Object *ob = objects[ob_index]; + bArmature *arm = ob->data; bool changed = false; for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) { @@ -1051,8 +1039,8 @@ static void select_similar_direction(bContext *C, const float thresh) uint objects_len = 0; Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len); for (uint ob_index = 0; ob_index < objects_len; ob_index++) { - Object * ob = objects[ob_index]; - bArmature * arm = ob->data; + Object *ob = objects[ob_index]; + bArmature *arm = ob->data; bool changed = false; for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) { @@ -1082,8 +1070,8 @@ static void select_similar_layer(bContext *C) uint objects_len = 0; Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len); for (uint ob_index = 0; ob_index < objects_len; ob_index++) { - Object * ob = objects[ob_index]; - bArmature * arm = ob->data; + Object *ob = objects[ob_index]; + bArmature *arm = ob->data; bool changed = false; for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) { @@ -1119,8 +1107,8 @@ static void select_similar_prefix(bContext *C) uint objects_len = 0; Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len); for (uint ob_index = 0; ob_index < objects_len; ob_index++) { - Object * ob = objects[ob_index]; - bArmature * arm = ob->data; + Object *ob = objects[ob_index]; + bArmature *arm = ob->data; bool changed = false; /* Find matches */ @@ -1158,8 +1146,8 @@ static void select_similar_suffix(bContext *C) uint objects_len = 0; Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len); for (uint ob_index = 0; ob_index < objects_len; ob_index++) { - Object * ob = objects[ob_index]; - bArmature * arm = ob->data; + Object *ob = objects[ob_index]; + bArmature *arm = ob->data; bool changed = false; /* Find matches */ @@ -1351,91 +1339,81 @@ void ARMATURE_OT_select_similar(wmOperatorType *ot) /* ********************* select hierarchy operator ************** */ +/* No need to convert to multi-objects. Just like we keep the non-active bones + * selected we then keep the non-active objects untouched (selected/unselected). */ static int armature_select_hierarchy_exec(bContext *C, wmOperator *op) { - ViewLayer *view_layer = CTX_data_view_layer(C); - - const int direction = RNA_enum_get(op->ptr, "direction"); + Object *ob = CTX_data_edit_object(C); + EditBone *ebone_active; + int direction = RNA_enum_get(op->ptr, "direction"); const bool add_to_sel = RNA_boolean_get(op->ptr, "extend"); + bool changed = false; + bArmature *arm = (bArmature *)ob->data; - bool multi_changed = false; - uint objects_len = 0; - Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len); - for (uint ob_index = 0; ob_index < objects_len; ob_index++) { - Object * ob = objects[ob_index]; - bArmature * arm = ob->data; - - EditBone *ebone_active; - bool changed = false; - - arm = (bArmature *)ob->data; - - ebone_active = arm->act_edbone; - if (ebone_active == NULL) { - continue; - } - - if (direction == BONE_SELECT_PARENT) { - if (ebone_active->parent) { - EditBone *ebone_parent; + ebone_active = arm->act_edbone; + if (ebone_active == NULL) { + return OPERATOR_CANCELLED; + } - ebone_parent = ebone_active->parent; + if (direction == BONE_SELECT_PARENT) { + if (ebone_active->parent) { + EditBone *ebone_parent; - if (EBONE_SELECTABLE(arm, ebone_parent)) { - arm->act_edbone = ebone_parent; + ebone_parent = ebone_active->parent; - if (!add_to_sel) { - ED_armature_ebone_select_set(ebone_active, false); - } - ED_armature_ebone_select_set(ebone_parent, true); + if (EBONE_SELECTABLE(arm, ebone_parent)) { + arm->act_edbone = ebone_parent; - changed = true; + if (!add_to_sel) { + ED_armature_ebone_select_set(ebone_active, false); } - } + ED_armature_ebone_select_set(ebone_parent, true); + changed = true; + } } - else { /* BONE_SELECT_CHILD */ - EditBone *ebone_iter, *ebone_child = NULL; - int pass; - - /* First pass, only connected bones (the logical direct child)/ */ - for (pass = 0; pass < 2 && (ebone_child == NULL); pass++) { - for (ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next) { - /* Possible we have multiple children, some invisible. */ - if (EBONE_SELECTABLE(arm, ebone_iter)) { - if (ebone_iter->parent == ebone_active) { - if ((pass == 1) || (ebone_iter->flag & BONE_CONNECTED)) { - ebone_child = ebone_iter; - break; - } + + } + else { /* BONE_SELECT_CHILD */ + EditBone *ebone_iter, *ebone_child = NULL; + int pass; + + /* first pass, only connected bones (the logical direct child) */ + for (pass = 0; pass < 2 && (ebone_child == NULL); pass++) { + for (ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next) { + /* possible we have multiple children, some invisible */ + if (EBONE_SELECTABLE(arm, ebone_iter)) { + if (ebone_iter->parent == ebone_active) { + if ((pass == 1) || (ebone_iter->flag & BONE_CONNECTED)) { + ebone_child = ebone_iter; + break; } } } } + } - if (ebone_child) { - arm->act_edbone = ebone_child; + if (ebone_child) { + arm->act_edbone = ebone_child; - if (!add_to_sel) { - ED_armature_ebone_select_set(ebone_active, false); - } - ED_armature_ebone_select_set(ebone_child, true); - - changed = true; + if (!add_to_sel) { + ED_armature_ebone_select_set(ebone_active, false); } - } + ED_armature_ebone_select_set(ebone_child, true); - if (changed == false) { - continue; + changed = true; } + } - multi_changed = true; - ED_armature_edit_sync_selection(arm->edbo); - WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob); + if (changed == false) { + return OPERATOR_CANCELLED; } - MEM_freeN(objects); - return multi_changed ? OPERATOR_FINISHED : OPERATOR_CANCELLED; + ED_armature_edit_sync_selection(arm->edbo); + + WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob); + + return OPERATOR_FINISHED; } void ARMATURE_OT_select_hierarchy(wmOperatorType *ot) @@ -1471,15 +1449,15 @@ void ARMATURE_OT_select_hierarchy(wmOperatorType *ot) */ static int armature_select_mirror_exec(bContext *C, wmOperator *op) { - ViewLayer * view_layer = CTX_data_view_layer(C); + ViewLayer *view_layer = CTX_data_view_layer(C); const bool active_only = RNA_boolean_get(op->ptr, "only_active"); const bool extend = RNA_boolean_get(op->ptr, "extend"); uint objects_len = 0; Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len); for (uint ob_index = 0; ob_index < objects_len; ob_index++) { - Object * ob = objects[ob_index]; - bArmature * arm = ob->data; + Object *ob = objects[ob_index]; + bArmature *arm = ob->data; EditBone *ebone, *ebone_mirror_act = NULL; diff --git a/source/blender/editors/armature/pose_edit.c b/source/blender/editors/armature/pose_edit.c index 58b7a8ab969..7a973e5dd2a 100644 --- a/source/blender/editors/armature/pose_edit.c +++ b/source/blender/editors/armature/pose_edit.c @@ -207,22 +207,34 @@ void ED_pose_recalculate_paths(bContext *C, Scene *scene, Object *ob, bool curre /* Override depsgraph with a filtered, simpler copy */ if (!current_frame_only && G.debug_value != -1) { - TIMEIT_START(filter_pose_depsgraph); DEG_FilterQuery query = {{0}}; DEG_FilterTarget *dft_ob = MEM_callocN(sizeof(DEG_FilterTarget), "DEG_FilterTarget"); dft_ob->id = &ob->id; BLI_addtail(&query.targets, dft_ob); +#ifdef DEBUG_TIME + TIMEIT_START(filter_pose_depsgraph); +#endif + depsgraph = DEG_graph_filter(depsgraph, bmain, &query); - free_depsgraph = true; - MEM_freeN(dft_ob); +#ifdef DEBUG_TIME TIMEIT_END(filter_pose_depsgraph); +#endif + + free_depsgraph = true; + MEM_freeN(dft_ob); +#ifdef DEBUG_TIME TIMEIT_START(filter_pose_update); +#endif + BKE_scene_graph_update_tagged(depsgraph, bmain); + +#ifdef DEBUG_TIME TIMEIT_END(filter_pose_update); +#endif } /* set flag to force recalc, then grab the relevant bones to target */ @@ -230,9 +242,15 @@ void ED_pose_recalculate_paths(bContext *C, Scene *scene, Object *ob, bool curre animviz_get_object_motionpaths(ob, &targets); /* recalculate paths, then free */ +#ifdef DEBUG_TIME TIMEIT_START(pose_path_calc); +#endif + animviz_calc_motionpaths(depsgraph, bmain, scene, &targets, !free_depsgraph, current_frame_only); + +#ifdef DEBUG_TIME TIMEIT_END(pose_path_calc); +#endif BLI_freelistN(&targets); @@ -298,7 +316,7 @@ static int pose_calculate_paths_exec(bContext *C, wmOperator *op) } /* set up path data for bones being calculated */ - CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones) + CTX_DATA_BEGIN_FOR_ID (C, bPoseChannel *, pchan, selected_pose_bones, &ob->id) { /* verify makes sure that the selected bone has a bone with the appropriate settings */ animviz_verify_motionpaths(op->reports, scene, ob, pchan); @@ -775,30 +793,29 @@ void POSE_OT_flip_names(wmOperatorType *ot) static int pose_autoside_names_exec(bContext *C, wmOperator *op) { Main *bmain = CTX_data_main(C); - Object *ob = BKE_object_pose_armature_get(CTX_data_active_object(C)); - bArmature *arm; char newname[MAXBONENAME]; short axis = RNA_enum_get(op->ptr, "axis"); - - /* paranoia checks */ - if (ELEM(NULL, ob, ob->pose)) - return OPERATOR_CANCELLED; - arm = ob->data; + Object *ob_prev = NULL; /* loop through selected bones, auto-naming them */ - CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones) + CTX_DATA_BEGIN_WITH_ID(C, bPoseChannel *, pchan, selected_pose_bones, Object *, ob) { + bArmature *arm = ob->data; BLI_strncpy(newname, pchan->name, sizeof(newname)); - if (bone_autoside_name(newname, 1, axis, pchan->bone->head[axis], pchan->bone->tail[axis])) + if (bone_autoside_name(newname, 1, axis, pchan->bone->head[axis], pchan->bone->tail[axis])) { ED_armature_bone_rename(bmain, arm, pchan->name, newname); - } - CTX_DATA_END; + } - /* since we renamed stuff... */ - DEG_id_tag_update(&ob->id, OB_RECALC_DATA); + if (ob_prev != ob) { + /* since we renamed stuff... */ + DEG_id_tag_update(&ob->id, OB_RECALC_DATA); - /* note, notifier might evolve */ - WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); + /* note, notifier might evolve */ + WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); + ob_prev = ob; + } + } + CTX_DATA_END; return OPERATOR_FINISHED; } @@ -833,20 +850,24 @@ void POSE_OT_autoside_names(wmOperatorType *ot) static int pose_bone_rotmode_exec(bContext *C, wmOperator *op) { - Object *ob = CTX_data_active_object(C); - int mode = RNA_enum_get(op->ptr, "type"); + const int mode = RNA_enum_get(op->ptr, "type"); + Object *prev_ob = NULL; /* set rotation mode of selected bones */ - CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones) + CTX_DATA_BEGIN_WITH_ID (C, bPoseChannel *, pchan, selected_pose_bones, Object *, ob) { pchan->rotmode = mode; + + if (prev_ob != ob) { + /* Notifiers and updates. */ + DEG_id_tag_update((ID *)ob, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, ob); + WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob); + prev_ob = ob; + } } CTX_DATA_END; - /* notifiers and updates */ - DEG_id_tag_update((ID *)ob, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, ob); - return OPERATOR_FINISHED; } @@ -974,37 +995,27 @@ static int armature_layers_invoke(bContext *C, wmOperator *op, const wmEvent *ev /* Set the visible layers for the active armature (edit and pose modes) */ static int armature_layers_exec(bContext *C, wmOperator *op) { - ViewLayer *view_layer = CTX_data_view_layer(C); + Object *ob = CTX_data_active_object(C); + bArmature *arm = armature_layers_get_data(&ob); PointerRNA ptr; bool layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */ - bool changed = false; + + if (arm == NULL) { + return OPERATOR_CANCELLED; + } /* get the values set in the operator properties */ RNA_boolean_get_array(op->ptr, "layers", layers); - uint objects_len = 0; - Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len); - for (uint ob_index = 0; ob_index < objects_len; ob_index++) { - Object *ob = objects[ob_index]; - bArmature *arm = armature_layers_get_data(&ob); - - if (arm == NULL) { - continue; - } - - /* Get pointer for armature, and write data there... */ - RNA_id_pointer_create((ID *)arm, &ptr); - RNA_boolean_set_array(&ptr, "layers", layers); - - /* Note, notifier might evolve. */ - WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); - DEG_id_tag_update(&arm->id, DEG_TAG_COPY_ON_WRITE); + /* get pointer for armature, and write data there... */ + RNA_id_pointer_create((ID *)arm, &ptr); + RNA_boolean_set_array(&ptr, "layers", layers); - changed = true; - } - MEM_freeN(objects); + /* note, notifier might evolve */ + WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); + DEG_id_tag_update(&arm->id, DEG_TAG_COPY_ON_WRITE); - return changed ? OPERATOR_FINISHED : OPERATOR_CANCELLED; + return OPERATOR_FINISHED; } void ARMATURE_OT_armature_layers(wmOperatorType *ot) @@ -1055,30 +1066,29 @@ static int pose_bone_layers_invoke(bContext *C, wmOperator *op, const wmEvent *e /* Set the visible layers for the active armature (edit and pose modes) */ static int pose_bone_layers_exec(bContext *C, wmOperator *op) { - Object *ob = BKE_object_pose_armature_get(CTX_data_active_object(C)); PointerRNA ptr; bool layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */ - if (ob == NULL || ob->data == NULL) { - return OPERATOR_CANCELLED; - } - /* get the values set in the operator properties */ RNA_boolean_get_array(op->ptr, "layers", layers); + Object *prev_ob = NULL; + /* set layers of pchans based on the values set in the operator props */ - CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones) + CTX_DATA_BEGIN_WITH_ID (C, bPoseChannel *, pchan, selected_pose_bones, Object *, ob) { /* get pointer for pchan, and write flags this way */ RNA_pointer_create((ID *)ob->data, &RNA_Bone, pchan->bone, &ptr); RNA_boolean_set_array(&ptr, "layers", layers); + + if (prev_ob != ob) { + /* Note, notifier might evolve. */ + WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); + DEG_id_tag_update((ID *)ob->data, DEG_TAG_COPY_ON_WRITE); + prev_ob = ob; + } } CTX_DATA_END; - - /* note, notifier might evolve */ - WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob); - DEG_id_tag_update((ID *)ob->data, DEG_TAG_COPY_ON_WRITE); - return OPERATOR_FINISHED; } diff --git a/source/blender/editors/armature/pose_select.c b/source/blender/editors/armature/pose_select.c index b99fc8eb204..b50c44e6a6b 100644 --- a/source/blender/editors/armature/pose_select.c +++ b/source/blender/editors/armature/pose_select.c @@ -459,34 +459,27 @@ void POSE_OT_select_all(wmOperatorType *ot) static int pose_select_parent_exec(bContext *C, wmOperator *UNUSED(op)) { - /* only clear relevant transforms for selected bones */ - ViewLayer *view_layer = CTX_data_view_layer(C); - FOREACH_OBJECT_IN_MODE_BEGIN (view_layer, OB_MODE_POSE, ob_iter) - { - Object *ob = ob_iter; - bArmature *arm = (bArmature *)ob->data; - - FOREACH_PCHAN_SELECTED_IN_OBJECT_BEGIN (ob_iter, pchan) - { - if (pchan) { - bPoseChannel *parent = pchan->parent; - if ((parent) && !(parent->bone->flag & (BONE_HIDDEN_P | BONE_UNSELECTABLE))) { - parent->bone->flag |= BONE_SELECTED; - arm->act_bone = parent->bone; - } - else { - continue; - } - } - else { - continue; - } - ED_pose_bone_select_tag_update(ob); + Object *ob = BKE_object_pose_armature_get(CTX_data_active_object(C)); + bArmature *arm = (bArmature *)ob->data; + bPoseChannel *pchan, *parent; + + /* Determine if there is an active bone */ + pchan = CTX_data_active_pose_bone(C); + if (pchan) { + parent = pchan->parent; + if ((parent) && !(parent->bone->flag & (BONE_HIDDEN_P | BONE_UNSELECTABLE))) { + parent->bone->flag |= BONE_SELECTED; + arm->act_bone = parent->bone; + } + else { + return OPERATOR_CANCELLED; } - FOREACH_PCHAN_SELECTED_IN_OBJECT_END; } - FOREACH_OBJECT_IN_MODE_END; + else { + return OPERATOR_CANCELLED; + } + ED_pose_bone_select_tag_update(ob); return OPERATOR_FINISHED; } @@ -570,6 +563,8 @@ void POSE_OT_select_constraint_target(wmOperatorType *ot) /* -------------------------------------- */ +/* No need to convert to multi-objects. Just like we keep the non-active bones + * selected we then keep the non-active objects untouched (selected/unselected). */ static int pose_select_hierarchy_exec(bContext *C, wmOperator *op) { Object *ob = BKE_object_pose_armature_get(CTX_data_active_object(C)); @@ -930,8 +925,8 @@ static int pose_select_mirror_exec(bContext *C, wmOperator *op) uint objects_len = 0; Object **objects = BKE_view_layer_array_from_objects_in_mode_unique_data(view_layer, &objects_len, OB_MODE_POSE); for (uint ob_index = 0; ob_index < objects_len; ob_index++) { - Object * ob = objects[ob_index]; - bArmature * arm = ob->data; + Object *ob = objects[ob_index]; + bArmature *arm = ob->data; bPoseChannel *pchan, *pchan_mirror_act = NULL; for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) { diff --git a/source/blender/editors/datafiles/CMakeLists.txt b/source/blender/editors/datafiles/CMakeLists.txt index 3e7f7063235..4e898d5654b 100644 --- a/source/blender/editors/datafiles/CMakeLists.txt +++ b/source/blender/editors/datafiles/CMakeLists.txt @@ -42,8 +42,8 @@ set(ICON_NAMES tria_up arrow_leftright plus - disclosure_tri_down disclosure_tri_right + disclosure_tri_down radiobut_off radiobut_on menu_panel @@ -58,12 +58,12 @@ set(ICON_NAMES node node_sel fullscreen - splitscreen + workspace rightarrow_thin bordermove viewzoom - zoomin - zoomout + add + remove panel_close copy_id eyedropper @@ -100,14 +100,16 @@ set(ICON_NAMES freeze stylus_pressure ghost_disabled - new + file_new file_tick quit url recover_last + 30 fullscreen_enter fullscreen_exit - lamp + #onionskin + light material texture anim @@ -121,27 +123,31 @@ set(ICON_NAMES physics speaker texture_shaded + tool_settings + shaderfx + #blank1 view3d - ipo - oops - buts - filesel - image_col + graph + outliner + properties + filebrowser + image info sequence text - imasel sound action nla - scriptwin + preferences time nodetree logic console - preferences clip asset_manager + node_compositing + node_texture + node_material object_datamode editmode_hlt facesel_hlt @@ -153,6 +159,15 @@ set(ICON_NAMES particlemode lightpaint greasepencil_stroke_paint + tracking + tracking_backwards + tracking_forwards + tracking_backwards_single + tracking_forwards_single + tracking_clear_backwards + tracking_clear_forwards + tracking_refine_backwards + tracking_refine_forwards scene_data renderlayers world_data @@ -161,7 +176,7 @@ set(ICON_NAMES curve_data meta_data lattice_data - lamp_data + light_data material_data texture_data anim_data @@ -186,7 +201,6 @@ set(ICON_NAMES render_result surface_data empty_data - settings render_animation render_still library_data_broken @@ -200,18 +214,36 @@ set(ICON_NAMES group_vertex group_vcol group_uvs + face_maps rna rna_add mouse_lmb mouse_mmb mouse_rmb - mouse_drag + mouse_move + mouse_lmb_drag + mouse_mmb_drag + mouse_rmb_drag + preset + decorate + decorate_keyframe + decorate_animate + decorate_driver + decorate_linked + decorate_override + decorate_unlocked + decorate_locked + fake_user + orphan_data + user + system + settings outliner_ob_empty outliner_ob_mesh outliner_ob_curve outliner_ob_lattice outliner_ob_meta - outliner_ob_lamp + outliner_ob_light outliner_ob_camera outliner_ob_armature outliner_ob_font @@ -220,6 +252,8 @@ set(ICON_NAMES outliner_ob_force_field outliner_ob_group_instance outliner_ob_greasepencil + outliner_ob_lightprobe + outliner_ob_image restrict_color_off restrict_color_on restrict_view_off @@ -228,12 +262,11 @@ set(ICON_NAMES restrict_select_on restrict_render_off restrict_render_on - outliner_data_empty outliner_data_mesh outliner_data_curve outliner_data_lattice outliner_data_meta - outliner_data_lamp + outliner_data_light outliner_data_camera outliner_data_armature outliner_data_font @@ -241,6 +274,10 @@ set(ICON_NAMES outliner_data_speaker outliner_data_pose outliner_data_greasepencil + onionskin_off + onionskin_on + hide_off + hide_on mesh_plane mesh_cube mesh_circle @@ -252,11 +289,11 @@ set(ICON_NAMES mesh_torus mesh_cone mesh_capsule - lamp_point - lamp_sun - lamp_spot - lamp_hemi - lamp_area + light_point + light_sun + light_spot + light_hemi + light_area meta_empty meta_plane meta_cube @@ -274,6 +311,9 @@ set(ICON_NAMES curve_ncurve curve_ncircle curve_path + lightprobe_cubemap + lightprobe_planar + lightprobe_grid color_red color_green color_blue @@ -294,8 +334,25 @@ set(ICON_NAMES force_turbulence force_drag force_smokeflow + temperature + gear node_insert_on node_insert_off + node_top + node_side + node_corner + align_left + align_center + align_right + align_justify + align_flush + align_top + align_middle + align_bottom + bold + italic + underline + small_caps modifier mod_wave mod_build @@ -346,7 +403,6 @@ set(ICON_NAMES pause prev_keyframe next_keyframe - play_audio play_reverse preview_range action_tweak @@ -355,8 +411,8 @@ set(ICON_NAMES pmarker marker_hlt marker - space2 - space3 + keyframe_hlt + keyframe keyingset key_dehlt key_hlt @@ -390,13 +446,12 @@ set(ICON_NAMES vertexsel edgesel facesel - loopsel - rotate - cursor - rotatecollection - rotatecenter - rotactive - align + pivot_boundbox + pivot_cursor + pivot_individual + pivot_median + pivot_active + center_only smoothcurve spherecurve rootcurve @@ -407,6 +462,7 @@ set(ICON_NAMES prop_off prop_on prop_con + sculpt_dyntopo particle_point particle_tip particle_path @@ -431,15 +487,19 @@ set(ICON_NAMES snap_peel_object grid object_origin + orientation_global + orientation_gimbal + orientation_local + orientation_normal + orientation_view pastedown copydown pasteflipup pasteflipdown vis_sel_11 vis_sel_10 - vis_sel_10 + vis_sel_01 vis_sel_00 - snap_surface automerge_on automerge_off retopo @@ -448,12 +508,16 @@ set(ICON_NAMES uv_facesel uv_islandsel uv_sync_select - bbox - wire - solid - smooth - potato - ortho + normals_vertex + normals_vertex_face + normals_face + shading_bbox + shading_wire + shading_solid + shading_rendered + shading_texture + overlay + xray lockview_off lockview_on axis_side @@ -473,8 +537,6 @@ set(ICON_NAMES shortdisplay ghost imgdisplay - save_as - save_copy bookmarks fontpreview filter @@ -483,6 +545,7 @@ set(ICON_NAMES file_parent file_refresh file_folder + file_blank file_blend file_image file_movie @@ -490,18 +553,19 @@ set(ICON_NAMES file_sound file_font file_text - recover_auto - save_prefs + sort_desc + sort_asc link_blend append_blend import export external_data - load_factory loop_back loop_forwards back forward + alembic + volume file_hidden file_backup disk_drive @@ -531,6 +595,11 @@ set(ICON_NAMES image_alpha image_zdepth imagefile + view_perspective + view_ortho + view_camera + view_pan + view_zoom ) # This section is maintained by the updating script, keep BEGIN/END comments. diff --git a/source/blender/editors/gizmo_library/gizmo_library_utils.c b/source/blender/editors/gizmo_library/gizmo_library_utils.c index 350c9922179..25364652785 100644 --- a/source/blender/editors/gizmo_library/gizmo_library_utils.c +++ b/source/blender/editors/gizmo_library/gizmo_library_utils.c @@ -190,7 +190,8 @@ bool gizmo_window_project_2d( float plane[4], co[3]; plane_from_point_normal_v3(plane, mat[3], mat[2]); - if (ED_view3d_win_to_3d_on_plane(ar, plane, mval, true, co)) { + bool clip_ray = ((RegionView3D *)ar->regiondata)->is_persp; + if (ED_view3d_win_to_3d_on_plane(ar, plane, mval, clip_ray, co)) { float imat[4][4]; invert_m4_m4(imat, mat); mul_m4_v3(imat, co); diff --git a/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c index e16deb71304..7b625364905 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c @@ -212,7 +212,9 @@ static void button2d_draw_intern( } float alpha = (highlight) ? 1.0f : 0.8f; + GPU_polygon_smooth(false); UI_icon_draw_alpha(pos[0], pos[1], button->icon, alpha); + GPU_polygon_smooth(true); } GPU_blend(false); } diff --git a/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c index 0646d689812..04015ee9f1e 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c @@ -413,7 +413,7 @@ static void cage2d_draw_box_interaction( if (is_solid) { BLI_assert(ELEM(prim_type, GPU_PRIM_TRI_FAN)); immBegin(prim_type, verts_len); - immAttrib3f(attr_id.col, 0.0f, 0.0f, 0.0f); + immAttr3f(attr_id.col, 0.0f, 0.0f, 0.0f); for (uint i = 0; i < verts_len; i++) { immVertex2fv(attr_id.pos, verts[i]); } @@ -424,7 +424,7 @@ static void cage2d_draw_box_interaction( GPU_line_width(line_width + 3.0f); immBegin(prim_type, verts_len); - immAttrib3f(attr_id.col, 0.0f, 0.0f, 0.0f); + immAttr3f(attr_id.col, 0.0f, 0.0f, 0.0f); for (uint i = 0; i < verts_len; i++) { immVertex2fv(attr_id.pos, verts[i]); } @@ -433,7 +433,7 @@ static void cage2d_draw_box_interaction( GPU_line_width(line_width); immBegin(prim_type, verts_len); - immAttrib3fv(attr_id.col, color); + immAttr3fv(attr_id.col, color); for (uint i = 0; i < verts_len; i++) { immVertex2fv(attr_id.pos, verts[i]); } diff --git a/source/blender/editors/gpencil/annotate_draw.c b/source/blender/editors/gpencil/annotate_draw.c index 0bb14a103f6..dae89d2cfd5 100644 --- a/source/blender/editors/gpencil/annotate_draw.c +++ b/source/blender/editors/gpencil/annotate_draw.c @@ -93,8 +93,9 @@ typedef enum eDrawStrokeFlags { /* ----- Tool Buffer Drawing ------ */ /* draw stroke defined in buffer (simple ogl lines/points for now, as dotted lines) */ -static void gp_draw_stroke_buffer(const tGPspoint *points, int totpoints, short thickness, - short dflag, short sflag, float ink[4]) +static void gp_draw_stroke_buffer( + const tGPspoint *points, int totpoints, short thickness, + short dflag, short sflag, float ink[4]) { int draw_points = 0; @@ -241,8 +242,9 @@ static void gp_draw_stroke_point( } /* draw a given stroke in 3d (i.e. in 3d-space), using simple ogl lines */ -static void gp_draw_stroke_3d(const bGPDspoint *points, int totpoints, short thickness, bool UNUSED(debug), - short UNUSED(sflag), const float ink[4], bool cyclic) +static void gp_draw_stroke_3d( + const bGPDspoint *points, int totpoints, short thickness, bool UNUSED(debug), + short UNUSED(sflag), const float ink[4], bool cyclic) { float curpressure = points[0].pressure; float cyclic_fpt[3]; @@ -322,8 +324,9 @@ static void gp_draw_stroke_3d(const bGPDspoint *points, int totpoints, short thi /* ----- Fancy 2D-Stroke Drawing ------ */ /* draw a given stroke in 2d */ -static void gp_draw_stroke_2d(const bGPDspoint *points, int totpoints, short thickness_s, short dflag, short sflag, - bool UNUSED(debug), int offsx, int offsy, int winx, int winy, const float ink[4]) +static void gp_draw_stroke_2d( + const bGPDspoint *points, int totpoints, short thickness_s, short dflag, short sflag, + bool UNUSED(debug), int offsx, int offsy, int winx, int winy, const float ink[4]) { /* otherwise thickness is twice that of the 3D view */ float thickness = (float)thickness_s * 0.5f; @@ -553,8 +556,9 @@ static void gp_draw_strokes( gp_draw_stroke_point(gps->points, lthick, dflag, gps->flag, offsx, offsy, winx, winy, color); } else { - gp_draw_stroke_3d(gps->points, gps->totpoints, lthick, debug, gps->flag, - color, gps->flag & GP_STROKE_CYCLIC); + gp_draw_stroke_3d( + gps->points, gps->totpoints, lthick, debug, gps->flag, + color, gps->flag & GP_STROKE_CYCLIC); } if (no_xray) { @@ -570,8 +574,9 @@ static void gp_draw_strokes( gp_draw_stroke_point(gps->points, lthick, dflag, gps->flag, offsx, offsy, winx, winy, color); } else { - gp_draw_stroke_2d(gps->points, gps->totpoints, lthick, dflag, gps->flag, debug, - offsx, offsy, winx, winy, color); + gp_draw_stroke_2d( + gps->points, gps->totpoints, lthick, dflag, gps->flag, debug, + offsx, offsy, winx, winy, color); } } } @@ -664,21 +669,21 @@ static void gp_draw_strokes_edit( /* size and color first */ if (show_direction_hint && i == 0) { /* start point in green bigger */ - immAttrib3f(color, 0.0f, 1.0f, 0.0f); - immAttrib1f(size, vsize + 4); + immAttr3f(color, 0.0f, 1.0f, 0.0f); + immAttr1f(size, vsize + 4); } else if (show_direction_hint && (i == gps->totpoints - 1)) { /* end point in red smaller */ - immAttrib3f(color, 1.0f, 0.0f, 0.0f); - immAttrib1f(size, vsize + 1); + immAttr3f(color, 1.0f, 0.0f, 0.0f); + immAttr1f(size, vsize + 1); } else if (pt->flag & GP_SPOINT_SELECT) { - immAttrib3fv(color, selectColor); - immAttrib1f(size, vsize); + immAttr3fv(color, selectColor); + immAttr1f(size, vsize); } else { - immAttrib3fv(color, gpl->color); - immAttrib1f(size, bsize); + immAttr3fv(color, gpl->color); + immAttr1f(size, bsize); } /* then position */ @@ -746,23 +751,16 @@ static void gp_draw_data_layers( * NOTE: If the setting doesn't apply, it *must* be cleared, * as dflag's carry over from the previous layer */ -#define GP_DRAWFLAG_APPLY(condition, draw_flag_value) { \ - if (condition) dflag |= (draw_flag_value); \ - else dflag &= ~(draw_flag_value); \ - } (void)0 /* xray... */ - GP_DRAWFLAG_APPLY((gpl->flag & GP_LAYER_NO_XRAY), GP_DRAWDATA_NO_XRAY); - -#undef GP_DRAWFLAG_APPLY - + SET_FLAG_FROM_TEST(dflag, gpl->flag & GP_LAYER_NO_XRAY, GP_DRAWDATA_NO_XRAY); /* draw the strokes already in active frame */ gp_draw_strokes(gpd, gpl, gpf, offsx, offsy, winx, winy, dflag, debug, lthick, ink); /* Draw verts of selected strokes * - when doing OpenGL renders, we don't want to be showing these, as that ends up flickering - * - locked layers can't be edited, so there's no point showing these verts + * - locked layers can't be edited, so there's no point showing these verts * as they will have no bearings on what gets edited * - only show when in editmode, since operators shouldn't work otherwise * (NOTE: doing it this way means that the toggling editmode shows visible change immediately) diff --git a/source/blender/editors/gpencil/annotate_paint.c b/source/blender/editors/gpencil/annotate_paint.c index 97834e6836c..31c66ac8d55 100644 --- a/source/blender/editors/gpencil/annotate_paint.c +++ b/source/blender/editors/gpencil/annotate_paint.c @@ -527,8 +527,9 @@ static void gp_stroke_simplify(tGPsdata *p) j += 2; } } - gp_stroke_addpoint(p, &old_points[num_points - 1].x, old_points[num_points - 1].pressure, - p->inittime + (double)old_points[num_points - 1].time); + gp_stroke_addpoint( + p, &old_points[num_points - 1].x, old_points[num_points - 1].pressure, + p->inittime + (double)old_points[num_points - 1].time); /* free old buffer */ MEM_freeN(old_points); @@ -782,10 +783,11 @@ static bool gp_stroke_eraser_is_occluded(tGPsdata *p, const bGPDspoint *pt, cons /* eraser tool - evaluation per stroke */ /* TODO: this could really do with some optimization (KD-Tree/BVH?) */ -static void gp_stroke_eraser_dostroke(tGPsdata *p, - bGPDframe *gpf, bGPDstroke *gps, - const int mval[2], const int mvalo[2], - const int radius, const rcti *rect) +static void gp_stroke_eraser_dostroke( + tGPsdata *p, + bGPDframe *gpf, bGPDstroke *gps, + const int mval[2], const int mvalo[2], + const int radius, const rcti *rect) { bGPDspoint *pt1, *pt2; int pc1[2] = {0}; @@ -1431,10 +1433,11 @@ static void gpencil_draw_eraser(bContext *UNUSED(C), int x, int y, void *p_ptr) immUniform1f("dash_width", 12.0f); immUniform1f("dash_factor", 0.5f); - imm_draw_circle_wire_2d(shdr_pos, x, y, p->radius, - /* XXX Dashed shader gives bad results with sets of small segments currently, - * temp hack around the issue. :( */ - max_ii(8, p->radius / 2)); /* was fixed 40 */ + imm_draw_circle_wire_2d( + shdr_pos, x, y, p->radius, + /* XXX Dashed shader gives bad results with sets of small segments currently, + * temp hack around the issue. :( */ + max_ii(8, p->radius / 2)); /* was fixed 40 */ immUnbindProgram(); @@ -1453,9 +1456,10 @@ static void gpencil_draw_toggle_eraser_cursor(bContext *C, tGPsdata *p, short en } else if (enable && !p->erasercursor) { /* enable cursor */ - p->erasercursor = WM_paint_cursor_activate(CTX_wm_manager(C), - NULL, /* XXX */ - gpencil_draw_eraser, p); + p->erasercursor = WM_paint_cursor_activate( + CTX_wm_manager(C), + NULL, /* XXX */ + gpencil_draw_eraser, p); } } diff --git a/source/blender/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c index be630d98ff1..d64c3faae1b 100644 --- a/source/blender/editors/gpencil/drawgpencil.c +++ b/source/blender/editors/gpencil/drawgpencil.c @@ -114,11 +114,11 @@ typedef enum eDrawStrokeFlags { /* ----- Tool Buffer Drawing ------ */ /* helper functions to set color of buffer point */ -static void gp_set_tpoint_varying_color(const tGPspoint *pt, const float ink[4], uint attrib_id) +static void gp_set_tpoint_varying_color(const tGPspoint *pt, const float ink[4], uint attr_id) { float alpha = ink[3] * pt->strength; CLAMP(alpha, GPENCIL_STRENGTH_MIN, 1.0f); - immAttrib4ub(attrib_id, F2UB(ink[0]), F2UB(ink[1]), F2UB(ink[2]), F2UB(alpha)); + immAttr4ub(attr_id, F2UB(ink[0]), F2UB(ink[1]), F2UB(ink[2]), F2UB(alpha)); } static void gp_set_point_uniform_color(const bGPDspoint *pt, const float ink[4]) @@ -128,11 +128,11 @@ static void gp_set_point_uniform_color(const bGPDspoint *pt, const float ink[4]) immUniformColor3fvAlpha(ink, alpha); } -static void gp_set_point_varying_color(const bGPDspoint *pt, const float ink[4], uint attrib_id) +static void gp_set_point_varying_color(const bGPDspoint *pt, const float ink[4], uint attr_id) { float alpha = ink[3] * pt->strength; CLAMP(alpha, GPENCIL_STRENGTH_MIN, 1.0f); - immAttrib4ub(attrib_id, F2UB(ink[0]), F2UB(ink[1]), F2UB(ink[2]), F2UB(alpha)); + immAttr4ub(attr_id, F2UB(ink[0]), F2UB(ink[1]), F2UB(ink[2]), F2UB(alpha)); } /* draw fills for buffer stroke */ @@ -199,8 +199,9 @@ static void gp_draw_stroke_buffer_fill(const tGPspoint *points, int totpoints, f } /* draw stroke defined in buffer (simple ogl lines/points for now, as dotted lines) */ -static void gp_draw_stroke_buffer(const tGPspoint *points, int totpoints, short thickness, - short dflag, short sflag, float ink[4], float fill_ink[4]) +static void gp_draw_stroke_buffer( + const tGPspoint *points, int totpoints, short thickness, + short dflag, short sflag, float ink[4], float fill_ink[4]) { int draw_points = 0; @@ -317,8 +318,9 @@ static void gp_calc_2d_stroke_fxy(const float pt[3], short sflag, int offsx, int /* draw a 2D buffer stroke in "volumetric" style * NOTE: the stroke buffer doesn't have any coordinate offsets/transforms */ -static void gp_draw_stroke_volumetric_buffer(const tGPspoint *points, int totpoints, short thickness, - short dflag, const float ink[4]) +static void gp_draw_stroke_volumetric_buffer( + const tGPspoint *points, int totpoints, short thickness, + short dflag, const float ink[4]) { /* error checking */ if ((points == NULL) || (totpoints <= 0)) @@ -340,7 +342,7 @@ static void gp_draw_stroke_volumetric_buffer(const tGPspoint *points, int totpoi const tGPspoint *pt = points; for (int i = 0; i < totpoints; i++, pt++) { gp_set_tpoint_varying_color(pt, ink, color); - immAttrib1f(size, pt->pressure * thickness); /* TODO: scale based on view transform (zoom level) */ + immAttr1f(size, pt->pressure * thickness); /* TODO: scale based on view transform (zoom level) */ immVertex2f(pos, pt->x, pt->y); } @@ -350,10 +352,11 @@ static void gp_draw_stroke_volumetric_buffer(const tGPspoint *points, int totpoi } /* draw a 2D strokes in "volumetric" style */ -static void gp_draw_stroke_volumetric_2d(const bGPDspoint *points, int totpoints, short thickness, - short UNUSED(dflag), short sflag, - int offsx, int offsy, int winx, int winy, - const float diff_mat[4][4], const float ink[4]) +static void gp_draw_stroke_volumetric_2d( + const bGPDspoint *points, int totpoints, short thickness, + short UNUSED(dflag), short sflag, + int offsx, int offsy, int winx, int winy, + const float diff_mat[4][4], const float ink[4]) { GPUVertFormat *format = immVertexFormat(); uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); @@ -374,7 +377,7 @@ static void gp_draw_stroke_volumetric_2d(const bGPDspoint *points, int totpoints gp_calc_2d_stroke_fxy(fpt, sflag, offsx, offsy, winx, winy, co); gp_set_point_varying_color(pt, ink, color); - immAttrib1f(size, pt->pressure * thickness); /* TODO: scale based on view transform */ + immAttr1f(size, pt->pressure * thickness); /* TODO: scale based on view transform */ immVertex2f(pos, co[0], co[1]); } @@ -400,7 +403,7 @@ static void gp_draw_stroke_volumetric_3d( const bGPDspoint *pt = points; for (int i = 0; i < totpoints && pt; i++, pt++) { gp_set_point_varying_color(pt, ink, color); - immAttrib1f(size, pt->pressure * thickness); /* TODO: scale based on view transform */ + immAttr1f(size, pt->pressure * thickness); /* TODO: scale based on view transform */ immVertex3fv(pos, &pt->x); /* we can adjust size in vertex shader based on view/projection! */ } @@ -580,7 +583,7 @@ static void gp_add_filldata_tobuffer( fpt[2] = 0.0f; /* 2d always is z=0.0f */ } - immAttrib2f(texcoord, uv[0], uv[1]); /* texture coordinates */ + immAttr2f(texcoord, uv[0], uv[1]); /* texture coordinates */ immVertex3fv(pos, fpt); /* position */ } @@ -736,9 +739,13 @@ static void gp_draw_stroke_3d(tGPDdraw *tgpw, short thickness, const float ink[4 int cyclic_add = (cyclic) ? 1 : 0; GPUVertFormat *format = immVertexFormat(); - uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); - uint color = GPU_vertformat_attr_add(format, "color", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT); - uint thickattrib = GPU_vertformat_attr_add(format, "thickness", GPU_COMP_F32, 1, GPU_FETCH_FLOAT); + const struct { + uint pos, color, thickness; + } attr_id = { + .pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT), + .color = GPU_vertformat_attr_add(format, "color", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT), + .thickness = GPU_vertformat_attr_add(format, "thickness", GPU_COMP_F32, 1, GPU_FETCH_FLOAT), + }; immBindBuiltinProgram(GPU_SHADER_GPENCIL_STROKE); immUniform2fv("Viewport", viewport); @@ -759,8 +766,8 @@ static void gp_draw_stroke_3d(tGPDdraw *tgpw, short thickness, const float ink[4 for (int i = 0; i < totpoints; i++, pt++) { /* first point for adjacency (not drawn) */ if (i == 0) { - gp_set_point_varying_color(points, ink, color); - immAttrib1f(thickattrib, max_ff(curpressure * thickness, 1.0f)); + gp_set_point_varying_color(points, ink, attr_id.color); + immAttr1f(attr_id.thickness, max_ff(curpressure * thickness, 1.0f)); if ((cyclic) && (totpoints > 2)) { mul_v3_m4v3(fpt, tgpw->diff_mat, &(points + totpoints - 1)->x); } @@ -768,35 +775,35 @@ static void gp_draw_stroke_3d(tGPDdraw *tgpw, short thickness, const float ink[4 mul_v3_m4v3(fpt, tgpw->diff_mat, &(points + 1)->x); } mul_v3_fl(fpt, -1.0f); - immVertex3fv(pos, fpt); + immVertex3fv(attr_id.pos, fpt); } /* set point */ - gp_set_point_varying_color(pt, ink, color); - immAttrib1f(thickattrib, max_ff(curpressure * thickness, 1.0f)); + gp_set_point_varying_color(pt, ink, attr_id.color); + immAttr1f(attr_id.thickness, max_ff(curpressure * thickness, 1.0f)); mul_v3_m4v3(fpt, tgpw->diff_mat, &pt->x); - immVertex3fv(pos, fpt); + immVertex3fv(attr_id.pos, fpt); curpressure = pt->pressure; } if (cyclic && totpoints > 2) { /* draw line to first point to complete the cycle */ - immAttrib1f(thickattrib, max_ff(points->pressure * thickness, 1.0f)); + immAttr1f(attr_id.thickness, max_ff(points->pressure * thickness, 1.0f)); mul_v3_m4v3(fpt, tgpw->diff_mat, &points->x); - immVertex3fv(pos, fpt); + immVertex3fv(attr_id.pos, fpt); /* now add adjacency point (not drawn) */ - immAttrib1f(thickattrib, max_ff((points + 1)->pressure * thickness, 1.0f)); + immAttr1f(attr_id.thickness, max_ff((points + 1)->pressure * thickness, 1.0f)); mul_v3_m4v3(fpt, tgpw->diff_mat, &(points + 1)->x); - immVertex3fv(pos, fpt); + immVertex3fv(attr_id.pos, fpt); } /* last adjacency point (not drawn) */ else { - gp_set_point_varying_color(points + totpoints - 1, ink, color); - immAttrib1f(thickattrib, max_ff(curpressure * thickness, 1.0f)); + gp_set_point_varying_color(points + totpoints - 1, ink, attr_id.color); + immAttr1f(attr_id.thickness, max_ff(curpressure * thickness, 1.0f)); mul_v3_m4v3(fpt, tgpw->diff_mat, &(points + totpoints - 2)->x); mul_v3_fl(fpt, -1.0f); - immVertex3fv(pos, fpt); + immVertex3fv(attr_id.pos, fpt); } immEnd(); @@ -832,8 +839,12 @@ static void gp_draw_stroke_2d( float fpt[3]; GPUVertFormat *format = immVertexFormat(); - uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); - uint color = GPU_vertformat_attr_add(format, "color", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT); + const struct { + uint pos, color; + } attr_id = { + .pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT), + .color = GPU_vertformat_attr_add(format, "color", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT), + }; immBindBuiltinProgram(GPU_SHADER_2D_FLAT_COLOR); immBegin(GPU_PRIM_TRI_STRIP, totpoints * 2 + 4); @@ -863,7 +874,7 @@ static void gp_draw_stroke_2d( pthick = (pt1->pressure * thickness * scalefac); /* color of point */ - gp_set_point_varying_color(pt1, ink, color); + gp_set_point_varying_color(pt1, ink, attr_id.color); /* if the first segment, start of segment is segment's normal */ if (i == 0) { @@ -881,8 +892,8 @@ static void gp_draw_stroke_2d( t1[1] = sc[1] + mt[1]; /* First two points of cap. */ - immVertex2fv(pos, t0); - immVertex2fv(pos, t1); + immVertex2fv(attr_id.pos, t0); + immVertex2fv(attr_id.pos, t1); /* calculate points for start of segment */ mt[0] = m2[0] * pthick; @@ -894,8 +905,8 @@ static void gp_draw_stroke_2d( t1[1] = s0[1] + mt[1]; /* Last two points of start cap (and first two points of first segment). */ - immVertex2fv(pos, t0); - immVertex2fv(pos, t1); + immVertex2fv(attr_id.pos, t0); + immVertex2fv(attr_id.pos, t1); } /* if not the first segment, use bisector of angle between segments */ else { @@ -928,8 +939,8 @@ static void gp_draw_stroke_2d( t1[1] = s0[1] + mt[1]; /* Last two points of previous segment, and first two points of current segment. */ - immVertex2fv(pos, t0); - immVertex2fv(pos, t1); + immVertex2fv(attr_id.pos, t0); + immVertex2fv(attr_id.pos, t1); } /* if last segment, also draw end of segment (defined as segment's normal) */ @@ -938,7 +949,7 @@ static void gp_draw_stroke_2d( pthick = (pt2->pressure * thickness * scalefac); /* color of point */ - gp_set_point_varying_color(pt2, ink, color); + gp_set_point_varying_color(pt2, ink, attr_id.color); /* calculate points for end of segment */ mt[0] = m2[0] * pthick; @@ -950,8 +961,8 @@ static void gp_draw_stroke_2d( t1[1] = s1[1] + mt[1]; /* Last two points of last segment (and first two points of end cap). */ - immVertex2fv(pos, t0); - immVertex2fv(pos, t1); + immVertex2fv(attr_id.pos, t0); + immVertex2fv(attr_id.pos, t1); /* draw end cap as last step * - make points slightly closer to center (about halfway across) @@ -967,8 +978,8 @@ static void gp_draw_stroke_2d( t1[1] = sc[1] + mt[1]; /* Last two points of end cap. */ - immVertex2fv(pos, t0); - immVertex2fv(pos, t1); + immVertex2fv(attr_id.pos, t0); + immVertex2fv(attr_id.pos, t1); } /* store computed point2 coordinates as point1 ones of next segment. */ @@ -1313,21 +1324,21 @@ static void gp_draw_strokes_edit( /* size and color first */ if (show_direction_hint && i == 0) { /* start point in green bigger */ - immAttrib3f(color, 0.0f, 1.0f, 0.0f); - immAttrib1f(size, vsize + 4); + immAttr3f(color, 0.0f, 1.0f, 0.0f); + immAttr1f(size, vsize + 4); } else if (show_direction_hint && (i == gps->totpoints - 1)) { /* end point in red smaller */ - immAttrib3f(color, 1.0f, 0.0f, 0.0f); - immAttrib1f(size, vsize + 1); + immAttr3f(color, 1.0f, 0.0f, 0.0f); + immAttr1f(size, vsize + 1); } else if (pt->flag & GP_SPOINT_SELECT) { - immAttrib3fv(color, selectColor); - immAttrib1f(size, vsize); + immAttr3fv(color, selectColor); + immAttr1f(size, vsize); } else { - immAttrib3fv(color, gp_style->stroke_rgba); - immAttrib1f(size, bsize); + immAttr3fv(color, gp_style->stroke_rgba); + immAttr1f(size, bsize); } /* then position */ @@ -1432,7 +1443,7 @@ void ED_gp_draw_primitives(const bContext *C, tGPDprimitive *tgpi, const int typ } Object *obact = CTX_data_active_object(C); - Depsgraph *depsgraph = CTX_data_depsgraph(C); \ + Depsgraph *depsgraph = CTX_data_depsgraph(C); float color[4]; UI_GetThemeColor3fv(TH_GP_VERTEX_SELECT, color); @@ -1525,18 +1536,12 @@ static void gp_draw_data_layers(RegionView3D *rv3d, * NOTE: If the setting doesn't apply, it *must* be cleared, * as dflag's carry over from the previous layer */ -#define GP_DRAWFLAG_APPLY(condition, draw_flag_value) { \ - if (condition) dflag |= (draw_flag_value); \ - else dflag &= ~(draw_flag_value); \ - } (void)0 /* xray... */ - GP_DRAWFLAG_APPLY((gpl->flag & GP_LAYER_NO_XRAY), GP_DRAWDATA_NO_XRAY); + SET_FLAG_FROM_TEST(dflag, gpl->flag & GP_LAYER_NO_XRAY, GP_DRAWDATA_NO_XRAY); /* volumetric strokes... */ - GP_DRAWFLAG_APPLY((gpl->flag & GP_LAYER_VOLUMETRIC), GP_DRAWDATA_VOLUMETRIC); - -#undef GP_DRAWFLAG_APPLY + SET_FLAG_FROM_TEST(dflag, gpl->flag & GP_LAYER_VOLUMETRIC, GP_DRAWDATA_VOLUMETRIC); tgpw.gpl = gpl; tgpw.gpf = gpf; diff --git a/source/blender/editors/gpencil/gpencil_brush.c b/source/blender/editors/gpencil/gpencil_brush.c index 20c3449c208..c83bf8b7a5c 100644 --- a/source/blender/editors/gpencil/gpencil_brush.c +++ b/source/blender/editors/gpencil/gpencil_brush.c @@ -168,8 +168,9 @@ typedef struct tGP_BrushEditData { /* Callback for performing some brush operation on a single point */ -typedef bool (*GP_BrushApplyCb)(tGP_BrushEditData *gso, bGPDstroke *gps, int pt_index, - const int radius, const int co[2]); +typedef bool (*GP_BrushApplyCb)( + tGP_BrushEditData *gso, bGPDstroke *gps, int pt_index, + const int radius, const int co[2]); /* ************************************************ */ /* Utility Functions */ @@ -1620,7 +1621,7 @@ static bool gpsculpt_brush_do_frame( static bool gpsculpt_brush_apply_standard(bContext *C, tGP_BrushEditData *gso) { ToolSettings *ts = CTX_data_tool_settings(C); - Depsgraph *depsgraph = CTX_data_depsgraph(C); \ + Depsgraph *depsgraph = CTX_data_depsgraph(C); Object *obact = gso->object; bGPdata *gpd = gso->gpd; bool changed = false; @@ -1684,9 +1685,9 @@ static bool gpsculpt_brush_apply_standard(bContext *C, tGP_BrushEditData *gso) if (gso->use_multiframe_falloff) { /* Faloff depends on distance to active frame (relative to the overall frame range) */ gso->mf_falloff = BKE_gpencil_multiframe_falloff_calc( - gpf, gpl->actframe->framenum, - f_init, f_end, - ts->gp_sculpt.cur_falloff); + gpf, gpl->actframe->framenum, + f_init, f_end, + ts->gp_sculpt.cur_falloff); } else { /* No falloff */ diff --git a/source/blender/editors/gpencil/gpencil_convert.c b/source/blender/editors/gpencil/gpencil_convert.c index c6bc65c7dbe..72165b04a05 100644 --- a/source/blender/editors/gpencil/gpencil_convert.c +++ b/source/blender/editors/gpencil/gpencil_convert.c @@ -134,8 +134,9 @@ static const EnumPropertyItem prop_gpencil_convert_timingmodes[] = { {0, NULL, 0, NULL, NULL}, }; -static const EnumPropertyItem *rna_GPConvert_mode_items(bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), - bool *UNUSED(r_free)) +static const EnumPropertyItem *rna_GPConvert_mode_items( + bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), + bool *UNUSED(r_free)) { if (RNA_boolean_get(ptr, "use_timing_data")) { return prop_gpencil_convert_timingmodes; @@ -155,7 +156,7 @@ static void gp_strokepoint_convertcoords( Scene *scene = CTX_data_scene(C); View3D *v3d = CTX_wm_view3d(C); ARegion *ar = CTX_wm_region(C); - Depsgraph *depsgraph = CTX_data_depsgraph(C); \ + Depsgraph *depsgraph = CTX_data_depsgraph(C); Object *obact = CTX_data_active_object(C); bGPDspoint mypt, *pt; @@ -254,8 +255,9 @@ static void gp_timing_data_set_nbr(tGpTimingData *gtd, const int nbr) } /* add stroke point to timing buffers */ -static void gp_timing_data_add_point(tGpTimingData *gtd, const double stroke_inittime, const float time, - const float delta_dist) +static void gp_timing_data_add_point( + tGpTimingData *gtd, const double stroke_inittime, const float time, + const float delta_dist) { float delta_time = 0.0f; const int cur_point = gtd->cur_point; @@ -290,9 +292,10 @@ static void gp_timing_data_add_point(tGpTimingData *gtd, const double stroke_ini #define MIN_TIME_DELTA 0.02f /* Loop over next points to find the end of the stroke, and compute */ -static int gp_find_end_of_stroke_idx(tGpTimingData *gtd, RNG *rng, const int idx, const int nbr_gaps, - int *nbr_done_gaps, const float tot_gaps_time, const float delta_time, - float *next_delta_time) +static int gp_find_end_of_stroke_idx( + tGpTimingData *gtd, RNG *rng, const int idx, const int nbr_gaps, + int *nbr_done_gaps, const float tot_gaps_time, const float delta_time, + float *next_delta_time) { int j; @@ -370,9 +373,10 @@ static void gp_stroke_path_animation_preprocess_gaps(tGpTimingData *gtd, RNG *rn } } -static void gp_stroke_path_animation_add_keyframes(Depsgraph *depsgraph, ReportList *reports, PointerRNA ptr, PropertyRNA *prop, FCurve *fcu, - Curve *cu, tGpTimingData *gtd, RNG *rng, const float time_range, - const int nbr_gaps, const float tot_gaps_time) +static void gp_stroke_path_animation_add_keyframes( + Depsgraph *depsgraph, ReportList *reports, PointerRNA ptr, PropertyRNA *prop, FCurve *fcu, + Curve *cu, tGpTimingData *gtd, RNG *rng, const float time_range, + const int nbr_gaps, const float tot_gaps_time) { /* Use actual recorded timing! */ const float time_start = (float)gtd->start_frame; @@ -398,8 +402,9 @@ static void gp_stroke_path_animation_add_keyframes(Depsgraph *depsgraph, ReportL start_stroke_idx = i; delta_time = next_delta_time; /* find end of that new stroke */ - end_stroke_idx = gp_find_end_of_stroke_idx(gtd, rng, i, nbr_gaps, &nbr_done_gaps, - tot_gaps_time, delta_time, &next_delta_time); + end_stroke_idx = gp_find_end_of_stroke_idx( + gtd, rng, i, nbr_gaps, &nbr_done_gaps, + tot_gaps_time, delta_time, &next_delta_time); /* This one should *never* be negative! */ end_stroke_time = time_start + ((gtd->times[end_stroke_idx] + delta_time) / gtd->tot_time * time_range); } @@ -530,8 +535,9 @@ static void gp_stroke_path_animation(bContext *C, ReportList *reports, Curve *cu printf("GP Stroke Path Conversion: Starting keying!\n"); } - gp_stroke_path_animation_add_keyframes(depsgraph, reports, ptr, prop, fcu, cu, gtd, rng, time_range, - nbr_gaps, tot_gaps_time); + gp_stroke_path_animation_add_keyframes( + depsgraph, reports, ptr, prop, fcu, cu, gtd, rng, time_range, + nbr_gaps, tot_gaps_time); BLI_rng_free(rng); } @@ -562,9 +568,10 @@ static void gp_stroke_path_animation(bContext *C, ReportList *reports, Curve *cu /* convert stroke to 3d path */ /* helper */ -static void gp_stroke_to_path_add_point(tGpTimingData *gtd, BPoint *bp, const float p[3], const float prev_p[3], - const bool do_gtd, const double inittime, const float time, - const float width, const float rad_fac, float minmax_weights[2]) +static void gp_stroke_to_path_add_point( + tGpTimingData *gtd, BPoint *bp, const float p[3], const float prev_p[3], + const bool do_gtd, const double inittime, const float time, + const float width, const float rad_fac, float minmax_weights[2]) { copy_v3_v3(bp->vec, p); bp->vec[3] = 1.0f; @@ -587,9 +594,10 @@ static void gp_stroke_to_path_add_point(tGpTimingData *gtd, BPoint *bp, const fl } } -static void gp_stroke_to_path(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDstroke *gps, Curve *cu, rctf *subrect, Nurb **curnu, - float minmax_weights[2], const float rad_fac, bool stitch, const bool add_start_point, - const bool add_end_point, tGpTimingData *gtd) +static void gp_stroke_to_path( + bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDstroke *gps, Curve *cu, rctf *subrect, Nurb **curnu, + float minmax_weights[2], const float rad_fac, bool stitch, const bool add_start_point, + const bool add_end_point, tGpTimingData *gtd) { bGPDspoint *pt; Nurb *nu = (curnu) ? *curnu : NULL; @@ -666,8 +674,9 @@ static void gp_stroke_to_path(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDstr } } bp++; - gp_stroke_to_path_add_point(gtd, bp, p1, (bp - 1)->vec, do_gtd, gps->prev->inittime, dt1, - 0.0f, rad_fac, minmax_weights); + gp_stroke_to_path_add_point( + gtd, bp, p1, (bp - 1)->vec, do_gtd, gps->prev->inittime, dt1, + 0.0f, rad_fac, minmax_weights); /* Second point */ /* Note dt2 is always negative, which marks the gap. */ @@ -729,8 +738,9 @@ static void gp_stroke_to_path(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDstr /* get coordinates to add at */ gp_strokepoint_convertcoords(C, gpd, gpl, gps, pt, p, subrect); - gp_stroke_to_path_add_point(gtd, bp, p, (prev_bp) ? prev_bp->vec : p, do_gtd, gps->inittime, pt->time, - width, rad_fac, minmax_weights); + gp_stroke_to_path_add_point( + gtd, bp, p, (prev_bp) ? prev_bp->vec : p, do_gtd, gps->inittime, pt->time, + width, rad_fac, minmax_weights); prev_bp = bp; } @@ -769,10 +779,11 @@ static void gp_stroke_to_path(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDstr /* convert stroke to 3d bezier */ /* helper */ -static void gp_stroke_to_bezier_add_point(tGpTimingData *gtd, BezTriple *bezt, - const float p[3], const float h1[3], const float h2[3], const float prev_p[3], - const bool do_gtd, const double inittime, const float time, - const float width, const float rad_fac, float minmax_weights[2]) +static void gp_stroke_to_bezier_add_point( + tGpTimingData *gtd, BezTriple *bezt, + const float p[3], const float h1[3], const float h2[3], const float prev_p[3], + const bool do_gtd, const double inittime, const float time, + const float width, const float rad_fac, float minmax_weights[2]) { copy_v3_v3(bezt->vec[0], h1); copy_v3_v3(bezt->vec[1], p); @@ -797,9 +808,10 @@ static void gp_stroke_to_bezier_add_point(tGpTimingData *gtd, BezTriple *bezt, } } -static void gp_stroke_to_bezier(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDstroke *gps, Curve *cu, rctf *subrect, Nurb **curnu, - float minmax_weights[2], const float rad_fac, bool stitch, const bool add_start_point, - const bool add_end_point, tGpTimingData *gtd) +static void gp_stroke_to_bezier( + bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDstroke *gps, Curve *cu, rctf *subrect, Nurb **curnu, + float minmax_weights[2], const float rad_fac, bool stitch, const bool add_start_point, + const bool add_end_point, tGpTimingData *gtd) { bGPDspoint *pt; Nurb *nu = (curnu) ? *curnu : NULL; @@ -918,15 +930,17 @@ static void gp_stroke_to_bezier(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDs interp_v3_v3v3(h1, p1, bezt->vec[1], BEZT_HANDLE_FAC); interp_v3_v3v3(h2, p1, p2, BEZT_HANDLE_FAC); bezt++; - gp_stroke_to_bezier_add_point(gtd, bezt, p1, h1, h2, (bezt - 1)->vec[1], do_gtd, gps->prev->inittime, dt1, - 0.0f, rad_fac, minmax_weights); + gp_stroke_to_bezier_add_point( + gtd, bezt, p1, h1, h2, (bezt - 1)->vec[1], do_gtd, gps->prev->inittime, dt1, + 0.0f, rad_fac, minmax_weights); /* Second point */ interp_v3_v3v3(h1, p2, p1, BEZT_HANDLE_FAC); interp_v3_v3v3(h2, p2, p3d_cur, BEZT_HANDLE_FAC); bezt++; - gp_stroke_to_bezier_add_point(gtd, bezt, p2, h1, h2, p1, do_gtd, gps->inittime, dt2, - 0.0f, rad_fac, minmax_weights); + gp_stroke_to_bezier_add_point( + gtd, bezt, p2, h1, h2, p1, do_gtd, gps->inittime, dt2, + 0.0f, rad_fac, minmax_weights); old_nbezt += 2; copy_v3_v3(p3d_prev, p2); @@ -950,8 +964,9 @@ static void gp_stroke_to_bezier(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDs interp_v3_v3v3(h1, p, p3d_cur, -BEZT_HANDLE_FAC); interp_v3_v3v3(h2, p, p3d_cur, BEZT_HANDLE_FAC); bezt = &nu->bezt[old_nbezt]; - gp_stroke_to_bezier_add_point(gtd, bezt, p, h1, h2, p, do_gtd, gps->inittime, dt, - 0.0f, rad_fac, minmax_weights); + gp_stroke_to_bezier_add_point( + gtd, bezt, p, h1, h2, p, do_gtd, gps->inittime, dt, + 0.0f, rad_fac, minmax_weights); old_nbezt++; copy_v3_v3(p3d_prev, p); @@ -979,8 +994,9 @@ static void gp_stroke_to_bezier(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDs interp_v3_v3v3(h2, p3d_cur, p3d_prev, -BEZT_HANDLE_FAC); } - gp_stroke_to_bezier_add_point(gtd, bezt, p3d_cur, h1, h2, prev_bezt ? prev_bezt->vec[1] : p3d_cur, - do_gtd, gps->inittime, pt->time, width, rad_fac, minmax_weights); + gp_stroke_to_bezier_add_point( + gtd, bezt, p3d_cur, h1, h2, prev_bezt ? prev_bezt->vec[1] : p3d_cur, + do_gtd, gps->inittime, pt->time, width, rad_fac, minmax_weights); /* shift coord vects */ copy_v3_v3(p3d_prev, p3d_cur); @@ -1018,8 +1034,9 @@ static void gp_stroke_to_bezier(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDs interp_v3_v3v3(h1, p, prev_bezt->vec[1], BEZT_HANDLE_FAC); interp_v3_v3v3(h2, p, prev_bezt->vec[1], -BEZT_HANDLE_FAC); /* Note bezt has already been incremented in main loop above, so it points to the right place. */ - gp_stroke_to_bezier_add_point(gtd, bezt, p, h1, h2, prev_bezt->vec[1], do_gtd, gps->inittime, dt, - 0.0f, rad_fac, minmax_weights); + gp_stroke_to_bezier_add_point( + gtd, bezt, p, h1, h2, prev_bezt->vec[1], do_gtd, gps->inittime, dt, + 0.0f, rad_fac, minmax_weights); } /* must calculate handles or else we crash */ @@ -1122,8 +1139,9 @@ static int gp_camera_view_subrect(bContext *C, rctf *subrect) } /* convert a given grease-pencil layer to a 3d-curve representation (using current view if appropriate) */ -static void gp_layer_to_curve(bContext *C, ReportList *reports, bGPdata *gpd, bGPDlayer *gpl, const int mode, - const bool norm_weights, const float rad_fac, const bool link_strokes, tGpTimingData *gtd) +static void gp_layer_to_curve( + bContext *C, ReportList *reports, bGPdata *gpd, bGPDlayer *gpl, const int mode, + const bool norm_weights, const float rad_fac, const bool link_strokes, tGpTimingData *gtd) { struct Main *bmain = CTX_data_main(C); ViewLayer *view_layer = CTX_data_view_layer(C); @@ -1190,13 +1208,15 @@ static void gp_layer_to_curve(bContext *C, ReportList *reports, bGPdata *gpd, bG switch (mode) { case GP_STROKECONVERT_PATH: - gp_stroke_to_path(C, gpd, gpl, gps, cu, subrect_ptr, &nu, minmax_weights, rad_fac, stitch, - add_start_point, add_end_point, gtd); + gp_stroke_to_path( + C, gpd, gpl, gps, cu, subrect_ptr, &nu, minmax_weights, rad_fac, stitch, + add_start_point, add_end_point, gtd); break; case GP_STROKECONVERT_CURVE: case GP_STROKECONVERT_POLY: /* convert after */ - gp_stroke_to_bezier(C, gpd, gpl, gps, cu, subrect_ptr, &nu, minmax_weights, rad_fac, stitch, - add_start_point, add_end_point, gtd); + gp_stroke_to_bezier( + C, gpd, gpl, gps, cu, subrect_ptr, &nu, minmax_weights, rad_fac, stitch, + add_start_point, add_end_point, gtd); break; default: BLI_assert(!"invalid mode"); diff --git a/source/blender/editors/gpencil/gpencil_data.c b/source/blender/editors/gpencil/gpencil_data.c index 068478af325..5cc5c55b3df 100644 --- a/source/blender/editors/gpencil/gpencil_data.c +++ b/source/blender/editors/gpencil/gpencil_data.c @@ -338,7 +338,8 @@ static int gp_layer_move_exec(bContext *C, wmOperator *op) bGPdata *gpd = ED_gpencil_data_get_active(C); bGPDlayer *gpl = BKE_gpencil_layer_getactive(gpd); - int direction = RNA_enum_get(op->ptr, "type"); + const bool reverse = (bool)(U.gp_settings & GP_PAINT_REVERSE_LAYERS); + const int direction = RNA_enum_get(op->ptr, "type") * (reverse ? -1 : 1); /* sanity checks */ if (ELEM(NULL, gpd, gpl)) @@ -1083,8 +1084,18 @@ void GPENCIL_OT_layer_isolate(wmOperatorType *ot) static int gp_merge_layer_exec(bContext *C, wmOperator *op) { bGPdata *gpd = ED_gpencil_data_get_active(C); - bGPDlayer *gpl_current = BKE_gpencil_layer_getactive(gpd); - bGPDlayer *gpl_next = gpl_current->next; + const bool reverse = (bool)(U.gp_settings & GP_PAINT_REVERSE_LAYERS); + bGPDlayer *gpl_current = NULL; + bGPDlayer *gpl_next = NULL; + + if (!reverse) { + gpl_current = BKE_gpencil_layer_getactive(gpd); + gpl_next = gpl_current->next; + } + else { + gpl_next = BKE_gpencil_layer_getactive(gpd); + gpl_current = gpl_next->prev; + } if (ELEM(NULL, gpd, gpl_current, gpl_next)) { BKE_report(op->reports, RPT_ERROR, "No layers to merge"); @@ -1983,8 +1994,9 @@ static void joined_gpencil_fix_animdata_cb(ID *id, FCurve *fcu, void *user_data) /* only remap if changed; this still means there will be some waste if there aren't many drivers/keys */ if (!STREQ(old_name, new_name) && strstr(fcu->rna_path, old_name)) { - fcu->rna_path = BKE_animsys_fix_rna_path_rename(id, fcu->rna_path, "layers", - old_name, new_name, 0, 0, false); + fcu->rna_path = BKE_animsys_fix_rna_path_rename( + id, fcu->rna_path, "layers", + old_name, new_name, 0, 0, false); /* we don't want to apply a second remapping on this F-Curve now, * so stop trying to fix names names @@ -2018,8 +2030,9 @@ static void joined_gpencil_fix_animdata_cb(ID *id, FCurve *fcu, void *user_data) if (!STREQ(old_name, new_name)) { if ((dtar->rna_path) && strstr(dtar->rna_path, old_name)) { /* Fix up path */ - dtar->rna_path = BKE_animsys_fix_rna_path_rename(id, dtar->rna_path, "layers", - old_name, new_name, 0, 0, false); + dtar->rna_path = BKE_animsys_fix_rna_path_rename( + id, dtar->rna_path, "layers", + old_name, new_name, 0, 0, false); break; /* no need to try any more names for layer path */ } } diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c index 923bd1e9f18..7b2eb7d6ecd 100644 --- a/source/blender/editors/gpencil/gpencil_edit.c +++ b/source/blender/editors/gpencil/gpencil_edit.c @@ -2192,10 +2192,10 @@ static int gp_snap_to_cursor(bContext *C, wmOperator *op) Scene *scene = CTX_data_scene(C); View3D *v3d = CTX_wm_view3d(C); - Depsgraph *depsgraph = CTX_data_depsgraph(C); \ - Object *obact = CTX_data_active_object(C); \ + Depsgraph *depsgraph = CTX_data_depsgraph(C); + Object *obact = CTX_data_active_object(C); - const bool use_offset = RNA_boolean_get(op->ptr, "use_offset"); + const bool use_offset = RNA_boolean_get(op->ptr, "use_offset"); const float *cursor_global = ED_view3d_cursor3d_get(scene, v3d)->location; for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) { @@ -2280,10 +2280,10 @@ static int gp_snap_cursor_to_sel(bContext *C, wmOperator *UNUSED(op)) Scene *scene = CTX_data_scene(C); View3D *v3d = CTX_wm_view3d(C); - Depsgraph *depsgraph = CTX_data_depsgraph(C); \ - Object *obact = CTX_data_active_object(C); \ + Depsgraph *depsgraph = CTX_data_depsgraph(C); + Object *obact = CTX_data_active_object(C); - float *cursor = ED_view3d_cursor3d_get(scene, v3d)->location; + float *cursor = ED_view3d_cursor3d_get(scene, v3d)->location; float centroid[3] = {0.0f}; float min[3], max[3]; size_t count = 0; diff --git a/source/blender/editors/gpencil/gpencil_fill.c b/source/blender/editors/gpencil/gpencil_fill.c index 3fd26f77449..f940b18dac6 100644 --- a/source/blender/editors/gpencil/gpencil_fill.c +++ b/source/blender/editors/gpencil/gpencil_fill.c @@ -127,8 +127,8 @@ typedef struct tGPDfill { /* draw a given stroke using same thickness and color for all points */ static void gp_draw_basic_stroke( - tGPDfill *tgpf, bGPDstroke *gps, const float diff_mat[4][4], - bool cyclic, float ink[4], int flag, float thershold) + tGPDfill *tgpf, bGPDstroke *gps, const float diff_mat[4][4], + const bool cyclic, const float ink[4], const int flag, const float thershold) { bGPDspoint *points = gps->points; @@ -166,14 +166,14 @@ static void gp_draw_basic_stroke( col[3] = 1.0f; } /* set point */ - immAttrib4fv(color, col); + immAttr4fv(color, col); mul_v3_m4v3(fpt, diff_mat, &pt->x); immVertex3fv(pos, fpt); } if (cyclic && totpoints > 2) { /* draw line to first point to complete the cycle */ - immAttrib4fv(color, col); + immAttr4fv(color, col); mul_v3_m4v3(fpt, diff_mat, &points->x); immVertex3fv(pos, fpt); } @@ -183,7 +183,7 @@ static void gp_draw_basic_stroke( } /* loop all layers */ -static void gp_draw_datablock(tGPDfill *tgpf, float ink[4]) +static void gp_draw_datablock(tGPDfill *tgpf, const float ink[4]) { /* duplicated: etempFlags */ enum { @@ -258,8 +258,9 @@ static void gp_draw_datablock(tGPDfill *tgpf, float ink[4]) if ((tgpf->fill_draw_mode == GP_FILL_DMODE_CONTROL) || (tgpf->fill_draw_mode == GP_FILL_DMODE_BOTH)) { - gp_draw_basic_stroke(tgpf, gps, tgpw.diff_mat, gps->flag & GP_STROKE_CYCLIC, ink, - tgpf->flag, tgpf->fill_threshold); + gp_draw_basic_stroke( + tgpf, gps, tgpw.diff_mat, gps->flag & GP_STROKE_CYCLIC, ink, + tgpf->flag, tgpf->fill_threshold); } } } @@ -322,7 +323,7 @@ static void gp_render_offscreen(tGPDfill *tgpf) GPU_matrix_set(tgpf->rv3d->viewmat); /* draw strokes */ - float ink[4] = { 1.0f, 0.0f, 0.0f, 1.0f }; + float ink[4] = {1.0f, 0.0f, 0.0f, 1.0f}; gp_draw_datablock(tgpf, ink); /* restore size */ @@ -355,10 +356,10 @@ static void gp_render_offscreen(tGPDfill *tgpf) } /* return pixel data (rgba) at index */ -static void get_pixel(ImBuf *ibuf, int idx, float r_col[4]) +static void get_pixel(const ImBuf *ibuf, const int idx, float r_col[4]) { if (ibuf->rect_float) { - float *frgba = &ibuf->rect_float[idx * 4]; + const float *frgba = &ibuf->rect_float[idx * 4]; copy_v4_v4(r_col, frgba); } else { @@ -636,15 +637,15 @@ static void gpencil_get_outline_points(tGPDfill *tgpf) bool start_found = false; const int NEIGHBOR_COUNT = 8; - int offset[8][2] = { - { -1, -1 }, - { 0, -1 }, - { 1, -1 }, - { 1, 0 }, - { 1, 1 }, - { 0, 1 }, - { -1, 1 }, - { -1, 0 } + const int offset[8][2] = { + {-1, -1}, + {0, -1}, + {1, -1}, + {1, 0}, + {1, 1}, + {0, 1}, + {-1, 1}, + {-1, 0} }; tgpf->stack = BLI_stack_new(sizeof(int[2]), __func__); @@ -653,7 +654,7 @@ static void gpencil_get_outline_points(tGPDfill *tgpf) int imagesize = ibuf->x * ibuf->y; /* find the initial point to start outline analysis */ - for (int idx = imagesize; idx >= 0; idx--) { + for (int idx = imagesize - 1; idx != 0; idx--) { get_pixel(ibuf, idx, rgba); if (rgba[1] == 1.0f) { boundary_co[0] = idx % ibuf->x; @@ -919,10 +920,12 @@ static void gpencil_stroke_from_buffer(tGPDfill *tgpf) /* if axis locked, reproject to plane locked */ if ((tgpf->lock_axis > GP_LOCKAXIS_NONE) && ((ts->gpencil_v3d_align & GP_PROJECT_DEPTH_VIEW) == 0)) { float origin[3]; - ED_gp_get_drawing_reference(tgpf->v3d, tgpf->scene, tgpf->ob, tgpf->gpl, - ts->gpencil_v3d_align, origin); - ED_gp_project_stroke_to_plane(tgpf->ob, tgpf->rv3d, gps, origin, - tgpf->lock_axis - 1); + ED_gp_get_drawing_reference( + tgpf->v3d, tgpf->scene, tgpf->ob, tgpf->gpl, + ts->gpencil_v3d_align, origin); + ED_gp_project_stroke_to_plane( + tgpf->ob, tgpf->rv3d, gps, origin, + tgpf->lock_axis - 1); } /* if parented change position relative to parent object */ @@ -952,7 +955,7 @@ static void gpencil_draw_boundary_lines(const bContext *UNUSED(C), tGPDfill *tgp if (!tgpf->gpd) { return; } - float ink[4] = { 1.0f, 0.0f, 0.0f, 1.0f }; + const float ink[4] = {1.0f, 0.0f, 0.0f, 1.0f}; gp_draw_datablock(tgpf, ink); } diff --git a/source/blender/editors/gpencil/gpencil_intern.h b/source/blender/editors/gpencil/gpencil_intern.h index 42d15c92ff2..f7117189c32 100644 --- a/source/blender/editors/gpencil/gpencil_intern.h +++ b/source/blender/editors/gpencil/gpencil_intern.h @@ -192,16 +192,19 @@ typedef struct GP_SpaceConversion { float mat[4][4]; /* transform matrix on the strokes (introduced in [b770964]) */ } GP_SpaceConversion; -bool gp_stroke_inside_circle(const int mval[2], const int UNUSED(mvalo[2]), - int rad, int x0, int y0, int x1, int y1); +bool gp_stroke_inside_circle( + const int mval[2], const int UNUSED(mvalo[2]), + int rad, int x0, int y0, int x1, int y1); void gp_point_conversion_init(struct bContext *C, GP_SpaceConversion *r_gsc); -void gp_point_to_xy(GP_SpaceConversion *settings, struct bGPDstroke *gps, struct bGPDspoint *pt, - int *r_x, int *r_y); +void gp_point_to_xy( + GP_SpaceConversion *settings, struct bGPDstroke *gps, struct bGPDspoint *pt, + int *r_x, int *r_y); -void gp_point_to_xy_fl(GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt, - float *r_x, float *r_y); +void gp_point_to_xy_fl( + GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt, + float *r_x, float *r_y); void gp_point_to_parent_space(bGPDspoint *pt, float diff_mat[4][4], bGPDspoint *r_pt); /** diff --git a/source/blender/editors/gpencil/gpencil_ops.c b/source/blender/editors/gpencil/gpencil_ops.c index eec059a59d1..ed3eab7b642 100644 --- a/source/blender/editors/gpencil/gpencil_ops.c +++ b/source/blender/editors/gpencil/gpencil_ops.c @@ -590,6 +590,10 @@ static void ed_keymap_gpencil_painting(wmKeyConfig *keyconf) /* set poll callback - so that this keymap only gets enabled when stroke paintmode is enabled */ keymap->poll = gp_stroke_paintmode_poll; + /* Shift-FKEY = Brush Strength */ + kmi = WM_keymap_add_item(keymap, "WM_OT_radial_control", FKEY, KM_PRESS, KM_SHIFT, 0); + RNA_string_set(kmi->ptr, "data_path_primary", "tool_settings.gpencil_paint.brush.gpencil_settings.pen_strength"); + /* FKEY = Brush Size */ kmi = WM_keymap_add_item(keymap, "WM_OT_radial_control", FKEY, KM_PRESS, 0, 0); RNA_string_set(kmi->ptr, "data_path_primary", "tool_settings.gpencil_paint.brush.size"); diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c index 85479de7a77..3650ae644fb 100644 --- a/source/blender/editors/gpencil/gpencil_paint.c +++ b/source/blender/editors/gpencil/gpencil_paint.c @@ -563,8 +563,8 @@ static short gp_stroke_addpoint( tGPspoint *pt; ToolSettings *ts = p->scene->toolsettings; Object *obact = (Object *)p->ownerPtr.data; - Depsgraph *depsgraph = p->depsgraph; \ - RegionView3D *rv3d = p->ar->regiondata; + Depsgraph *depsgraph = p->depsgraph; + RegionView3D *rv3d = p->ar->regiondata; View3D *v3d = p->sa->spacedata.first; MaterialGPencilStyle *gp_style = p->material->gp_style; const int def_nr = obact->actdef - 1; @@ -833,81 +833,6 @@ static short gp_stroke_addpoint( return GP_STROKEADD_INVALID; } -/* simplify a stroke (in buffer) before storing it - * - applies a reverse Chaikin filter - * - code adapted from etch-a-ton branch - */ -static void gp_stroke_simplify(tGPsdata *p) -{ - bGPdata *gpd = p->gpd; - tGPspoint *old_points = (tGPspoint *)gpd->runtime.sbuffer; - short num_points = gpd->runtime.sbuffer_size; - short flag = gpd->runtime.sbuffer_sflag; - short i, j; - - /* only simplify if simplification is enabled, and we're not doing a straight line */ - if (!(U.gp_settings & GP_PAINT_DOSIMPLIFY) || (p->paintmode == GP_PAINTMODE_DRAW_STRAIGHT)) - return; - - /* don't simplify if less than 4 points in buffer */ - if ((num_points <= 4) || (old_points == NULL)) - return; - - /* clear buffer (but don't free mem yet) so that we can write to it - * - firstly set sbuffer to NULL, so a new one is allocated - * - secondly, reset flag after, as it gets cleared auto - */ - gpd->runtime.sbuffer = NULL; - gp_session_validatebuffer(p); - gpd->runtime.sbuffer_sflag = flag; - - /* macro used in loop to get position of new point - * - used due to the mixture of datatypes in use here - */ -#define GP_SIMPLIFY_AVPOINT(offs, sfac) \ - { \ - co[0] += (float)(old_points[offs].x * sfac); \ - co[1] += (float)(old_points[offs].y * sfac); \ - pressure += old_points[offs].pressure * sfac; \ - time += old_points[offs].time * sfac; \ - } (void)0 - - /* XXX Here too, do not lose start and end points! */ - gp_stroke_addpoint(p, &old_points->x, old_points->pressure, p->inittime + (double)old_points->time); - for (i = 0, j = 0; i < num_points; i++) { - if (i - j == 3) { - float co[2], pressure, time; - int mco[2]; - - /* initialize values */ - co[0] = 0.0f; - co[1] = 0.0f; - pressure = 0.0f; - time = 0.0f; - - /* using macro, calculate new point */ - GP_SIMPLIFY_AVPOINT(j, -0.25f); - GP_SIMPLIFY_AVPOINT(j + 1, 0.75f); - GP_SIMPLIFY_AVPOINT(j + 2, 0.75f); - GP_SIMPLIFY_AVPOINT(j + 3, -0.25f); - - /* set values for adding */ - mco[0] = (int)co[0]; - mco[1] = (int)co[1]; - - /* ignore return values on this... assume to be ok for now */ - gp_stroke_addpoint(p, mco, pressure, p->inittime + (double)time); - - j += 2; - } - } - gp_stroke_addpoint(p, &old_points[num_points - 1].x, old_points[num_points - 1].pressure, - p->inittime + (double)old_points[num_points - 1].time); - - /* free old buffer */ - MEM_freeN(old_points); -} - /* make a new stroke from the buffer data */ static void gp_stroke_newfrombuffer(tGPsdata *p) { @@ -2201,9 +2126,6 @@ static void gp_paint_strokeend(tGPsdata *p) /* check if doing eraser or not */ if ((p->gpd->runtime.sbuffer_sflag & GP_STROKE_ERASER) == 0) { - /* simplify stroke before transferring? */ - gp_stroke_simplify(p); - /* transfer stroke to frame */ gp_stroke_newfrombuffer(p); } diff --git a/source/blender/editors/gpencil/gpencil_utils.c b/source/blender/editors/gpencil/gpencil_utils.c index eb4307b9f86..77a838d2f22 100644 --- a/source/blender/editors/gpencil/gpencil_utils.c +++ b/source/blender/editors/gpencil/gpencil_utils.c @@ -393,7 +393,7 @@ const EnumPropertyItem *ED_gpencil_layers_with_new_enum_itemf( item_tmp.identifier = "__CREATE__"; item_tmp.name = "New Layer"; item_tmp.value = -1; - item_tmp.icon = ICON_ZOOMIN; + item_tmp.icon = ICON_ADD; RNA_enum_item_add(&item, &totitem, &item_tmp); /* separator */ @@ -434,8 +434,9 @@ const EnumPropertyItem *ED_gpencil_layers_with_new_enum_itemf( * \param x0, y0 The screen-space x and y coordinates of the start of the stroke segment * \param x1, y1 The screen-space x and y coordinates of the end of the stroke segment */ -bool gp_stroke_inside_circle(const int mval[2], const int UNUSED(mvalo[2]), - int rad, int x0, int y0, int x1, int y1) +bool gp_stroke_inside_circle( + const int mval[2], const int UNUSED(mvalo[2]), + int rad, int x0, int y0, int x1, int y1) { /* simple within-radius check for now */ const float mval_fl[2] = {mval[0], mval[1]}; @@ -550,9 +551,9 @@ void gp_point_conversion_init(bContext *C, GP_SpaceConversion *r_gsc) /** * Convert point to parent space * - * \param pt Original point - * \param diff_mat Matrix with the difference between original parent matrix - * \param[out] r_pt Pointer to new point after apply matrix + * \param pt: Original point + * \param diff_mat: Matrix with the difference between original parent matrix + * \param[out] r_pt: Pointer to new point after apply matrix */ void gp_point_to_parent_space(bGPDspoint *pt, float diff_mat[4][4], bGPDspoint *r_pt) { @@ -610,8 +611,9 @@ void gp_apply_parent_point(Depsgraph *depsgraph, Object *obact, bGPdata *gpd, bG * * \warning This assumes that the caller has already checked whether the stroke in question can be drawn. */ -void gp_point_to_xy(GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt, - int *r_x, int *r_y) +void gp_point_to_xy( + GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt, + int *r_x, int *r_y) { ARegion *ar = gsc->ar; View2D *v2d = gsc->v2d; @@ -663,8 +665,9 @@ void gp_point_to_xy(GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt, * * \warning This assumes that the caller has already checked whether the stroke in question can be drawn */ -void gp_point_to_xy_fl(GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt, - float *r_x, float *r_y) +void gp_point_to_xy_fl( + GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt, + float *r_x, float *r_y) { ARegion *ar = gsc->ar; View2D *v2d = gsc->v2d; @@ -929,8 +932,8 @@ void ED_gp_project_point_to_plane(Object *ob, RegionView3D *rv3d, const float or /** * Subdivide a stroke once, by adding a point half way between each pair of existing points - * \param gps Stroke data - * \param subdivide Number of times to subdivide + * \param gps: Stroke data + * \param subdivide: Number of times to subdivide */ void gp_subdivide_stroke(bGPDstroke *gps, const int subdivide) { @@ -1024,8 +1027,8 @@ void gp_subdivide_stroke(bGPDstroke *gps, const int subdivide) /** * Add randomness to stroke - * \param gps Stroke data - * \param brush Brush data + * \param gps: Stroke data + * \param brush: Brush data */ void gp_randomize_stroke(bGPDstroke *gps, Brush *brush, RNG *rng) { @@ -1679,10 +1682,11 @@ void ED_gpencil_toggle_brush_cursor(bContext *C, bool enable, void *customdata) gset->paintcursor = NULL; } /* enable cursor */ - gset->paintcursor = WM_paint_cursor_activate(CTX_wm_manager(C), - NULL, - gp_brush_drawcursor, - (lastpost) ? customdata : NULL); + gset->paintcursor = WM_paint_cursor_activate( + CTX_wm_manager(C), + NULL, + gp_brush_drawcursor, + (lastpost) ? customdata : NULL); } } diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h index 713cc21c8ec..560ed0cf0e0 100644 --- a/source/blender/editors/include/ED_view3d.h +++ b/source/blender/editors/include/ED_view3d.h @@ -469,6 +469,7 @@ struct ImBuf *ED_view3d_draw_offscreen_imbuf_simple( struct GPUOffScreen *ofs, char err_out[256]); struct Base *ED_view3d_give_base_under_cursor(struct bContext *C, const int mval[2]); +struct Object *ED_view3d_give_object_under_cursor(struct bContext *C, const int mval[2]); void ED_view3d_quadview_update(struct ScrArea *sa, struct ARegion *ar, bool do_clip); void ED_view3d_update_viewmat( struct Depsgraph *depsgraph, struct Scene *scene, struct View3D *v3d, struct ARegion *ar, diff --git a/source/blender/editors/include/UI_icons.h b/source/blender/editors/include/UI_icons.h index 45cc1046932..a463cfdb633 100644 --- a/source/blender/editors/include/UI_icons.h +++ b/source/blender/editors/include/UI_icons.h @@ -28,106 +28,124 @@ * \ingroup editorui */ -/* Note: this is included twice with different #defines for DEF_ICON - * once from UI_resources.h for the internal icon enum and - * once for interface_api.c for the definition of the RNA enum for the icons */ +/* Note: this is included multiple times with different #defines for DEF_ICON. */ + +/* Auto define more specific types for places that do not need the distinction. */ +#ifndef DEF_ICON_COLLECTION +# define DEF_ICON_COLLECTION DEF_ICON +#endif +#ifndef DEF_ICON_OBJECT +# define DEF_ICON_OBJECT DEF_ICON +#endif +#ifndef DEF_ICON_OBJECT_DATA +# define DEF_ICON_OBJECT_DATA DEF_ICON +#endif +#ifndef DEF_ICON_MODIFIER +# define DEF_ICON_MODIFIER DEF_ICON +#endif +#ifndef DEF_ICON_SHADING +# define DEF_ICON_SHADING DEF_ICON +#endif +#ifndef DEF_ICON_COLOR +# define DEF_ICON_COLOR DEF_ICON +#endif /* ICON_ prefix added */ -DEF_ICON(NONE) +DEF_ICON_COLOR(NONE) DEF_ICON(QUESTION) DEF_ICON(ERROR) DEF_ICON(CANCEL) -DEF_ICON_MONO(TRIA_RIGHT) -DEF_ICON_MONO(TRIA_DOWN) -DEF_ICON_MONO(TRIA_LEFT) -DEF_ICON_MONO(TRIA_UP) -DEF_ICON_MONO(ARROW_LEFTRIGHT) -DEF_ICON_MONO(PLUS) -DEF_ICON_MONO(DISCLOSURE_TRI_RIGHT) -DEF_ICON_MONO(DISCLOSURE_TRI_DOWN) -DEF_ICON_MONO(RADIOBUT_OFF) -DEF_ICON_MONO(RADIOBUT_ON) -DEF_ICON(MENU_PANEL) +DEF_ICON(TRIA_RIGHT) +DEF_ICON(TRIA_DOWN) +DEF_ICON(TRIA_LEFT) +DEF_ICON(TRIA_UP) +DEF_ICON(ARROW_LEFTRIGHT) +DEF_ICON(PLUS) +DEF_ICON(DISCLOSURE_TRI_RIGHT) +DEF_ICON(DISCLOSURE_TRI_DOWN) +DEF_ICON(RADIOBUT_OFF) +DEF_ICON(RADIOBUT_ON) +DEF_ICON_COLOR(MENU_PANEL) DEF_ICON(BLENDER) -DEF_ICON_MONO(GRIP) -DEF_ICON_MONO(DOT) -DEF_ICON_MONO(COLLAPSEMENU) -DEF_ICON_MONO(X) +DEF_ICON(GRIP) +DEF_ICON(DOT) +DEF_ICON(COLLAPSEMENU) +DEF_ICON(X) DEF_ICON_BLANK(5) /* XXX 'DOWNARROW' icon! */ -DEF_ICON(GO_LEFT) -DEF_ICON(PLUG) -DEF_ICON(UI) +DEF_ICON_COLOR(GO_LEFT) +DEF_ICON_COLOR(PLUG) +DEF_ICON_COLOR(UI) DEF_ICON(NODE) DEF_ICON(NODE_SEL) /* ui */ -DEF_ICON(FULLSCREEN) -DEF_ICON(SPLITSCREEN) -DEF_ICON_MONO(RIGHTARROW_THIN) -DEF_ICON_MONO(BORDERMOVE) -DEF_ICON_MONO(VIEWZOOM) -DEF_ICON_MONO(ZOOMIN) -DEF_ICON_MONO(ZOOMOUT) -DEF_ICON_MONO(PANEL_CLOSE) -DEF_ICON(COPY_ID) +DEF_ICON_COLOR(FULLSCREEN) +DEF_ICON(WORKSPACE) +DEF_ICON(RIGHTARROW_THIN) +DEF_ICON(BORDERMOVE) +DEF_ICON(VIEWZOOM) +DEF_ICON(ADD) +DEF_ICON(REMOVE) +DEF_ICON(PANEL_CLOSE) +DEF_ICON_COLOR(COPY_ID) DEF_ICON(EYEDROPPER) -DEF_ICON(LINK_AREA) +DEF_ICON_COLOR(LINK_AREA) DEF_ICON(AUTO) -DEF_ICON_MONO(CHECKBOX_DEHLT) -DEF_ICON_MONO(CHECKBOX_HLT) -DEF_ICON_MONO(UNLOCKED) -DEF_ICON_MONO(LOCKED) -DEF_ICON_MONO(UNPINNED) -DEF_ICON_MONO(PINNED) -DEF_ICON_MONO(SCREEN_BACK) -DEF_ICON_MONO(RIGHTARROW) -DEF_ICON_MONO(DOWNARROW_HLT) -DEF_ICON(DOTSUP) -DEF_ICON(DOTSDOWN) +DEF_ICON(CHECKBOX_DEHLT) +DEF_ICON(CHECKBOX_HLT) +DEF_ICON(UNLOCKED) +DEF_ICON(LOCKED) +DEF_ICON(UNPINNED) +DEF_ICON(PINNED) +DEF_ICON(SCREEN_BACK) +DEF_ICON(RIGHTARROW) +DEF_ICON(DOWNARROW_HLT) +DEF_ICON_COLOR(DOTSUP) +DEF_ICON_COLOR(DOTSDOWN) DEF_ICON(LINK) DEF_ICON(INLINK) -DEF_ICON(PLUGIN) +DEF_ICON_COLOR(PLUGIN) /* various ui */ DEF_ICON(HELP) DEF_ICON(GHOST_ENABLED) DEF_ICON(COLOR) /* see COLOR_RED/GREEN/BLUE */ -DEF_ICON_MONO(LINKED) -DEF_ICON_MONO(UNLINKED) -DEF_ICON_MONO(HAND) -DEF_ICON_MONO(ZOOM_ALL) -DEF_ICON_MONO(ZOOM_SELECTED) -DEF_ICON_MONO(ZOOM_PREVIOUS) -DEF_ICON_MONO(ZOOM_IN) -DEF_ICON_MONO(ZOOM_OUT) -DEF_ICON(RENDER_REGION) -DEF_ICON(BORDER_RECT) -DEF_ICON(BORDER_LASSO) +DEF_ICON(LINKED) +DEF_ICON(UNLINKED) +DEF_ICON(HAND) +DEF_ICON(ZOOM_ALL) +DEF_ICON(ZOOM_SELECTED) +DEF_ICON(ZOOM_PREVIOUS) +DEF_ICON(ZOOM_IN) +DEF_ICON(ZOOM_OUT) +DEF_ICON_COLOR(RENDER_REGION) +DEF_ICON_COLOR(BORDER_RECT) +DEF_ICON_COLOR(BORDER_LASSO) DEF_ICON(FREEZE) DEF_ICON(STYLUS_PRESSURE) DEF_ICON(GHOST_DISABLED) -DEF_ICON(NEW) +DEF_ICON(FILE_NEW) DEF_ICON(FILE_TICK) DEF_ICON(QUIT) DEF_ICON(URL) DEF_ICON(RECOVER_LAST) -DEF_ICON_BLANK(30) -DEF_ICON_MONO(FULLSCREEN_ENTER) -DEF_ICON_MONO(FULLSCREEN_EXIT) -DEF_ICON(BLANK1) // Not actually blank - this is used all over the place +DEF_ICON(30) +DEF_ICON(FULLSCREEN_ENTER) +DEF_ICON(FULLSCREEN_EXIT) +DEF_ICON(ONIONSKIN) /* BUTTONS */ -DEF_ICON(LIGHT) -DEF_ICON(MATERIAL) -DEF_ICON(TEXTURE) +DEF_ICON_SHADING(LIGHT) +DEF_ICON_SHADING(MATERIAL) +DEF_ICON_SHADING(TEXTURE) DEF_ICON(ANIM) -DEF_ICON(WORLD) +DEF_ICON_SHADING(WORLD) DEF_ICON(SCENE) DEF_ICON(EDIT) DEF_ICON(GAME) DEF_ICON(RADIO) -DEF_ICON(SCRIPT) -DEF_ICON(PARTICLES) +DEF_ICON_COLOR(SCRIPT) +DEF_ICON_MODIFIER(PARTICLES) DEF_ICON(PHYSICS) DEF_ICON(SPEAKER) DEF_ICON(TEXTURE_SHADED) @@ -142,32 +160,32 @@ DEF_ICON_BLANK(49) DEF_ICON_BLANK(50) DEF_ICON_BLANK(51) DEF_ICON_BLANK(52) -DEF_ICON_BLANK(52b) +DEF_ICON_COLOR(BLANK1) // Not actually blank - this is used all over the place /* EDITORS */ DEF_ICON(VIEW3D) -DEF_ICON(IPO) -DEF_ICON(OOPS) -DEF_ICON(BUTS) -DEF_ICON(FILESEL) -DEF_ICON(IMAGE_COL) +DEF_ICON(GRAPH) +DEF_ICON(OUTLINER) +DEF_ICON(PROPERTIES) +DEF_ICON(FILEBROWSER) +DEF_ICON(IMAGE) DEF_ICON(INFO) DEF_ICON(SEQUENCE) DEF_ICON(TEXT) -DEF_ICON(IMASEL) +DEF_ICON_BLANK(62) DEF_ICON(SOUND) DEF_ICON(ACTION) DEF_ICON(NLA) -DEF_ICON(SCRIPTWIN) +DEF_ICON(PREFERENCES) DEF_ICON(TIME) DEF_ICON(NODETREE) DEF_ICON(LOGIC) DEF_ICON(CONSOLE) -DEF_ICON(PREFERENCES) +DEF_ICON_BLANK(54) DEF_ICON(CLIP) DEF_ICON(ASSET_MANAGER) -DEF_ICON_BLANK(57) -DEF_ICON_BLANK(58) -DEF_ICON_BLANK(59) +DEF_ICON(NODE_COMPOSITING) +DEF_ICON(NODE_TEXTURE) +DEF_ICON(NODE_MATERIAL) DEF_ICON_BLANK(60) DEF_ICON_BLANK(61) @@ -181,151 +199,151 @@ DEF_ICON(WPAINT_HLT) DEF_ICON(SCULPTMODE_HLT) DEF_ICON(POSE_HLT) DEF_ICON(PARTICLEMODE) -DEF_ICON(LIGHTPAINT) -DEF_ICON(GREASEPENCIL_STROKE_PAINT) +DEF_ICON_COLOR(LIGHTPAINT) +DEF_ICON_COLOR(GREASEPENCIL_STROKE_PAINT) DEF_ICON_BLANK(64) DEF_ICON_BLANK(65) DEF_ICON_BLANK(66) DEF_ICON_BLANK(67) DEF_ICON_BLANK(68) -DEF_ICON_BLANK(69) -DEF_ICON_BLANK(70) -DEF_ICON_BLANK(71) -DEF_ICON_BLANK(72) -DEF_ICON_BLANK(73) -DEF_ICON_BLANK(74) -DEF_ICON_BLANK(75) -DEF_ICON_BLANK(76) -DEF_ICON_BLANK(77) +DEF_ICON(TRACKING) +DEF_ICON(TRACKING_BACKWARDS) +DEF_ICON(TRACKING_FORWARDS) +DEF_ICON(TRACKING_BACKWARDS_SINGLE) +DEF_ICON(TRACKING_FORWARDS_SINGLE) +DEF_ICON(TRACKING_CLEAR_BACKWARDS) +DEF_ICON(TRACKING_CLEAR_FORWARDS) +DEF_ICON(TRACKING_REFINE_BACKWARDS) +DEF_ICON(TRACKING_REFINE_FORWARDS) DEF_ICON_BLANK(77b) /* DATA */ DEF_ICON(SCENE_DATA) DEF_ICON(RENDERLAYERS) -DEF_ICON(WORLD_DATA) +DEF_ICON_SHADING(WORLD_DATA) DEF_ICON(OBJECT_DATA) DEF_ICON(MESH_DATA) DEF_ICON(CURVE_DATA) DEF_ICON(META_DATA) DEF_ICON(LATTICE_DATA) -DEF_ICON(LIGHT_DATA) -DEF_ICON(MATERIAL_DATA) -DEF_ICON(TEXTURE_DATA) +DEF_ICON_SHADING(LIGHT_DATA) +DEF_ICON_SHADING(MATERIAL_DATA) +DEF_ICON_SHADING(TEXTURE_DATA) DEF_ICON(ANIM_DATA) DEF_ICON(CAMERA_DATA) DEF_ICON(PARTICLE_DATA) DEF_ICON(LIBRARY_DATA_DIRECT) -DEF_ICON(GROUP) +DEF_ICON_COLLECTION(GROUP) DEF_ICON(ARMATURE_DATA) DEF_ICON(POSE_DATA) DEF_ICON(BONE_DATA) -DEF_ICON(CONSTRAINT) -DEF_ICON(SHAPEKEY_DATA) -DEF_ICON(CONSTRAINT_BONE) +DEF_ICON_MODIFIER(CONSTRAINT) +DEF_ICON_COLOR(SHAPEKEY_DATA) +DEF_ICON_MODIFIER(CONSTRAINT_BONE) DEF_ICON(CAMERA_STEREO) DEF_ICON(PACKAGE) DEF_ICON(UGLYPACKAGE) DEF_ICON_BLANK(79b) /* DATA */ -DEF_ICON(BRUSH_DATA) -DEF_ICON(IMAGE_DATA) +DEF_ICON_SHADING(BRUSH_DATA) +DEF_ICON_SHADING(IMAGE_DATA) DEF_ICON(FILE) DEF_ICON(FCURVE) DEF_ICON(FONT_DATA) DEF_ICON(RENDER_RESULT) DEF_ICON(SURFACE_DATA) DEF_ICON(EMPTY_DATA) -DEF_ICON(SETTINGS) +DEF_ICON_BLANK(88) DEF_ICON(RENDER_ANIMATION) DEF_ICON(RENDER_STILL) DEF_ICON(LIBRARY_DATA_BROKEN) -DEF_ICON(BOIDS) +DEF_ICON_COLOR(BOIDS) DEF_ICON(STRANDS) DEF_ICON(LIBRARY_DATA_INDIRECT) DEF_ICON(GREASEPENCIL) -DEF_ICON(LINE_DATA) -DEF_ICON(LIBRARY_DATA_OVERRIDE) +DEF_ICON_SHADING(LINE_DATA) +DEF_ICON_COLOR(LIBRARY_DATA_OVERRIDE) DEF_ICON(GROUP_BONE) DEF_ICON(GROUP_VERTEX) DEF_ICON(GROUP_VCOL) DEF_ICON(GROUP_UVS) -DEF_ICON_BLANK(89) +DEF_ICON(FACE_MAPS) DEF_ICON_BLANK(90) DEF_ICON(RNA) DEF_ICON(RNA_ADD) /* INPUT + DECORATOR */ -DEF_ICON_MONO(MOUSE_LMB) -DEF_ICON_MONO(MOUSE_MMB) -DEF_ICON_MONO(MOUSE_RMB) -DEF_ICON_MONO(MOUSE_MOVE) -DEF_ICON_MONO(MOUSE_LMB_DRAG) -DEF_ICON_MONO(MOUSE_MMB_DRAG) -DEF_ICON_MONO(MOUSE_RMB_DRAG) +DEF_ICON(MOUSE_LMB) +DEF_ICON(MOUSE_MMB) +DEF_ICON(MOUSE_RMB) +DEF_ICON(MOUSE_MOVE) +DEF_ICON(MOUSE_LMB_DRAG) +DEF_ICON(MOUSE_MMB_DRAG) +DEF_ICON(MOUSE_RMB_DRAG) DEF_ICON_BLANK(99) -DEF_ICON_MONO(PRESET) +DEF_ICON(PRESET) DEF_ICON_BLANK(101) -DEF_ICON_MONO(DECORATE) -DEF_ICON_MONO(DECORATE_KEYFRAME) -DEF_ICON_MONO(DECORATE_ANIMATE) -DEF_ICON_MONO(DECORATE_DRIVER) -DEF_ICON_MONO(DECORATE_LINKED) -DEF_ICON_MONO(DECORATE_OVERRIDE) -DEF_ICON_MONO(DECORATE_UNLOCKED) -DEF_ICON_MONO(DECORATE_LOCKED) +DEF_ICON(DECORATE) +DEF_ICON(DECORATE_KEYFRAME) +DEF_ICON(DECORATE_ANIMATE) +DEF_ICON(DECORATE_DRIVER) +DEF_ICON(DECORATE_LINKED) +DEF_ICON(DECORATE_OVERRIDE) +DEF_ICON(DECORATE_UNLOCKED) +DEF_ICON(DECORATE_LOCKED) DEF_ICON_BLANK(110) DEF_ICON_BLANK(111) DEF_ICON_BLANK(112) -DEF_ICON_BLANK(113) -DEF_ICON_BLANK(114) -DEF_ICON_MONO(USER) -DEF_ICON_BLANK(116) -DEF_ICON_BLANK(116b) +DEF_ICON(FAKE_USER) +DEF_ICON(ORPHAN_DATA) +DEF_ICON(USER) +DEF_ICON(SYSTEM) +DEF_ICON(SETTINGS) /* OUTLINER */ -DEF_ICON(OUTLINER_OB_EMPTY) -DEF_ICON(OUTLINER_OB_MESH) -DEF_ICON(OUTLINER_OB_CURVE) -DEF_ICON(OUTLINER_OB_LATTICE) -DEF_ICON(OUTLINER_OB_META) -DEF_ICON(OUTLINER_OB_LIGHT) -DEF_ICON(OUTLINER_OB_CAMERA) -DEF_ICON(OUTLINER_OB_ARMATURE) -DEF_ICON(OUTLINER_OB_FONT) -DEF_ICON(OUTLINER_OB_SURFACE) -DEF_ICON(OUTLINER_OB_SPEAKER) -DEF_ICON(OUTLINER_OB_FORCE_FIELD) -DEF_ICON(OUTLINER_OB_GROUP_INSTANCE) -DEF_ICON(OUTLINER_OB_GREASEPENCIL) -DEF_ICON(OUTLINER_OB_LIGHTPROBE) -DEF_ICON(OUTLINER_OB_IMAGE) +DEF_ICON_OBJECT(OUTLINER_OB_EMPTY) +DEF_ICON_OBJECT(OUTLINER_OB_MESH) +DEF_ICON_OBJECT(OUTLINER_OB_CURVE) +DEF_ICON_OBJECT(OUTLINER_OB_LATTICE) +DEF_ICON_OBJECT(OUTLINER_OB_META) +DEF_ICON_OBJECT(OUTLINER_OB_LIGHT) +DEF_ICON_OBJECT(OUTLINER_OB_CAMERA) +DEF_ICON_OBJECT(OUTLINER_OB_ARMATURE) +DEF_ICON_OBJECT(OUTLINER_OB_FONT) +DEF_ICON_OBJECT(OUTLINER_OB_SURFACE) +DEF_ICON_OBJECT(OUTLINER_OB_SPEAKER) +DEF_ICON_OBJECT(OUTLINER_OB_FORCE_FIELD) +DEF_ICON_OBJECT(OUTLINER_OB_GROUP_INSTANCE) +DEF_ICON_OBJECT(OUTLINER_OB_GREASEPENCIL) +DEF_ICON_OBJECT(OUTLINER_OB_LIGHTPROBE) +DEF_ICON_OBJECT(OUTLINER_OB_IMAGE) DEF_ICON_BLANK(125) DEF_ICON(RESTRICT_COLOR_OFF) DEF_ICON(RESTRICT_COLOR_ON) -DEF_ICON_MONO(HIDE_OFF) -DEF_ICON_MONO(HIDE_ON) -DEF_ICON_MONO(RESTRICT_SELECT_OFF) -DEF_ICON_MONO(RESTRICT_SELECT_ON) -DEF_ICON_MONO(RESTRICT_RENDER_OFF) -DEF_ICON_MONO(RESTRICT_RENDER_ON) +DEF_ICON(RESTRICT_VIEW_OFF) +DEF_ICON(RESTRICT_VIEW_ON) +DEF_ICON(RESTRICT_SELECT_OFF) +DEF_ICON(RESTRICT_SELECT_ON) +DEF_ICON(RESTRICT_RENDER_OFF) +DEF_ICON(RESTRICT_RENDER_ON) DEF_ICON_BLANK(127b) /* OUTLINER */ -DEF_ICON(OUTLINER_DATA_EMPTY) -DEF_ICON(OUTLINER_DATA_MESH) -DEF_ICON(OUTLINER_DATA_CURVE) -DEF_ICON(OUTLINER_DATA_LATTICE) -DEF_ICON(OUTLINER_DATA_META) -DEF_ICON(OUTLINER_DATA_LIGHT) -DEF_ICON(OUTLINER_DATA_CAMERA) -DEF_ICON(OUTLINER_DATA_ARMATURE) -DEF_ICON(OUTLINER_DATA_FONT) -DEF_ICON(OUTLINER_DATA_SURFACE) -DEF_ICON(OUTLINER_DATA_SPEAKER) -DEF_ICON(OUTLINER_DATA_POSE) -DEF_ICON(OUTLINER_DATA_GREASEPENCIL) -DEF_ICON_BLANK(131) +DEF_ICON_BLANK(128) +DEF_ICON_OBJECT_DATA(OUTLINER_DATA_MESH) +DEF_ICON_OBJECT_DATA(OUTLINER_DATA_CURVE) +DEF_ICON_OBJECT_DATA(OUTLINER_DATA_LATTICE) +DEF_ICON_OBJECT_DATA(OUTLINER_DATA_META) +DEF_ICON_OBJECT_DATA(OUTLINER_DATA_LIGHT) +DEF_ICON_OBJECT_DATA(OUTLINER_DATA_CAMERA) +DEF_ICON_OBJECT_DATA(OUTLINER_DATA_ARMATURE) +DEF_ICON_OBJECT_DATA(OUTLINER_DATA_FONT) +DEF_ICON_OBJECT_DATA(OUTLINER_DATA_SURFACE) +DEF_ICON_OBJECT_DATA(OUTLINER_DATA_SPEAKER) +DEF_ICON_OBJECT_DATA(OUTLINER_DATA_POSE) +DEF_ICON_BLANK(130) +DEF_ICON_OBJECT_DATA(OUTLINER_DATA_GREASEPENCIL) DEF_ICON_BLANK(132) DEF_ICON_BLANK(133) DEF_ICON_BLANK(134) @@ -333,10 +351,10 @@ DEF_ICON_BLANK(135) DEF_ICON_BLANK(136) DEF_ICON_BLANK(137) DEF_ICON_BLANK(138) -DEF_ICON_BLANK(139) -DEF_ICON_BLANK(140) -DEF_ICON_MONO(RESTRICT_VIEW_OFF) -DEF_ICON_MONO(RESTRICT_VIEW_ON) +DEF_ICON(ONIONSKIN_OFF) +DEF_ICON(ONIONSKIN_ON) +DEF_ICON(HIDE_OFF) +DEF_ICON(HIDE_ON) DEF_ICON_BLANK(142b) /* PRIMITIVES */ @@ -352,14 +370,14 @@ DEF_ICON(MESH_TORUS) DEF_ICON(MESH_CONE) DEF_ICON(MESH_CAPSULE) DEF_ICON_BLANK(611) -DEF_ICON(LIGHT_POINT) -DEF_ICON(LIGHT_SUN) -DEF_ICON(LIGHT_SPOT) -DEF_ICON(LIGHT_HEMI) -DEF_ICON(LIGHT_AREA) +DEF_ICON_SHADING(LIGHT_POINT) +DEF_ICON_SHADING(LIGHT_SUN) +DEF_ICON_SHADING(LIGHT_SPOT) +DEF_ICON_SHADING(LIGHT_HEMI) +DEF_ICON_SHADING(LIGHT_AREA) DEF_ICON_BLANK(617) DEF_ICON_BLANK(618) -DEF_ICON(META_EMPTY) +DEF_ICON_COLOR(META_EMPTY) DEF_ICON(META_PLANE) DEF_ICON(META_CUBE) DEF_ICON(META_BALL) @@ -382,33 +400,33 @@ DEF_ICON(CURVE_BEZCIRCLE) DEF_ICON(CURVE_NCURVE) DEF_ICON(CURVE_NCIRCLE) DEF_ICON(CURVE_PATH) -DEF_ICON(LIGHTPROBE_CUBEMAP) -DEF_ICON(LIGHTPROBE_PLANAR) -DEF_ICON(LIGHTPROBE_GRID) +DEF_ICON_SHADING(LIGHTPROBE_CUBEMAP) +DEF_ICON_SHADING(LIGHTPROBE_PLANAR) +DEF_ICON_SHADING(LIGHTPROBE_GRID) DEF_ICON_BLANK(647) DEF_ICON_BLANK(648) DEF_ICON(COLOR_RED) DEF_ICON(COLOR_GREEN) DEF_ICON(COLOR_BLUE) -DEF_ICON_MONO(TRIA_RIGHT_BAR) -DEF_ICON_MONO(TRIA_DOWN_BAR) -DEF_ICON_MONO(TRIA_LEFT_BAR) -DEF_ICON_MONO(TRIA_UP_BAR) +DEF_ICON(TRIA_RIGHT_BAR) +DEF_ICON(TRIA_DOWN_BAR) +DEF_ICON(TRIA_LEFT_BAR) +DEF_ICON(TRIA_UP_BAR) /* EMPTY */ -DEF_ICON(FORCE_FORCE) -DEF_ICON(FORCE_WIND) -DEF_ICON(FORCE_VORTEX) -DEF_ICON(FORCE_MAGNETIC) -DEF_ICON(FORCE_HARMONIC) -DEF_ICON(FORCE_CHARGE) -DEF_ICON(FORCE_LENNARDJONES) -DEF_ICON(FORCE_TEXTURE) -DEF_ICON(FORCE_CURVE) -DEF_ICON(FORCE_BOID) -DEF_ICON(FORCE_TURBULENCE) -DEF_ICON(FORCE_DRAG) -DEF_ICON(FORCE_SMOKEFLOW) +DEF_ICON_COLOR(FORCE_FORCE) +DEF_ICON_COLOR(FORCE_WIND) +DEF_ICON_COLOR(FORCE_VORTEX) +DEF_ICON_COLOR(FORCE_MAGNETIC) +DEF_ICON_COLOR(FORCE_HARMONIC) +DEF_ICON_COLOR(FORCE_CHARGE) +DEF_ICON_COLOR(FORCE_LENNARDJONES) +DEF_ICON_COLOR(FORCE_TEXTURE) +DEF_ICON_COLOR(FORCE_CURVE) +DEF_ICON_COLOR(FORCE_BOID) +DEF_ICON_COLOR(FORCE_TURBULENCE) +DEF_ICON_COLOR(FORCE_DRAG) +DEF_ICON_COLOR(FORCE_SMOKEFLOW) DEF_ICON_BLANK(673) DEF_ICON_BLANK(674) DEF_ICON_BLANK(675) @@ -424,14 +442,14 @@ DEF_ICON_BLANK(684) DEF_ICON_BLANK(685) /* EMPTY */ -DEF_ICON_BLANK(690) /* XXX 'Temperature' icon! */ +DEF_ICON_COLOR(TEMPERATURE) /* XXX 'Temperature' icon! */ DEF_ICON_BLANK(691) /* XXX 'Temperature' icon! */ -DEF_ICON_BLANK(692) /* XXX 'Gear' icon! */ +DEF_ICON_COLOR(GEAR) /* XXX 'Gear' icon! */ DEF_ICON(NODE_INSERT_ON) DEF_ICON(NODE_INSERT_OFF) -DEF_ICON_BLANK(695) -DEF_ICON_BLANK(696) -DEF_ICON_BLANK(697) +DEF_ICON(NODE_TOP) +DEF_ICON(NODE_SIDE) +DEF_ICON(NODE_CORNER) DEF_ICON_BLANK(698) DEF_ICON_BLANK(699) DEF_ICON_BLANK(700) @@ -452,19 +470,19 @@ DEF_ICON_BLANK(714) DEF_ICON_BLANK(715) /* EMPTY */ -DEF_ICON_MONO(ALIGN_LEFT) -DEF_ICON_MONO(ALIGN_CENTER) -DEF_ICON_MONO(ALIGN_RIGHT) -DEF_ICON_MONO(ALIGN_JUSTIFY) -DEF_ICON_MONO(ALIGN_FLUSH) -DEF_ICON_MONO(ALIGN_TOP) -DEF_ICON_MONO(ALIGN_MIDDLE) -DEF_ICON_MONO(ALIGN_BOTTOM) -DEF_ICON_MONO(BOLD) -DEF_ICON_MONO(ITALIC) -DEF_ICON_MONO(UNDERLINE) -DEF_ICON_MONO(SMALL_CAPS_ON) -DEF_ICON_MONO(SMALL_CAPS_OFF) +DEF_ICON(ALIGN_LEFT) +DEF_ICON(ALIGN_CENTER) +DEF_ICON(ALIGN_RIGHT) +DEF_ICON(ALIGN_JUSTIFY) +DEF_ICON(ALIGN_FLUSH) +DEF_ICON(ALIGN_TOP) +DEF_ICON(ALIGN_MIDDLE) +DEF_ICON(ALIGN_BOTTOM) +DEF_ICON(BOLD) +DEF_ICON(ITALIC) +DEF_ICON(UNDERLINE) +DEF_ICON(SMALL_CAPS) +DEF_ICON_BLANK(742) DEF_ICON_BLANK(743) DEF_ICON_BLANK(744) DEF_ICON_BLANK(745) @@ -508,51 +526,51 @@ DEF_ICON_BLANK(784) DEF_ICON_BLANK(785) /* MODIFIERS */ -DEF_ICON(MODIFIER) -DEF_ICON(MOD_WAVE) -DEF_ICON(MOD_BUILD) -DEF_ICON(MOD_DECIM) -DEF_ICON(MOD_MIRROR) -DEF_ICON(MOD_SOFT) -DEF_ICON(MOD_SUBSURF) -DEF_ICON(HOOK) -DEF_ICON(MOD_PHYSICS) -DEF_ICON(MOD_PARTICLES) -DEF_ICON(MOD_BOOLEAN) -DEF_ICON(MOD_EDGESPLIT) -DEF_ICON(MOD_ARRAY) -DEF_ICON(MOD_UVPROJECT) -DEF_ICON(MOD_DISPLACE) -DEF_ICON(MOD_CURVE) -DEF_ICON(MOD_LATTICE) -DEF_ICON(CONSTRAINT_DATA) -DEF_ICON(MOD_ARMATURE) -DEF_ICON(MOD_SHRINKWRAP) -DEF_ICON(MOD_CAST) -DEF_ICON(MOD_MESHDEFORM) -DEF_ICON(MOD_BEVEL) -DEF_ICON(MOD_SMOOTH) -DEF_ICON(MOD_SIMPLEDEFORM) -DEF_ICON(MOD_MASK) +DEF_ICON_MODIFIER(MODIFIER) +DEF_ICON_COLOR(MOD_WAVE) +DEF_ICON_COLOR(MOD_BUILD) +DEF_ICON_COLOR(MOD_DECIM) +DEF_ICON_COLOR(MOD_MIRROR) +DEF_ICON_COLOR(MOD_SOFT) +DEF_ICON_COLOR(MOD_SUBSURF) +DEF_ICON_COLOR(HOOK) +DEF_ICON_COLOR(MOD_PHYSICS) +DEF_ICON_COLOR(MOD_PARTICLES) +DEF_ICON_COLOR(MOD_BOOLEAN) +DEF_ICON_COLOR(MOD_EDGESPLIT) +DEF_ICON_COLOR(MOD_ARRAY) +DEF_ICON_COLOR(MOD_UVPROJECT) +DEF_ICON_COLOR(MOD_DISPLACE) +DEF_ICON_COLOR(MOD_CURVE) +DEF_ICON_COLOR(MOD_LATTICE) +DEF_ICON_COLOR(CONSTRAINT_DATA) +DEF_ICON_COLOR(MOD_ARMATURE) +DEF_ICON_COLOR(MOD_SHRINKWRAP) +DEF_ICON_COLOR(MOD_CAST) +DEF_ICON_COLOR(MOD_MESHDEFORM) +DEF_ICON_COLOR(MOD_BEVEL) +DEF_ICON_COLOR(MOD_SMOOTH) +DEF_ICON_COLOR(MOD_SIMPLEDEFORM) +DEF_ICON_COLOR(MOD_MASK) /* MODIFIERS */ -DEF_ICON(MOD_CLOTH) -DEF_ICON(MOD_EXPLODE) -DEF_ICON(MOD_FLUIDSIM) -DEF_ICON(MOD_MULTIRES) -DEF_ICON(MOD_SMOKE) -DEF_ICON(MOD_SOLIDIFY) -DEF_ICON(MOD_SCREW) -DEF_ICON(MOD_VERTEX_WEIGHT) -DEF_ICON(MOD_DYNAMICPAINT) -DEF_ICON(MOD_REMESH) -DEF_ICON(MOD_OCEAN) -DEF_ICON(MOD_WARP) -DEF_ICON(MOD_SKIN) -DEF_ICON(MOD_TRIANGULATE) -DEF_ICON(MOD_WIREFRAME) -DEF_ICON(MOD_DATA_TRANSFER) -DEF_ICON(MOD_NORMALEDIT) +DEF_ICON_COLOR(MOD_CLOTH) +DEF_ICON_COLOR(MOD_EXPLODE) +DEF_ICON_COLOR(MOD_FLUIDSIM) +DEF_ICON_COLOR(MOD_MULTIRES) +DEF_ICON_COLOR(MOD_SMOKE) +DEF_ICON_COLOR(MOD_SOLIDIFY) +DEF_ICON_COLOR(MOD_SCREW) +DEF_ICON_COLOR(MOD_VERTEX_WEIGHT) +DEF_ICON_COLOR(MOD_DYNAMICPAINT) +DEF_ICON_COLOR(MOD_REMESH) +DEF_ICON_COLOR(MOD_OCEAN) +DEF_ICON_COLOR(MOD_WARP) +DEF_ICON_COLOR(MOD_SKIN) +DEF_ICON_COLOR(MOD_TRIANGULATE) +DEF_ICON_COLOR(MOD_WIREFRAME) +DEF_ICON_COLOR(MOD_DATA_TRANSFER) +DEF_ICON_COLOR(MOD_NORMALEDIT) DEF_ICON_BLANK(169) DEF_ICON_BLANK(170) DEF_ICON_BLANK(171) @@ -564,24 +582,24 @@ DEF_ICON_BLANK(176) DEF_ICON_BLANK(177) /* ANIMATION */ -DEF_ICON_MONO(REC) -DEF_ICON_MONO(PLAY) -DEF_ICON_MONO(FF) -DEF_ICON_MONO(REW) -DEF_ICON_MONO(PAUSE) -DEF_ICON_MONO(PREV_KEYFRAME) -DEF_ICON_MONO(NEXT_KEYFRAME) +DEF_ICON(REC) +DEF_ICON(PLAY) +DEF_ICON(FF) +DEF_ICON(REW) +DEF_ICON(PAUSE) +DEF_ICON(PREV_KEYFRAME) +DEF_ICON(NEXT_KEYFRAME) DEF_ICON_BLANK(185) -DEF_ICON_MONO(PLAY_REVERSE) +DEF_ICON(PLAY_REVERSE) DEF_ICON(PREVIEW_RANGE) DEF_ICON(ACTION_TWEAK) DEF_ICON(PMARKER_ACT) DEF_ICON(PMARKER_SEL) -DEF_ICON(PMARKER) +DEF_ICON_COLOR(PMARKER) DEF_ICON(MARKER_HLT) DEF_ICON(MARKER) -DEF_ICON(SPACE2) // XXX -DEF_ICON(SPACE3) // XXX +DEF_ICON(KEYFRAME_HLT) +DEF_ICON(KEYFRAME) DEF_ICON(KEYINGSET) DEF_ICON(KEY_DEHLT) DEF_ICON(KEY_HLT) @@ -594,8 +612,8 @@ DEF_ICON(DRIVER) /* ANIMATION */ DEF_ICON(SOLO_OFF) DEF_ICON(SOLO_ON) -DEF_ICON_MONO(FRAME_PREV) -DEF_ICON_MONO(FRAME_NEXT) +DEF_ICON(FRAME_PREV) +DEF_ICON(FRAME_NEXT) DEF_ICON(NLA_PUSHDOWN) DEF_ICON(IPO_CONSTANT) DEF_ICON(IPO_LINEAR) @@ -614,7 +632,6 @@ DEF_ICON(IPO_EASE_IN) DEF_ICON(IPO_EASE_OUT) DEF_ICON(IPO_EASE_IN_OUT) DEF_ICON(NORMALIZE_FCURVES) - /* available */ DEF_ICON_BLANK(204) DEF_ICON_BLANK(205) DEF_ICON_BLANK(206) @@ -624,14 +641,14 @@ DEF_ICON_BLANK(207) DEF_ICON(VERTEXSEL) DEF_ICON(EDGESEL) DEF_ICON(FACESEL) -DEF_ICON(LOOPSEL) +DEF_ICON_BLANK(209) DEF_ICON_BLANK(210) -DEF_ICON(ROTATE) -DEF_ICON(CURSOR) -DEF_ICON(ROTATECOLLECTION) -DEF_ICON(ROTATECENTER) -DEF_ICON(ROTACTIVE) -DEF_ICON(ALIGN) +DEF_ICON(PIVOT_BOUNDBOX) +DEF_ICON(PIVOT_CURSOR) +DEF_ICON(PIVOT_INDIVIDUAL) +DEF_ICON(PIVOT_MEDIAN) +DEF_ICON(PIVOT_ACTIVE) +DEF_ICON(CENTER_ONLY) DEF_ICON_BLANK(211) DEF_ICON(SMOOTHCURVE) DEF_ICON(SPHERECURVE) @@ -649,10 +666,10 @@ DEF_ICON(PARTICLE_TIP) DEF_ICON(PARTICLE_PATH) /* EDITING */ -DEF_ICON(MAN_TRANS) -DEF_ICON(MAN_ROT) -DEF_ICON(MAN_SCALE) -DEF_ICON(MANIPUL) +DEF_ICON_COLOR(MAN_TRANS) +DEF_ICON_COLOR(MAN_ROT) +DEF_ICON_COLOR(MAN_SCALE) +DEF_ICON_COLOR(MANIPUL) DEF_ICON(SNAP_OFF) DEF_ICON(SNAP_ON) DEF_ICON(SNAP_NORMAL) @@ -670,11 +687,11 @@ DEF_ICON(CLIPUV_HLT) DEF_ICON(SNAP_PEEL_OBJECT) DEF_ICON(GRID) DEF_ICON(OBJECT_ORIGIN) -DEF_ICON_BLANK(222) -DEF_ICON_BLANK(224) -DEF_ICON_BLANK(225) -DEF_ICON_BLANK(226) -DEF_ICON_BLANK(226b) +DEF_ICON(ORIENTATION_GLOBAL) +DEF_ICON(ORIENTATION_GIMBAL) +DEF_ICON(ORIENTATION_LOCAL) +DEF_ICON(ORIENTATION_NORMAL) +DEF_ICON(ORIENTATION_VIEW) /* EDITING */ DEF_ICON(PASTEDOWN) @@ -685,10 +702,10 @@ DEF_ICON(VIS_SEL_11) DEF_ICON(VIS_SEL_10) DEF_ICON(VIS_SEL_01) DEF_ICON(VIS_SEL_00) -DEF_ICON(SNAP_SURFACE) +DEF_ICON_BLANK(231) DEF_ICON(AUTOMERGE_ON) DEF_ICON(AUTOMERGE_OFF) -DEF_ICON(RETOPO) +DEF_ICON_COLOR(RETOPO) DEF_ICON(UV_VERTEXSEL) DEF_ICON(UV_EDGESEL) DEF_ICON(UV_FACESEL) @@ -700,18 +717,18 @@ DEF_ICON_BLANK(242) DEF_ICON_BLANK(243) DEF_ICON_BLANK(244) DEF_ICON_BLANK(245) -DEF_ICON_BLANK(246) -DEF_ICON_BLANK(247) -DEF_ICON_BLANK(247b) +DEF_ICON(NORMALS_VERTEX) +DEF_ICON(NORMALS_VERTEX_FACE) +DEF_ICON(NORMALS_FACE) /* 3D VIEW */ -DEF_ICON(BBOX) -DEF_ICON(WIRE) -DEF_ICON(SOLID) -DEF_ICON(SMOOTH) -DEF_ICON(POTATO) +DEF_ICON(SHADING_BBOX) +DEF_ICON(SHADING_WIRE) +DEF_ICON(SHADING_SOLID) +DEF_ICON(SHADING_RENDERED) +DEF_ICON(SHADING_TEXTURE) DEF_ICON(OVERLAY) -DEF_ICON(ORTHO) +DEF_ICON(XRAY) DEF_ICON_BLANK(249) DEF_ICON_BLANK(250) DEF_ICON(LOCKVIEW_OFF) @@ -766,17 +783,17 @@ DEF_ICON(SORTTIME) DEF_ICON(SORTSIZE) DEF_ICON(LONGDISPLAY) DEF_ICON(SHORTDISPLAY) -DEF_ICON(GHOST) -DEF_ICON(IMGDISPLAY) -DEF_ICON(SAVE_AS) -DEF_ICON(SAVE_COPY) +DEF_ICON_COLOR(GHOST) +DEF_ICON_COLOR(IMGDISPLAY) +DEF_ICON_BLANK(292) +DEF_ICON_BLANK(293) DEF_ICON(BOOKMARKS) DEF_ICON(FONTPREVIEW) DEF_ICON(FILTER) DEF_ICON(NEWFOLDER) DEF_ICON(OPEN_RECENT) -DEF_ICON_MONO(FILE_PARENT) -DEF_ICON_MONO(FILE_REFRESH) +DEF_ICON(FILE_PARENT) +DEF_ICON(FILE_REFRESH) DEF_ICON(FILE_FOLDER) DEF_ICON(FILE_BLANK) DEF_ICON(FILE_BLEND) @@ -788,29 +805,29 @@ DEF_ICON(FILE_FONT) DEF_ICON(FILE_TEXT) /* FILE SELECT */ -DEF_ICON_MONO(RECOVER_AUTO) -DEF_ICON_MONO(SAVE_PREFS) -DEF_ICON_MONO(LINK_BLEND) -DEF_ICON_MONO(APPEND_BLEND) -DEF_ICON_MONO(IMPORT) -DEF_ICON_MONO(EXPORT) -DEF_ICON(EXTERNAL_DATA) -DEF_ICON(LOAD_FACTORY) +DEF_ICON(SORT_DESC) +DEF_ICON(SORT_ASC) +DEF_ICON(LINK_BLEND) +DEF_ICON(APPEND_BLEND) +DEF_ICON(IMPORT) +DEF_ICON(EXPORT) +DEF_ICON_COLOR(EXTERNAL_DATA) +DEF_ICON_BLANK(299) DEF_ICON_BLANK(300) DEF_ICON_BLANK(301) DEF_ICON_BLANK(302) DEF_ICON_BLANK(303) DEF_ICON_BLANK(304) -DEF_ICON_MONO(LOOP_BACK) -DEF_ICON_MONO(LOOP_FORWARDS) -DEF_ICON_MONO(BACK) -DEF_ICON_MONO(FORWARD) +DEF_ICON(LOOP_BACK) +DEF_ICON(LOOP_FORWARDS) +DEF_ICON(BACK) +DEF_ICON(FORWARD) DEF_ICON_BLANK(309) DEF_ICON_BLANK(310) DEF_ICON_BLANK(311) DEF_ICON_BLANK(312) -DEF_ICON_BLANK(313) -DEF_ICON_BLANK(314) +DEF_ICON(ALEMBIC) +DEF_ICON(VOLUME) DEF_ICON(FILE_HIDDEN) DEF_ICON(FILE_BACKUP) DEF_ICON(DISK_DRIVE) @@ -857,7 +874,7 @@ DEF_ICON(IMAGE_RGB) // XXX CHANGE TO STRAIGHT ALPHA, Z ETC DEF_ICON(IMAGE_RGB_ALPHA) DEF_ICON(IMAGE_ALPHA) DEF_ICON(IMAGE_ZDEPTH) -DEF_ICON(IMAGEFILE) +DEF_ICON_COLOR(IMAGEFILE) DEF_ICON_BLANK(336) DEF_ICON_BLANK(337) DEF_ICON_BLANK(338) @@ -873,88 +890,88 @@ DEF_ICON(VIEW_ZOOM) /* brush icons */ -DEF_ICON(BRUSH_ADD) -DEF_ICON(BRUSH_BLOB) -DEF_ICON(BRUSH_BLUR) -DEF_ICON(BRUSH_CLAY) -DEF_ICON(BRUSH_CLAY_STRIPS) -DEF_ICON(BRUSH_CLONE) -DEF_ICON(BRUSH_CREASE) -DEF_ICON(BRUSH_DARKEN) -DEF_ICON(BRUSH_FILL) -DEF_ICON(BRUSH_FLATTEN) -DEF_ICON(BRUSH_GRAB) -DEF_ICON(BRUSH_INFLATE) -DEF_ICON(BRUSH_LAYER) -DEF_ICON(BRUSH_LIGHTEN) -DEF_ICON(BRUSH_MASK) -DEF_ICON(BRUSH_MIX) -DEF_ICON(BRUSH_MULTIPLY) -DEF_ICON(BRUSH_NUDGE) -DEF_ICON(BRUSH_PINCH) -DEF_ICON(BRUSH_SCRAPE) -DEF_ICON(BRUSH_SCULPT_DRAW) -DEF_ICON(BRUSH_SMEAR) -DEF_ICON(BRUSH_SMOOTH) -DEF_ICON(BRUSH_SNAKE_HOOK) -DEF_ICON(BRUSH_SOFTEN) -DEF_ICON(BRUSH_SUBTRACT) -DEF_ICON(BRUSH_TEXDRAW) -DEF_ICON(BRUSH_TEXFILL) -DEF_ICON(BRUSH_TEXMASK) -DEF_ICON(BRUSH_THUMB) -DEF_ICON(BRUSH_ROTATE) -DEF_ICON(BRUSH_VERTEXDRAW) +DEF_ICON_COLOR(BRUSH_ADD) +DEF_ICON_COLOR(BRUSH_BLOB) +DEF_ICON_COLOR(BRUSH_BLUR) +DEF_ICON_COLOR(BRUSH_CLAY) +DEF_ICON_COLOR(BRUSH_CLAY_STRIPS) +DEF_ICON_COLOR(BRUSH_CLONE) +DEF_ICON_COLOR(BRUSH_CREASE) +DEF_ICON_COLOR(BRUSH_DARKEN) +DEF_ICON_COLOR(BRUSH_FILL) +DEF_ICON_COLOR(BRUSH_FLATTEN) +DEF_ICON_COLOR(BRUSH_GRAB) +DEF_ICON_COLOR(BRUSH_INFLATE) +DEF_ICON_COLOR(BRUSH_LAYER) +DEF_ICON_COLOR(BRUSH_LIGHTEN) +DEF_ICON_COLOR(BRUSH_MASK) +DEF_ICON_COLOR(BRUSH_MIX) +DEF_ICON_COLOR(BRUSH_MULTIPLY) +DEF_ICON_COLOR(BRUSH_NUDGE) +DEF_ICON_COLOR(BRUSH_PINCH) +DEF_ICON_COLOR(BRUSH_SCRAPE) +DEF_ICON_COLOR(BRUSH_SCULPT_DRAW) +DEF_ICON_COLOR(BRUSH_SMEAR) +DEF_ICON_COLOR(BRUSH_SMOOTH) +DEF_ICON_COLOR(BRUSH_SNAKE_HOOK) +DEF_ICON_COLOR(BRUSH_SOFTEN) +DEF_ICON_COLOR(BRUSH_SUBTRACT) +DEF_ICON_COLOR(BRUSH_TEXDRAW) +DEF_ICON_COLOR(BRUSH_TEXFILL) +DEF_ICON_COLOR(BRUSH_TEXMASK) +DEF_ICON_COLOR(BRUSH_THUMB) +DEF_ICON_COLOR(BRUSH_ROTATE) +DEF_ICON_COLOR(BRUSH_VERTEXDRAW) /* Matcaps */ -DEF_ICON(MATCAP_01) -DEF_ICON(MATCAP_02) -DEF_ICON(MATCAP_03) -DEF_ICON(MATCAP_04) -DEF_ICON(MATCAP_05) -DEF_ICON(MATCAP_06) -DEF_ICON(MATCAP_07) -DEF_ICON(MATCAP_08) -DEF_ICON(MATCAP_09) -DEF_ICON(MATCAP_10) -DEF_ICON(MATCAP_11) -DEF_ICON(MATCAP_12) -DEF_ICON(MATCAP_13) -DEF_ICON(MATCAP_14) -DEF_ICON(MATCAP_15) -DEF_ICON(MATCAP_16) -DEF_ICON(MATCAP_17) -DEF_ICON(MATCAP_18) -DEF_ICON(MATCAP_19) -DEF_ICON(MATCAP_20) -DEF_ICON(MATCAP_21) -DEF_ICON(MATCAP_22) -DEF_ICON(MATCAP_23) -DEF_ICON(MATCAP_24) +DEF_ICON_COLOR(MATCAP_01) +DEF_ICON_COLOR(MATCAP_02) +DEF_ICON_COLOR(MATCAP_03) +DEF_ICON_COLOR(MATCAP_04) +DEF_ICON_COLOR(MATCAP_05) +DEF_ICON_COLOR(MATCAP_06) +DEF_ICON_COLOR(MATCAP_07) +DEF_ICON_COLOR(MATCAP_08) +DEF_ICON_COLOR(MATCAP_09) +DEF_ICON_COLOR(MATCAP_10) +DEF_ICON_COLOR(MATCAP_11) +DEF_ICON_COLOR(MATCAP_12) +DEF_ICON_COLOR(MATCAP_13) +DEF_ICON_COLOR(MATCAP_14) +DEF_ICON_COLOR(MATCAP_15) +DEF_ICON_COLOR(MATCAP_16) +DEF_ICON_COLOR(MATCAP_17) +DEF_ICON_COLOR(MATCAP_18) +DEF_ICON_COLOR(MATCAP_19) +DEF_ICON_COLOR(MATCAP_20) +DEF_ICON_COLOR(MATCAP_21) +DEF_ICON_COLOR(MATCAP_22) +DEF_ICON_COLOR(MATCAP_23) +DEF_ICON_COLOR(MATCAP_24) /* grease pencil sculpt */ -DEF_ICON(GPBRUSH_SMOOTH) -DEF_ICON(GPBRUSH_THICKNESS) -DEF_ICON(GPBRUSH_STRENGTH) -DEF_ICON(GPBRUSH_GRAB) -DEF_ICON(GPBRUSH_PUSH) -DEF_ICON(GPBRUSH_TWIST) -DEF_ICON(GPBRUSH_PINCH) -DEF_ICON(GPBRUSH_RANDOMIZE) -DEF_ICON(GPBRUSH_CLONE) -DEF_ICON(GPBRUSH_WEIGHT) +DEF_ICON_COLOR(GPBRUSH_SMOOTH) +DEF_ICON_COLOR(GPBRUSH_THICKNESS) +DEF_ICON_COLOR(GPBRUSH_STRENGTH) +DEF_ICON_COLOR(GPBRUSH_GRAB) +DEF_ICON_COLOR(GPBRUSH_PUSH) +DEF_ICON_COLOR(GPBRUSH_TWIST) +DEF_ICON_COLOR(GPBRUSH_PINCH) +DEF_ICON_COLOR(GPBRUSH_RANDOMIZE) +DEF_ICON_COLOR(GPBRUSH_CLONE) +DEF_ICON_COLOR(GPBRUSH_WEIGHT) -DEF_ICON(GPBRUSH_PENCIL) -DEF_ICON(GPBRUSH_PEN) -DEF_ICON(GPBRUSH_INK) -DEF_ICON(GPBRUSH_INKNOISE) -DEF_ICON(GPBRUSH_BLOCK) -DEF_ICON(GPBRUSH_MARKER) -DEF_ICON(GPBRUSH_CUSTOM) -DEF_ICON(GPBRUSH_FILL) -DEF_ICON(GPBRUSH_ERASE_SOFT) -DEF_ICON(GPBRUSH_ERASE_HARD) -DEF_ICON(GPBRUSH_ERASE_STROKE) +DEF_ICON_COLOR(GPBRUSH_PENCIL) +DEF_ICON_COLOR(GPBRUSH_PEN) +DEF_ICON_COLOR(GPBRUSH_INK) +DEF_ICON_COLOR(GPBRUSH_INKNOISE) +DEF_ICON_COLOR(GPBRUSH_BLOCK) +DEF_ICON_COLOR(GPBRUSH_MARKER) +DEF_ICON_COLOR(GPBRUSH_CUSTOM) +DEF_ICON_COLOR(GPBRUSH_FILL) +DEF_ICON_COLOR(GPBRUSH_ERASE_SOFT) +DEF_ICON_COLOR(GPBRUSH_ERASE_HARD) +DEF_ICON_COLOR(GPBRUSH_ERASE_STROKE) /* Vector Icons */ DEF_ICON_VECTOR(SMALL_TRI_RIGHT_VEC) @@ -987,53 +1004,65 @@ DEF_ICON_VECTOR(COLORSET_19_VEC) DEF_ICON_VECTOR(COLORSET_20_VEC) /* Events */ -DEF_ICON(EVENT_A) -DEF_ICON(EVENT_B) -DEF_ICON(EVENT_C) -DEF_ICON(EVENT_D) -DEF_ICON(EVENT_E) -DEF_ICON(EVENT_F) -DEF_ICON(EVENT_G) -DEF_ICON(EVENT_H) -DEF_ICON(EVENT_I) -DEF_ICON(EVENT_J) -DEF_ICON(EVENT_K) -DEF_ICON(EVENT_L) -DEF_ICON(EVENT_M) -DEF_ICON(EVENT_N) -DEF_ICON(EVENT_O) -DEF_ICON(EVENT_P) -DEF_ICON(EVENT_Q) -DEF_ICON(EVENT_R) -DEF_ICON(EVENT_S) -DEF_ICON(EVENT_T) -DEF_ICON(EVENT_U) -DEF_ICON(EVENT_V) -DEF_ICON(EVENT_W) -DEF_ICON(EVENT_X) -DEF_ICON(EVENT_Y) -DEF_ICON(EVENT_Z) -DEF_ICON(EVENT_SHIFT) -DEF_ICON(EVENT_CTRL) -DEF_ICON(EVENT_ALT) -DEF_ICON(EVENT_OS) -DEF_ICON(EVENT_F1) -DEF_ICON(EVENT_F2) -DEF_ICON(EVENT_F3) -DEF_ICON(EVENT_F4) -DEF_ICON(EVENT_F5) -DEF_ICON(EVENT_F6) -DEF_ICON(EVENT_F7) -DEF_ICON(EVENT_F8) -DEF_ICON(EVENT_F9) -DEF_ICON(EVENT_F10) -DEF_ICON(EVENT_F11) -DEF_ICON(EVENT_F12) -DEF_ICON(EVENT_ESC) -DEF_ICON(EVENT_TAB) -DEF_ICON(EVENT_PAGEUP) -DEF_ICON(EVENT_PAGEDOWN) -DEF_ICON(EVENT_HOME) -DEF_ICON(EVENT_END) -DEF_ICON(EVENT_RETURN) +DEF_ICON_COLOR(EVENT_A) +DEF_ICON_COLOR(EVENT_B) +DEF_ICON_COLOR(EVENT_C) +DEF_ICON_COLOR(EVENT_D) +DEF_ICON_COLOR(EVENT_E) +DEF_ICON_COLOR(EVENT_F) +DEF_ICON_COLOR(EVENT_G) +DEF_ICON_COLOR(EVENT_H) +DEF_ICON_COLOR(EVENT_I) +DEF_ICON_COLOR(EVENT_J) +DEF_ICON_COLOR(EVENT_K) +DEF_ICON_COLOR(EVENT_L) +DEF_ICON_COLOR(EVENT_M) +DEF_ICON_COLOR(EVENT_N) +DEF_ICON_COLOR(EVENT_O) +DEF_ICON_COLOR(EVENT_P) +DEF_ICON_COLOR(EVENT_Q) +DEF_ICON_COLOR(EVENT_R) +DEF_ICON_COLOR(EVENT_S) +DEF_ICON_COLOR(EVENT_T) +DEF_ICON_COLOR(EVENT_U) +DEF_ICON_COLOR(EVENT_V) +DEF_ICON_COLOR(EVENT_W) +DEF_ICON_COLOR(EVENT_X) +DEF_ICON_COLOR(EVENT_Y) +DEF_ICON_COLOR(EVENT_Z) +DEF_ICON_COLOR(EVENT_SHIFT) +DEF_ICON_COLOR(EVENT_CTRL) +DEF_ICON_COLOR(EVENT_ALT) +DEF_ICON_COLOR(EVENT_OS) +DEF_ICON_COLOR(EVENT_F1) +DEF_ICON_COLOR(EVENT_F2) +DEF_ICON_COLOR(EVENT_F3) +DEF_ICON_COLOR(EVENT_F4) +DEF_ICON_COLOR(EVENT_F5) +DEF_ICON_COLOR(EVENT_F6) +DEF_ICON_COLOR(EVENT_F7) +DEF_ICON_COLOR(EVENT_F8) +DEF_ICON_COLOR(EVENT_F9) +DEF_ICON_COLOR(EVENT_F10) +DEF_ICON_COLOR(EVENT_F11) +DEF_ICON_COLOR(EVENT_F12) +DEF_ICON_COLOR(EVENT_ESC) +DEF_ICON_COLOR(EVENT_TAB) +DEF_ICON_COLOR(EVENT_PAGEUP) +DEF_ICON_COLOR(EVENT_PAGEDOWN) +DEF_ICON_COLOR(EVENT_HOME) +DEF_ICON_COLOR(EVENT_END) +DEF_ICON_COLOR(EVENT_RETURN) /* add as needed. */ + +/* Undefine all types. */ + +#undef DEF_ICON +#undef DEF_ICON_COLLECTION +#undef DEF_ICON_OBJECT +#undef DEF_ICON_OBJECT_DATA +#undef DEF_ICON_MODIFIER +#undef DEF_ICON_SHADING +#undef DEF_ICON_VECTOR +#undef DEF_ICON_COLOR +#undef DEF_ICON_BLANK diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 72766087930..ed1aa1212fa 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -1124,7 +1124,7 @@ void uiTemplateList( uiLayout *layout, struct bContext *C, const char *listtype_name, const char *list_id, struct PointerRNA *dataptr, const char *propname, struct PointerRNA *active_dataptr, const char *active_propname, const char *item_dyntip_propname, - int rows, int maxrows, int layout_type, int columns); + int rows, int maxrows, int layout_type, int columns, bool reverse); void uiTemplateNodeLink(uiLayout *layout, struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *input); void uiTemplateNodeView(uiLayout *layout, struct bContext *C, struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *input); void uiTemplateTextureUser(uiLayout *layout, struct bContext *C); diff --git a/source/blender/editors/include/UI_resources.h b/source/blender/editors/include/UI_resources.h index 458b43231d9..1a8b7bb12af 100644 --- a/source/blender/editors/include/UI_resources.h +++ b/source/blender/editors/include/UI_resources.h @@ -29,14 +29,15 @@ * \ingroup editorui */ +#include "BLI_sys_types.h" + #ifndef __UI_RESOURCES_H__ #define __UI_RESOURCES_H__ -/* elubie: TODO: move the typedef for icons to UI_interface_icons.h */ -/* and add/replace include of UI_resources.h by UI_interface_icons.h */ +/* Define icon enum. */ #define DEF_ICON(name) ICON_##name, #define DEF_ICON_VECTOR(name) ICON_##name, -#define DEF_ICON_MONO(name) ICON_##name, +#define DEF_ICON_COLOR(name) ICON_##name, #define DEF_ICON_BLANK(name) ICON_BLANK_##name, typedef enum { @@ -47,11 +48,6 @@ typedef enum { #define BIFICONID_FIRST (ICON_NONE) -#undef DEF_ICON -#undef DEF_ICON_VECTOR -#undef DEF_ICON_MONO -#undef DEF_ICON_BLANK - /* use to denote intentionally unset theme color */ #define TH_UNDEFINED -1 @@ -267,6 +263,12 @@ typedef enum ThemeColorID { TH_ANIM_INACTIVE, /* no active action */ TH_ANIM_PREVIEW_RANGE,/* preview range overlay */ + TH_ICON_COLLECTION, + TH_ICON_OBJECT, + TH_ICON_OBJECT_DATA, + TH_ICON_MODIFIER, + TH_ICON_SHADING, + TH_NLA_TWEAK, /* 'tweaking' track in NLA */ TH_NLA_TWEAK_DUPLI, /* error/warning flag for other strips referencing dupli strip */ @@ -366,6 +368,9 @@ void UI_GetThemeColor4ubv(int colorid, unsigned char col[4]); // get a theme color from specified space type void UI_GetThemeColorType4ubv(int colorid, int spacetype, char col[4]); +// get theme color for coloring monochrome icons +bool UI_GetIconThemeColor4fv(int colorid, float col[4]); + // shade a 3 byte color (same as UI_GetColorPtrBlendShade3ubv with 0.0 factor) void UI_GetColorPtrShade3ubv(const unsigned char cp1[3], unsigned char col[3], int offset); diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index dcd09f0d4b0..1916023ab07 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -3316,10 +3316,11 @@ static uiBut *ui_def_but( if (block->flag & UI_BLOCK_RADIAL) { but->drawflag |= UI_BUT_TEXT_LEFT; - if (but->str && but->str[0]) + if (but->str && but->str[0]) { but->drawflag |= UI_BUT_ICON_LEFT; + } } - else if ((block->flag & UI_BLOCK_LOOP) || + else if (((block->flag & UI_BLOCK_LOOP) && !ui_block_is_popover(block)) || ELEM(but->type, UI_BTYPE_MENU, UI_BTYPE_TEXT, UI_BTYPE_LABEL, UI_BTYPE_BLOCK, UI_BTYPE_BUT_MENU, UI_BTYPE_SEARCH_MENU, diff --git a/source/blender/editors/interface/interface_draw.c b/source/blender/editors/interface/interface_draw.c index 715980953a5..fcff7378754 100644 --- a/source/blender/editors/interface/interface_draw.c +++ b/source/blender/editors/interface/interface_draw.c @@ -259,7 +259,7 @@ static void round_box_shade_col(unsigned attrib, const float col1[3], float cons fac * col1[2] + (1.0f - fac) * col2[2], 1.0f }; - immAttrib4fv(attrib, col); + immAttr4fv(attrib, col); } #endif @@ -573,7 +573,7 @@ void ui_draw_but_TAB_outline(const rcti *rect, float rad, unsigned char highligh immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR); immBeginAtMost(GPU_PRIM_LINE_STRIP, 25); - immAttrib3ubv(col, highlight); + immAttr3ubv(col, highlight); /* start with corner left-top */ if (roundboxtype & UI_CNR_TOP_LEFT) { @@ -599,7 +599,7 @@ void ui_draw_but_TAB_outline(const rcti *rect, float rad, unsigned char highligh immVertex2f(pos, maxx, maxy); } - immAttrib3ubv(col, highlight_fade); + immAttr3ubv(col, highlight_fade); /* corner right-bottom */ if (roundboxtype & UI_CNR_BOTTOM_RIGHT) { @@ -625,7 +625,7 @@ void ui_draw_but_TAB_outline(const rcti *rect, float rad, unsigned char highligh immVertex2f(pos, minx, miny); } - immAttrib3ubv(col, highlight); + immAttr3ubv(col, highlight); /* back to corner left-top */ immVertex2f(pos, minx, roundboxtype & UI_CNR_TOP_LEFT ? maxy - rad : maxy); @@ -1456,7 +1456,7 @@ void ui_draw_but_COLORBAND(uiBut *but, uiWidgetColors *UNUSED(wcol), const rcti v1[0] = v2[0] = x1 + a; - immAttrib4fv(col_id, colf); + immAttr4fv(col_id, colf); immVertex2fv(pos_id, v1); immVertex2fv(pos_id, v2); } @@ -1475,7 +1475,7 @@ void ui_draw_but_COLORBAND(uiBut *but, uiWidgetColors *UNUSED(wcol), const rcti v1[0] = v2[0] = x1 + a; - immAttrib4f(col_id, colf[0], colf[1], colf[2], 1.0f); + immAttr4f(col_id, colf[0], colf[1], colf[2], 1.0f); immVertex2fv(pos_id, v1); immVertex2fv(pos_id, v2); } @@ -1822,7 +1822,7 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, const rcti UI_GetThemeColor4fv(TH_TEXT, color); float fx = rect->xmin + zoomx * (cmp[a].x - offsx); float fy = rect->ymin + zoomy * (cmp[a].y - offsy); - immAttrib4fv(col, color); + immAttr4fv(col, color); immVertex2f(pos, fx, fy); } immEnd(); @@ -1945,9 +1945,9 @@ void ui_draw_but_TRACKPREVIEW(ARegion *UNUSED(ar), uiBut *but, uiWidgetColors *U float y2 = pos_sel[i + 1] * axe; if (i % 2 == 1) - immAttrib4fv(col, col_sel); + immAttr4fv(col, col_sel); else - immAttrib4fv(col, col_outline); + immAttr4fv(col, col_outline); immVertex2f(pos, x1, y1); immVertex2f(pos, x2, y2); @@ -2078,38 +2078,38 @@ static void ui_shadowbox(unsigned pos, unsigned color, float minx, float miny, f const float v8[2] = {minx + 0.5f * shadsize, miny - shadsize}; /* right quad */ - immAttrib4ub(color, 0, 0, 0, alpha); + immAttr4ub(color, 0, 0, 0, alpha); immVertex2fv(pos, v3); immVertex2fv(pos, v1); - immAttrib4ub(color, 0, 0, 0, 0); + immAttr4ub(color, 0, 0, 0, 0); immVertex2fv(pos, v2); immVertex2fv(pos, v2); immVertex2fv(pos, v4); - immAttrib4ub(color, 0, 0, 0, alpha); + immAttr4ub(color, 0, 0, 0, alpha); immVertex2fv(pos, v3); /* corner shape */ - /* immAttrib4ub(color, 0, 0, 0, alpha); */ /* Not needed, done above in previous tri */ + /* immAttr4ub(color, 0, 0, 0, alpha); */ /* Not needed, done above in previous tri */ immVertex2fv(pos, v3); - immAttrib4ub(color, 0, 0, 0, 0); + immAttr4ub(color, 0, 0, 0, 0); immVertex2fv(pos, v4); immVertex2fv(pos, v5); immVertex2fv(pos, v5); immVertex2fv(pos, v6); - immAttrib4ub(color, 0, 0, 0, alpha); + immAttr4ub(color, 0, 0, 0, alpha); immVertex2fv(pos, v3); /* bottom quad */ - /* immAttrib4ub(color, 0, 0, 0, alpha); */ /* Not needed, done above in previous tri */ + /* immAttr4ub(color, 0, 0, 0, alpha); */ /* Not needed, done above in previous tri */ immVertex2fv(pos, v3); - immAttrib4ub(color, 0, 0, 0, 0); + immAttr4ub(color, 0, 0, 0, 0); immVertex2fv(pos, v6); immVertex2fv(pos, v8); immVertex2fv(pos, v8); - immAttrib4ub(color, 0, 0, 0, alpha); + immAttr4ub(color, 0, 0, 0, alpha); immVertex2fv(pos, v7); immVertex2fv(pos, v3); } diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 1891687b28b..b883984a702 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -2076,22 +2076,22 @@ static void ui_but_set_float_array(bContext *C, uiBut *but, uiHandleButtonData * button_activate_state(C, but, BUTTON_STATE_EXIT); } -static void float_array_to_string(float *values, int array_length, char *output, int max_output_len) +static void float_array_to_string(float *values, int array_length, char *output, int output_len_max) { /* to avoid buffer overflow attacks; numbers are quite arbitrary */ - BLI_assert(max_output_len > 15); - max_output_len -= 10; + BLI_assert(output_len_max > 15); + output_len_max -= 10; int current_index = 0; output[current_index] = '['; current_index++; for (int i = 0; i < array_length; i++) { - int length = BLI_snprintf(output + current_index, max_output_len - current_index, "%f", values[i]); + int length = BLI_snprintf(output + current_index, output_len_max - current_index, "%f", values[i]); current_index += length; if (i < array_length - 1) { - if (current_index < max_output_len) { + if (current_index < output_len_max) { output[current_index + 0] = ','; output[current_index + 1] = ' '; current_index += 2; @@ -2103,12 +2103,12 @@ static void float_array_to_string(float *values, int array_length, char *output, output[current_index + 1] = '\0'; } -static void ui_but_copy_numeric_array(uiBut *but, char *output, int max_output_len) +static void ui_but_copy_numeric_array(uiBut *but, char *output, int output_len_max) { int array_length = get_but_property_array_length(but); float *values = alloca(array_length * sizeof(float)); RNA_property_float_get_array(&but->rnapoin, but->rnaprop, values); - float_array_to_string(values, array_length, output, max_output_len); + float_array_to_string(values, array_length, output, output_len_max); } static bool parse_float_array(char *text, float *values, int expected_length) @@ -2146,11 +2146,11 @@ static void ui_but_paste_numeric_array(bContext *C, uiBut *but, uiHandleButtonDa } } -static void ui_but_copy_numeric_value(uiBut *but, char *output, int max_output_len) +static void ui_but_copy_numeric_value(uiBut *but, char *output, int output_len_max) { /* Get many decimal places, then strip trailing zeros. * note: too high values start to give strange results */ - ui_but_string_get_ex(but, output, max_output_len, UI_PRECISION_FLOAT_MAX, false, NULL); + ui_but_string_get_ex(but, output, output_len_max, UI_PRECISION_FLOAT_MAX, false, NULL); BLI_str_rstrip_float_zero(output, '\0'); } @@ -2192,7 +2192,7 @@ static void ui_but_paste_normalized_vector(bContext *C, uiBut *but, char *buf_pa } } -static void ui_but_copy_color(uiBut *but, char *output, int max_output_len) +static void ui_but_copy_color(uiBut *but, char *output, int output_len_max) { float rgba[4]; @@ -2207,7 +2207,7 @@ static void ui_but_copy_color(uiBut *but, char *output, int max_output_len) if (but->rnaprop && RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA) srgb_to_linearrgb_v3_v3(rgba, rgba); - float_array_to_string(rgba, 4, output, max_output_len); + float_array_to_string(rgba, 4, output, output_len_max); } static void ui_but_paste_color(bContext *C, uiBut *but, char *buf_paste) @@ -2225,9 +2225,9 @@ static void ui_but_paste_color(bContext *C, uiBut *but, char *buf_paste) } } -static void ui_but_copy_text(uiBut *but, char *output, int max_output_len) +static void ui_but_copy_text(uiBut *but, char *output, int output_len_max) { - ui_but_string_get(but, output, max_output_len); + ui_but_string_get(but, output, output_len_max); } static void ui_but_paste_text(bContext *C, uiBut *but, uiHandleButtonData *data, char *buf_paste) @@ -2284,22 +2284,22 @@ static void ui_but_paste_curvemapping(bContext *C, uiBut *but) } } -static void ui_but_copy_operator(bContext *C, uiBut *but, char *output, int max_output_len) +static void ui_but_copy_operator(bContext *C, uiBut *but, char *output, int output_len_max) { PointerRNA *opptr; opptr = UI_but_operator_ptr_get(but); char *str; str = WM_operator_pystring_ex(C, NULL, false, true, but->optype, opptr); - strncpy(output, str, max_output_len); + BLI_strncpy(output, str, output_len_max); MEM_freeN(str); } -static void ui_but_copy_menu(uiBut *but, char *output, int max_output_len) +static void ui_but_copy_menu(uiBut *but, char *output, int output_len_max) { MenuType *mt = UI_but_menutype_get(but); if (mt) { - BLI_snprintf(output, max_output_len, "bpy.ops.wm.call_menu(name=\"%s\")", mt->idname); + BLI_snprintf(output, output_len_max, "bpy.ops.wm.call_menu(name=\"%s\")", mt->idname); } } @@ -2309,8 +2309,12 @@ static void ui_but_copy(bContext *C, uiBut *but, const bool copy_array) return; } - static const int max_copy_length = UI_MAX_DRAW_STR; - char buffer_to_copy[UI_MAX_DRAW_STR] = { 0 }; + /* Arbitrary large value (allow for paths: 'PATH_MAX') */ + char buf[4096] = {0}; + const int buf_max_len = sizeof(buf); + + /* Left false for copying internal data (color-band for eg). */ + bool is_buf_set = false; bool has_required_data = !(but->poin == NULL && but->rnapoin.data == NULL); @@ -2319,27 +2323,31 @@ static void ui_but_copy(bContext *C, uiBut *but, const bool copy_array) case UI_BTYPE_NUM_SLIDER: if (!has_required_data) break; if (copy_array && ui_but_has_array_value(but)) { - ui_but_copy_numeric_array(but, buffer_to_copy, max_copy_length); + ui_but_copy_numeric_array(but, buf, buf_max_len); } else { - ui_but_copy_numeric_value(but, buffer_to_copy, max_copy_length); + ui_but_copy_numeric_value(but, buf, buf_max_len); } + is_buf_set = true; break; case UI_BTYPE_UNITVEC: if (!has_required_data) break; - ui_but_copy_numeric_array(but, buffer_to_copy, max_copy_length); + ui_but_copy_numeric_array(but, buf, buf_max_len); + is_buf_set = true; break; case UI_BTYPE_COLOR: if (!has_required_data) break; - ui_but_copy_color(but, buffer_to_copy, max_copy_length); + ui_but_copy_color(but, buf, buf_max_len); + is_buf_set = true; break; case UI_BTYPE_TEXT: case UI_BTYPE_SEARCH_MENU: if (!has_required_data) break; - ui_but_copy_text(but, buffer_to_copy, max_copy_length); + ui_but_copy_text(but, buf, buf_max_len); + is_buf_set = true; break; case UI_BTYPE_COLORBAND: @@ -2351,19 +2359,23 @@ static void ui_but_copy(bContext *C, uiBut *but, const bool copy_array) break; case UI_BTYPE_BUT: - ui_but_copy_operator(C, but, buffer_to_copy, max_copy_length); + ui_but_copy_operator(C, but, buf, buf_max_len); + is_buf_set = true; break; case UI_BTYPE_MENU: case UI_BTYPE_PULLDOWN: - ui_but_copy_menu(but, buffer_to_copy, max_copy_length); + ui_but_copy_menu(but, buf, buf_max_len); + is_buf_set = true; break; default: break; } - WM_clipboard_text_set(buffer_to_copy, 0); + if (is_buf_set) { + WM_clipboard_text_set(buf, 0); + } } static void ui_but_paste(bContext *C, uiBut *but, uiHandleButtonData *data, const bool paste_array) diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c index 162687c64ff..0c5eb35f939 100644 --- a/source/blender/editors/interface/interface_icons.c +++ b/source/blender/editors/interface/interface_icons.c @@ -104,7 +104,7 @@ typedef struct IconImage { typedef void (*VectorDrawFunc)(int x, int y, int w, int h, float alpha); #define ICON_TYPE_PREVIEW 0 -#define ICON_TYPE_TEXTURE 1 +#define ICON_TYPE_COLOR_TEXTURE 1 #define ICON_TYPE_MONO_TEXTURE 2 #define ICON_TYPE_BUFFER 3 #define ICON_TYPE_VECTOR 4 @@ -129,6 +129,7 @@ typedef struct DrawInfo { } buffer; struct { int x, y, w, h; + int theme_color; } texture; struct { /* Can be packed into a single int. */ @@ -149,29 +150,35 @@ typedef struct IconTexture { float invh; } IconTexture; +typedef struct IconType { + int type; + int theme_color; +} IconType; + /* ******************* STATIC LOCAL VARS ******************* */ /* static here to cache results of icon directory scan, so it's not * scanning the filesystem each time the menu is drawn */ static struct ListBase iconfilelist = {NULL, NULL}; static IconTexture icongltex = {0, 0, 0, 0.0f, 0.0f}; -static const int icontypes[] = { -#define DEF_ICON(name) ICON_TYPE_TEXTURE, -#define DEF_ICON_VECTOR(name) ICON_TYPE_VECTOR, -#define DEF_ICON_MONO(name) ICON_TYPE_MONO_TEXTURE, -#define DEF_ICON_BLANK(name) ICON_TYPE_BLANK, +static const IconType icontypes[] = { +#define DEF_ICON(name) {ICON_TYPE_MONO_TEXTURE, 0}, +#define DEF_ICON_COLLECTION(name) {ICON_TYPE_MONO_TEXTURE, TH_ICON_COLLECTION}, +#define DEF_ICON_OBJECT(name) {ICON_TYPE_MONO_TEXTURE, TH_ICON_OBJECT}, +#define DEF_ICON_OBJECT_DATA(name) {ICON_TYPE_MONO_TEXTURE, TH_ICON_OBJECT_DATA}, +#define DEF_ICON_MODIFIER(name) {ICON_TYPE_MONO_TEXTURE, TH_ICON_MODIFIER}, +#define DEF_ICON_SHADING(name) {ICON_TYPE_MONO_TEXTURE, TH_ICON_SHADING}, +#define DEF_ICON_VECTOR(name) {ICON_TYPE_VECTOR, 0}, +#define DEF_ICON_COLOR(name) {ICON_TYPE_COLOR_TEXTURE, 0}, +#define DEF_ICON_BLANK(name) {ICON_TYPE_BLANK, 0}, #include "UI_icons.h" -#undef DEF_ICON -#undef DEF_ICON_VECTOR -#undef DEF_ICON_MONO -#undef DEF_ICON_BLANK }; /* **************************************************** */ #ifndef WITH_HEADLESS -static DrawInfo *def_internal_icon(ImBuf *bbuf, int icon_id, int xofs, int yofs, int size, int type) +static DrawInfo *def_internal_icon(ImBuf *bbuf, int icon_id, int xofs, int yofs, int size, int type, int theme_color) { Icon *new_icon = NULL; IconImage *iimg = NULL; @@ -185,7 +192,8 @@ static DrawInfo *def_internal_icon(ImBuf *bbuf, int icon_id, int xofs, int yofs, di = MEM_callocN(sizeof(DrawInfo), "drawinfo"); di->type = type; - if (ELEM(type, ICON_TYPE_TEXTURE, ICON_TYPE_MONO_TEXTURE)) { + if (ELEM(type, ICON_TYPE_COLOR_TEXTURE, ICON_TYPE_MONO_TEXTURE)) { + di->data.texture.theme_color = theme_color; di->data.texture.x = xofs; di->data.texture.y = yofs; di->data.texture.w = size; @@ -439,7 +447,7 @@ static void init_brush_icons(void) int size = datatoc_ ##name## _png_size; \ DrawInfo *di; \ \ - di = def_internal_icon(NULL, icon_id, 0, 0, w, ICON_TYPE_BUFFER); \ + di = def_internal_icon(NULL, icon_id, 0, 0, w, ICON_TYPE_BUFFER, 0); \ di->data.buffer.image->datatoc_rect = rect; \ di->data.buffer.image->datatoc_size = size; \ } @@ -580,7 +588,7 @@ static void init_event_icons(void) #define INIT_EVENT_ICON(icon_id, type, value) \ { \ - DrawInfo *di = def_internal_icon(NULL, icon_id, 0, 0, w, ICON_TYPE_EVENT); \ + DrawInfo *di = def_internal_icon(NULL, icon_id, 0, 0, w, ICON_TYPE_EVENT, 0); \ di->data.input.event_type = type; \ di->data.input.event_value = value; \ di->data.input.icon = icon_id; \ @@ -741,15 +749,15 @@ static void init_internal_icons(void) for (y = 0; y < ICON_GRID_ROWS; y++) { /* Row W has monochrome icons. */ for (x = 0; x < ICON_GRID_COLS; x++) { - int icontype = icontypes[y * ICON_GRID_COLS + x]; - if (!ELEM(icontype, ICON_TYPE_TEXTURE, ICON_TYPE_MONO_TEXTURE)) { + IconType icontype = icontypes[y * ICON_GRID_COLS + x]; + if (!ELEM(icontype.type, ICON_TYPE_COLOR_TEXTURE, ICON_TYPE_MONO_TEXTURE)) { continue; } def_internal_icon(b32buf, BIFICONID_FIRST + y * ICON_GRID_COLS + x, x * (ICON_GRID_W + ICON_GRID_MARGIN) + ICON_GRID_MARGIN, y * (ICON_GRID_H + ICON_GRID_MARGIN) + ICON_GRID_MARGIN, ICON_GRID_W, - icontype); + icontype.type, icontype.theme_color); } } } @@ -1324,7 +1332,6 @@ static void icon_draw_cache_flush_ex(void) return; /* We need to flush widget base first to ensure correct ordering. */ - GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); UI_widgetbase_draw_cache_flush(); GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); @@ -1346,6 +1353,8 @@ static void icon_draw_cache_flush_ex(void) glBindTexture(GL_TEXTURE_2D, 0); g_icon_draw_cache.calls = 0; + + GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); } void UI_icon_draw_cache_end(void) @@ -1358,10 +1367,7 @@ void UI_icon_draw_cache_end(void) return; GPU_blend(true); - icon_draw_cache_flush_ex(); - - GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); GPU_blend(false); } @@ -1405,9 +1411,10 @@ static void icon_draw_texture( } /* We need to flush widget base first to ensure correct ordering. */ - GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); UI_widgetbase_draw_cache_flush(); + GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); + float x1, x2, y1, y2; x1 = ix * icongltex.invw; @@ -1431,6 +1438,8 @@ static void icon_draw_texture( GPU_draw_primitive(GPU_PRIM_TRI_STRIP, 4); glBindTexture(GL_TEXTURE_2D, 0); + + GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); } /* Drawing size for preview images */ @@ -1516,21 +1525,21 @@ static void icon_draw_size( const short event_value = di->data.input.event_value; icon_draw_rect_input(x, y, w, h, alpha, event_type, event_value); } - else if (di->type == ICON_TYPE_TEXTURE) { + else if (di->type == ICON_TYPE_COLOR_TEXTURE) { /* texture image use premul alpha for correct scaling */ - GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); icon_draw_texture(x, y, (float)w, (float)h, di->data.texture.x, di->data.texture.y, di->data.texture.w, di->data.texture.h, alpha, rgb); - GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); } else if (di->type == ICON_TYPE_MONO_TEXTURE) { /* icon that matches text color, assumed to be white */ float color[4]; - if (mono_rgba) { - rgba_uchar_to_float(color, (const uchar *)mono_rgba); - } - else { - UI_GetThemeColor4fv(TH_TEXT, color); + if (!UI_GetIconThemeColor4fv(di->data.texture.theme_color, color)) { + if (mono_rgba) { + rgba_uchar_to_float(color, (const uchar *)mono_rgba); + } + else { + UI_GetThemeColor4fv(TH_TEXT, color); + } } if (rgb) { @@ -1539,10 +1548,8 @@ static void icon_draw_size( mul_v4_fl(color, alpha); - GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); icon_draw_texture(x, y, (float)w, (float)h, di->data.texture.x, di->data.texture.y, di->data.texture.w, di->data.texture.h, color[3], color); - GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); } else if (di->type == ICON_TYPE_BUFFER) { @@ -1672,7 +1679,10 @@ static int ui_id_brush_get_icon(const bContext *C, ID *id) } /* reset the icon */ - if (ob != NULL && ob->mode & OB_MODE_GPENCIL_PAINT) { + if ((ob != NULL) && + (ob->mode & OB_MODE_GPENCIL_PAINT) && + (br->gpencil_settings != NULL)) + { switch (br->gpencil_settings->icon_id) { case GP_BRUSH_ICON_PENCIL: br->id.icon_id = ICON_GPBRUSH_PENCIL; diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index c085a294acd..ac8b22aa74f 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -780,7 +780,7 @@ static uiBut *ui_item_with_label( /* BUTTONS_OT_file_browse calls UI_context_active_but_prop_get_filebrowser */ uiDefIconButO( block, UI_BTYPE_BUT, subtype == PROP_DIRPATH ? "BUTTONS_OT_directory_browse" : "BUTTONS_OT_file_browse", - WM_OP_INVOKE_DEFAULT, ICON_FILESEL, x, y, UI_UNIT_X, h, NULL); + WM_OP_INVOKE_DEFAULT, ICON_FILEBROWSER, x, y, UI_UNIT_X, h, NULL); } else if (flag & UI_ITEM_R_EVENT) { but = uiDefButR_prop(block, UI_BTYPE_KEY_EVENT, 0, name, x, y, prop_but_width, h, ptr, prop, index, 0, 0, -1, -1, NULL); diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c index 590deb59ce3..1897df41fd0 100644 --- a/source/blender/editors/interface/interface_panel.c +++ b/source/blender/editors/interface/interface_panel.c @@ -551,18 +551,18 @@ static void immRectf_tris_color_ex( unsigned int pos, float x1, float y1, float x2, float y2, unsigned int col, const float color[3]) { - immAttrib4fv(col, color); + immAttr4fv(col, color); immVertex2f(pos, x1, y1); - immAttrib4fv(col, color); + immAttr4fv(col, color); immVertex2f(pos, x2, y1); - immAttrib4fv(col, color); + immAttr4fv(col, color); immVertex2f(pos, x2, y2); - immAttrib4fv(col, color); + immAttr4fv(col, color); immVertex2f(pos, x1, y1); - immAttrib4fv(col, color); + immAttr4fv(col, color); immVertex2f(pos, x2, y2); - immAttrib4fv(col, color); + immAttr4fv(col, color); immVertex2f(pos, x1, y2); } @@ -1823,7 +1823,7 @@ static void ui_panel_category_draw_tab( immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR); immBegin(filled ? GPU_PRIM_TRI_FAN : GPU_PRIM_LINE_STRIP, vert_len); for (int i = 0; i < buf_index; i++) { - immAttrib3ubv(color, cbuf[i]); + immAttr3ubv(color, cbuf[i]); immVertex2fv(pos, vbuf[i]); } immEnd(); diff --git a/source/blender/editors/interface/interface_region_popover.c b/source/blender/editors/interface/interface_region_popover.c index b71152fcd19..cb4939adc56 100644 --- a/source/blender/editors/interface/interface_region_popover.c +++ b/source/blender/editors/interface/interface_region_popover.c @@ -100,7 +100,15 @@ static void ui_popover_create_block(bContext *C, uiPopover *pup, int opcontext) BLI_assert(pup->ui_size_x != 0); uiStyle *style = UI_style_get_dpi(); + pup->block = UI_block_begin(C, NULL, __func__, UI_EMBOSS); + UI_block_flag_enable(pup->block, UI_BLOCK_KEEP_OPEN | UI_BLOCK_POPOVER); +#ifdef USE_UI_POPOVER_ONCE + if (pup->is_once) { + UI_block_flag_enable(pup->block, UI_BLOCK_POPOVER_ONCE); + } +#endif + pup->layout = UI_block_layout( pup->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, pup->ui_size_x, 0, MENU_PADDING, style); @@ -139,12 +147,6 @@ static uiBlock *ui_block_func_POPOVER(bContext *C, uiPopupBlockHandle *handle, v UI_block_region_set(block, handle->region); UI_block_layout_resolve(block, &width, &height); - UI_block_flag_enable(block, UI_BLOCK_KEEP_OPEN | UI_BLOCK_POPOVER); -#ifdef USE_UI_POPOVER_ONCE - if (pup->is_once) { - UI_block_flag_enable(block, UI_BLOCK_POPOVER_ONCE); - } -#endif UI_block_direction_set(block, UI_DIR_DOWN | UI_DIR_CENTER_X); const int block_margin = U.widget_unit / 2; diff --git a/source/blender/editors/interface/interface_region_search.c b/source/blender/editors/interface/interface_region_search.c index d262cbc38bd..471055ed24a 100644 --- a/source/blender/editors/interface/interface_region_search.c +++ b/source/blender/editors/interface/interface_region_search.c @@ -533,8 +533,9 @@ ARegion *ui_searchbox_create_generic(bContext *C, ARegion *butregion, uiBut *but data->prv_cols = but->a2; } - /* only show key shortcuts when needed (not rna buttons) [#36699] */ - if (but->rnaprop == NULL) { + /* Only show key shortcuts when needed (checking RNA prop pointer is useless here, a lot of buttons are about data + * without having that pointer defined, let's rather try with optype!). */ + if (but->optype != NULL) { data->use_sep = true; } diff --git a/source/blender/editors/interface/interface_style.c b/source/blender/editors/interface/interface_style.c index 16c3e01e7aa..47d105efd5f 100644 --- a/source/blender/editors/interface/interface_style.c +++ b/source/blender/editors/interface/interface_style.c @@ -179,7 +179,8 @@ void UI_fontstyle_draw_ex( } else { /* draw from boundbox center */ - yofs = ceil(0.5f * (BLI_rcti_size_y(rect) - BLF_ascender(fs->uifont_id))); + float height = BLF_ascender(fs->uifont_id) + BLF_descender(fs->uifont_id); + yofs = ceil(0.5f * (BLI_rcti_size_y(rect) - height)); } if (fs->align == UI_STYLE_TEXT_CENTER) { @@ -225,7 +226,7 @@ void UI_fontstyle_draw_rotated(const uiFontStyle *fs, const rcti *rect, const ch UI_fontstyle_set(fs); - height = BLF_ascender(fs->uifont_id); + height = BLF_ascender(fs->uifont_id) + BLF_descender(fs->uifont_id); /* becomes x-offset when rotated */ xofs = ceil(0.5f * (BLI_rcti_size_y(rect) - height)); diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index 9dfe4d99268..7fbb01919b7 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -623,13 +623,13 @@ static uiBut *template_id_def_new_but( if (newop) { but = uiDefIconTextButO( - block, but_type, newop, WM_OP_INVOKE_DEFAULT, ICON_ZOOMIN, + block, but_type, newop, WM_OP_INVOKE_DEFAULT, ICON_ADD, (id) ? "" : CTX_IFACE_(template_id_context(type), "New"), 0, 0, w, but_height, NULL); UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_ADD_NEW)); } else { but = uiDefIconTextBut( - block, but_type, 0, ICON_ZOOMIN, (id) ? "" : CTX_IFACE_(template_id_context(type), "New"), + block, but_type, 0, ICON_ADD, (id) ? "" : CTX_IFACE_(template_id_context(type), "New"), 0, 0, w, but_height, NULL, 0, 0, 0, 0, NULL); UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_ADD_NEW)); } @@ -773,13 +773,13 @@ static void template_ID( if (openop) { but = uiDefIconTextButO( - block, UI_BTYPE_BUT, openop, WM_OP_INVOKE_DEFAULT, ICON_FILESEL, (id) ? "" : IFACE_("Open"), + block, UI_BTYPE_BUT, openop, WM_OP_INVOKE_DEFAULT, ICON_FILEBROWSER, (id) ? "" : IFACE_("Open"), 0, 0, w, UI_UNIT_Y, NULL); UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_OPEN)); } else { but = uiDefIconTextBut( - block, UI_BTYPE_BUT, 0, ICON_FILESEL, (id) ? "" : IFACE_("Open"), 0, 0, w, UI_UNIT_Y, + block, UI_BTYPE_BUT, 0, ICON_FILEBROWSER, (id) ? "" : IFACE_("Open"), 0, 0, w, UI_UNIT_Y, NULL, 0, 0, 0, 0, NULL); UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_OPEN)); } @@ -1164,7 +1164,7 @@ static void template_search_buttons( template_search_add_button_searchmenu(C, layout, block, template_search, editable, false); template_search_add_button_name(block, &active_ptr, type); - template_search_add_button_operator(block, newop, WM_OP_INVOKE_DEFAULT, ICON_ZOOMIN, editable); + template_search_add_button_operator(block, newop, WM_OP_INVOKE_DEFAULT, ICON_ADD, editable); template_search_add_button_operator(block, unlinkop, WM_OP_INVOKE_REGION_WIN, ICON_X, editable); UI_block_align_end(block); @@ -1474,10 +1474,10 @@ static uiLayout *draw_modifier( uiItemO(row, "", ICON_X, "OBJECT_OT_modifier_remove"); } else if (modifier_is_simulation(md) == 1) { - uiItemStringO(row, "", ICON_BUTS, "WM_OT_properties_context_change", "context", "PHYSICS"); + uiItemStringO(row, "", ICON_PROPERTIES, "WM_OT_properties_context_change", "context", "PHYSICS"); } else if (modifier_is_simulation(md) == 2) { - uiItemStringO(row, "", ICON_BUTS, "WM_OT_properties_context_change", "context", "PARTICLES"); + uiItemStringO(row, "", ICON_PROPERTIES, "WM_OT_properties_context_change", "context", "PARTICLES"); } UI_block_emboss_set(block, UI_EMBOSS); } @@ -2039,7 +2039,7 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con) /* enabled */ UI_block_emboss_set(block, UI_EMBOSS_NONE); uiItemR(row, &ptr, "mute", 0, "", - (con->flag & CONSTRAINT_OFF) ? ICON_HIDE_ON : ICON_HIDE_OFF); + (con->flag & CONSTRAINT_OFF) ? ICON_RESTRICT_VIEW_ON : ICON_RESTRICT_VIEW_OFF); UI_block_emboss_set(block, UI_EMBOSS); uiLayoutSetOperatorContext(row, WM_OP_INVOKE_DEFAULT); @@ -2361,13 +2361,13 @@ static void colorband_buttons_layout( row = uiLayoutRow(split, false); bt = uiDefIconTextBut( - block, UI_BTYPE_BUT, 0, ICON_ZOOMIN, "", 0, 0, 2.0f * unit, UI_UNIT_Y, NULL, + block, UI_BTYPE_BUT, 0, ICON_ADD, "", 0, 0, 2.0f * unit, UI_UNIT_Y, NULL, 0, 0, 0, 0, TIP_("Add a new color stop to the colorband")); UI_but_funcN_set(bt, colorband_add_cb, MEM_dupallocN(cb), coba); bt = uiDefIconTextBut( - block, UI_BTYPE_BUT, 0, ICON_ZOOMOUT, "", xs + 2.0f * unit, ys + UI_UNIT_Y, 2.0f * unit, UI_UNIT_Y, + block, UI_BTYPE_BUT, 0, ICON_REMOVE, "", xs + 2.0f * unit, ys + UI_UNIT_Y, 2.0f * unit, UI_UNIT_Y, NULL, 0, 0, 0, 0, TIP_("Delete the active position")); UI_but_funcN_set(bt, colorband_del_cb, MEM_dupallocN(cb), coba); @@ -3309,8 +3309,8 @@ void uiTemplatePalette(uiLayout *layout, PointerRNA *ptr, const char *propname, col = uiLayoutColumn(layout, true); uiLayoutRow(col, true); - uiDefIconButO(block, UI_BTYPE_BUT, "PALETTE_OT_color_add", WM_OP_INVOKE_DEFAULT, ICON_ZOOMIN, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL); - uiDefIconButO(block, UI_BTYPE_BUT, "PALETTE_OT_color_delete", WM_OP_INVOKE_DEFAULT, ICON_ZOOMOUT, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL); + uiDefIconButO(block, UI_BTYPE_BUT, "PALETTE_OT_color_add", WM_OP_INVOKE_DEFAULT, ICON_ADD, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL); + uiDefIconButO(block, UI_BTYPE_BUT, "PALETTE_OT_color_delete", WM_OP_INVOKE_DEFAULT, ICON_REMOVE, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL); col = uiLayoutColumn(layout, true); uiLayoutRow(col, true); @@ -3474,7 +3474,7 @@ static void uilist_draw_item_default( } } -static void uilist_draw_filter_default(struct uiList *ui_list, struct bContext *UNUSED(C), struct uiLayout *layout) +static void uilist_draw_filter_default(struct uiList *ui_list, struct bContext *UNUSED(C), struct uiLayout *layout, bool reverse) { PointerRNA listptr; uiLayout *row, *subrow; @@ -3488,10 +3488,13 @@ static void uilist_draw_filter_default(struct uiList *ui_list, struct bContext * uiItemR(subrow, &listptr, "use_filter_invert", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "", (ui_list->filter_flag & UILST_FLT_EXCLUDE) ? ICON_ZOOM_OUT : ICON_ZOOM_IN); - subrow = uiLayoutRow(row, true); - uiItemR(subrow, &listptr, "use_filter_sort_alpha", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "", ICON_NONE); - uiItemR(subrow, &listptr, "use_filter_sort_reverse", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "", - (ui_list->filter_sort_flag & UILST_FLT_SORT_REVERSE) ? ICON_TRIA_UP : ICON_TRIA_DOWN); + /* a reverse list, cannot sort or invert order in filter */ + if (!reverse) { + subrow = uiLayoutRow(row, true); + uiItemR(subrow, &listptr, "use_filter_sort_alpha", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "", ICON_NONE); + uiItemR(subrow, &listptr, "use_filter_sort_reverse", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "", + (ui_list->filter_sort_flag & UILST_FLT_SORT_REVERSE) ? ICON_SORT_DESC : ICON_SORT_ASC); + } } typedef struct { @@ -3714,7 +3717,7 @@ static char *uilist_item_tooltip_func(bContext *UNUSED(C), void *argN, const cha void uiTemplateList( uiLayout *layout, bContext *C, const char *listtype_name, const char *list_id, PointerRNA *dataptr, const char *propname, PointerRNA *active_dataptr, const char *active_propname, - const char *item_dyntip_propname, int rows, int maxrows, int layout_type, int columns) + const char *item_dyntip_propname, int rows, int maxrows, int layout_type, int columns, bool reverse) { uiListType *ui_list_type; uiList *ui_list = NULL; @@ -3835,6 +3838,19 @@ void uiTemplateList( MEM_SAFE_FREE(dyn_data->items_filter_neworder); dyn_data->items_len = dyn_data->items_shown = -1; + /* if reverse, enable reverse and forced flag */ + if (reverse) { + ui_list->filter_sort_flag |= UILST_FLT_SORT_REVERSE; + ui_list->filter_sort_flag |= UILST_FLT_FORCED_REVERSE; + } + else { + /* if it was forced, disable forced flag to restore all normal behavior */ + if (ui_list->filter_sort_flag & UILST_FLT_FORCED_REVERSE) { + ui_list->filter_sort_flag &= ~UILST_FLT_SORT_REVERSE; + ui_list->filter_sort_flag &= ~UILST_FLT_FORCED_REVERSE; + } + } + /* When active item changed since last draw, scroll to it. */ if (activei != ui_list->list_last_activei) { ui_list->flag |= UILST_SCROLL_TO_ACTIVE_ITEM; @@ -4112,7 +4128,7 @@ void uiTemplateList( subblock = uiLayoutGetBlock(col); uiDefBut(subblock, UI_BTYPE_SEPR, 0, "", 0, 0, UI_UNIT_X, UI_UNIT_Y * 0.05f, NULL, 0.0, 0.0, 0, 0, ""); - draw_filter(ui_list, C, col); + draw_filter(ui_list, C, col, reverse); } else { but = uiDefIconButBitI(subblock, UI_BTYPE_TOGGLE, UILST_FLT_SHOW, 0, ICON_DISCLOSURE_TRI_RIGHT, 0, 0, @@ -4299,10 +4315,10 @@ eAutoPropButsReturn uiTemplateOperatorPropertyButs( uiItemM(row, "WM_MT_operator_presets", NULL, ICON_NONE); wmOperatorType *ot = WM_operatortype_find("WM_OT_operator_preset_add", false); - uiItemFullO_ptr(row, ot, "", ICON_ZOOMIN, NULL, WM_OP_INVOKE_DEFAULT, 0, &op_ptr); + uiItemFullO_ptr(row, ot, "", ICON_ADD, NULL, WM_OP_INVOKE_DEFAULT, 0, &op_ptr); RNA_string_set(&op_ptr, "operator", op->type->idname); - uiItemFullO_ptr(row, ot, "", ICON_ZOOMOUT, NULL, WM_OP_INVOKE_DEFAULT, 0, &op_ptr); + uiItemFullO_ptr(row, ot, "", ICON_REMOVE, NULL, WM_OP_INVOKE_DEFAULT, 0, &op_ptr); RNA_string_set(&op_ptr, "operator", op->type->idname); RNA_boolean_set(&op_ptr, "remove_active", true); } @@ -4481,7 +4497,7 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C) owner = sa; } handle_event = B_STOPFILE; - icon = ICON_FILESEL; + icon = ICON_FILEBROWSER; } else { Scene *scene; @@ -4506,7 +4522,7 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C) */ if (sa->spacetype != SPACE_NODE) { handle_event = B_STOPOTHER; - icon = ICON_IMAGE_COL; + icon = ICON_IMAGE; break; } } diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index 762d593947e..3441ea7351a 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -940,7 +940,7 @@ static void widget_draw_vertex_buffer(unsigned int pos, unsigned int col, int mo immBegin(mode, totvert); for (int i = 0; i < totvert; ++i) { if (quads_col) - immAttrib4ubv(col, quads_col[i]); + immAttr4ubv(col, quads_col[i]); immVertex2fv(pos, quads_pos[i]); } immEnd(); @@ -1301,7 +1301,7 @@ static void widget_draw_icon( if (ELEM(but->type, UI_BTYPE_TOGGLE, UI_BTYPE_ROW, UI_BTYPE_TOGGLE_N, UI_BTYPE_LISTROW)) { if (but->flag & UI_SELECT) {} else if (but->flag & UI_ACTIVE) {} - else alpha = 0.5f; + else alpha = 0.75f; } else if ((but->type == UI_BTYPE_LABEL)) { /* extra feature allows more alpha blending */ @@ -2084,6 +2084,7 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB const BIFIconID icon = (but->flag & UI_HAS_ICON) ? but->icon + but->iconadd : ICON_NONE; int icon_size_init = is_tool ? ICON_DEFAULT_HEIGHT_TOOLBAR : ICON_DEFAULT_HEIGHT; const float icon_size = icon_size_init / (but->block->aspect / UI_DPI_FAC); + const float icon_padding = 2 * UI_DPI_FAC; #ifdef USE_UI_TOOLBAR_HACK if (is_tool) { @@ -2115,7 +2116,7 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB but->block->aspect = aspect_orig; #endif - rect->xmin += icon_size; + rect->xmin += icon_size + icon_padding; } if (but->editstr || (but->drawflag & UI_BUT_TEXT_LEFT)) { @@ -2597,7 +2598,7 @@ static void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, const rcti * immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR); immBegin(GPU_PRIM_TRI_FAN, tot + 2); - immAttrib3fv(color, colcent); + immAttr3fv(color, colcent); immVertex2f(pos, centx, centy); float ang = 0.0f; @@ -2609,7 +2610,7 @@ static void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, const rcti * ui_color_picker_to_rgb_v(hsv, col); - immAttrib3fv(color, col); + immAttr3fv(color, col); immVertex2f(pos, centx + co * radius, centy + si * radius); } immEnd(); @@ -2765,22 +2766,22 @@ void ui_draw_gradient(const rcti *rect, const float hsv[3], const int type, cons dy = (float)BLI_rcti_size_y(rect) / 3.0f; for (a = 0; a < 3; a++, sy += dy) { - immAttrib4f(col, col0[a][0], col0[a][1], col0[a][2], alpha); + immAttr4f(col, col0[a][0], col0[a][1], col0[a][2], alpha); immVertex2f(pos, sx1, sy); - immAttrib4f(col, col1[a][0], col1[a][1], col1[a][2], alpha); + immAttr4f(col, col1[a][0], col1[a][1], col1[a][2], alpha); immVertex2f(pos, sx2, sy); - immAttrib4f(col, col1[a + 1][0], col1[a + 1][1], col1[a + 1][2], alpha); + immAttr4f(col, col1[a + 1][0], col1[a + 1][1], col1[a + 1][2], alpha); immVertex2f(pos, sx2, sy + dy); - immAttrib4f(col, col0[a][0], col0[a][1], col0[a][2], alpha); + immAttr4f(col, col0[a][0], col0[a][1], col0[a][2], alpha); immVertex2f(pos, sx1, sy); - immAttrib4f(col, col1[a + 1][0], col1[a + 1][1], col1[a + 1][2], alpha); + immAttr4f(col, col1[a + 1][0], col1[a + 1][1], col1[a + 1][2], alpha); immVertex2f(pos, sx2, sy + dy); - immAttrib4f(col, col0[a + 1][0], col0[a + 1][1], col0[a + 1][2], alpha); + immAttr4f(col, col0[a + 1][0], col0[a + 1][1], col0[a + 1][2], alpha); immVertex2f(pos, sx1, sy + dy); } } @@ -4520,14 +4521,14 @@ static void draw_disk_shaded( if (shaded) { fac = (y1 + radius_ext) * radius_ext_scale; round_box_shade_col4_r(r_col, col1, col2, fac); - immAttrib4ubv(col, r_col); + immAttr4ubv(col, r_col); } immVertex2f(pos, c * radius_int, s * radius_int); if (shaded) { fac = (y2 + radius_ext) * radius_ext_scale; round_box_shade_col4_r(r_col, col1, col2, fac); - immAttrib4ubv(col, r_col); + immAttr4ubv(col, r_col); } immVertex2f(pos, c * radius_ext, s * radius_ext); } diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c index fbbaa544e2c..33a8a2ec5fa 100644 --- a/source/blender/editors/interface/resources.c +++ b/source/blender/editors/interface/resources.c @@ -686,6 +686,17 @@ const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colo case TH_GIZMO_B: cp = btheme->tui.gizmo_b; break; + case TH_ICON_COLLECTION: + cp = btheme->tui.icon_collection; break; + case TH_ICON_OBJECT: + cp = btheme->tui.icon_object; break; + case TH_ICON_OBJECT_DATA: + cp = btheme->tui.icon_object_data; break; + case TH_ICON_MODIFIER: + cp = btheme->tui.icon_modifier; break; + case TH_ICON_SHADING: + cp = btheme->tui.icon_shading; break; + case TH_INFO_SELECTED: cp = ts->info_selected; break; @@ -1109,6 +1120,31 @@ void UI_GetThemeColorType4ubv(int colorid, int spacetype, char col[4]) col[3] = cp[3]; } +bool UI_GetIconThemeColor4fv(int colorid, float col[4]) +{ + if (colorid == 0) { + return false; + } + + /* Only colored icons in outliner and popups, overall UI is intended + * to stay monochrome and out of the way except a few places where it + * is important to communicate different data types. */ + if (!((theme_spacetype == SPACE_OUTLINER) || + (theme_regionid == RGN_TYPE_TEMPORARY))) + { + return false; + } + + const unsigned char *cp; + cp = UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid); + col[0] = ((float)cp[0]) / 255.0f; + col[1] = ((float)cp[1]) / 255.0f; + col[2] = ((float)cp[2]) / 255.0f; + col[3] = ((float)cp[3]) / 255.0f; + + return true; +} + void UI_GetColorPtrShade3ubv(const unsigned char cp[3], unsigned char col[3], int offset) { int r, g, b; diff --git a/source/blender/editors/interface/view2d.c b/source/blender/editors/interface/view2d.c index 9654f088637..baaaac2e814 100644 --- a/source/blender/editors/interface/view2d.c +++ b/source/blender/editors/interface/view2d.c @@ -1358,9 +1358,9 @@ void UI_view2d_grid_draw(View2D *v2d, View2DGrid *grid, int flag) UI_GetThemeColor3ubv(TH_GRID, grid_line_color); for (a = 0; a < step; a++) { - immSkipAttrib(color); + immAttrSkip(color); immVertex2fv(pos, vec1); - immAttrib3ubv(color, grid_line_color); + immAttr3ubv(color, grid_line_color); immVertex2fv(pos, vec2); vec2[0] = vec1[0] += grid->dx; @@ -1374,9 +1374,9 @@ void UI_view2d_grid_draw(View2D *v2d, View2DGrid *grid, int flag) step++; for (a = 0; a <= step; a++) { - immSkipAttrib(color); + immAttrSkip(color); immVertex2fv(pos, vec1); - immAttrib3ubv(color, grid_line_color); + immAttr3ubv(color, grid_line_color); immVertex2fv(pos, vec2); vec2[0] = vec1[0] -= grid->dx; @@ -1395,9 +1395,9 @@ void UI_view2d_grid_draw(View2D *v2d, View2DGrid *grid, int flag) UI_GetThemeColor3ubv(TH_GRID, grid_line_color); for (a = 0; a <= step; a++) { - immSkipAttrib(color); + immAttrSkip(color); immVertex2fv(pos, vec1); - immAttrib3ubv(color, grid_line_color); + immAttr3ubv(color, grid_line_color); immVertex2fv(pos, vec2); vec2[1] = vec1[1] += grid->dy; @@ -1410,9 +1410,9 @@ void UI_view2d_grid_draw(View2D *v2d, View2DGrid *grid, int flag) if (flag & V2D_HORIZONTAL_FINELINES) { UI_GetThemeColorShade3ubv(TH_GRID, 16, grid_line_color); for (a = 0; a < step; a++) { - immSkipAttrib(color); + immAttrSkip(color); immVertex2fv(pos, vec1); - immAttrib3ubv(color, grid_line_color); + immAttr3ubv(color, grid_line_color); immVertex2fv(pos, vec2); vec2[1] = vec1[1] -= grid->dy; @@ -1429,9 +1429,9 @@ void UI_view2d_grid_draw(View2D *v2d, View2DGrid *grid, int flag) vec2[0] = v2d->cur.xmax; vec1[1] = vec2[1] = 0.0f; - immSkipAttrib(color); + immAttrSkip(color); immVertex2fv(pos, vec1); - immAttrib3ubv(color, grid_line_color); + immAttr3ubv(color, grid_line_color); immVertex2fv(pos, vec2); } @@ -1441,9 +1441,9 @@ void UI_view2d_grid_draw(View2D *v2d, View2DGrid *grid, int flag) vec2[1] = v2d->cur.ymax; vec1[0] = vec2[0] = 0.0f; - immSkipAttrib(color); + immAttrSkip(color); immVertex2fv(pos, vec1); - immAttrib3ubv(color, grid_line_color); + immAttr3ubv(color, grid_line_color); immVertex2fv(pos, vec2); } @@ -1490,7 +1490,7 @@ void UI_view2d_constant_grid_draw(View2D *v2d, float step) immBindBuiltinProgram(GPU_SHADER_2D_FLAT_COLOR); immBegin(GPU_PRIM_LINES, count_x * 2 + count_y * 2 + 4); - immAttrib3fv(color, theme_color); + immAttr3fv(color, theme_color); for (int i = 0; i < count_x ; start_x += step, i++) { immVertex2f(pos, start_x, v2d->cur.ymin); immVertex2f(pos, start_x, v2d->cur.ymax); @@ -1504,7 +1504,7 @@ void UI_view2d_constant_grid_draw(View2D *v2d, float step) /* X and Y axis */ UI_GetThemeColorShade3fv(TH_BACK, -18, theme_color); - immAttrib3fv(color, theme_color); + immAttr3fv(color, theme_color); immVertex2f(pos, 0.0f, v2d->cur.ymin); immVertex2f(pos, 0.0f, v2d->cur.ymax); immVertex2f(pos, v2d->cur.xmin, 0.0f); @@ -1552,9 +1552,9 @@ void UI_view2d_multi_grid_draw(View2D *v2d, int colorid, float step, int level_s if (i == 0 || (level < totlevels - 1 && i % level_size == 0)) continue; - immSkipAttrib(color); + immAttrSkip(color); immVertex2f(pos, start, v2d->cur.ymin); - immAttrib3ubv(color, grid_line_color); + immAttr3ubv(color, grid_line_color); immVertex2f(pos, start, v2d->cur.ymax); } @@ -1567,9 +1567,9 @@ void UI_view2d_multi_grid_draw(View2D *v2d, int colorid, float step, int level_s if (i == 0 || (level < totlevels - 1 && i % level_size == 0)) continue; - immSkipAttrib(color); + immAttrSkip(color); immVertex2f(pos, v2d->cur.xmin, start); - immAttrib3ubv(color, grid_line_color); + immAttr3ubv(color, grid_line_color); immVertex2f(pos, v2d->cur.xmax, start); } @@ -1580,14 +1580,14 @@ void UI_view2d_multi_grid_draw(View2D *v2d, int colorid, float step, int level_s /* X and Y axis */ UI_GetThemeColorShade3ubv(colorid, -18 + ((totlevels - 1) * -6), grid_line_color); - immSkipAttrib(color); + immAttrSkip(color); immVertex2f(pos, 0.0f, v2d->cur.ymin); - immAttrib3ubv(color, grid_line_color); + immAttr3ubv(color, grid_line_color); immVertex2f(pos, 0.0f, v2d->cur.ymax); - immSkipAttrib(color); + immAttrSkip(color); immVertex2f(pos, v2d->cur.xmin, 0.0f); - immAttrib3ubv(color, grid_line_color); + immAttr3ubv(color, grid_line_color); immVertex2f(pos, v2d->cur.xmax, 0.0f); immEnd(); diff --git a/source/blender/editors/mesh/editmesh_knife_project.c b/source/blender/editors/mesh/editmesh_knife_project.c index 5ccbcf063ad..da8b8d217d7 100644 --- a/source/blender/editors/mesh/editmesh_knife_project.c +++ b/source/blender/editors/mesh/editmesh_knife_project.c @@ -66,7 +66,7 @@ static LinkNode *knifeproject_poly_from_object(const bContext *C, Scene *scene, struct Mesh *me_eval; bool me_eval_needs_free; - if (ob->type == OB_MESH || ob->derivedFinal) { + if (ob->type == OB_MESH || ob->runtime.mesh_eval) { me_eval = (ob->runtime.mesh_eval ? ob->runtime.mesh_eval : mesh_get_eval_final(depsgraph, scene, ob, CD_MASK_BAREMESH)); me_eval_needs_free = false; diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index eeaf345e7f1..552edc5a659 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -253,14 +253,14 @@ static int edbm_subdivide_edge_ring_exec(bContext *C, wmOperator *op) ViewLayer *view_layer = CTX_data_view_layer(C); uint objects_len = 0; - Object * *objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len); + Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len); struct EdgeRingOpSubdProps op_props; mesh_operator_edgering_props_get(op, &op_props); for (uint ob_index = 0; ob_index < objects_len; ob_index++) { - Object * obedit = objects[ob_index]; - BMEditMesh * em = BKE_editmesh_from_object(obedit); + Object *obedit = objects[ob_index]; + BMEditMesh *em = BKE_editmesh_from_object(obedit); if (em->bm->totedgesel == 0) { continue; @@ -2375,12 +2375,12 @@ static void mesh_set_smooth_faces(BMEditMesh *em, short smooth) static int edbm_faces_shade_smooth_exec(bContext *C, wmOperator *UNUSED(op)) { - ViewLayer * view_layer = CTX_data_view_layer(C); + ViewLayer *view_layer = CTX_data_view_layer(C); uint objects_len = 0; - Object * *objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len); + Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len); for (uint ob_index = 0; ob_index < objects_len; ob_index++) { - Object * obedit = objects[ob_index]; - BMEditMesh * em = BKE_editmesh_from_object(obedit); + Object *obedit = objects[ob_index]; + BMEditMesh *em = BKE_editmesh_from_object(obedit); if (em->bm->totfacesel == 0) { continue; diff --git a/source/blender/editors/metaball/mball_edit.c b/source/blender/editors/metaball/mball_edit.c index 06add39d90f..8cb4bfba5f5 100644 --- a/source/blender/editors/metaball/mball_edit.c +++ b/source/blender/editors/metaball/mball_edit.c @@ -508,6 +508,7 @@ void MBALL_OT_delete_metaelems(wmOperatorType *ot) ot->idname = "MBALL_OT_delete_metaelems"; /* callback functions */ + ot->invoke = WM_operator_confirm; ot->exec = delete_metaelems_exec; ot->poll = ED_operator_editmball; diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 3fccb5f6943..e8833ca259a 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -67,7 +67,6 @@ #include "BKE_context.h" #include "BKE_constraint.h" #include "BKE_curve.h" -#include "BKE_DerivedMesh.h" #include "BKE_displist.h" #include "BKE_effect.h" #include "BKE_font.h" @@ -869,9 +868,7 @@ static int empty_drop_named_image_invoke(bContext *C, wmOperator *op, const wmEv { Scene *scene = CTX_data_scene(C); - Base *base = NULL; Image *ima = NULL; - Object *ob = NULL; ima = (Image *)WM_operator_drop_load_path(C, op, ID_IM); if (!ima) { @@ -880,26 +877,22 @@ static int empty_drop_named_image_invoke(bContext *C, wmOperator *op, const wmEv /* handled below */ id_us_min((ID *)ima); - base = ED_view3d_give_base_under_cursor(C, event->mval); + Object *ob = NULL; + Object *ob_cursor = ED_view3d_give_object_under_cursor(C, event->mval); - /* if empty under cursor, then set object */ - if (base && base->object->type == OB_EMPTY) { - ob = base->object; - DEG_id_tag_update(&scene->id, DEG_TAG_SELECT_UPDATE); + /* either change empty under cursor or create a new empty */ + if (ob_cursor && ob_cursor->type == OB_EMPTY) { WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, scene); + DEG_id_tag_update((ID *)ob_cursor, DEG_TAG_TRANSFORM); + ob = ob_cursor; } else { - /* add new empty */ - float rot[3]; - - if (!ED_object_add_generic_get_opts(C, op, 'Z', NULL, rot, NULL, NULL)) - return OPERATOR_CANCELLED; + ob = ED_object_add_type(C, OB_EMPTY, NULL, NULL, NULL, false); - ob = ED_object_add_type(C, OB_EMPTY, NULL, NULL, rot, false); - - /* add under the mouse */ ED_object_location_from_view(C, ob->loc); ED_view3d_cursor3d_position(C, event->mval, false, ob->loc); + ED_object_rotation_from_view(C, ob->rot, 'Z'); + ob->empty_drawsize = 5.0f; } BKE_object_empty_draw_type_set(ob, OB_EMPTY_IMAGE); @@ -1774,7 +1767,6 @@ static int convert_exec(bContext *C, wmOperator *op) ViewLayer *view_layer = CTX_data_view_layer(C); Base *basen = NULL, *basact = NULL; Object *ob1, *obact = CTX_data_active_object(C); - DerivedMesh *dm; Curve *cu; Nurb *nu; MetaBall *mb; @@ -1911,12 +1903,11 @@ static int convert_exec(bContext *C, wmOperator *op) /* note: get the mesh from the original, not from the copy in some * cases this doesn't give correct results (when MDEF is used for eg) */ - dm = mesh_get_derived_final(depsgraph, scene, newob, CD_MASK_MESH); - - DM_to_mesh(dm, newob->data, newob, CD_MASK_MESH, true); - - /* re-tessellation is called by DM_to_mesh */ - + Mesh *me_eval = mesh_get_eval_final(depsgraph, scene, newob, CD_MASK_MESH); + if (newob->runtime.mesh_eval == me_eval) { + newob->runtime.mesh_eval = NULL; + } + BKE_mesh_nomain_to_mesh(me_eval, newob->data, newob, CD_MASK_MESH, true); BKE_object_free_modifiers(newob, 0); /* after derivedmesh calls! */ } else if (ob->type == OB_FONT) { diff --git a/source/blender/editors/object/object_bake_api.c b/source/blender/editors/object/object_bake_api.c index d0d82a8ccc7..cc9f21df3f9 100644 --- a/source/blender/editors/object/object_bake_api.c +++ b/source/blender/editors/object/object_bake_api.c @@ -635,7 +635,7 @@ static Mesh *bake_mesh_new_from_object(Depsgraph *depsgraph, Main *bmain, Scene { ED_object_editmode_load(bmain, ob); - Mesh *me = BKE_mesh_new_from_object(depsgraph, bmain, scene, ob, 1, 0, 0); + Mesh *me = BKE_mesh_new_from_object(depsgraph, bmain, scene, ob, 1, 0); if (me->flag & ME_AUTOSMOOTH) { BKE_mesh_split_faces(me, true); } diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index c893f106363..89eea4c1b64 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -1993,7 +1993,7 @@ static void move_to_collection_menu_create(bContext *UNUSED(C), uiLayout *layout uiItemFullO_ptr(layout, menu->ot, "New Collection", - ICON_ZOOMIN, + ICON_ADD, menu->ptr.data, WM_OP_INVOKE_DEFAULT, 0, diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index cfd50b0dba6..2b5b5a078a6 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -98,6 +98,23 @@ static void modifier_skin_customdata_delete(struct Object *ob); /******************************** API ****************************/ +static void object_force_modifier_update_for_bind(Depsgraph *depsgraph, Scene *scene, Object *ob) +{ + if (ob->type == OB_MESH) { + Mesh *me_eval = mesh_create_eval_final_view(depsgraph, scene, ob, 0); + BKE_id_free(NULL, me_eval); + } + else if (ob->type == OB_LATTICE) { + BKE_lattice_modifiers_calc(depsgraph, scene, ob); + } + else if (ob->type == OB_MBALL) { + BKE_displist_make_mball(depsgraph, scene, ob); + } + else if (ELEM(ob->type, OB_CURVE, OB_SURF, OB_FONT)) { + BKE_displist_make_curveTypes(depsgraph, scene, ob, 0); + } +} + ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *scene, Object *ob, const char *name, int type) { ModifierData *md = NULL, *new_md = NULL; @@ -2269,27 +2286,13 @@ static int laplaciandeform_bind_exec(bContext *C, wmOperator *op) lmd->flag &= ~MOD_LAPLACIANDEFORM_BIND; } else { - DerivedMesh *dm; int mode = lmd->modifier.mode; /* Force modifier to run, it will call binding routine. */ - /* TODO(Sybren): deduplicate the code below, it's used multiple times here. */ lmd->modifier.mode |= eModifierMode_Realtime; lmd->flag |= MOD_LAPLACIANDEFORM_BIND; - if (ob->type == OB_MESH) { - dm = mesh_create_derived_view(depsgraph, scene, ob, 0); - dm->release(dm); - } - else if (ob->type == OB_LATTICE) { - BKE_lattice_modifiers_calc(depsgraph, scene, ob); - } - else if (ob->type == OB_MBALL) { - BKE_displist_make_mball(depsgraph, scene, ob); - } - else if (ELEM(ob->type, OB_CURVE, OB_SURF, OB_FONT)) { - BKE_displist_make_curveTypes(depsgraph, scene, ob, 0); - } + object_force_modifier_update_for_bind(depsgraph, scene, ob); lmd->modifier.mode = mode; } @@ -2340,39 +2343,24 @@ static int surfacedeform_bind_exec(bContext *C, wmOperator *op) if (!smd) return OPERATOR_CANCELLED; - if (smd->flags & MOD_SDEF_BIND) { /* Un-binding happens inside the modifier when it's evaluated. */ smd->flags &= ~MOD_SDEF_BIND; } else if (smd->target) { - DerivedMesh *dm; int mode = smd->modifier.mode; /* Force modifier to run, it will call binding routine. */ smd->modifier.mode |= eModifierMode_Realtime; smd->flags |= MOD_SDEF_BIND; - if (ob->type == OB_MESH) { - dm = mesh_create_derived_view(depsgraph, scene, ob, 0); - dm->release(dm); - } - else if (ob->type == OB_LATTICE) { - BKE_lattice_modifiers_calc(depsgraph, scene, ob); - } - else if (ob->type == OB_MBALL) { - BKE_displist_make_mball(depsgraph, scene, ob); - } - else if (ELEM(ob->type, OB_CURVE, OB_SURF, OB_FONT)) { - BKE_displist_make_curveTypes(depsgraph, scene, ob, 0); - } + object_force_modifier_update_for_bind(depsgraph, scene, ob); smd->modifier.mode = mode; } DEG_id_tag_update(&ob->id, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); - return OPERATOR_FINISHED; } diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index 66cd90c1c83..9bd30aa2497 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -2865,13 +2865,13 @@ void ED_region_grid_draw(ARegion *ar, float zoomx, float zoomy) /* the fine resolution level */ for (int i = 0; i < count_fine; i++) { - immAttrib3fv(color, theme_color); + immAttr3fv(color, theme_color); immVertex2f(pos, x1, y1 * (1.0f - fac) + y2 * fac); - immAttrib3fv(color, theme_color); + immAttr3fv(color, theme_color); immVertex2f(pos, x2, y1 * (1.0f - fac) + y2 * fac); - immAttrib3fv(color, theme_color); + immAttr3fv(color, theme_color); immVertex2f(pos, x1 * (1.0f - fac) + x2 * fac, y1); - immAttrib3fv(color, theme_color); + immAttr3fv(color, theme_color); immVertex2f(pos, x1 * (1.0f - fac) + x2 * fac, y2); fac += gridstep; } @@ -2882,13 +2882,13 @@ void ED_region_grid_draw(ARegion *ar, float zoomx, float zoomy) /* the large resolution level */ for (int i = 0; i < count_large; i++) { - immAttrib3fv(color, theme_color); + immAttr3fv(color, theme_color); immVertex2f(pos, x1, y1 * (1.0f - fac) + y2 * fac); - immAttrib3fv(color, theme_color); + immAttr3fv(color, theme_color); immVertex2f(pos, x2, y1 * (1.0f - fac) + y2 * fac); - immAttrib3fv(color, theme_color); + immAttr3fv(color, theme_color); immVertex2f(pos, x1 * (1.0f - fac) + x2 * fac, y1); - immAttrib3fv(color, theme_color); + immAttr3fv(color, theme_color); immVertex2f(pos, x1 * (1.0f - fac) + x2 * fac, y2); fac += 4.0f * gridstep; } diff --git a/source/blender/editors/screen/glutil.c b/source/blender/editors/screen/glutil.c index b1bda08e9a5..728df79fbbd 100644 --- a/source/blender/editors/screen/glutil.c +++ b/source/blender/editors/screen/glutil.c @@ -297,16 +297,16 @@ void immDrawPixelsTexScaled_clipping(IMMDrawPixelsTexState *state, } immBegin(GPU_PRIM_TRI_FAN, 4); - immAttrib2f(texco, (float)(0 + offset_left) / tex_w, (float)(0 + offset_bot) / tex_h); + immAttr2f(texco, (float)(0 + offset_left) / tex_w, (float)(0 + offset_bot) / tex_h); immVertex2f(pos, rast_x + (float)offset_left * xzoom, rast_y + (float)offset_bot * yzoom); - immAttrib2f(texco, (float)(subpart_w - offset_right) / tex_w, (float)(0 + offset_bot) / tex_h); + immAttr2f(texco, (float)(subpart_w - offset_right) / tex_w, (float)(0 + offset_bot) / tex_h); immVertex2f(pos, rast_x + (float)(subpart_w - offset_right) * xzoom * scaleX, rast_y + (float)offset_bot * yzoom); - immAttrib2f(texco, (float)(subpart_w - offset_right) / tex_w, (float)(subpart_h - offset_top) / tex_h); + immAttr2f(texco, (float)(subpart_w - offset_right) / tex_w, (float)(subpart_h - offset_top) / tex_h); immVertex2f(pos, rast_x + (float)(subpart_w - offset_right) * xzoom * scaleX, rast_y + (float)(subpart_h - offset_top) * yzoom * scaleY); - immAttrib2f(texco, (float)(0 + offset_left) / tex_w, (float)(subpart_h - offset_top) / tex_h); + immAttr2f(texco, (float)(0 + offset_left) / tex_w, (float)(subpart_h - offset_top) / tex_h); immVertex2f(pos, rast_x + (float)offset_left * xzoom, rast_y + (float)(subpart_h - offset_top) * yzoom * scaleY); immEnd(); } diff --git a/source/blender/editors/sculpt_paint/paint_cursor.c b/source/blender/editors/sculpt_paint/paint_cursor.c index 5cca61d4c78..0ee55f0f062 100644 --- a/source/blender/editors/sculpt_paint/paint_cursor.c +++ b/source/blender/editors/sculpt_paint/paint_cursor.c @@ -694,13 +694,13 @@ static void paint_draw_tex_overlay( immUniform1i("image", GL_TEXTURE0); immBegin(GPU_PRIM_TRI_FAN, 4); - immAttrib2f(texCoord, 0.0f, 0.0f); + immAttr2f(texCoord, 0.0f, 0.0f); immVertex2f(pos, quad.xmin, quad.ymin); - immAttrib2f(texCoord, 1.0f, 0.0f); + immAttr2f(texCoord, 1.0f, 0.0f); immVertex2f(pos, quad.xmax, quad.ymin); - immAttrib2f(texCoord, 1.0f, 1.0f); + immAttr2f(texCoord, 1.0f, 1.0f); immVertex2f(pos, quad.xmax, quad.ymax); - immAttrib2f(texCoord, 0.0f, 1.0f); + immAttr2f(texCoord, 0.0f, 1.0f); immVertex2f(pos, quad.xmin, quad.ymax); immEnd(); @@ -777,13 +777,13 @@ static void paint_draw_cursor_overlay( immUniform1i("image", 0); immBegin(GPU_PRIM_TRI_FAN, 4); - immAttrib2f(texCoord, 0.0f, 0.0f); + immAttr2f(texCoord, 0.0f, 0.0f); immVertex2f(pos, quad.xmin, quad.ymin); - immAttrib2f(texCoord, 1.0f, 0.0f); + immAttr2f(texCoord, 1.0f, 0.0f); immVertex2f(pos, quad.xmax, quad.ymin); - immAttrib2f(texCoord, 1.0f, 1.0f); + immAttr2f(texCoord, 1.0f, 1.0f); immVertex2f(pos, quad.xmax, quad.ymax); - immAttrib2f(texCoord, 0.0f, 1.0f); + immAttr2f(texCoord, 0.0f, 1.0f); immVertex2f(pos, quad.xmin, quad.ymax); immEnd(); diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c index e914a24092e..9057c3b0609 100644 --- a/source/blender/editors/sculpt_paint/paint_utils.c +++ b/source/blender/editors/sculpt_paint/paint_utils.c @@ -53,6 +53,7 @@ #include "BKE_customdata.h" #include "BKE_image.h" #include "BKE_material.h" +#include "BKE_mesh_runtime.h" #include "BKE_object.h" #include "BKE_paint.h" #include "BKE_report.h" @@ -285,13 +286,15 @@ static void imapaint_tri_weights( /* compute uv coordinates of mouse in face */ static void imapaint_pick_uv(Mesh *me_eval, Scene *scene, Object *ob_eval, unsigned int faceindex, const int xy[2], float uv[2]) { - const int tottri = me_eval->runtime.looptris.len; int i, findex; float p[2], w[3], absw, minabsw; float matrix[4][4], proj[4][4]; GLint view[4]; const eImagePaintMode mode = scene->toolsettings->imapaint.mode; - const MLoopTri *lt = me_eval->runtime.looptris.array; + + const MLoopTri *lt = BKE_mesh_runtime_looptri_ensure(me_eval); + const int tottri = me_eval->runtime.looptris.len; + const MVert *mvert = me_eval->mvert; const MPoly *mpoly = me_eval->mpoly; const MLoop *mloop = me_eval->mloop; @@ -327,7 +330,7 @@ static void imapaint_pick_uv(Mesh *me_eval, Scene *scene, Object *ob_eval, unsig const Material *ma; const TexPaintSlot *slot; - ma = give_current_material(ob_eval, mp->mat_nr); + ma = give_current_material(ob_eval, mp->mat_nr + 1); slot = &ma->texpaintslot[ma->paint_active_slot]; if (!(slot && slot->uvname && @@ -466,7 +469,7 @@ void paint_sample_color(bContext *C, ARegion *ar, int x, int y, bool texpaint_pr if (ob) { Mesh *me = (Mesh *)ob->data; - Mesh *me_eval = BKE_object_get_evaluated_mesh(depsgraph, ob); /* Or shall we just do ob_eval->mesh_eval ? */ + Mesh *me_eval = ob_eval->runtime.mesh_eval; ViewContext vc; const int mval[2] = {x, y}; diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c index 139986fa1c1..7b3cfe184f5 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.c +++ b/source/blender/editors/sculpt_paint/paint_vertex.c @@ -173,12 +173,12 @@ static MDeformVert *defweight_prev_init(MDeformVert *dvert_prev, MDeformVert *dv * (without rebuilding the 'derivedFinal') */ static bool vertex_paint_use_fast_update_check(Object *ob) { - DerivedMesh *dm = ob->derivedFinal; + Mesh *me_eval = ob->runtime.mesh_eval; - if (dm) { + if (me_eval != NULL) { Mesh *me = BKE_mesh_from_object(ob); if (me && me->mloopcol) { - return (me->mloopcol == CustomData_get_layer(&dm->loopData, CD_MLOOPCOL)); + return (me->mloopcol == CustomData_get_layer(&me_eval->ldata, CD_MLOOPCOL)); } } diff --git a/source/blender/editors/space_buttons/buttons_texture.c b/source/blender/editors/space_buttons/buttons_texture.c index de422565abd..958b55526c3 100644 --- a/source/blender/editors/space_buttons/buttons_texture.c +++ b/source/blender/editors/space_buttons/buttons_texture.c @@ -507,7 +507,7 @@ void uiTemplateTextureShow(uiLayout *layout, bContext *C, PointerRNA *ptr, Prope uiBlock *block = uiLayoutGetBlock(layout); uiBut *but; - but = uiDefIconBut(block, UI_BTYPE_BUT, 0, ICON_BUTS, 0, 0, UI_UNIT_X, UI_UNIT_Y, + but = uiDefIconBut(block, UI_BTYPE_BUT, 0, ICON_PROPERTIES, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0.0, 0.0, TIP_("Show texture in texture tab")); UI_but_func_set(but, template_texture_show, user->ptr.data, user->prop); } diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c index 14ab00cbef5..7820012ad14 100644 --- a/source/blender/editors/space_buttons/space_buttons.c +++ b/source/blender/editors/space_buttons/space_buttons.c @@ -514,6 +514,7 @@ static void buttons_area_listener( break; case NC_BRUSH: buttons_area_redraw(sa, BCONTEXT_TEXTURE); + buttons_area_redraw(sa, BCONTEXT_TOOL); sbuts->preview = 1; break; case NC_TEXTURE: diff --git a/source/blender/editors/space_clip/clip_dopesheet_draw.c b/source/blender/editors/space_clip/clip_dopesheet_draw.c index 2aa0a3e2b9a..dec7487a754 100644 --- a/source/blender/editors/space_clip/clip_dopesheet_draw.c +++ b/source/blender/editors/space_clip/clip_dopesheet_draw.c @@ -82,7 +82,7 @@ static void draw_keyframe_shape(float x, float y, bool sel, float alpha, UI_GetThemeColorShadeAlpha4fv(TH_STRIP_SELECT, 50, -255 * (1.0f - alpha), color); } - immAttrib4fv(color_id, color); + immAttr4fv(color_id, color); immVertex2f(pos_id, x, y); } @@ -225,8 +225,8 @@ void clip_draw_dopesheet_main(SpaceClip *sc, ARegion *ar, Scene *scene) immBegin(GPU_PRIM_POINTS, keyframe_len); /* all same size with black outline */ - immAttrib1f(size_id, 2.0f * STRIP_HEIGHT_HALF); - immAttrib4ub(outline_color_id, 0, 0, 0, 255); + immAttr1f(size_id, 2.0f * STRIP_HEIGHT_HALF); + immAttr4ub(outline_color_id, 0, 0, 0, 255); y = (float) CHANNEL_FIRST; /* start again at the top */ for (channel = dopesheet->channels.first; channel; channel = channel->next) { diff --git a/source/blender/editors/space_clip/clip_draw.c b/source/blender/editors/space_clip/clip_draw.c index ebdf5342172..9f4983a35b2 100644 --- a/source/blender/editors/space_clip/clip_draw.c +++ b/source/blender/editors/space_clip/clip_draw.c @@ -1154,16 +1154,16 @@ static void draw_plane_marker_image(Scene *scene, immBegin(GPU_PRIM_TRI_FAN, 4); - immAttrib2f(texCoord, 0.0f, 0.0f); + immAttr2f(texCoord, 0.0f, 0.0f); immVertex2f(pos, 0.0f, 0.0f); - immAttrib2f(texCoord, 1.0f, 0.0f); + immAttr2f(texCoord, 1.0f, 0.0f); immVertex2f(pos, 1.0f, 0.0f); - immAttrib2f(texCoord, 1.0f, 1.0f); + immAttr2f(texCoord, 1.0f, 1.0f); immVertex2f(pos, 1.0f, 1.0f); - immAttrib2f(texCoord, 0.0f, 1.0f); + immAttr2f(texCoord, 0.0f, 1.0f); immVertex2f(pos, 0.0f, 1.0f); immEnd(); diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c index 679ae6b9648..2ae432fbc4e 100644 --- a/source/blender/editors/space_file/file_draw.c +++ b/source/blender/editors/space_file/file_draw.c @@ -221,13 +221,13 @@ void file_draw_buttons(const bContext *C, ARegion *ar) /* Filename number increment / decrement buttons. */ if (fnumbuttons && (params->flag & FILE_DIRSEL_ONLY) == 0) { UI_block_align_begin(block); - but = uiDefIconButO(block, UI_BTYPE_BUT, "FILE_OT_filenum", 0, ICON_ZOOMOUT, + but = uiDefIconButO(block, UI_BTYPE_BUT, "FILE_OT_filenum", 0, ICON_REMOVE, min_x + line2_w + separator - chan_offs, line2_y, btn_fn_w, btn_h, TIP_("Decrement the filename number")); RNA_int_set(UI_but_operator_ptr_get(but), "increment", -1); - but = uiDefIconButO(block, UI_BTYPE_BUT, "FILE_OT_filenum", 0, ICON_ZOOMIN, + but = uiDefIconButO(block, UI_BTYPE_BUT, "FILE_OT_filenum", 0, ICON_ADD, min_x + line2_w + separator + btn_fn_w - chan_offs, line2_y, btn_fn_w, btn_h, TIP_("Increment the filename number")); @@ -515,15 +515,15 @@ static void draw_dividers(FileLayout *layout, View2D *v2d) sx += step; v1[0] = v2[0] = sx; - immSkipAttrib(color); + immAttrSkip(color); immVertex2iv(pos, v1); - immAttrib3ubv(color, col_lo); + immAttr3ubv(color, col_lo); immVertex2iv(pos, v2); v1[0] = v2[0] = sx + 1; - immSkipAttrib(color); + immAttrSkip(color); immVertex2iv(pos, v1); - immAttrib3ubv(color, col_hi); + immAttr3ubv(color, col_hi); immVertex2iv(pos, v2); } diff --git a/source/blender/editors/space_file/filelist.h b/source/blender/editors/space_file/filelist.h index 76845c44226..6d898ee2fe9 100644 --- a/source/blender/editors/space_file/filelist.h +++ b/source/blender/editors/space_file/filelist.h @@ -56,12 +56,12 @@ typedef enum FileCheckType { CHECK_ALL = 3 } FileCheckType; -struct ListBase * folderlist_new(void); +struct ListBase *folderlist_new(void); void folderlist_free(struct ListBase *folderlist); -struct ListBase * folderlist_duplicate(ListBase *folderlist); +struct ListBase *folderlist_duplicate(ListBase *folderlist); void folderlist_popdir(struct ListBase *folderlist, char *dir); void folderlist_pushdir(struct ListBase *folderlist, const char *dir); -const char * folderlist_peeklastdir(struct ListBase *folderdist); +const char *folderlist_peeklastdir(struct ListBase *folderdist); int folderlist_clear_next(struct SpaceFile *sfile); @@ -77,24 +77,24 @@ void filelist_filter(struct FileList *filelist); void filelist_init_icons(void); void filelist_free_icons(void); void filelist_imgsize(struct FileList *filelist, short w, short h); -struct ImBuf * filelist_getimage(struct FileList *filelist, const int index); -struct ImBuf * filelist_geticon_image(struct FileList *filelist, const int index); +struct ImBuf *filelist_getimage(struct FileList *filelist, const int index); +struct ImBuf *filelist_geticon_image(struct FileList *filelist, const int index); int filelist_geticon(struct FileList *filelist, const int index, const bool is_main); -struct FileList * filelist_new(short type); +struct FileList *filelist_new(short type); void filelist_clear(struct FileList *filelist); void filelist_clear_ex(struct FileList *filelist, const bool do_cache, const bool do_selection); void filelist_free(struct FileList *filelist); -const char * filelist_dir(struct FileList *filelist); +const char *filelist_dir(struct FileList *filelist); bool filelist_is_dir(struct FileList *filelist, const char *path); void filelist_setdir(struct FileList *filelist, char *r_dir); int filelist_files_ensure(struct FileList *filelist); int filelist_empty(struct FileList *filelist); -FileDirEntry * filelist_file(struct FileList *filelist, int index); +FileDirEntry *filelist_file(struct FileList *filelist, int index); int filelist_file_findpath(struct FileList *filelist, const char *file); -FileDirEntry * filelist_entry_find_uuid(struct FileList *filelist, const int uuid[4]); +FileDirEntry *filelist_entry_find_uuid(struct FileList *filelist, const int uuid[4]); void filelist_file_cache_slidingwindow_set(struct FileList *filelist, size_t window_size); bool filelist_file_cache_block(struct FileList *filelist, const int index); diff --git a/source/blender/editors/space_graph/graph_buttons.c b/source/blender/editors/space_graph/graph_buttons.c index c8b3b182b9c..ddb248f754d 100644 --- a/source/blender/editors/space_graph/graph_buttons.c +++ b/source/blender/editors/space_graph/graph_buttons.c @@ -874,7 +874,7 @@ static void graph_draw_driver_settings_panel(uiLayout *layout, ID *id, FCurve *f /* add driver variable - add blank */ row = uiLayoutRow(layout, true); block = uiLayoutGetBlock(row); - but = uiDefIconTextBut(block, UI_BTYPE_BUT, B_IPO_DEPCHANGE, ICON_ZOOMIN, IFACE_("Add Input Variable"), + but = uiDefIconTextBut(block, UI_BTYPE_BUT, B_IPO_DEPCHANGE, ICON_ADD, IFACE_("Add Input Variable"), 0, 0, 10 * UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, TIP_("Add a Driver Variable to keep track an input used by the driver")); @@ -888,7 +888,7 @@ static void graph_draw_driver_settings_panel(uiLayout *layout, ID *id, FCurve *f /* add driver variable */ row = uiLayoutRow(layout, false); block = uiLayoutGetBlock(row); - but = uiDefIconTextBut(block, UI_BTYPE_BUT, B_IPO_DEPCHANGE, ICON_ZOOMIN, IFACE_("Add Input Variable"), + but = uiDefIconTextBut(block, UI_BTYPE_BUT, B_IPO_DEPCHANGE, ICON_ADD, IFACE_("Add Input Variable"), 0, 0, 10 * UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, TIP_("Driver variables ensure that all dependencies will be accounted for, eusuring that drivers will update correctly")); diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c index ad9af8cb948..927f64cb528 100644 --- a/source/blender/editors/space_graph/graph_draw.c +++ b/source/blender/editors/space_graph/graph_draw.c @@ -363,9 +363,9 @@ static void draw_fcurve_handles(SpaceIpo *sipo, FCurve *fcu) if ((!prevbezt && (bezt->ipo == BEZT_IPO_BEZ)) || (prevbezt && (prevbezt->ipo == BEZT_IPO_BEZ))) { UI_GetThemeColor3ubv(basecol + bezt->h1, col); col[3] = fcurve_display_alpha(fcu) * 255; - immAttrib4ubv(color, col); + immAttr4ubv(color, col); immVertex2fv(pos, fp); - immAttrib4ubv(color, col); + immAttr4ubv(color, col); immVertex2fv(pos, fp + 3); } @@ -373,9 +373,9 @@ static void draw_fcurve_handles(SpaceIpo *sipo, FCurve *fcu) if (bezt->ipo == BEZT_IPO_BEZ) { UI_GetThemeColor3ubv(basecol + bezt->h2, col); col[3] = fcurve_display_alpha(fcu) * 255; - immAttrib4ubv(color, col); + immAttr4ubv(color, col); immVertex2fv(pos, fp + 3); - immAttrib4ubv(color, col); + immAttr4ubv(color, col); immVertex2fv(pos, fp + 6); } } @@ -387,9 +387,9 @@ static void draw_fcurve_handles(SpaceIpo *sipo, FCurve *fcu) fp = bezt->vec[0]; UI_GetThemeColor3ubv(basecol + bezt->h1, col); col[3] = fcurve_display_alpha(fcu) * 255; - immAttrib4ubv(color, col); + immAttr4ubv(color, col); immVertex2fv(pos, fp); - immAttrib4ubv(color, col); + immAttr4ubv(color, col); immVertex2fv(pos, fp + 3); } @@ -400,9 +400,9 @@ static void draw_fcurve_handles(SpaceIpo *sipo, FCurve *fcu) fp = bezt->vec[1]; UI_GetThemeColor3ubv(basecol + bezt->h2, col); col[3] = fcurve_display_alpha(fcu) * 255; - immAttrib4ubv(color, col); + immAttr4ubv(color, col); immVertex2fv(pos, fp); - immAttrib4ubv(color, col); + immAttr4ubv(color, col); immVertex2fv(pos, fp + 3); } } diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index b9f49d0aeae..65170c7c203 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -1786,7 +1786,7 @@ static void node_composit_buts_file_output_ex(uiLayout *layout, bContext *C, Poi uiItemS(layout); - uiItemO(layout, IFACE_("Add Input"), ICON_ZOOMIN, "NODE_OT_output_file_add_socket"); + uiItemO(layout, IFACE_("Add Input"), ICON_ADD, "NODE_OT_output_file_add_socket"); row = uiLayoutRow(layout, false); col = uiLayoutColumn(row, true); @@ -1795,13 +1795,13 @@ static void node_composit_buts_file_output_ex(uiLayout *layout, bContext *C, Poi /* using different collection properties if multilayer format is enabled */ if (multilayer) { uiTemplateList(col, C, "UI_UL_list", "file_output_node", ptr, "layer_slots", ptr, "active_input_index", - NULL, 0, 0, 0, 0); + NULL, 0, 0, 0, 0, false); RNA_property_collection_lookup_int(ptr, RNA_struct_find_property(ptr, "layer_slots"), active_index, &active_input_ptr); } else { uiTemplateList(col, C, "UI_UL_list", "file_output_node", ptr, "file_slots", ptr, "active_input_index", - NULL, 0, 0, 0, 0); + NULL, 0, 0, 0, 0, false); RNA_property_collection_lookup_int(ptr, RNA_struct_find_property(ptr, "file_slots"), active_index, &active_input_ptr); } @@ -2495,8 +2495,8 @@ static void node_composit_buts_cryptomatte(uiLayout *layout, bContext *UNUSED(C) static void node_composit_buts_cryptomatte_ex(uiLayout *layout, bContext *UNUSED(C), PointerRNA *UNUSED(ptr)) { - uiItemO(layout, IFACE_("Add Crypto Layer"), ICON_ZOOMIN, "NODE_OT_cryptomatte_layer_add"); - uiItemO(layout, IFACE_("Remove Crypto Layer"), ICON_ZOOMOUT, "NODE_OT_cryptomatte_layer_remove"); + uiItemO(layout, IFACE_("Add Crypto Layer"), ICON_ADD, "NODE_OT_cryptomatte_layer_add"); + uiItemO(layout, IFACE_("Remove Crypto Layer"), ICON_REMOVE, "NODE_OT_cryptomatte_layer_remove"); } static void node_composit_buts_brightcontrast(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) @@ -3007,9 +3007,9 @@ void ED_node_init_butfuncs(void) NODE_TYPES_END /* tree type icons */ - ntreeType_Composite->ui_icon = ICON_RENDERLAYERS; - ntreeType_Shader->ui_icon = ICON_MATERIAL; - ntreeType_Texture->ui_icon = ICON_TEXTURE; + ntreeType_Composite->ui_icon = ICON_NODE_COMPOSITING; + ntreeType_Shader->ui_icon = ICON_NODE_MATERIAL; + ntreeType_Texture->ui_icon = ICON_NODE_TEXTURE; } void ED_init_custom_node_type(bNodeType *ntype) diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c index c2efc548c30..0a913bcbea8 100644 --- a/source/blender/editors/space_node/node_buttons.c +++ b/source/blender/editors/space_node/node_buttons.c @@ -150,14 +150,14 @@ static void node_tree_interface_panel(const bContext *C, Panel *pa) ot = WM_operatortype_find("NODE_OT_tree_socket_add", false); uiItemL(col, IFACE_("Inputs:"), ICON_NONE); uiTemplateList(col, (bContext *)C, "NODE_UL_interface_sockets", "inputs", &ptr, "inputs", &ptr, "active_input", - NULL, 0, 0, 0, 0); + NULL, 0, 0, 0, 0, false); uiItemFullO_ptr(col, ot, "", ICON_PLUS, NULL, WM_OP_EXEC_DEFAULT, 0, &opptr); RNA_enum_set(&opptr, "in_out", SOCK_IN); col = uiLayoutColumn(split, true); uiItemL(col, IFACE_("Outputs:"), ICON_NONE); uiTemplateList(col, (bContext *)C, "NODE_UL_interface_sockets", "outputs", &ptr, "outputs", &ptr, "active_output", - NULL, 0, 0, 0, 0); + NULL, 0, 0, 0, 0, false); uiItemFullO_ptr(col, ot, "", ICON_PLUS, NULL, WM_OP_EXEC_DEFAULT, 0, &opptr); RNA_enum_set(&opptr, "in_out", SOCK_OUT); diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index bba46771674..17ef2c32160 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -638,7 +638,7 @@ static void node_socket_circle_draw(const bContext *C, bNodeTree *ntree, Pointer RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &ptr); sock->typeinfo->draw_color((bContext *)C, &ptr, &node_ptr, color); - immAttrib4fv(col, color); + immAttr4fv(col, color); immVertex2f(pos, sock->locx, sock->locy); } diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c index f95081da4a5..1c45dc24108 100644 --- a/source/blender/editors/space_outliner/outliner_draw.c +++ b/source/blender/editors/space_outliner/outliner_draw.c @@ -1143,7 +1143,7 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te) else if (te->idcode == SEQ_TYPE_SOUND_RAM) data.icon = ICON_SOUND; else if (te->idcode == SEQ_TYPE_IMAGE) - data.icon = ICON_IMAGE_COL; + data.icon = ICON_IMAGE; else data.icon = ICON_PARTICLES; break; @@ -1226,6 +1226,9 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te) if (ob->dup_group) { data.icon = ICON_OUTLINER_OB_GROUP_INSTANCE; } + else if (ob->empty_drawtype == OB_EMPTY_IMAGE) { + data.icon = ICON_OUTLINER_OB_IMAGE; + } else { data.icon = ICON_OUTLINER_OB_EMPTY; } @@ -1311,7 +1314,7 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te) data.icon = ICON_OUTLINER_DATA_GREASEPENCIL; break; case ID_LP: { - LightProbe * lp = (LightProbe *)tselem->id; + LightProbe *lp = (LightProbe *)tselem->id; switch (lp->type) { case LIGHTPROBE_TYPE_CUBE: data.icon = ICON_LIGHTPROBE_CUBEMAP; break; @@ -1328,7 +1331,7 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te) data.icon = ICON_BRUSH_DATA; break; case ID_SCR: case ID_WS: - data.icon = ICON_SPLITSCREEN; break; + data.icon = ICON_WORKSPACE; break; default: break; } @@ -1423,7 +1426,7 @@ static void outliner_draw_iconrow_doit( if (active != OL_DRAWSEL_NONE) { float ufac = UI_UNIT_X / 20.0f; - float color[4] = {1.0f, 1.0f, 1.0f, 0.4f}; + float color[4] = {1.0f, 1.0f, 1.0f, 0.2f}; UI_draw_roundbox_corner_set(UI_CNR_ALL); color[3] *= alpha_fac; @@ -1693,7 +1696,7 @@ static void outliner_draw_tree_element( if (!(ELEM(tselem->type, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM, TSE_ID_BASE))) { tselem_draw_icon(block, xmax, (float)startx + offsx, (float)*starty, tselem, te, alpha_fac, true); - offsx += UI_UNIT_X + 2 * ufac; + offsx += UI_UNIT_X + 4 * ufac; } else offsx += 2 * ufac; @@ -1714,13 +1717,13 @@ static void outliner_draw_tree_element( (float)startx + offsx + 2 * ufac, (float)*starty + 2 * ufac, ICON_LIBRARY_DATA_DIRECT, alpha_fac); } - offsx += UI_UNIT_X + 2 * ufac; + offsx += UI_UNIT_X + 4 * ufac; } else if (ELEM(tselem->type, 0, TSE_LAYER_COLLECTION) && ID_IS_STATIC_OVERRIDE(tselem->id)) { UI_icon_draw_alpha( (float)startx + offsx + 2 * ufac, (float)*starty + 2 * ufac, ICON_LIBRARY_DATA_OVERRIDE, alpha_fac); - offsx += UI_UNIT_X + 2 * ufac; + offsx += UI_UNIT_X + 4 * ufac; } GPU_blend(false); diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c index 864609e4157..96193d375d5 100644 --- a/source/blender/editors/space_sequencer/sequencer_draw.c +++ b/source/blender/editors/space_sequencer/sequencer_draw.c @@ -1341,29 +1341,29 @@ void draw_image_seq(const bContext *C, Scene *scene, ARegion *ar, SpaceSeq *sseq tot_clip.xmax = v2d->tot.xmin + (fabsf(BLI_rctf_size_x(&v2d->tot)) * scene->ed->over_border.xmax); tot_clip.ymax = v2d->tot.ymin + (fabsf(BLI_rctf_size_y(&v2d->tot)) * scene->ed->over_border.ymax); - immAttrib2f(texCoord, scene->ed->over_border.xmin, scene->ed->over_border.ymin); + immAttr2f(texCoord, scene->ed->over_border.xmin, scene->ed->over_border.ymin); immVertex2f(pos, tot_clip.xmin, tot_clip.ymin); - immAttrib2f(texCoord, scene->ed->over_border.xmin, scene->ed->over_border.ymax); + immAttr2f(texCoord, scene->ed->over_border.xmin, scene->ed->over_border.ymax); immVertex2f(pos, tot_clip.xmin, tot_clip.ymax); - immAttrib2f(texCoord, scene->ed->over_border.xmax, scene->ed->over_border.ymax); + immAttr2f(texCoord, scene->ed->over_border.xmax, scene->ed->over_border.ymax); immVertex2f(pos, tot_clip.xmax, tot_clip.ymax); - immAttrib2f(texCoord, scene->ed->over_border.xmax, scene->ed->over_border.ymin); + immAttr2f(texCoord, scene->ed->over_border.xmax, scene->ed->over_border.ymin); immVertex2f(pos, tot_clip.xmax, tot_clip.ymin); } else if (sseq->overlay_type == SEQ_DRAW_OVERLAY_REFERENCE) { - immAttrib2f(texCoord, 0.0f, 0.0f); + immAttr2f(texCoord, 0.0f, 0.0f); immVertex2f(pos, v2d->tot.xmin, v2d->tot.ymin); - immAttrib2f(texCoord, 0.0f, 1.0f); + immAttr2f(texCoord, 0.0f, 1.0f); immVertex2f(pos, v2d->tot.xmin, v2d->tot.ymax); - immAttrib2f(texCoord, 1.0f, 1.0f); + immAttr2f(texCoord, 1.0f, 1.0f); immVertex2f(pos, v2d->tot.xmax, v2d->tot.ymax); - immAttrib2f(texCoord, 1.0f, 0.0f); + immAttr2f(texCoord, 1.0f, 0.0f); immVertex2f(pos, v2d->tot.xmax, v2d->tot.ymin); } } @@ -1383,31 +1383,31 @@ void draw_image_seq(const bContext *C, Scene *scene, ARegion *ar, SpaceSeq *sseq imagey = aspect / image_aspect; } - immAttrib2f(texCoord, 0.0f, 0.0f); + immAttr2f(texCoord, 0.0f, 0.0f); immVertex2f(pos, -imagex, -imagey); - immAttrib2f(texCoord, 0.0f, 1.0f); + immAttr2f(texCoord, 0.0f, 1.0f); immVertex2f(pos, -imagex, imagey); - immAttrib2f(texCoord, 1.0f, 1.0f); + immAttr2f(texCoord, 1.0f, 1.0f); immVertex2f(pos, imagex, imagey); - immAttrib2f(texCoord, 1.0f, 0.0f); + immAttr2f(texCoord, 1.0f, 0.0f); immVertex2f(pos, imagex, -imagey); } else { draw_metadata = ((sseq->flag & SEQ_SHOW_METADATA) != 0); - immAttrib2f(texCoord, 0.0f, 0.0f); + immAttr2f(texCoord, 0.0f, 0.0f); immVertex2f(pos, v2d->tot.xmin, v2d->tot.ymin); - immAttrib2f(texCoord, 0.0f, 1.0f); + immAttr2f(texCoord, 0.0f, 1.0f); immVertex2f(pos, v2d->tot.xmin, v2d->tot.ymax); - immAttrib2f(texCoord, 1.0f, 1.0f); + immAttr2f(texCoord, 1.0f, 1.0f); immVertex2f(pos, v2d->tot.xmax, v2d->tot.ymax); - immAttrib2f(texCoord, 1.0f, 0.0f); + immAttr2f(texCoord, 1.0f, 0.0f); immVertex2f(pos, v2d->tot.xmax, v2d->tot.ymin); } diff --git a/source/blender/editors/space_view3d/CMakeLists.txt b/source/blender/editors/space_view3d/CMakeLists.txt index 4bcec142aa9..0d30d623b8d 100644 --- a/source/blender/editors/space_view3d/CMakeLists.txt +++ b/source/blender/editors/space_view3d/CMakeLists.txt @@ -44,7 +44,6 @@ set(INC_SYS set(SRC drawobject.c - drawvolume.c space_view3d.c view3d_buttons.c view3d_camera_control.c diff --git a/source/blender/editors/space_view3d/drawvolume.c b/source/blender/editors/space_view3d/drawvolume.c deleted file mode 100644 index 46bd57df7f5..00000000000 --- a/source/blender/editors/space_view3d/drawvolume.c +++ /dev/null @@ -1,853 +0,0 @@ -/* - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * Contributor(s): Daniel Genrich - * - * ***** END GPL LICENSE BLOCK ***** - */ - -/** \file blender/editors/space_view3d/drawvolume.c - * \ingroup spview3d - */ - -#include <string.h> -#include <math.h> - -#include "MEM_guardedalloc.h" - -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" -#include "DNA_smoke_types.h" -#include "DNA_view3d_types.h" - -#include "BLI_utildefines.h" -#include "BLI_math.h" - -#include "BKE_colorband.h" -#include "BKE_deform.h" -#include "BKE_particle.h" - -#include "smoke_API.h" - -#include "BIF_gl.h" - -#include "GPU_shader.h" -#include "GPU_texture.h" -#include "GPU_state.h" - -#include "view3d_intern.h" // own include - -struct GPUTexture; - -// #define DEBUG_DRAW_TIME - -#ifdef DEBUG_DRAW_TIME -# include "PIL_time.h" -# include "PIL_time_utildefines.h" -#endif - -/* *************************** Transfer functions *************************** */ - -enum { - TFUNC_FLAME_SPECTRUM = 0, - TFUNC_COLOR_RAMP = 1, -}; - -#define TFUNC_WIDTH 256 - -static void create_flame_spectrum_texture(float *data) -{ -#define FIRE_THRESH 7 -#define MAX_FIRE_ALPHA 0.06f -#define FULL_ON_FIRE 100 - - float *spec_pixels = MEM_mallocN(TFUNC_WIDTH * 4 * 16 * 16 * sizeof(float), "spec_pixels"); - - blackbody_temperature_to_rgb_table(data, TFUNC_WIDTH, 1500, 3000); - - for (int i = 0; i < 16; i++) { - for (int j = 0; j < 16; j++) { - for (int k = 0; k < TFUNC_WIDTH; k++) { - int index = (j * TFUNC_WIDTH * 16 + i * TFUNC_WIDTH + k) * 4; - if (k >= FIRE_THRESH) { - spec_pixels[index] = (data[k * 4]); - spec_pixels[index + 1] = (data[k * 4 + 1]); - spec_pixels[index + 2] = (data[k * 4 + 2]); - spec_pixels[index + 3] = MAX_FIRE_ALPHA * ( - (k > FULL_ON_FIRE) ? 1.0f : (k - FIRE_THRESH) / ((float)FULL_ON_FIRE - FIRE_THRESH)); - } - else { - zero_v4(&spec_pixels[index]); - } - } - } - } - - memcpy(data, spec_pixels, sizeof(float) * 4 * TFUNC_WIDTH); - - MEM_freeN(spec_pixels); - -#undef FIRE_THRESH -#undef MAX_FIRE_ALPHA -#undef FULL_ON_FIRE -} - -static void create_color_ramp(const ColorBand *coba, float *data) -{ - for (int i = 0; i < TFUNC_WIDTH; i++) { - BKE_colorband_evaluate(coba, (float)i / TFUNC_WIDTH, &data[i * 4]); - } -} - -static GPUTexture *create_transfer_function(int type, const ColorBand *coba) -{ - float *data = MEM_mallocN(sizeof(float) * 4 * TFUNC_WIDTH, __func__); - - switch (type) { - case TFUNC_FLAME_SPECTRUM: - create_flame_spectrum_texture(data); - break; - case TFUNC_COLOR_RAMP: - create_color_ramp(coba, data); - break; - } - - GPUTexture *tex = GPU_texture_create_1D(TFUNC_WIDTH, GPU_RGBA8, data, NULL); - - MEM_freeN(data); - - return tex; -} - -static GPUTexture *create_field_texture(SmokeDomainSettings *sds) -{ - float *field = NULL; - - switch (sds->coba_field) { -#ifdef WITH_SMOKE - case FLUID_FIELD_DENSITY: field = smoke_get_density(sds->fluid); break; - case FLUID_FIELD_HEAT: field = smoke_get_heat(sds->fluid); break; - case FLUID_FIELD_FUEL: field = smoke_get_fuel(sds->fluid); break; - case FLUID_FIELD_REACT: field = smoke_get_react(sds->fluid); break; - case FLUID_FIELD_FLAME: field = smoke_get_flame(sds->fluid); break; - case FLUID_FIELD_VELOCITY_X: field = smoke_get_velocity_x(sds->fluid); break; - case FLUID_FIELD_VELOCITY_Y: field = smoke_get_velocity_y(sds->fluid); break; - case FLUID_FIELD_VELOCITY_Z: field = smoke_get_velocity_z(sds->fluid); break; - case FLUID_FIELD_COLOR_R: field = smoke_get_color_r(sds->fluid); break; - case FLUID_FIELD_COLOR_G: field = smoke_get_color_g(sds->fluid); break; - case FLUID_FIELD_COLOR_B: field = smoke_get_color_b(sds->fluid); break; - case FLUID_FIELD_FORCE_X: field = smoke_get_force_x(sds->fluid); break; - case FLUID_FIELD_FORCE_Y: field = smoke_get_force_y(sds->fluid); break; - case FLUID_FIELD_FORCE_Z: field = smoke_get_force_z(sds->fluid); break; -#endif - default: return NULL; - } - - return GPU_texture_create_3D(sds->res[0], sds->res[1], sds->res[2], GPU_R8, field, NULL); -} - -typedef struct VolumeSlicer { - float size[3]; - float min[3]; - float max[3]; - float (*verts)[3]; -} VolumeSlicer; - -/* *************************** Axis Aligned Slicing ************************** */ - -static void create_single_slice(VolumeSlicer *slicer, const float depth, - const int axis, const int idx) -{ - const float vertices[3][4][3] = { - { - { depth, slicer->min[1], slicer->min[2] }, - { depth, slicer->max[1], slicer->min[2] }, - { depth, slicer->max[1], slicer->max[2] }, - { depth, slicer->min[1], slicer->max[2] } - }, - { - { slicer->min[0], depth, slicer->min[2] }, - { slicer->min[0], depth, slicer->max[2] }, - { slicer->max[0], depth, slicer->max[2] }, - { slicer->max[0], depth, slicer->min[2] } - }, - { - { slicer->min[0], slicer->min[1], depth }, - { slicer->min[0], slicer->max[1], depth }, - { slicer->max[0], slicer->max[1], depth }, - { slicer->max[0], slicer->min[1], depth } - } - }; - - copy_v3_v3(slicer->verts[idx + 0], vertices[axis][0]); - copy_v3_v3(slicer->verts[idx + 1], vertices[axis][1]); - copy_v3_v3(slicer->verts[idx + 2], vertices[axis][2]); - copy_v3_v3(slicer->verts[idx + 3], vertices[axis][0]); - copy_v3_v3(slicer->verts[idx + 4], vertices[axis][2]); - copy_v3_v3(slicer->verts[idx + 5], vertices[axis][3]); -} - -static void create_axis_aligned_slices(VolumeSlicer *slicer, const int num_slices, - const float view_dir[3], const int axis) -{ - float depth, slice_size = slicer->size[axis] / num_slices; - - /* always process slices in back to front order! */ - if (view_dir[axis] > 0.0f) { - depth = slicer->min[axis]; - } - else { - depth = slicer->max[axis]; - slice_size = -slice_size; - } - - int count = 0; - for (int slice = 0; slice < num_slices; slice++) { - create_single_slice(slicer, depth, axis, count); - - count += 6; - depth += slice_size; - } -} - -/* *************************** View Aligned Slicing ************************** */ - -/* Code adapted from: - * "GPU-based Volume Rendering, Real-time Volume Graphics", AK Peters/CRC Press - */ -static int create_view_aligned_slices(VolumeSlicer *slicer, - const int num_slices, - const float view_dir[3]) -{ - const int indices[] = { 0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 5 }; - - const float vertices[8][3] = { - { slicer->min[0], slicer->min[1], slicer->min[2] }, - { slicer->max[0], slicer->min[1], slicer->min[2] }, - { slicer->max[0], slicer->max[1], slicer->min[2] }, - { slicer->min[0], slicer->max[1], slicer->min[2] }, - { slicer->min[0], slicer->min[1], slicer->max[2] }, - { slicer->max[0], slicer->min[1], slicer->max[2] }, - { slicer->max[0], slicer->max[1], slicer->max[2] }, - { slicer->min[0], slicer->max[1], slicer->max[2] } - }; - - const int edges[12][2] = { - { 0, 1 }, { 1, 2 }, { 2, 3 }, - { 3, 0 }, { 0, 4 }, { 1, 5 }, - { 2, 6 }, { 3, 7 }, { 4, 5 }, - { 5, 6 }, { 6, 7 }, { 7, 4 } - }; - - const int edge_list[8][12] = { - { 0, 1, 5, 6, 4, 8, 11, 9, 3, 7, 2, 10 }, - { 0, 4, 3, 11, 1, 2, 6, 7, 5, 9, 8, 10 }, - { 1, 5, 0, 8, 2, 3, 7, 4, 6, 10, 9, 11 }, - { 7, 11, 10, 8, 2, 6, 1, 9, 3, 0, 4, 5 }, - { 8, 5, 9, 1, 11, 10, 7, 6, 4, 3, 0, 2 }, - { 9, 6, 10, 2, 8, 11, 4, 7, 5, 0, 1, 3 }, - { 9, 8, 5, 4, 6, 1, 2, 0, 10, 7, 11, 3 }, - { 10, 9, 6, 5, 7, 2, 3, 1, 11, 4, 8, 0 } - }; - - /* find vertex that is the furthest from the view plane */ - int max_index = 0; - float max_dist, min_dist; - min_dist = max_dist = dot_v3v3(view_dir, vertices[0]); - - for (int i = 1; i < 8; i++) { - float dist = dot_v3v3(view_dir, vertices[i]); - - if (dist > max_dist) { - max_dist = dist; - max_index = i; - } - - if (dist < min_dist) { - min_dist = dist; - } - } - - max_dist -= FLT_EPSILON; - min_dist += FLT_EPSILON; - - /* start and direction vectors */ - float vec_start[12][3], vec_dir[12][3]; - /* lambda intersection values */ - float lambda[12], lambda_inc[12]; - float denom = 0.0f; - - float plane_dist = min_dist; - float plane_dist_inc = (max_dist - min_dist) / (float)num_slices; - - /* for all edges */ - for (int i = 0; i < 12; i++) { - copy_v3_v3(vec_start[i], vertices[edges[edge_list[max_index][i]][0]]); - copy_v3_v3(vec_dir[i], vertices[edges[edge_list[max_index][i]][1]]); - sub_v3_v3(vec_dir[i], vec_start[i]); - - denom = dot_v3v3(vec_dir[i], view_dir); - - if (1.0f + denom != 1.0f) { - lambda_inc[i] = plane_dist_inc / denom; - lambda[i] = (plane_dist - dot_v3v3(vec_start[i], view_dir)) / denom; - } - else { - lambda[i] = -1.0f; - lambda_inc[i] = 0.0f; - } - } - - float intersections[6][3]; - float dL[12]; - int num_points = 0; - /* find intersections for each slice, process them in back to front order */ - for (int i = 0; i < num_slices; i++) { - for (int e = 0; e < 12; e++) { - dL[e] = lambda[e] + i * lambda_inc[e]; - } - - if ((dL[0] >= 0.0f) && (dL[0] < 1.0f)) { - madd_v3_v3v3fl(intersections[0], vec_start[0], vec_dir[0], dL[0]); - } - else if ((dL[1] >= 0.0f) && (dL[1] < 1.0f)) { - madd_v3_v3v3fl(intersections[0], vec_start[1], vec_dir[1], dL[1]); - } - else if ((dL[3] >= 0.0f) && (dL[3] < 1.0f)) { - madd_v3_v3v3fl(intersections[0], vec_start[3], vec_dir[3], dL[3]); - } - else continue; - - if ((dL[2] >= 0.0f) && (dL[2] < 1.0f)) { - madd_v3_v3v3fl(intersections[1], vec_start[2], vec_dir[2], dL[2]); - } - else if ((dL[0] >= 0.0f) && (dL[0] < 1.0f)) { - madd_v3_v3v3fl(intersections[1], vec_start[0], vec_dir[0], dL[0]); - } - else if ((dL[1] >= 0.0f) && (dL[1] < 1.0f)) { - madd_v3_v3v3fl(intersections[1], vec_start[1], vec_dir[1], dL[1]); - } - else { - madd_v3_v3v3fl(intersections[1], vec_start[3], vec_dir[3], dL[3]); - } - - if ((dL[4] >= 0.0f) && (dL[4] < 1.0f)) { - madd_v3_v3v3fl(intersections[2], vec_start[4], vec_dir[4], dL[4]); - } - else if ((dL[5] >= 0.0f) && (dL[5] < 1.0f)) { - madd_v3_v3v3fl(intersections[2], vec_start[5], vec_dir[5], dL[5]); - } - else { - madd_v3_v3v3fl(intersections[2], vec_start[7], vec_dir[7], dL[7]); - } - - if ((dL[6] >= 0.0f) && (dL[6] < 1.0f)) { - madd_v3_v3v3fl(intersections[3], vec_start[6], vec_dir[6], dL[6]); - } - else if ((dL[4] >= 0.0f) && (dL[4] < 1.0f)) { - madd_v3_v3v3fl(intersections[3], vec_start[4], vec_dir[4], dL[4]); - } - else if ((dL[5] >= 0.0f) && (dL[5] < 1.0f)) { - madd_v3_v3v3fl(intersections[3], vec_start[5], vec_dir[5], dL[5]); - } - else { - madd_v3_v3v3fl(intersections[3], vec_start[7], vec_dir[7], dL[7]); - } - - if ((dL[8] >= 0.0f) && (dL[8] < 1.0f)) { - madd_v3_v3v3fl(intersections[4], vec_start[8], vec_dir[8], dL[8]); - } - else if ((dL[9] >= 0.0f) && (dL[9] < 1.0f)) { - madd_v3_v3v3fl(intersections[4], vec_start[9], vec_dir[9], dL[9]); - } - else { - madd_v3_v3v3fl(intersections[4], vec_start[11], vec_dir[11], dL[11]); - } - - if ((dL[10] >= 0.0f) && (dL[10] < 1.0f)) { - madd_v3_v3v3fl(intersections[5], vec_start[10], vec_dir[10], dL[10]); - } - else if ((dL[8] >= 0.0f) && (dL[8] < 1.0f)) { - madd_v3_v3v3fl(intersections[5], vec_start[8], vec_dir[8], dL[8]); - } - else if ((dL[9] >= 0.0f) && (dL[9] < 1.0f)) { - madd_v3_v3v3fl(intersections[5], vec_start[9], vec_dir[9], dL[9]); - } - else { - madd_v3_v3v3fl(intersections[5], vec_start[11], vec_dir[11], dL[11]); - } - - for (int e = 0; e < 12; e++) { - copy_v3_v3(slicer->verts[num_points++], intersections[indices[e]]); - } - } - - return num_points; -} - -static void bind_shader(SmokeDomainSettings *sds, GPUShader *shader, GPUTexture *tex_spec, - GPUTexture *tex_tfunc, GPUTexture *tex_coba, - bool use_fire, const float min[3], - const float ob_sizei[3], const float invsize[3]) -{ - int invsize_location = GPU_shader_get_uniform(shader, "invsize"); - int ob_sizei_location = GPU_shader_get_uniform(shader, "ob_sizei"); - int min_location = GPU_shader_get_uniform(shader, "min_location"); - - int soot_location; - int stepsize_location; - int densityscale_location; - int spec_location, flame_location; - int shadow_location, actcol_location; - int tfunc_location = 0; - int coba_location = 0; - - if (use_fire) { - spec_location = GPU_shader_get_uniform(shader, "spectrum_texture"); - flame_location = GPU_shader_get_uniform(shader, "flame_texture"); - } - else { - shadow_location = GPU_shader_get_uniform(shader, "shadow_texture"); - actcol_location = GPU_shader_get_uniform(shader, "active_color"); - soot_location = GPU_shader_get_uniform(shader, "soot_texture"); - stepsize_location = GPU_shader_get_uniform(shader, "step_size"); - densityscale_location = GPU_shader_get_uniform(shader, "density_scale"); - - if (sds->use_coba) { - tfunc_location = GPU_shader_get_uniform(shader, "transfer_texture"); - coba_location = GPU_shader_get_uniform(shader, "color_band_texture"); - } - } - - GPU_shader_bind(shader); - - if (use_fire) { - GPU_texture_bind(sds->tex_flame, 2); - GPU_shader_uniform_texture(shader, flame_location, sds->tex_flame); - - GPU_texture_bind(tex_spec, 3); - GPU_shader_uniform_texture(shader, spec_location, tex_spec); - } - else { - float density_scale = 10.0f * sds->display_thickness; - - GPU_shader_uniform_vector(shader, stepsize_location, 1, 1, &sds->dx); - GPU_shader_uniform_vector(shader, densityscale_location, 1, 1, &density_scale); - - GPU_texture_bind(sds->tex, 0); - GPU_shader_uniform_texture(shader, soot_location, sds->tex); - - GPU_texture_bind(sds->tex_shadow, 1); - GPU_shader_uniform_texture(shader, shadow_location, sds->tex_shadow); - - float active_color[3] = { 0.9, 0.9, 0.9 }; - if ((sds->active_fields & SM_ACTIVE_COLORS) == 0) - mul_v3_v3(active_color, sds->active_color); - GPU_shader_uniform_vector(shader, actcol_location, 3, 1, active_color); - - if (sds->use_coba) { - GPU_texture_bind(tex_tfunc, 4); - GPU_shader_uniform_texture(shader, tfunc_location, tex_tfunc); - - GPU_texture_bind(tex_coba, 5); - GPU_shader_uniform_texture(shader, coba_location, tex_coba); - } - } - - GPU_shader_uniform_vector(shader, min_location, 3, 1, min); - GPU_shader_uniform_vector(shader, ob_sizei_location, 3, 1, ob_sizei); - GPU_shader_uniform_vector(shader, invsize_location, 3, 1, invsize); -} - -static void unbind_shader(SmokeDomainSettings *sds, GPUTexture *tex_spec, - GPUTexture *tex_tfunc, GPUTexture *tex_coba, bool use_fire) -{ - GPU_shader_unbind(); - - GPU_texture_unbind(sds->tex); - - if (use_fire) { - GPU_texture_unbind(sds->tex_flame); - GPU_texture_unbind(tex_spec); - GPU_texture_free(tex_spec); - } - else { - GPU_texture_unbind(sds->tex_shadow); - - if (sds->use_coba) { - GPU_texture_unbind(tex_tfunc); - GPU_texture_free(tex_tfunc); - - GPU_texture_unbind(tex_coba); - GPU_texture_free(tex_coba); - } - } -} - -static void draw_buffer(SmokeDomainSettings *sds, GPUShader *shader, const VolumeSlicer *slicer, - const float ob_sizei[3], const float invsize[3], const int num_points, const bool do_fire) -{ - GPUTexture *tex_spec = (do_fire) ? create_transfer_function(TFUNC_FLAME_SPECTRUM, NULL) : NULL; - GPUTexture *tex_tfunc = (sds->use_coba) ? create_transfer_function(TFUNC_COLOR_RAMP, sds->coba) : NULL; - GPUTexture *tex_coba = (sds->use_coba) ? create_field_texture(sds) : NULL; - - GLuint vertex_buffer; - glGenBuffers(1, &vertex_buffer); - glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); - glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 3 * num_points, &slicer->verts[0][0], GL_STATIC_DRAW); - - bind_shader(sds, shader, tex_spec, tex_tfunc, tex_coba, do_fire, slicer->min, ob_sizei, invsize); - - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(3, GL_FLOAT, 0, NULL); - - glDrawArrays(GL_TRIANGLES, 0, num_points); - - glDisableClientState(GL_VERTEX_ARRAY); - - unbind_shader(sds, tex_spec, tex_tfunc, tex_coba, do_fire); - - /* cleanup */ - - glBindBuffer(GL_ARRAY_BUFFER, 0); - - glDeleteBuffers(1, &vertex_buffer); -} - -void draw_smoke_volume(SmokeDomainSettings *sds, Object *ob, - const float min[3], const float max[3], - const float viewnormal[3]) -{ - if (!sds->tex || !sds->tex_shadow) { - fprintf(stderr, "Could not allocate 3D texture for volume rendering!\n"); - return; - } - - const bool use_fire = (sds->active_fields & SM_ACTIVE_FIRE) && sds->tex_flame; - - GPUBuiltinShader builtin_shader; - - if (sds->use_coba) { - builtin_shader = GPU_SHADER_SMOKE_COBA; - } - else { - builtin_shader = GPU_SHADER_SMOKE; - } - - GPUShader *shader = GPU_shader_get_builtin_shader(builtin_shader); - - if (!shader) { - fprintf(stderr, "Unable to create GLSL smoke shader.\n"); - return; - } - - GPUShader *fire_shader = NULL; - if (use_fire) { - fire_shader = GPU_shader_get_builtin_shader(GPU_SHADER_SMOKE_FIRE); - - if (!fire_shader) { - fprintf(stderr, "Unable to create GLSL fire shader.\n"); - return; - } - } - - const float ob_sizei[3] = { - 1.0f / fabsf(ob->size[0]), - 1.0f / fabsf(ob->size[1]), - 1.0f / fabsf(ob->size[2]) - }; - - const float size[3] = { max[0] - min[0], max[1] - min[1], max[2] - min[2] }; - const float invsize[3] = { 1.0f / size[0], 1.0f / size[1], 1.0f / size[2] }; - -#ifdef DEBUG_DRAW_TIME - TIMEIT_START(draw); -#endif - - /* setup slicing information */ - - const bool view_aligned = (sds->slice_method == MOD_SMOKE_SLICE_VIEW_ALIGNED); - int max_slices, max_points, axis = 0; - - if (view_aligned) { - max_slices = max_iii(sds->res[0], sds->res[1], sds->res[2]) * sds->slice_per_voxel; - max_points = max_slices * 12; - } - else { - if (sds->axis_slice_method == AXIS_SLICE_FULL) { - axis = axis_dominant_v3_single(viewnormal); - max_slices = sds->res[axis] * sds->slice_per_voxel; - } - else { - axis = (sds->slice_axis == SLICE_AXIS_AUTO) ? axis_dominant_v3_single(viewnormal) : sds->slice_axis - 1; - max_slices = 1; - } - - max_points = max_slices * 6; - } - - VolumeSlicer slicer; - copy_v3_v3(slicer.min, min); - copy_v3_v3(slicer.max, max); - copy_v3_v3(slicer.size, size); - slicer.verts = MEM_mallocN(sizeof(float) * 3 * max_points, "smoke_slice_vertices"); - - int num_points; - - if (view_aligned) { - num_points = create_view_aligned_slices(&slicer, max_slices, viewnormal); - } - else { - num_points = max_points; - - if (sds->axis_slice_method == AXIS_SLICE_FULL) { - create_axis_aligned_slices(&slicer, max_slices, viewnormal, axis); - } - else { - const float depth = (sds->slice_depth - 0.5f) * size[axis]; - create_single_slice(&slicer, depth, axis, 0); - } - } - - /* setup buffer and draw */ - - int gl_depth = 0, gl_blend = 0, gl_depth_write = 0; - glGetBooleanv(GL_BLEND, (GLboolean *)&gl_blend); - glGetBooleanv(GL_DEPTH_TEST, (GLboolean *)&gl_depth); - glGetBooleanv(GL_DEPTH_WRITEMASK, (GLboolean *)&gl_depth_write); - - GPU_depth_test(true); - glDepthMask(GL_FALSE); - GPU_blend(true); - - GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); - draw_buffer(sds, shader, &slicer, ob_sizei, invsize, num_points, false); - - /* Draw fire separately (T47639). */ - if (use_fire && !sds->use_coba) { - glBlendFunc(GL_ONE, GL_ONE); - draw_buffer(sds, fire_shader, &slicer, ob_sizei, invsize, num_points, true); - } - -#ifdef DEBUG_DRAW_TIME - printf("Draw Time: %f\n", (float)TIMEIT_VALUE(draw)); - TIMEIT_END(draw); -#endif - - MEM_freeN(slicer.verts); - - glDepthMask(gl_depth_write); - - if (!gl_blend) { - GPU_blend(false); - } - - if (gl_depth) { - GPU_depth_test(true); - } -} - -#ifdef WITH_SMOKE -static void add_tri(float (*verts)[3], float(*colors)[3], int *offset, - float p1[3], float p2[3], float p3[3], float rgb[3]) -{ - copy_v3_v3(verts[*offset + 0], p1); - copy_v3_v3(verts[*offset + 1], p2); - copy_v3_v3(verts[*offset + 2], p3); - - copy_v3_v3(colors[*offset + 0], rgb); - copy_v3_v3(colors[*offset + 1], rgb); - copy_v3_v3(colors[*offset + 2], rgb); - - *offset += 3; -} - -static void add_needle(float (*verts)[3], float (*colors)[3], float center[3], - float dir[3], float scale, float voxel_size, int *offset) -{ - float len = len_v3(dir); - - float rgb[3]; - BKE_defvert_weight_to_rgb(rgb, len); - - if (len != 0.0f) { - mul_v3_fl(dir, 1.0f / len); - len *= scale; - } - - len *= voxel_size; - - float corners[4][3] = { - { 0.0f, 0.2f, -0.5f }, - { -0.2f * 0.866f, -0.2f * 0.5f, -0.5f }, - { 0.2f * 0.866f, -0.2f * 0.5f, -0.5f }, - { 0.0f, 0.0f, 0.5f } - }; - - const float up[3] = { 0.0f, 0.0f, 1.0f }; - float rot[3][3]; - - rotation_between_vecs_to_mat3(rot, up, dir); - transpose_m3(rot); - - for (int i = 0; i < 4; i++) { - mul_m3_v3(rot, corners[i]); - mul_v3_fl(corners[i], len); - add_v3_v3(corners[i], center); - } - - add_tri(verts, colors, offset, corners[0], corners[1], corners[2], rgb); - add_tri(verts, colors, offset, corners[0], corners[1], corners[3], rgb); - add_tri(verts, colors, offset, corners[1], corners[2], corners[3], rgb); - add_tri(verts, colors, offset, corners[2], corners[0], corners[3], rgb); -} - -static void add_streamline(float (*verts)[3], float(*colors)[3], float center[3], - float dir[3], float scale, float voxel_size, int *offset) -{ - const float len = len_v3(dir); - - float rgb[3]; - BKE_defvert_weight_to_rgb(rgb, len); - - copy_v3_v3(colors[(*offset)], rgb); - copy_v3_v3(verts[(*offset)++], center); - - mul_v3_fl(dir, scale * voxel_size); - add_v3_v3(center, dir); - - copy_v3_v3(colors[(*offset)], rgb); - copy_v3_v3(verts[(*offset)++], center); -} - -typedef void (*vector_draw_func)(float(*)[3], float(*)[3], float *, float *, float, float, int *); -#endif /* WITH_SMOKE */ - -void draw_smoke_velocity(SmokeDomainSettings *domain, float viewnormal[3]) -{ -#ifdef WITH_SMOKE - const float *vel_x = smoke_get_velocity_x(domain->fluid); - const float *vel_y = smoke_get_velocity_y(domain->fluid); - const float *vel_z = smoke_get_velocity_z(domain->fluid); - - if (ELEM(NULL, vel_x, vel_y, vel_z)) { - return; - } - - const int *base_res = domain->base_res; - const int *res = domain->res; - const int *res_min = domain->res_min; - - int res_max[3]; - copy_v3_v3_int(res_max, domain->res_max); - - const float *cell_size = domain->cell_size; - const float step_size = ((float)max_iii(base_res[0], base_res[1], base_res[2])) / 16.0f; - - /* set first position so that it doesn't jump when domain moves */ - float xyz[3] = { - res_min[0] + fmod(-(float)domain->shift[0] + res_min[0], step_size), - res_min[1] + fmod(-(float)domain->shift[1] + res_min[1], step_size), - res_min[2] + fmod(-(float)domain->shift[2] + res_min[2], step_size) - }; - - if (xyz[0] < res_min[0]) xyz[0] += step_size; - if (xyz[1] < res_min[1]) xyz[1] += step_size; - if (xyz[2] < res_min[2]) xyz[2] += step_size; - - float min[3] = { - domain->p0[0] - domain->cell_size[0] * domain->adapt_res, - domain->p0[1] - domain->cell_size[1] * domain->adapt_res, - domain->p0[2] - domain->cell_size[2] * domain->adapt_res, - }; - - int num_points_v[3] = { - ((float)(res_max[0] - floor(xyz[0])) / step_size) + 0.5f, - ((float)(res_max[1] - floor(xyz[1])) / step_size) + 0.5f, - ((float)(res_max[2] - floor(xyz[2])) / step_size) + 0.5f - }; - - if (domain->slice_method == MOD_SMOKE_SLICE_AXIS_ALIGNED && - domain->axis_slice_method == AXIS_SLICE_SINGLE) - { - const int axis = (domain->slice_axis == SLICE_AXIS_AUTO) ? - axis_dominant_v3_single(viewnormal) : domain->slice_axis - 1; - - xyz[axis] = (float)base_res[axis] * domain->slice_depth; - num_points_v[axis] = 1; - res_max[axis] = xyz[axis] + 1; - } - - vector_draw_func func; - int max_points; - - if (domain->vector_draw_type == VECTOR_DRAW_NEEDLE) { - func = add_needle; - max_points = (num_points_v[0] * num_points_v[1] * num_points_v[2]) * 4 * 3; - } - else { - func = add_streamline; - max_points = (num_points_v[0] * num_points_v[1] * num_points_v[2]) * 2; - } - - float (*verts)[3] = MEM_mallocN(sizeof(float) * 3 * max_points, ""); - float (*colors)[3] = MEM_mallocN(sizeof(float) * 3 * max_points, ""); - - int num_points = 0; - - for (float x = floor(xyz[0]); x < res_max[0]; x += step_size) { - for (float y = floor(xyz[1]); y < res_max[1]; y += step_size) { - for (float z = floor(xyz[2]); z < res_max[2]; z += step_size) { - int index = (floor(x) - res_min[0]) + (floor(y) - res_min[1]) * res[0] + (floor(z) - res_min[2]) * res[0] * res[1]; - - float pos[3] = { - min[0] + ((float)x + 0.5f) * cell_size[0], - min[1] + ((float)y + 0.5f) * cell_size[1], - min[2] + ((float)z + 0.5f) * cell_size[2] - }; - - float vel[3] = { - vel_x[index], vel_y[index], vel_z[index] - }; - - func(verts, colors, pos, vel, domain->vector_scale, cell_size[0], &num_points); - } - } - } - - GPU_line_width(1.0f); - - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(3, GL_FLOAT, 0, verts); - - glEnableClientState(GL_COLOR_ARRAY); - glColorPointer(3, GL_FLOAT, 0, colors); - - glDrawArrays(GL_LINES, 0, num_points); - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - - MEM_freeN(verts); - MEM_freeN(colors); -#else - UNUSED_VARS(domain, viewnormal); -#endif -} diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 735b4e5bec0..bfd6679b513 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -824,9 +824,9 @@ static void draw_view_axis(RegionView3D *rv3d, const rcti *rect) for (int axis_i = 0; axis_i < 3; axis_i++) { int i = axis_order[axis_i]; - immAttrib4ubv(col, axis_col[i]); + immAttr4ubv(col, axis_col[i]); immVertex2f(pos, startx, starty); - immAttrib4ubv(col, axis_col[i]); + immAttr4ubv(col, axis_col[i]); immVertex2fv(pos, axis_pos[i]); } @@ -874,7 +874,7 @@ static void UNUSED_FUNCTION(draw_rotation_guide)(RegionView3D *rv3d) immBegin(GPU_PRIM_LINE_STRIP, 3); color[3] = 0; /* more transparent toward the ends */ - immAttrib4ubv(col, color); + immAttr4ubv(col, color); add_v3_v3v3(end, o, scaled_axis); immVertex3fv(pos, end); @@ -884,11 +884,11 @@ static void UNUSED_FUNCTION(draw_rotation_guide)(RegionView3D *rv3d) #endif color[3] = 127; /* more opaque toward the center */ - immAttrib4ubv(col, color); + immAttr4ubv(col, color); immVertex3fv(pos, o); color[3] = 0; - immAttrib4ubv(col, color); + immAttr4ubv(col, color); sub_v3_v3v3(end, o, scaled_axis); immVertex3fv(pos, end); immEnd(); @@ -913,7 +913,7 @@ static void UNUSED_FUNCTION(draw_rotation_guide)(RegionView3D *rv3d) immBegin(GPU_PRIM_LINE_LOOP, ROT_AXIS_DETAIL); color[3] = 63; /* somewhat faint */ - immAttrib4ubv(col, color); + immAttr4ubv(col, color); float angle = 0.0f; for (int i = 0; i < ROT_AXIS_DETAIL; ++i, angle += step) { float p[3] = {s * cosf(angle), s * sinf(angle), 0.0f}; @@ -941,7 +941,7 @@ static void UNUSED_FUNCTION(draw_rotation_guide)(RegionView3D *rv3d) immBindBuiltinProgram(GPU_SHADER_3D_POINT_FIXED_SIZE_VARYING_COLOR); GPU_point_size(5.0f); immBegin(GPU_PRIM_POINTS, 1); - immAttrib4ubv(col, color); + immAttr4ubv(col, color); immVertex3fv(pos, o); immEnd(); immUnbindProgram(); diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index e710d7b2d2a..0174e139c0a 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -2825,7 +2825,7 @@ static int viewselected_exec(bContext *C, wmOperator *op) const int smooth_viewtx = WM_operator_smooth_viewtx_get(op); INIT_MINMAX(min, max); - if (is_gp_edit || is_face_map) { + if (is_face_map) { ob_eval = NULL; } @@ -2845,7 +2845,6 @@ static int viewselected_exec(bContext *C, wmOperator *op) } if (is_gp_edit) { - /* TODO(sergey): Check on this after gpencil merge. */ CTX_DATA_BEGIN(C, bGPDstroke *, gps, editable_gpencil_strokes) { /* we're only interested in selected points here... */ @@ -2854,6 +2853,14 @@ static int viewselected_exec(bContext *C, wmOperator *op) } } CTX_DATA_END; + + if ((ob_eval) && (ok)) { + add_v3_v3(min, ob_eval->obmat[3]); + add_v3_v3(max, ob_eval->obmat[3]); + } + } + else if (ob_eval && (ob_eval->type == OB_GPENCIL)) { + ok |= BKE_gpencil_data_minmax(ob_eval, gpd, min, max); } else if (is_face_map) { ok = WM_gizmomap_minmax(ar->gizmo_map, true, true, min, max); diff --git a/source/blender/editors/space_view3d/view3d_gizmo_empty.c b/source/blender/editors/space_view3d/view3d_gizmo_empty.c index 2913ba245e7..fe1129f8028 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_empty.c +++ b/source/blender/editors/space_view3d/view3d_gizmo_empty.c @@ -31,6 +31,8 @@ #include "BKE_object.h" #include "BKE_image.h" +#include "DEG_depsgraph.h" + #include "DNA_object_types.h" #include "DNA_lamp_types.h" @@ -94,6 +96,7 @@ static void gizmo_empty_image_prop_matrix_set( Object *ob = igzgroup->state.ob; ob->empty_drawsize = matrix[0][0]; + DEG_id_tag_update(&ob->id, DEG_TAG_TRANSFORM); float dims[2]; RNA_float_get_array(gz->ptr, "dimensions", dims); diff --git a/source/blender/editors/space_view3d/view3d_iterators.c b/source/blender/editors/space_view3d/view3d_iterators.c index 499331639c4..1a3b0bf64cd 100644 --- a/source/blender/editors/space_view3d/view3d_iterators.c +++ b/source/blender/editors/space_view3d/view3d_iterators.c @@ -43,6 +43,7 @@ #include "BKE_editmesh.h" #include "BKE_context.h" #include "BKE_mesh_runtime.h" +#include "BKE_mesh_iterators.h" #include "DEG_depsgraph.h" #include "DEG_depsgraph_query.h" @@ -158,9 +159,8 @@ void mesh_foreachScreenVert( void *userData, eV3DProjTest clip_flag) { foreachScreenVert_userData data; - DerivedMesh *dm; - dm = editbmesh_get_derived_cage(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH); + Mesh *me = editbmesh_get_eval_cage(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH); ED_view3d_check_mats_rv3d(vc->rv3d); @@ -174,9 +174,7 @@ void mesh_foreachScreenVert( } BM_mesh_elem_table_ensure(vc->em->bm, BM_VERT); - dm->foreachMappedVert(dm, mesh_foreachScreenVert__mapFunc, &data, DM_FOREACH_NOP); - - dm->release(dm); + BKE_mesh_foreach_mapped_vert(me, mesh_foreachScreenVert__mapFunc, &data, MESH_FOREACH_NOP); } /* ------------------------------------------------------------------------ */ @@ -214,9 +212,8 @@ void mesh_foreachScreenEdge( void *userData, eV3DProjTest clip_flag) { foreachScreenEdge_userData data; - DerivedMesh *dm; - dm = editbmesh_get_derived_cage(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH); + Mesh *me = editbmesh_get_eval_cage(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH); ED_view3d_check_mats_rv3d(vc->rv3d); @@ -236,9 +233,7 @@ void mesh_foreachScreenEdge( } BM_mesh_elem_table_ensure(vc->em->bm, BM_EDGE); - dm->foreachMappedEdge(dm, mesh_foreachScreenEdge__mapFunc, &data); - - dm->release(dm); + BKE_mesh_foreach_mapped_edge(me, mesh_foreachScreenEdge__mapFunc, &data); } /* ------------------------------------------------------------------------ */ @@ -262,10 +257,8 @@ void mesh_foreachScreenFace( void *userData, const eV3DProjTest clip_flag) { foreachScreenFace_userData data; - DerivedMesh *dm; - - dm = editbmesh_get_derived_cage(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH); + Mesh *me = editbmesh_get_eval_cage(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH); ED_view3d_check_mats_rv3d(vc->rv3d); data.vc = *vc; @@ -274,9 +267,7 @@ void mesh_foreachScreenFace( data.clip_flag = clip_flag; BM_mesh_elem_table_ensure(vc->em->bm, BM_FACE); - dm->foreachMappedFaceCenter(dm, mesh_foreachScreenFace__mapFunc, &data, DM_FOREACH_NOP); - - dm->release(dm); + BKE_mesh_foreach_mapped_face_center(me, mesh_foreachScreenFace__mapFunc, &data, MESH_FOREACH_NOP); } /* ------------------------------------------------------------------------ */ diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c index 26a9a8f24c1..47266c2584e 100644 --- a/source/blender/editors/space_view3d/view3d_select.c +++ b/source/blender/editors/space_view3d/view3d_select.c @@ -1528,6 +1528,13 @@ Base *ED_view3d_give_base_under_cursor(bContext *C, const int mval[2]) return basact; } +Object *ED_view3d_give_object_under_cursor(bContext *C, const int mval[2]) +{ + Base *base = ED_view3d_give_base_under_cursor(C, mval); + if (base) return base->object; + return NULL; +} + static void deselect_all_tracks(MovieTracking *tracking) { MovieTrackingObject *object; diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c index 58406470f36..97b9a5c84e0 100644 --- a/source/blender/editors/space_view3d/view3d_snap.c +++ b/source/blender/editors/space_view3d/view3d_snap.c @@ -768,10 +768,8 @@ static bool snap_calc_active_center(bContext *C, const bool select_only, float r Object *obedit = CTX_data_edit_object(C); if (obedit) { - Object *ob_edit_eval = DEG_get_evaluated_object(depsgraph, obedit); - - if (ED_object_editmode_calc_active_center(ob_edit_eval, select_only, r_center)) { - mul_m4_v3(ob_edit_eval->obmat, r_center); + if (ED_object_editmode_calc_active_center(obedit, select_only, r_center)) { + mul_m4_v3(obedit->obmat, r_center); return true; } } diff --git a/source/blender/editors/transform/transform_snap_object.c b/source/blender/editors/transform/transform_snap_object.c index a3ce35a223a..48006874e34 100644 --- a/source/blender/editors/transform/transform_snap_object.c +++ b/source/blender/editors/transform/transform_snap_object.c @@ -100,6 +100,7 @@ typedef struct SnapObjectData { typedef struct SnapObjectData_Mesh { SnapObjectData sd; BVHTreeFromMesh treedata; + const struct MPoly *poly; BVHTree *bvhtree[2]; /* from loose verts and from loose edges */ uint has_looptris : 1; uint has_loose_edge : 1; @@ -428,12 +429,19 @@ static bool raycastMesh( if (treedata->looptri && treedata->looptri_allocated == false) { treedata->looptri = BKE_mesh_runtime_looptri_ensure(me); } + /* required for snapping with occlusion. */ + treedata->edge = me->medge; + sod->poly = me->mpoly; } } if (treedata->tree == NULL) { BKE_bvhtree_from_mesh_get(treedata, me, BVHTREE_FROM_LOOPTRI, 4); + /* required for snapping with occlusion. */ + treedata->edge = me->medge; + sod->poly = me->mpoly; + if (treedata->tree == NULL) { return retval; } @@ -736,22 +744,31 @@ static bool raycastObj( switch (ob->type) { case OB_MESH: - if (use_obedit && BKE_object_is_in_editmode(ob)) { + { + Mesh *me = ob->data; + if (BKE_object_is_in_editmode(ob)) { BMEditMesh *em = BKE_editmesh_from_object(ob); - retval = raycastEditMesh( - sctx, - ray_start, ray_dir, - ob, em, obmat, ob_index, - ray_depth, r_loc, r_no, r_index, r_hit_list); - } - else { - retval = raycastMesh( - sctx, - ray_start, ray_dir, - ob, ob->data, obmat, ob_index, - ray_depth, r_loc, r_no, r_index, r_hit_list); + if (use_obedit) { + retval = raycastEditMesh( + sctx, + ray_start, ray_dir, + ob, em, obmat, ob_index, + ray_depth, r_loc, r_no, r_index, r_hit_list); + break; + } + else if (em->mesh_eval_final && + (em->mesh_eval_final->runtime.deformed_only == false)) + { + me = em->mesh_eval_final; + } } + retval = raycastMesh( + sctx, + ray_start, ray_dir, + ob, me, obmat, ob_index, + ray_depth, r_loc, r_no, r_index, r_hit_list); break; + } } if (retval) { @@ -1202,12 +1219,11 @@ static short snap_mesh_polygon( nearest2d.get_edge_verts_index = (Nearest2DGetEdgeVertsCallback)cb_medge_verts_get; nearest2d.copy_vert_no = (Nearest2DCopyVertNoCallback)cb_mvert_no_copy; - MPoly *mp = &((Mesh *)ob->data)->mpoly[*r_index]; - const MLoop *ml; + const MPoly *mp = &((SnapObjectData_Mesh *)sod)->poly[*r_index]; + const MLoop *ml = &treedata->loop[mp->loopstart]; if (snapdata->snap_to_flag & SCE_SNAP_MODE_EDGE) { elem = SCE_SNAP_MODE_EDGE; - treedata->edge = ((Mesh *)ob->data)->medge; - ml = &treedata->loop[mp->loopstart]; + BLI_assert(treedata->edge != NULL); for (int i = mp->totloop; i--; ml++) { cb_snap_edge( &nearest2d, ml->e, &neasrest_precalc, @@ -1217,7 +1233,6 @@ static short snap_mesh_polygon( } else { elem = SCE_SNAP_MODE_VERTEX; - ml = &treedata->loop[mp->loopstart]; for (int i = mp->totloop; i--; ml++) { cb_snap_vert( &nearest2d, ml->v, &neasrest_precalc, @@ -2243,21 +2258,29 @@ static short snapObject( switch (ob->type) { case OB_MESH: - if (use_obedit && BKE_object_is_in_editmode(ob)) { + { + Mesh *me = ob->data; + if (BKE_object_is_in_editmode(ob)) { BMEditMesh *em = BKE_editmesh_from_object(ob); - retval = snapEditMesh( - sctx, snapdata, ob, em, obmat, - dist_px, - r_loc, r_no, r_index); - } - else { - retval = snapMesh( - sctx, snapdata, ob, ob->data, obmat, - dist_px, - r_loc, r_no, r_index); + if (use_obedit) { + retval = snapEditMesh( + sctx, snapdata, ob, em, obmat, + dist_px, + r_loc, r_no, r_index); + break; + } + else if (em->mesh_eval_final && + (em->mesh_eval_final->runtime.deformed_only == false)) + { + me = em->mesh_eval_final; + } } + retval = snapMesh( + sctx, snapdata, ob, me, obmat, + dist_px, + r_loc, r_no, r_index); break; - + } case OB_ARMATURE: retval = snapArmature( snapdata, diff --git a/source/blender/editors/util/ed_transverts.c b/source/blender/editors/util/ed_transverts.c index 3cd74f1266f..583d1116eec 100644 --- a/source/blender/editors/util/ed_transverts.c +++ b/source/blender/editors/util/ed_transverts.c @@ -43,6 +43,7 @@ #include "BKE_editmesh.h" #include "BKE_DerivedMesh.h" #include "BKE_context.h" +#include "BKE_mesh_iterators.h" #include "DEG_depsgraph.h" @@ -304,9 +305,9 @@ void ED_transverts_create_from_obedit(TransVertStore *tvs, Object *obedit, const userdata[1] = tvs->transverts; } - if (tvs->transverts && em->derivedCage) { + if (tvs->transverts && em->mesh_eval_cage) { BM_mesh_elem_table_ensure(bm, BM_VERT); - em->derivedCage->foreachMappedVert(em->derivedCage, set_mapped_co, userdata, DM_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert(em->mesh_eval_cage, set_mapped_co, userdata, MESH_FOREACH_NOP); } } else if (obedit->type == OB_ARMATURE) { diff --git a/source/blender/freestyle/intern/application/AppCanvas.h b/source/blender/freestyle/intern/application/AppCanvas.h index 9a92cf482d0..ed473e22489 100644 --- a/source/blender/freestyle/intern/application/AppCanvas.h +++ b/source/blender/freestyle/intern/application/AppCanvas.h @@ -69,7 +69,7 @@ public: virtual float thickness() const; AppView *_pViewer; - inline const AppView * viewer() const {return _pViewer;} + inline const AppView *viewer() const {return _pViewer;} /*! modifiers */ void setViewer(AppView *iViewer); diff --git a/source/blender/freestyle/intern/application/AppConfig.h b/source/blender/freestyle/intern/application/AppConfig.h index ae1d96e06d8..d7572aa1a04 100644 --- a/source/blender/freestyle/intern/application/AppConfig.h +++ b/source/blender/freestyle/intern/application/AppConfig.h @@ -44,7 +44,7 @@ namespace Config { class Path { protected: - static Path * _pInstance; + static Path *_pInstance; string _ProjectDir; string _ModelsPath; string _PatternsPath; diff --git a/source/blender/freestyle/intern/application/Controller.cpp b/source/blender/freestyle/intern/application/Controller.cpp index b4c815f8ad0..5ae04698a73 100644 --- a/source/blender/freestyle/intern/application/Controller.cpp +++ b/source/blender/freestyle/intern/application/Controller.cpp @@ -642,11 +642,11 @@ void Controller::ComputeSteerableViewMap() NodeShape *completeNS = new NodeShape; completeNS->material().setDiffuse(c,c,c,1); ng[Canvas::NB_STEERABLE_VIEWMAP-1]->AddChild(completeNS); - SteerableViewMap * svm = _Canvas->getSteerableViewMap(); + SteerableViewMap *svm = _Canvas->getSteerableViewMap(); svm->Reset(); ViewMap::fedges_container& fedges = _ViewMap->FEdges(); - LineRep * fRep; + LineRep *fRep; NodeShape *ns; for (ViewMap::fedges_container::iterator f = fedges.begin(), fend = fedges.end(); f != fend; @@ -722,7 +722,7 @@ void Controller::ComputeSteerableViewMap() void Controller::saveSteerableViewMapImages() { - SteerableViewMap * svm = _Canvas->getSteerableViewMap(); + SteerableViewMap *svm = _Canvas->getSteerableViewMap(); if (!svm) { cerr << "the Steerable ViewMap has not been computed yet" << endl; return; @@ -1003,7 +1003,7 @@ void Controller::resetModified(bool iMod) _Canvas->resetModified(iMod); } -NodeGroup * Controller::BuildRep(vector<ViewEdge*>::iterator vedges_begin, vector<ViewEdge*>::iterator vedges_end) +NodeGroup *Controller::BuildRep(vector<ViewEdge*>::iterator vedges_begin, vector<ViewEdge*>::iterator vedges_end) { ViewMapTesselator2D tesselator2D; FrsMaterial mat; @@ -1052,7 +1052,7 @@ void Controller::resetInterpreter() void Controller::displayDensityCurves(int x, int y) { - SteerableViewMap * svm = _Canvas->getSteerableViewMap(); + SteerableViewMap *svm = _Canvas->getSteerableViewMap(); if (!svm) return; diff --git a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp index a0b97b817fd..a42e59ddb2a 100644 --- a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp +++ b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp @@ -107,13 +107,11 @@ NodeGroup *BlenderFileLoader::Load() bool apply_modifiers = false; bool calc_undeformed = false; - bool calc_tessface = false; Mesh *mesh = BKE_mesh_new_from_object(depsgraph, _re->main, _re->scene, ob, apply_modifiers, - calc_tessface, calc_undeformed); if (mesh) { diff --git a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h index 0542b7f45fd..37a3f52ccdd 100644 --- a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h +++ b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h @@ -92,7 +92,7 @@ public: virtual ~BlenderFileLoader(); /*! Loads the 3D scene and returns a pointer to the scene root node */ - NodeGroup * Load(); + NodeGroup *Load(); /*! Gets the number of read faces */ inline unsigned int numFacesRead() {return _numFacesRead;} diff --git a/source/blender/freestyle/intern/geometry/Grid.h b/source/blender/freestyle/intern/geometry/Grid.h index 7d025a6a7f1..0a9be01aba1 100644 --- a/source/blender/freestyle/intern/geometry/Grid.h +++ b/source/blender/freestyle/intern/geometry/Grid.h @@ -290,8 +290,9 @@ public: * Returns the first intersection (occluder,t,u,v) or null. * Starts with a call to InitRay. */ - Polygon3r * castRayToFindFirstIntersection(const Vec3r& orig, const Vec3r& dir, double& t, - double& u, double& v, unsigned timestamp); + Polygon3r *castRayToFindFirstIntersection( + const Vec3r& orig, const Vec3r& dir, double& t, + double& u, double& v, unsigned timestamp); /*! Init all structures and values for computing the cells intersected by this new ray */ diff --git a/source/blender/freestyle/intern/geometry/SweepLine.h b/source/blender/freestyle/intern/geometry/SweepLine.h index 98e860862bb..3edd045320f 100644 --- a/source/blender/freestyle/intern/geometry/SweepLine.h +++ b/source/blender/freestyle/intern/geometry/SweepLine.h @@ -72,7 +72,7 @@ public: } public: - void * userdata; // FIXME + void *userdata; // FIXME Edge *EdgeA; // first segment Edge *EdgeB; // second segment diff --git a/source/blender/freestyle/intern/image/ImagePyramid.cpp b/source/blender/freestyle/intern/image/ImagePyramid.cpp index b81f8303945..db92cc68286 100644 --- a/source/blender/freestyle/intern/image/ImagePyramid.cpp +++ b/source/blender/freestyle/intern/image/ImagePyramid.cpp @@ -61,7 +61,7 @@ ImagePyramid::~ImagePyramid() } } -GrayImage * ImagePyramid::getLevel(int l) +GrayImage *ImagePyramid::getLevel(int l) { return _levels[l]; } diff --git a/source/blender/freestyle/intern/python/BPy_Convert.h b/source/blender/freestyle/intern/python/BPy_Convert.h index a0e0b578c10..976b760a325 100644 --- a/source/blender/freestyle/intern/python/BPy_Convert.h +++ b/source/blender/freestyle/intern/python/BPy_Convert.h @@ -98,53 +98,53 @@ extern "C" { // C++ => Python //============================== -PyObject * PyBool_from_bool(bool b); -PyObject * Vector_from_Vec2f(Vec2f& v); -PyObject * Vector_from_Vec3f(Vec3f& v); -PyObject * Vector_from_Vec3r(Vec3r& v); - -PyObject * Any_BPy_Interface0D_from_Interface0D(Interface0D& if0D); -PyObject * Any_BPy_Interface1D_from_Interface1D(Interface1D& if1D); -PyObject * Any_BPy_FEdge_from_FEdge(FEdge& fe); -PyObject * Any_BPy_ViewVertex_from_ViewVertex(ViewVertex& vv); - -PyObject * BPy_BBox_from_BBox(const BBox< Vec3r > &bb); -PyObject * BPy_CurvePoint_from_CurvePoint(CurvePoint& cp); -PyObject * BPy_directedViewEdge_from_directedViewEdge(ViewVertex::directedViewEdge& dve); -PyObject * BPy_FEdge_from_FEdge(FEdge& fe); -PyObject * BPy_FEdgeSharp_from_FEdgeSharp(FEdgeSharp& fes); -PyObject * BPy_FEdgeSmooth_from_FEdgeSmooth(FEdgeSmooth& fes); -PyObject * BPy_Id_from_Id(Id& id); -PyObject * BPy_Interface0D_from_Interface0D(Interface0D& if0D); -PyObject * BPy_Interface1D_from_Interface1D(Interface1D& if1D); -PyObject * BPy_IntegrationType_from_IntegrationType(IntegrationType i); -PyObject * BPy_FrsMaterial_from_FrsMaterial(const FrsMaterial& m); -PyObject * BPy_Nature_from_Nature(unsigned short n); -PyObject * BPy_MediumType_from_MediumType(Stroke::MediumType n); -PyObject * BPy_SShape_from_SShape(SShape& ss); -PyObject * BPy_Stroke_from_Stroke(Stroke& s); -PyObject * BPy_StrokeAttribute_from_StrokeAttribute(StrokeAttribute& sa); -PyObject * BPy_StrokeVertex_from_StrokeVertex(StrokeVertex& sv); -PyObject * BPy_SVertex_from_SVertex(SVertex& sv); -PyObject * BPy_ViewVertex_from_ViewVertex(ViewVertex& vv); -PyObject * BPy_NonTVertex_from_NonTVertex(NonTVertex& ntv); -PyObject * BPy_TVertex_from_TVertex(TVertex& tv); -PyObject * BPy_ViewEdge_from_ViewEdge(ViewEdge& ve); -PyObject * BPy_Chain_from_Chain(Chain& c); -PyObject * BPy_ViewShape_from_ViewShape(ViewShape& vs); - -PyObject * BPy_AdjacencyIterator_from_AdjacencyIterator(AdjacencyIterator& a_it); -PyObject * BPy_Interface0DIterator_from_Interface0DIterator(Interface0DIterator& if0D_it, bool reversed); -PyObject * BPy_CurvePointIterator_from_CurvePointIterator(CurveInternal::CurvePointIterator& cp_it); -PyObject * BPy_StrokeVertexIterator_from_StrokeVertexIterator(StrokeInternal::StrokeVertexIterator& sv_it, +PyObject *PyBool_from_bool(bool b); +PyObject *Vector_from_Vec2f(Vec2f& v); +PyObject *Vector_from_Vec3f(Vec3f& v); +PyObject *Vector_from_Vec3r(Vec3r& v); + +PyObject *Any_BPy_Interface0D_from_Interface0D(Interface0D& if0D); +PyObject *Any_BPy_Interface1D_from_Interface1D(Interface1D& if1D); +PyObject *Any_BPy_FEdge_from_FEdge(FEdge& fe); +PyObject *Any_BPy_ViewVertex_from_ViewVertex(ViewVertex& vv); + +PyObject *BPy_BBox_from_BBox(const BBox< Vec3r > &bb); +PyObject *BPy_CurvePoint_from_CurvePoint(CurvePoint& cp); +PyObject *BPy_directedViewEdge_from_directedViewEdge(ViewVertex::directedViewEdge& dve); +PyObject *BPy_FEdge_from_FEdge(FEdge& fe); +PyObject *BPy_FEdgeSharp_from_FEdgeSharp(FEdgeSharp& fes); +PyObject *BPy_FEdgeSmooth_from_FEdgeSmooth(FEdgeSmooth& fes); +PyObject *BPy_Id_from_Id(Id& id); +PyObject *BPy_Interface0D_from_Interface0D(Interface0D& if0D); +PyObject *BPy_Interface1D_from_Interface1D(Interface1D& if1D); +PyObject *BPy_IntegrationType_from_IntegrationType(IntegrationType i); +PyObject *BPy_FrsMaterial_from_FrsMaterial(const FrsMaterial& m); +PyObject *BPy_Nature_from_Nature(unsigned short n); +PyObject *BPy_MediumType_from_MediumType(Stroke::MediumType n); +PyObject *BPy_SShape_from_SShape(SShape& ss); +PyObject *BPy_Stroke_from_Stroke(Stroke& s); +PyObject *BPy_StrokeAttribute_from_StrokeAttribute(StrokeAttribute& sa); +PyObject *BPy_StrokeVertex_from_StrokeVertex(StrokeVertex& sv); +PyObject *BPy_SVertex_from_SVertex(SVertex& sv); +PyObject *BPy_ViewVertex_from_ViewVertex(ViewVertex& vv); +PyObject *BPy_NonTVertex_from_NonTVertex(NonTVertex& ntv); +PyObject *BPy_TVertex_from_TVertex(TVertex& tv); +PyObject *BPy_ViewEdge_from_ViewEdge(ViewEdge& ve); +PyObject *BPy_Chain_from_Chain(Chain& c); +PyObject *BPy_ViewShape_from_ViewShape(ViewShape& vs); + +PyObject *BPy_AdjacencyIterator_from_AdjacencyIterator(AdjacencyIterator& a_it); +PyObject *BPy_Interface0DIterator_from_Interface0DIterator(Interface0DIterator& if0D_it, bool reversed); +PyObject *BPy_CurvePointIterator_from_CurvePointIterator(CurveInternal::CurvePointIterator& cp_it); +PyObject *BPy_StrokeVertexIterator_from_StrokeVertexIterator(StrokeInternal::StrokeVertexIterator& sv_it, bool reversed); -PyObject * BPy_SVertexIterator_from_SVertexIterator(ViewEdgeInternal::SVertexIterator& sv_it); -PyObject * BPy_orientedViewEdgeIterator_from_orientedViewEdgeIterator(ViewVertexInternal::orientedViewEdgeIterator& ove_it, +PyObject *BPy_SVertexIterator_from_SVertexIterator(ViewEdgeInternal::SVertexIterator& sv_it); +PyObject *BPy_orientedViewEdgeIterator_from_orientedViewEdgeIterator(ViewVertexInternal::orientedViewEdgeIterator& ove_it, bool reversed); -PyObject * BPy_ViewEdgeIterator_from_ViewEdgeIterator(ViewEdgeInternal::ViewEdgeIterator& ve_it); -PyObject * BPy_ChainingIterator_from_ChainingIterator(ChainingIterator& c_it); -PyObject * BPy_ChainPredicateIterator_from_ChainPredicateIterator(ChainPredicateIterator& cp_it); -PyObject * BPy_ChainSilhouetteIterator_from_ChainSilhouetteIterator(ChainSilhouetteIterator& cs_it); +PyObject *BPy_ViewEdgeIterator_from_ViewEdgeIterator(ViewEdgeInternal::ViewEdgeIterator& ve_it); +PyObject *BPy_ChainingIterator_from_ChainingIterator(ChainingIterator& c_it); +PyObject *BPy_ChainPredicateIterator_from_ChainPredicateIterator(ChainPredicateIterator& cp_it); +PyObject *BPy_ChainSilhouetteIterator_from_ChainSilhouetteIterator(ChainSilhouetteIterator& cs_it); //============================== // Python => C++ diff --git a/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp b/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp index 548ab529f34..a6683f538c6 100644 --- a/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp +++ b/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp @@ -63,7 +63,7 @@ PyDoc_STRVAR(Integrator_integrate_doc, " :class:`UnaryFunction0DUnsigned` type.\n" " :rtype: int or float"); -static PyObject * Integrator_integrate(PyObject * /*self*/, PyObject *args, PyObject *kwds) +static PyObject *Integrator_integrate(PyObject * /*self*/, PyObject *args, PyObject *kwds) { static const char *kwlist[] = {"func", "it", "it_end", "integration_type", NULL}; PyObject *obj1, *obj4 = 0; diff --git a/source/blender/freestyle/intern/python/BPy_Interface1D.cpp b/source/blender/freestyle/intern/python/BPy_Interface1D.cpp index 0fc3ec41dec..c5a07fd295b 100644 --- a/source/blender/freestyle/intern/python/BPy_Interface1D.cpp +++ b/source/blender/freestyle/intern/python/BPy_Interface1D.cpp @@ -138,7 +138,7 @@ PyDoc_STRVAR(Interface1D_vertices_begin_doc, " :return: An Interface0DIterator pointing to the first vertex.\n" " :rtype: :class:`Interface0DIterator`"); -static PyObject * Interface1D_vertices_begin(BPy_Interface1D *self) +static PyObject *Interface1D_vertices_begin(BPy_Interface1D *self) { Interface0DIterator if0D_it(self->if1D->verticesBegin()); return BPy_Interface0DIterator_from_Interface0DIterator(if0D_it, false); @@ -153,7 +153,7 @@ PyDoc_STRVAR(Interface1D_vertices_end_doc, " :return: An Interface0DIterator pointing after the last vertex.\n" " :rtype: :class:`Interface0DIterator`"); -static PyObject * Interface1D_vertices_end(BPy_Interface1D *self) +static PyObject *Interface1D_vertices_end(BPy_Interface1D *self) { Interface0DIterator if0D_it(self->if1D->verticesEnd()); return BPy_Interface0DIterator_from_Interface0DIterator(if0D_it, true); @@ -173,7 +173,7 @@ PyDoc_STRVAR(Interface1D_points_begin_doc, " :return: An Interface0DIterator pointing to the first point.\n" " :rtype: :class:`Interface0DIterator`"); -static PyObject * Interface1D_points_begin(BPy_Interface1D *self, PyObject *args, PyObject *kwds) +static PyObject *Interface1D_points_begin(BPy_Interface1D *self, PyObject *args, PyObject *kwds) { static const char *kwlist[] = {"t", NULL}; float f = 0.0f; @@ -198,7 +198,7 @@ PyDoc_STRVAR(Interface1D_points_end_doc, " :return: An Interface0DIterator pointing after the last point.\n" " :rtype: :class:`Interface0DIterator`"); -static PyObject * Interface1D_points_end(BPy_Interface1D *self, PyObject *args, PyObject *kwds) +static PyObject *Interface1D_points_end(BPy_Interface1D *self, PyObject *args, PyObject *kwds) { static const char *kwlist[] = {"t", NULL}; float f = 0.0f; diff --git a/source/blender/freestyle/intern/python/BPy_SShape.cpp b/source/blender/freestyle/intern/python/BPy_SShape.cpp index cf4880ad3f7..28c9e815196 100644 --- a/source/blender/freestyle/intern/python/BPy_SShape.cpp +++ b/source/blender/freestyle/intern/python/BPy_SShape.cpp @@ -122,7 +122,7 @@ PyDoc_STRVAR(SShape_add_vertex_doc, " :arg vertex: An SVertex object.\n" " :type vertex: :class:`SVertex`"); -static PyObject * SShape_add_vertex(BPy_SShape *self, PyObject *args, PyObject *kwds) +static PyObject *SShape_add_vertex(BPy_SShape *self, PyObject *args, PyObject *kwds) { static const char *kwlist[] = {"edge", NULL}; PyObject *py_sv = 0; diff --git a/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp b/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp index fb7eb49127c..b390bb293d5 100644 --- a/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp +++ b/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp @@ -135,7 +135,7 @@ static void StrokeAttribute_dealloc(BPy_StrokeAttribute *self) Py_TYPE(self)->tp_free((PyObject *)self); } -static PyObject * StrokeAttribute_repr(BPy_StrokeAttribute *self) +static PyObject *StrokeAttribute_repr(BPy_StrokeAttribute *self) { stringstream repr("StrokeAttribute:"); repr << " r: " << self->sa->getColorR() << " g: " << self->sa->getColorG() << " b: " << self->sa->getColorB() << @@ -282,7 +282,7 @@ PyDoc_STRVAR(StrokeAttribute_set_attribute_real_doc, " :arg value: The attribute value.\n" " :type value: float\n"); -static PyObject * StrokeAttribute_set_attribute_real(BPy_StrokeAttribute *self, PyObject *args, PyObject *kwds) +static PyObject *StrokeAttribute_set_attribute_real(BPy_StrokeAttribute *self, PyObject *args, PyObject *kwds) { static const char *kwlist[] = {"name", "value", NULL}; char *s = 0; @@ -306,7 +306,7 @@ PyDoc_STRVAR(StrokeAttribute_set_attribute_vec2_doc, " :arg value: The attribute value.\n" " :type value: :class:`mathutils.Vector`, list or tuple of 2 real numbers\n"); -static PyObject * StrokeAttribute_set_attribute_vec2(BPy_StrokeAttribute *self, PyObject *args, PyObject *kwds) +static PyObject *StrokeAttribute_set_attribute_vec2(BPy_StrokeAttribute *self, PyObject *args, PyObject *kwds) { static const char *kwlist[] = {"name", "value", NULL}; char *s; @@ -335,7 +335,7 @@ PyDoc_STRVAR(StrokeAttribute_set_attribute_vec3_doc, " :arg value: The attribute value.\n" " :type value: :class:`mathutils.Vector`, list or tuple of 3 real numbers\n"); -static PyObject * StrokeAttribute_set_attribute_vec3(BPy_StrokeAttribute *self, PyObject *args, PyObject *kwds) +static PyObject *StrokeAttribute_set_attribute_vec3(BPy_StrokeAttribute *self, PyObject *args, PyObject *kwds) { static const char *kwlist[] = {"name", "value", NULL}; char *s; diff --git a/source/blender/freestyle/intern/scene_graph/NodeCamera.h b/source/blender/freestyle/intern/scene_graph/NodeCamera.h index c2f70d514a8..2fc6a00f955 100644 --- a/source/blender/freestyle/intern/scene_graph/NodeCamera.h +++ b/source/blender/freestyle/intern/scene_graph/NodeCamera.h @@ -68,12 +68,12 @@ public: /*! Matrix is copied */ void setProjectionMatrix(double projection_matrix[16]); - double * modelViewMatrix() + double *modelViewMatrix() { return modelview_matrix_; } - double * projectionMatrix() + double *projectionMatrix() { return projection_matrix_; } diff --git a/source/blender/freestyle/intern/view_map/Interface0D.cpp b/source/blender/freestyle/intern/view_map/Interface0D.cpp index 1d8515700d3..5cfd216cda2 100644 --- a/source/blender/freestyle/intern/view_map/Interface0D.cpp +++ b/source/blender/freestyle/intern/view_map/Interface0D.cpp @@ -78,7 +78,7 @@ Geometry::Vec2r Interface0D::getPoint2D() const return 0; } -FEdge * Interface0D::getFEdge(Interface0D&) +FEdge *Interface0D::getFEdge(Interface0D&) { PyErr_SetString(PyExc_TypeError, "method getFEdge() not properly overridden"); return 0; @@ -96,25 +96,25 @@ Nature::VertexNature Interface0D::getNature() const return Nature::POINT; } -SVertex * Interface0D::castToSVertex() +SVertex *Interface0D::castToSVertex() { PyErr_SetString(PyExc_TypeError, "method castToSVertex() not properly overridden"); return 0; } -ViewVertex * Interface0D::castToViewVertex() +ViewVertex *Interface0D::castToViewVertex() { PyErr_SetString(PyExc_TypeError, "method castToViewVertex() not properly overridden"); return 0; } -NonTVertex * Interface0D::castToNonTVertex() +NonTVertex *Interface0D::castToNonTVertex() { PyErr_SetString(PyExc_TypeError, "method castToNonTVertex() not properly overridden"); return 0; } -TVertex * Interface0D::castToTVertex() +TVertex *Interface0D::castToTVertex() { PyErr_SetString(PyExc_TypeError, "method castToTVertex() not properly overridden"); return 0; diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt index e8c3a19b77e..85a3b604e33 100644 --- a/source/blender/gpu/CMakeLists.txt +++ b/source/blender/gpu/CMakeLists.txt @@ -88,9 +88,6 @@ set(SRC intern/gpu_viewport.c shaders/gpu_shader_material.glsl - shaders/gpu_shader_fire_frag.glsl - shaders/gpu_shader_smoke_frag.glsl - shaders/gpu_shader_smoke_vert.glsl GPU_attr_binding.h GPU_batch.h @@ -239,9 +236,6 @@ data_to_c_simple(shaders/gpu_shader_keyframe_diamond_vert.glsl SRC) data_to_c_simple(shaders/gpu_shader_keyframe_diamond_frag.glsl SRC) data_to_c_simple(shaders/gpu_shader_geometry.glsl SRC) -data_to_c_simple(shaders/gpu_shader_fire_frag.glsl SRC) -data_to_c_simple(shaders/gpu_shader_smoke_frag.glsl SRC) -data_to_c_simple(shaders/gpu_shader_smoke_vert.glsl SRC) data_to_c_simple(shaders/gpu_shader_material.glsl SRC) data_to_c_simple(shaders/gpu_shader_gpencil_stroke_vert.glsl SRC) diff --git a/source/blender/gpu/GPU_draw.h b/source/blender/gpu/GPU_draw.h index 028756bc739..008f4199b02 100644 --- a/source/blender/gpu/GPU_draw.h +++ b/source/blender/gpu/GPU_draw.h @@ -103,6 +103,7 @@ void GPU_free_images_old(struct Main *bmain); void GPU_free_smoke(struct SmokeModifierData *smd); void GPU_free_smoke_velocity(struct SmokeModifierData *smd); void GPU_create_smoke(struct SmokeModifierData *smd, int highres); +void GPU_create_smoke_coba_field(struct SmokeModifierData *smd); void GPU_create_smoke_velocity(struct SmokeModifierData *smd); /* Delayed free of OpenGL buffers by main thread */ diff --git a/source/blender/gpu/GPU_immediate.h b/source/blender/gpu/GPU_immediate.h index c8a4ea6a837..846adc44cee 100644 --- a/source/blender/gpu/GPU_immediate.h +++ b/source/blender/gpu/GPU_immediate.h @@ -57,46 +57,46 @@ GPUBatch *immBeginBatchAtMost(GPUPrimType, uint vertex_len); /* Provide attribute values that can change per vertex. */ /* First vertex after immBegin must have all its attributes specified. */ -/* Skipped attributes will continue using the previous value for that attrib_id. */ -void immAttrib1f(uint attrib_id, float x); -void immAttrib2f(uint attrib_id, float x, float y); -void immAttrib3f(uint attrib_id, float x, float y, float z); -void immAttrib4f(uint attrib_id, float x, float y, float z, float w); +/* Skipped attributes will continue using the previous value for that attr_id. */ +void immAttr1f(uint attr_id, float x); +void immAttr2f(uint attr_id, float x, float y); +void immAttr3f(uint attr_id, float x, float y, float z); +void immAttr4f(uint attr_id, float x, float y, float z, float w); -void immAttrib2i(uint attrib_id, int x, int y); +void immAttr2i(uint attr_id, int x, int y); -void immAttrib1u(uint attrib_id, uint x); +void immAttr1u(uint attr_id, uint x); -void immAttrib2s(uint attrib_id, short x, short y); +void immAttr2s(uint attr_id, short x, short y); -void immAttrib2fv(uint attrib_id, const float data[2]); -void immAttrib3fv(uint attrib_id, const float data[3]); -void immAttrib4fv(uint attrib_id, const float data[4]); +void immAttr2fv(uint attr_id, const float data[2]); +void immAttr3fv(uint attr_id, const float data[3]); +void immAttr4fv(uint attr_id, const float data[4]); -void immAttrib3ub(uint attrib_id, unsigned char r, unsigned char g, unsigned char b); -void immAttrib4ub(uint attrib_id, unsigned char r, unsigned char g, unsigned char b, unsigned char a); +void immAttr3ub(uint attr_id, unsigned char r, unsigned char g, unsigned char b); +void immAttr4ub(uint attr_id, unsigned char r, unsigned char g, unsigned char b, unsigned char a); -void immAttrib3ubv(uint attrib_id, const unsigned char data[4]); -void immAttrib4ubv(uint attrib_id, const unsigned char data[4]); +void immAttr3ubv(uint attr_id, const unsigned char data[4]); +void immAttr4ubv(uint attr_id, const unsigned char data[4]); /* Explicitly skip an attribute. */ -/* This advanced option kills automatic value copying for this attrib_id. */ -void immSkipAttrib(uint attrib_id); +/* This advanced option kills automatic value copying for this attr_id. */ +void immAttrSkip(uint attr_id); /* Provide one last attribute value & end the current vertex. */ /* This is most often used for 2D or 3D position (similar to glVertex). */ -void immVertex2f(uint attrib_id, float x, float y); -void immVertex3f(uint attrib_id, float x, float y, float z); -void immVertex4f(uint attrib_id, float x, float y, float z, float w); +void immVertex2f(uint attr_id, float x, float y); +void immVertex3f(uint attr_id, float x, float y, float z); +void immVertex4f(uint attr_id, float x, float y, float z, float w); -void immVertex2i(uint attrib_id, int x, int y); +void immVertex2i(uint attr_id, int x, int y); -void immVertex2s(uint attrib_id, short x, short y); +void immVertex2s(uint attr_id, short x, short y); -void immVertex2fv(uint attrib_id, const float data[2]); -void immVertex3fv(uint attrib_id, const float data[3]); +void immVertex2fv(uint attr_id, const float data[2]); +void immVertex3fv(uint attr_id, const float data[3]); -void immVertex2iv(uint attrib_id, const int data[2]); +void immVertex2iv(uint attr_id, const int data[2]); /* Provide uniform values that don't change for the entire draw call. */ void immUniform1i(const char *name, int x); diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h index b53e6f108e7..308205339db 100644 --- a/source/blender/gpu/GPU_shader.h +++ b/source/blender/gpu/GPU_shader.h @@ -101,11 +101,6 @@ int GPU_shader_get_attribute(GPUShader *shader, const char *name); /* Builtin/Non-generated shaders */ typedef enum GPUBuiltinShader { - /* UNUSED (TODO REMOVE) */ - GPU_SHADER_SMOKE, - GPU_SHADER_SMOKE_FIRE, - GPU_SHADER_SMOKE_COBA, - /* specialized drawing */ GPU_SHADER_TEXT, GPU_SHADER_TEXT_SIMPLE, diff --git a/source/blender/gpu/GPU_shader_interface.h b/source/blender/gpu/GPU_shader_interface.h index 458a49a366b..af89e487cf8 100644 --- a/source/blender/gpu/GPU_shader_interface.h +++ b/source/blender/gpu/GPU_shader_interface.h @@ -58,6 +58,7 @@ typedef enum { GPU_UNIFORM_COLOR, /* vec4 color */ GPU_UNIFORM_EYE, /* vec3 eye */ GPU_UNIFORM_CALLID, /* int callId */ + GPU_UNIFORM_OBJECT_INFO, /* vec3 objectInfo */ GPU_UNIFORM_CUSTOM, /* custom uniform, not one of the above built-ins */ diff --git a/source/blender/gpu/GPU_vertex_format.h b/source/blender/gpu/GPU_vertex_format.h index 5e7e036bf41..113a3e894d0 100644 --- a/source/blender/gpu/GPU_vertex_format.h +++ b/source/blender/gpu/GPU_vertex_format.h @@ -80,8 +80,11 @@ typedef struct GPUVertFormat { GPUVertAttr attribs[GPU_VERT_ATTR_MAX_LEN]; /* TODO: variable-size attribs array */ } GPUVertFormat; +struct GPUShaderInterface; + void GPU_vertformat_clear(GPUVertFormat *); void GPU_vertformat_copy(GPUVertFormat *dest, const GPUVertFormat *src); +void GPU_vertformat_from_interface(GPUVertFormat *format, const struct GPUShaderInterface *shaderface); uint GPU_vertformat_attr_add( GPUVertFormat *, const char *name, diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c index c1e6b9b53a0..808cb985bf5 100644 --- a/source/blender/gpu/intern/gpu_codegen.c +++ b/source/blender/gpu/intern/gpu_codegen.c @@ -759,7 +759,7 @@ static void codegen_call_functions(DynStr *ds, ListBase *nodes, GPUOutput *final BLI_dynstr_append(ds, ";\n"); } -static char *code_generate_fragment(GPUMaterial *material, ListBase *nodes, GPUOutput *output) +static char *code_generate_fragment(GPUMaterial *material, ListBase *nodes, GPUOutput *output, int *rbuiltins) { DynStr *ds = BLI_dynstr_new(); char *code; @@ -770,14 +770,13 @@ static char *code_generate_fragment(GPUMaterial *material, ListBase *nodes, GPUO #endif codegen_set_unique_ids(nodes); - builtins = codegen_process_uniforms_functions(material, ds, nodes); - + *rbuiltins = builtins = codegen_process_uniforms_functions(material, ds, nodes); if (builtins & GPU_BARYCENTRIC_TEXCO) - BLI_dynstr_append(ds, "\tin vec2 barycentricTexCo;\n"); + BLI_dynstr_append(ds, "in vec2 barycentricTexCo;\n"); if (builtins & GPU_BARYCENTRIC_DIST) - BLI_dynstr_append(ds, "\tflat in vec3 barycentricDist;\n"); + BLI_dynstr_append(ds, "flat in vec3 barycentricDist;\n"); BLI_dynstr_append(ds, "Closure nodetree_exec(void)\n{\n"); @@ -1790,6 +1789,7 @@ GPUPass *GPU_generate_pass( GPUNodeLink *frag_outlink, struct GPUVertexAttribs *attribs, ListBase *nodes, + int *builtins, const char *vert_code, const char *geom_code, const char *frag_lib, @@ -1804,7 +1804,7 @@ GPUPass *GPU_generate_pass( GPU_nodes_get_vertex_attributes(nodes, attribs); /* generate code */ - char *fragmentgen = code_generate_fragment(material, nodes, frag_outlink->output); + char *fragmentgen = code_generate_fragment(material, nodes, frag_outlink->output, builtins); /* Cache lookup: Reuse shaders already compiled */ uint32_t hash = gpu_pass_hash(fragmentgen, defines, attribs); diff --git a/source/blender/gpu/intern/gpu_codegen.h b/source/blender/gpu/intern/gpu_codegen.h index 39d946d89a0..96be3a1a422 100644 --- a/source/blender/gpu/intern/gpu_codegen.h +++ b/source/blender/gpu/intern/gpu_codegen.h @@ -179,7 +179,7 @@ typedef struct GPUPass GPUPass; GPUPass *GPU_generate_pass( GPUMaterial *material, GPUNodeLink *frag_outlink, struct GPUVertexAttribs *attribs, - ListBase *nodes, + ListBase *nodes, int *builtins, const char *vert_code, const char *geom_code, const char *frag_lib, const char *defines); diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c index 7902c5296aa..685b929ac93 100644 --- a/source/blender/gpu/intern/gpu_draw.c +++ b/source/blender/gpu/intern/gpu_draw.c @@ -62,7 +62,7 @@ #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" -#include "BKE_bmfont.h" +#include "BKE_colorband.h" #include "BKE_global.h" #include "BKE_image.h" #include "BKE_main.h" @@ -883,6 +883,192 @@ void GPU_paint_update_image(Image *ima, ImageUser *iuser, int x, int y, int w, i BKE_image_release_ibuf(ima, ibuf, NULL); } +/* *************************** Transfer functions *************************** */ + +enum { + TFUNC_FLAME_SPECTRUM = 0, + TFUNC_COLOR_RAMP = 1, +}; + +#define TFUNC_WIDTH 256 + +#ifdef WITH_SMOKE +static void create_flame_spectrum_texture(float *data) +{ +#define FIRE_THRESH 7 +#define MAX_FIRE_ALPHA 0.06f +#define FULL_ON_FIRE 100 + + float *spec_pixels = MEM_mallocN(TFUNC_WIDTH * 4 * 16 * 16 * sizeof(float), "spec_pixels"); + + blackbody_temperature_to_rgb_table(data, TFUNC_WIDTH, 1500, 3000); + + for (int i = 0; i < 16; i++) { + for (int j = 0; j < 16; j++) { + for (int k = 0; k < TFUNC_WIDTH; k++) { + int index = (j * TFUNC_WIDTH * 16 + i * TFUNC_WIDTH + k) * 4; + if (k >= FIRE_THRESH) { + spec_pixels[index] = (data[k * 4]); + spec_pixels[index + 1] = (data[k * 4 + 1]); + spec_pixels[index + 2] = (data[k * 4 + 2]); + spec_pixels[index + 3] = MAX_FIRE_ALPHA * ( + (k > FULL_ON_FIRE) ? 1.0f : (k - FIRE_THRESH) / ((float)FULL_ON_FIRE - FIRE_THRESH)); + } + else { + zero_v4(&spec_pixels[index]); + } + } + } + } + + memcpy(data, spec_pixels, sizeof(float) * 4 * TFUNC_WIDTH); + + MEM_freeN(spec_pixels); + +#undef FIRE_THRESH +#undef MAX_FIRE_ALPHA +#undef FULL_ON_FIRE +} + +static void create_color_ramp(const ColorBand *coba, float *data) +{ + for (int i = 0; i < TFUNC_WIDTH; i++) { + BKE_colorband_evaluate(coba, (float)i / TFUNC_WIDTH, &data[i * 4]); + } +} + +static GPUTexture *create_transfer_function(int type, const ColorBand *coba) +{ + float *data = MEM_mallocN(sizeof(float) * 4 * TFUNC_WIDTH, __func__); + + switch (type) { + case TFUNC_FLAME_SPECTRUM: + create_flame_spectrum_texture(data); + break; + case TFUNC_COLOR_RAMP: + create_color_ramp(coba, data); + break; + } + + GPUTexture *tex = GPU_texture_create_1D(TFUNC_WIDTH, GPU_RGBA8, data, NULL); + + MEM_freeN(data); + + return tex; +} + +static void swizzle_texture_channel_rrrr(GPUTexture *tex) +{ + GPU_texture_bind(tex, 0); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_R, GL_RED); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_G, GL_RED); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_B, GL_RED); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_A, GL_RED); + GPU_texture_unbind(tex); +} + +static GPUTexture *create_field_texture(SmokeDomainSettings *sds) +{ + float *field = NULL; + + switch (sds->coba_field) { + case FLUID_FIELD_DENSITY: field = smoke_get_density(sds->fluid); break; + case FLUID_FIELD_HEAT: field = smoke_get_heat(sds->fluid); break; + case FLUID_FIELD_FUEL: field = smoke_get_fuel(sds->fluid); break; + case FLUID_FIELD_REACT: field = smoke_get_react(sds->fluid); break; + case FLUID_FIELD_FLAME: field = smoke_get_flame(sds->fluid); break; + case FLUID_FIELD_VELOCITY_X: field = smoke_get_velocity_x(sds->fluid); break; + case FLUID_FIELD_VELOCITY_Y: field = smoke_get_velocity_y(sds->fluid); break; + case FLUID_FIELD_VELOCITY_Z: field = smoke_get_velocity_z(sds->fluid); break; + case FLUID_FIELD_COLOR_R: field = smoke_get_color_r(sds->fluid); break; + case FLUID_FIELD_COLOR_G: field = smoke_get_color_g(sds->fluid); break; + case FLUID_FIELD_COLOR_B: field = smoke_get_color_b(sds->fluid); break; + case FLUID_FIELD_FORCE_X: field = smoke_get_force_x(sds->fluid); break; + case FLUID_FIELD_FORCE_Y: field = smoke_get_force_y(sds->fluid); break; + case FLUID_FIELD_FORCE_Z: field = smoke_get_force_z(sds->fluid); break; + default: return NULL; + } + + GPUTexture *tex = GPU_texture_create_nD( + sds->res[0], sds->res[1], sds->res[2], 3, + field, GPU_R8, GPU_DATA_FLOAT, 0, true, NULL); + + swizzle_texture_channel_rrrr(tex); + return tex; +} + +static GPUTexture *create_density_texture(SmokeDomainSettings *sds, int highres) +{ + float *data = NULL, *source; + int cell_count = (highres) ? smoke_turbulence_get_cells(sds->wt) : sds->total_cells; + const bool has_color = (highres) ? smoke_turbulence_has_colors(sds->wt) : smoke_has_colors(sds->fluid); + int *dim = (highres) ? sds->res_wt : sds->res; + GPUTextureFormat format = (has_color) ? GPU_RGBA8 : GPU_R8; + + if (has_color) { + data = MEM_callocN(sizeof(float) * cell_count * 4, "smokeColorTexture"); + } + + if (highres) { + if (has_color) { + smoke_turbulence_get_rgba(sds->wt, data, 0); + } + else { + source = smoke_turbulence_get_density(sds->wt); + } + } + else { + if (has_color) { + smoke_get_rgba(sds->fluid, data, 0); + } + else { + source = smoke_get_density(sds->fluid); + } + } + + GPUTexture *tex = GPU_texture_create_nD( + dim[0], dim[1], dim[2], 3, + (data) ? data : source, + format, GPU_DATA_FLOAT, 0, true, NULL); + if (data) { + MEM_freeN(data); + } + + if (format == GPU_R8) { + /* Swizzle the RGBA components to read the Red channel so + * that the shader stay the same for colored and non color + * density textures. */ + swizzle_texture_channel_rrrr(tex); + } + return tex; +} + +static GPUTexture *create_flame_texture(SmokeDomainSettings *sds, int highres) +{ + float *source = NULL; + const bool has_fuel = (highres) ? smoke_turbulence_has_fuel(sds->wt) : smoke_has_fuel(sds->fluid); + int *dim = (highres) ? sds->res_wt : sds->res; + + if (!has_fuel) + return NULL; + + if (highres) { + source = smoke_turbulence_get_flame(sds->wt); + } + else { + source = smoke_get_flame(sds->fluid); + } + + GPUTexture *tex = GPU_texture_create_nD( + dim[0], dim[1], dim[2], 3, + source, GPU_R8, GPU_DATA_FLOAT, 0, true, NULL); + + swizzle_texture_channel_rrrr(tex); + + return tex; +} +#endif /* WITH_SMOKE */ + void GPU_free_smoke(SmokeModifierData *smd) { if (smd->type & MOD_SMOKE_TYPE_DOMAIN && smd->domain) { @@ -897,85 +1083,66 @@ void GPU_free_smoke(SmokeModifierData *smd) if (smd->domain->tex_flame) GPU_texture_free(smd->domain->tex_flame); smd->domain->tex_flame = NULL; + + if (smd->domain->tex_flame_coba) + GPU_texture_free(smd->domain->tex_flame_coba); + smd->domain->tex_flame_coba = NULL; + + if (smd->domain->tex_coba) + GPU_texture_free(smd->domain->tex_coba); + smd->domain->tex_coba = NULL; + + if (smd->domain->tex_field) + GPU_texture_free(smd->domain->tex_field); + smd->domain->tex_field = NULL; } } -void GPU_create_smoke(SmokeModifierData *smd, int highres) +void GPU_create_smoke_coba_field(SmokeModifierData *smd) { #ifdef WITH_SMOKE if (smd->type & MOD_SMOKE_TYPE_DOMAIN) { SmokeDomainSettings *sds = smd->domain; - if (!sds->tex && !highres) { - /* rgba texture for color + density */ - if (smoke_has_colors(sds->fluid)) { - float *data = MEM_callocN(sizeof(float) * sds->total_cells * 4, "smokeColorTexture"); - smoke_get_rgba(sds->fluid, data, 0); - sds->tex = GPU_texture_create_3D(sds->res[0], sds->res[1], sds->res[2], GPU_RGBA8, data, NULL); - MEM_freeN(data); - } - /* density only */ - else { - sds->tex = GPU_texture_create_3D( - sds->res[0], sds->res[1], sds->res[2], - GPU_R8, smoke_get_density(sds->fluid), NULL); - - /* Swizzle the RGBA components to read the Red channel so - * that the shader stay the same for colored and non color - * density textures. */ - GPU_texture_bind(sds->tex, 0); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_R, GL_RED); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_G, GL_RED); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_B, GL_RED); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_A, GL_RED); - GPU_texture_unbind(sds->tex); - } - sds->tex_flame = ( - smoke_has_fuel(sds->fluid) ? - GPU_texture_create_3D( - sds->res[0], sds->res[1], sds->res[2], - GPU_R8, smoke_get_flame(sds->fluid), NULL) : - NULL); + + if (!sds->tex_field) { + sds->tex_field = create_field_texture(sds); } - else if (!sds->tex && highres) { - /* rgba texture for color + density */ - if (smoke_turbulence_has_colors(sds->wt)) { - float *data = MEM_callocN(sizeof(float) * smoke_turbulence_get_cells(sds->wt) * 4, "smokeColorTexture"); - smoke_turbulence_get_rgba(sds->wt, data, 0); - sds->tex = GPU_texture_create_3D(sds->res_wt[0], sds->res_wt[1], sds->res_wt[2], GPU_RGBA8, data, NULL); - MEM_freeN(data); - } - /* density only */ - else { - sds->tex = GPU_texture_create_3D( - sds->res_wt[0], sds->res_wt[1], sds->res_wt[2], - GPU_R8, smoke_turbulence_get_density(sds->wt), NULL); - - /* Swizzle the RGBA components to read the Red channel so - * that the shader stay the same for colored and non color - * density textures. */ - GPU_texture_bind(sds->tex, 0); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_R, GL_RED); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_G, GL_RED); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_B, GL_RED); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_A, GL_RED); - GPU_texture_unbind(sds->tex); - } - sds->tex_flame = ( - smoke_turbulence_has_fuel(sds->wt) ? - GPU_texture_create_3D( - sds->res_wt[0], sds->res_wt[1], sds->res_wt[2], - GPU_R8, smoke_turbulence_get_flame(sds->wt), NULL) : - NULL); + if (!sds->tex_coba) { + sds->tex_coba = create_transfer_function(TFUNC_COLOR_RAMP, sds->coba); } + } +#else // WITH_SMOKE + smd->domain->tex_field = NULL; +#endif // WITH_SMOKE +} - sds->tex_shadow = GPU_texture_create_3D( - sds->res[0], sds->res[1], sds->res[2], - GPU_R8, sds->shadow, NULL); +void GPU_create_smoke(SmokeModifierData *smd, int highres) +{ +#ifdef WITH_SMOKE + if (smd->type & MOD_SMOKE_TYPE_DOMAIN) { + SmokeDomainSettings *sds = smd->domain; + + if (!sds->tex) { + sds->tex = create_density_texture(sds, highres); + } + if (!sds->tex_flame) { + sds->tex_flame = create_flame_texture(sds, highres); + } + if (!sds->tex_flame_coba && sds->tex_flame) { + sds->tex_flame_coba = create_transfer_function(TFUNC_FLAME_SPECTRUM, NULL); + } + if (!sds->tex_shadow) { + sds->tex_shadow = GPU_texture_create_nD( + sds->res[0], sds->res[1], sds->res[2], 3, + sds->shadow, + GPU_R8, GPU_DATA_FLOAT, 0, true, NULL); + } } #else // WITH_SMOKE (void)highres; smd->domain->tex = NULL; smd->domain->tex_flame = NULL; + smd->domain->tex_flame_coba = NULL; smd->domain->tex_shadow = NULL; #endif // WITH_SMOKE } diff --git a/source/blender/gpu/intern/gpu_immediate.c b/source/blender/gpu/intern/gpu_immediate.c index 6e3de51df6b..a71ba68821b 100644 --- a/source/blender/gpu/intern/gpu_immediate.c +++ b/source/blender/gpu/intern/gpu_immediate.c @@ -412,56 +412,56 @@ static void setAttribValueBit(uint attrib_id) /* --- generic attribute functions --- */ -void immAttrib1f(uint attrib_id, float x) +void immAttr1f(uint attrib_id, float x) { - GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id; + GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id; #if TRUST_NO_ONE assert(attrib_id < imm.vertex_format.attr_len); - assert(attrib->comp_type == GPU_COMP_F32); - assert(attrib->comp_len == 1); + assert(attr->comp_type == GPU_COMP_F32); + assert(attr->comp_len == 1); assert(imm.vertex_idx < imm.vertex_len); assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */ #endif setAttribValueBit(attrib_id); - float *data = (float *)(imm.vertex_data + attrib->offset); + float *data = (float *)(imm.vertex_data + attr->offset); /* printf("%s %td %p\n", __FUNCTION__, (GLubyte*)data - imm.buffer_data, data); */ data[0] = x; } -void immAttrib2f(uint attrib_id, float x, float y) +void immAttr2f(uint attrib_id, float x, float y) { - GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id; + GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id; #if TRUST_NO_ONE assert(attrib_id < imm.vertex_format.attr_len); - assert(attrib->comp_type == GPU_COMP_F32); - assert(attrib->comp_len == 2); + assert(attr->comp_type == GPU_COMP_F32); + assert(attr->comp_len == 2); assert(imm.vertex_idx < imm.vertex_len); assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */ #endif setAttribValueBit(attrib_id); - float *data = (float *)(imm.vertex_data + attrib->offset); + float *data = (float *)(imm.vertex_data + attr->offset); /* printf("%s %td %p\n", __FUNCTION__, (GLubyte*)data - imm.buffer_data, data); */ data[0] = x; data[1] = y; } -void immAttrib3f(uint attrib_id, float x, float y, float z) +void immAttr3f(uint attrib_id, float x, float y, float z) { - GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id; + GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id; #if TRUST_NO_ONE assert(attrib_id < imm.vertex_format.attr_len); - assert(attrib->comp_type == GPU_COMP_F32); - assert(attrib->comp_len == 3); + assert(attr->comp_type == GPU_COMP_F32); + assert(attr->comp_len == 3); assert(imm.vertex_idx < imm.vertex_len); assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */ #endif setAttribValueBit(attrib_id); - float *data = (float *)(imm.vertex_data + attrib->offset); + float *data = (float *)(imm.vertex_data + attr->offset); /* printf("%s %td %p\n", __FUNCTION__, (GLubyte*)data - imm.buffer_data, data); */ data[0] = x; @@ -469,19 +469,19 @@ void immAttrib3f(uint attrib_id, float x, float y, float z) data[2] = z; } -void immAttrib4f(uint attrib_id, float x, float y, float z, float w) +void immAttr4f(uint attrib_id, float x, float y, float z, float w) { - GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id; + GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id; #if TRUST_NO_ONE assert(attrib_id < imm.vertex_format.attr_len); - assert(attrib->comp_type == GPU_COMP_F32); - assert(attrib->comp_len == 4); + assert(attr->comp_type == GPU_COMP_F32); + assert(attr->comp_len == 4); assert(imm.vertex_idx < imm.vertex_len); assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */ #endif setAttribValueBit(attrib_id); - float *data = (float *)(imm.vertex_data + attrib->offset); + float *data = (float *)(imm.vertex_data + attr->offset); /* printf("%s %td %p\n", __FUNCTION__, (GLubyte*)data - imm.buffer_data, data); */ data[0] = x; @@ -490,87 +490,87 @@ void immAttrib4f(uint attrib_id, float x, float y, float z, float w) data[3] = w; } -void immAttrib1u(uint attrib_id, uint x) +void immAttr1u(uint attrib_id, uint x) { - GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id; + GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id; #if TRUST_NO_ONE assert(attrib_id < imm.vertex_format.attr_len); - assert(attrib->comp_type == GPU_COMP_U32); - assert(attrib->comp_len == 1); + assert(attr->comp_type == GPU_COMP_U32); + assert(attr->comp_len == 1); assert(imm.vertex_idx < imm.vertex_len); assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */ #endif setAttribValueBit(attrib_id); - uint *data = (uint *)(imm.vertex_data + attrib->offset); + uint *data = (uint *)(imm.vertex_data + attr->offset); data[0] = x; } -void immAttrib2i(uint attrib_id, int x, int y) +void immAttr2i(uint attrib_id, int x, int y) { - GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id; + GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id; #if TRUST_NO_ONE assert(attrib_id < imm.vertex_format.attr_len); - assert(attrib->comp_type == GPU_COMP_I32); - assert(attrib->comp_len == 2); + assert(attr->comp_type == GPU_COMP_I32); + assert(attr->comp_len == 2); assert(imm.vertex_idx < imm.vertex_len); assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */ #endif setAttribValueBit(attrib_id); - int *data = (int *)(imm.vertex_data + attrib->offset); + int *data = (int *)(imm.vertex_data + attr->offset); data[0] = x; data[1] = y; } -void immAttrib2s(uint attrib_id, short x, short y) +void immAttr2s(uint attrib_id, short x, short y) { - GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id; + GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id; #if TRUST_NO_ONE assert(attrib_id < imm.vertex_format.attr_len); - assert(attrib->comp_type == GPU_COMP_I16); - assert(attrib->comp_len == 2); + assert(attr->comp_type == GPU_COMP_I16); + assert(attr->comp_len == 2); assert(imm.vertex_idx < imm.vertex_len); assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */ #endif setAttribValueBit(attrib_id); - short *data = (short *)(imm.vertex_data + attrib->offset); + short *data = (short *)(imm.vertex_data + attr->offset); data[0] = x; data[1] = y; } -void immAttrib2fv(uint attrib_id, const float data[2]) +void immAttr2fv(uint attrib_id, const float data[2]) { - immAttrib2f(attrib_id, data[0], data[1]); + immAttr2f(attrib_id, data[0], data[1]); } -void immAttrib3fv(uint attrib_id, const float data[3]) +void immAttr3fv(uint attrib_id, const float data[3]) { - immAttrib3f(attrib_id, data[0], data[1], data[2]); + immAttr3f(attrib_id, data[0], data[1], data[2]); } -void immAttrib4fv(uint attrib_id, const float data[4]) +void immAttr4fv(uint attrib_id, const float data[4]) { - immAttrib4f(attrib_id, data[0], data[1], data[2], data[3]); + immAttr4f(attrib_id, data[0], data[1], data[2], data[3]); } -void immAttrib3ub(uint attrib_id, uchar r, uchar g, uchar b) +void immAttr3ub(uint attrib_id, uchar r, uchar g, uchar b) { - GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id; + GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id; #if TRUST_NO_ONE assert(attrib_id < imm.vertex_format.attr_len); - assert(attrib->comp_type == GPU_COMP_U8); - assert(attrib->comp_len == 3); + assert(attr->comp_type == GPU_COMP_U8); + assert(attr->comp_len == 3); assert(imm.vertex_idx < imm.vertex_len); assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */ #endif setAttribValueBit(attrib_id); - GLubyte *data = imm.vertex_data + attrib->offset; + GLubyte *data = imm.vertex_data + attr->offset; /* printf("%s %td %p\n", __FUNCTION__, data - imm.buffer_data, data); */ data[0] = r; @@ -578,19 +578,19 @@ void immAttrib3ub(uint attrib_id, uchar r, uchar g, uchar b) data[2] = b; } -void immAttrib4ub(uint attrib_id, uchar r, uchar g, uchar b, uchar a) +void immAttr4ub(uint attrib_id, uchar r, uchar g, uchar b, uchar a) { - GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id; + GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id; #if TRUST_NO_ONE assert(attrib_id < imm.vertex_format.attr_len); - assert(attrib->comp_type == GPU_COMP_U8); - assert(attrib->comp_len == 4); + assert(attr->comp_type == GPU_COMP_U8); + assert(attr->comp_len == 4); assert(imm.vertex_idx < imm.vertex_len); assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */ #endif setAttribValueBit(attrib_id); - GLubyte *data = imm.vertex_data + attrib->offset; + GLubyte *data = imm.vertex_data + attr->offset; /* printf("%s %td %p\n", __FUNCTION__, data - imm.buffer_data, data); */ data[0] = r; @@ -599,17 +599,17 @@ void immAttrib4ub(uint attrib_id, uchar r, uchar g, uchar b, uchar a) data[3] = a; } -void immAttrib3ubv(uint attrib_id, const uchar data[3]) +void immAttr3ubv(uint attrib_id, const uchar data[3]) { - immAttrib3ub(attrib_id, data[0], data[1], data[2]); + immAttr3ub(attrib_id, data[0], data[1], data[2]); } -void immAttrib4ubv(uint attrib_id, const uchar data[4]) +void immAttr4ubv(uint attrib_id, const uchar data[4]) { - immAttrib4ub(attrib_id, data[0], data[1], data[2], data[3]); + immAttr4ub(attrib_id, data[0], data[1], data[2], data[3]); } -void immSkipAttrib(uint attrib_id) +void immAttrSkip(uint attrib_id) { #if TRUST_NO_ONE assert(attrib_id < imm.vertex_format.attr_len); @@ -652,49 +652,49 @@ static void immEndVertex(void) /* and move on to the next vertex */ void immVertex2f(uint attrib_id, float x, float y) { - immAttrib2f(attrib_id, x, y); + immAttr2f(attrib_id, x, y); immEndVertex(); } void immVertex3f(uint attrib_id, float x, float y, float z) { - immAttrib3f(attrib_id, x, y, z); + immAttr3f(attrib_id, x, y, z); immEndVertex(); } void immVertex4f(uint attrib_id, float x, float y, float z, float w) { - immAttrib4f(attrib_id, x, y, z, w); + immAttr4f(attrib_id, x, y, z, w); immEndVertex(); } void immVertex2i(uint attrib_id, int x, int y) { - immAttrib2i(attrib_id, x, y); + immAttr2i(attrib_id, x, y); immEndVertex(); } void immVertex2s(uint attrib_id, short x, short y) { - immAttrib2s(attrib_id, x, y); + immAttr2s(attrib_id, x, y); immEndVertex(); } void immVertex2fv(uint attrib_id, const float data[2]) { - immAttrib2f(attrib_id, data[0], data[1]); + immAttr2f(attrib_id, data[0], data[1]); immEndVertex(); } void immVertex3fv(uint attrib_id, const float data[3]) { - immAttrib3f(attrib_id, data[0], data[1], data[2]); + immAttr3f(attrib_id, data[0], data[1], data[2]); immEndVertex(); } void immVertex2iv(uint attrib_id, const int data[2]) { - immAttrib2i(attrib_id, data[0], data[1]); + immAttr2i(attrib_id, data[0], data[1]); immEndVertex(); } diff --git a/source/blender/gpu/intern/gpu_immediate_util.c b/source/blender/gpu/intern/gpu_immediate_util.c index d0f0c3aacce..983c70281a2 100644 --- a/source/blender/gpu/intern/gpu_immediate_util.c +++ b/source/blender/gpu/intern/gpu_immediate_util.c @@ -89,35 +89,35 @@ void immRecti(uint pos, int x1, int y1, int x2, int y2) void immRectf_fast_with_color(uint pos, uint col, float x1, float y1, float x2, float y2, const float color[4]) { - immAttrib4fv(col, color); + immAttr4fv(col, color); immVertex2f(pos, x1, y1); - immAttrib4fv(col, color); + immAttr4fv(col, color); immVertex2f(pos, x2, y1); - immAttrib4fv(col, color); + immAttr4fv(col, color); immVertex2f(pos, x2, y2); - immAttrib4fv(col, color); + immAttr4fv(col, color); immVertex2f(pos, x1, y1); - immAttrib4fv(col, color); + immAttr4fv(col, color); immVertex2f(pos, x2, y2); - immAttrib4fv(col, color); + immAttr4fv(col, color); immVertex2f(pos, x1, y2); } void immRecti_fast_with_color(uint pos, uint col, int x1, int y1, int x2, int y2, const float color[4]) { - immAttrib4fv(col, color); + immAttr4fv(col, color); immVertex2i(pos, x1, y1); - immAttrib4fv(col, color); + immAttr4fv(col, color); immVertex2i(pos, x2, y1); - immAttrib4fv(col, color); + immAttr4fv(col, color); immVertex2i(pos, x2, y2); - immAttrib4fv(col, color); + immAttr4fv(col, color); immVertex2i(pos, x1, y1); - immAttrib4fv(col, color); + immAttr4fv(col, color); immVertex2i(pos, x2, y2); - immAttrib4fv(col, color); + immAttr4fv(col, color); immVertex2i(pos, x1, y2); } @@ -425,16 +425,16 @@ void imm_draw_cylinder_fill_normal_3d( n2[0] = cos2; n2[1] = sin2; n2[2] = 1 - n2[2]; /* first tri */ - immAttrib3fv(nor, n2); + immAttr3fv(nor, n2); immVertex3fv(pos, v1); immVertex3fv(pos, v2); - immAttrib3fv(nor, n1); + immAttr3fv(nor, n1); immVertex3fv(pos, v3); /* second tri */ immVertex3fv(pos, v3); immVertex3fv(pos, v4); - immAttrib3fv(nor, n2); + immAttr3fv(nor, n2); immVertex3fv(pos, v1); } } diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c index ac97867f40f..986003c99e6 100644 --- a/source/blender/gpu/intern/gpu_material.c +++ b/source/blender/gpu/intern/gpu_material.c @@ -688,6 +688,7 @@ GPUMaterial *GPU_material_from_nodetree( mat->outlink, &mat->attribs, &mat->nodes, + &mat->builtins, vert_code, geom_code, frag_lib, diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c index 274ad1c8c0c..d428e2f9bd9 100644 --- a/source/blender/gpu/intern/gpu_shader.c +++ b/source/blender/gpu/intern/gpu_shader.c @@ -167,10 +167,6 @@ extern char datatoc_gpu_shader_text_simple_geom_glsl[]; extern char datatoc_gpu_shader_keyframe_diamond_vert_glsl[]; extern char datatoc_gpu_shader_keyframe_diamond_frag_glsl[]; -extern char datatoc_gpu_shader_fire_frag_glsl[]; -extern char datatoc_gpu_shader_smoke_vert_glsl[]; -extern char datatoc_gpu_shader_smoke_frag_glsl[]; - extern char datatoc_gpu_shader_gpencil_stroke_vert_glsl[]; extern char datatoc_gpu_shader_gpencil_stroke_frag_glsl[]; extern char datatoc_gpu_shader_gpencil_stroke_geom_glsl[]; @@ -664,16 +660,6 @@ int GPU_shader_get_attribute(GPUShader *shader, const char *name) } static const GPUShaderStages builtin_shader_stages[GPU_NUM_BUILTIN_SHADERS] = { - [GPU_SHADER_SMOKE] = - { datatoc_gpu_shader_smoke_vert_glsl, - datatoc_gpu_shader_smoke_frag_glsl }, - [GPU_SHADER_SMOKE_FIRE] = - { datatoc_gpu_shader_smoke_vert_glsl, - datatoc_gpu_shader_smoke_frag_glsl }, - [GPU_SHADER_SMOKE_COBA] = - { datatoc_gpu_shader_smoke_vert_glsl, - datatoc_gpu_shader_smoke_frag_glsl }, - [GPU_SHADER_TEXT] = { datatoc_gpu_shader_text_vert_glsl, datatoc_gpu_shader_text_frag_glsl, @@ -997,9 +983,6 @@ static const char *gpu_shader_get_builtin_shader_defines( case GPU_SHADER_2D_NODELINK_INST: return "#define USE_INSTANCE\n"; - case GPU_SHADER_SMOKE_COBA: - return "#define USE_COBA\n"; - case GPU_SHADER_INSTANCE_VARIYING_ID_VARIYING_SIZE: case GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SIZE: return "#define UNIFORM_SCALE\n"; diff --git a/source/blender/gpu/intern/gpu_shader_interface.c b/source/blender/gpu/intern/gpu_shader_interface.c index f6bbc228ae9..d46fc979363 100644 --- a/source/blender/gpu/intern/gpu_shader_interface.c +++ b/source/blender/gpu/intern/gpu_shader_interface.c @@ -72,6 +72,7 @@ static const char *BuiltinUniform_name(GPUUniformBuiltin u) [GPU_UNIFORM_COLOR] = "color", [GPU_UNIFORM_EYE] = "eye", [GPU_UNIFORM_CALLID] = "callId", + [GPU_UNIFORM_OBJECT_INFO] = "unfobjectinfo", [GPU_UNIFORM_CUSTOM] = NULL, [GPU_NUM_UNIFORMS] = NULL, diff --git a/source/blender/gpu/intern/gpu_texture.c b/source/blender/gpu/intern/gpu_texture.c index abb632ce718..6a8e686afb3 100644 --- a/source/blender/gpu/intern/gpu_texture.c +++ b/source/blender/gpu/intern/gpu_texture.c @@ -138,6 +138,7 @@ static int gpu_get_component_count(GPUTextureFormat format) { switch (format) { case GPU_RGBA8: + case GPU_RGBA8UI: case GPU_RGBA16F: case GPU_RGBA16: case GPU_RGBA32F: @@ -183,7 +184,7 @@ static void gpu_validate_data_format(GPUTextureFormat tex_format, GPUDataFormat } } /* Byte formats */ - else if (ELEM(tex_format, GPU_R8, GPU_RG8, GPU_RGBA8)) { + else if (ELEM(tex_format, GPU_R8, GPU_RG8, GPU_RGBA8, GPU_RGBA8UI)) { BLI_assert(ELEM(data_format, GPU_DATA_UNSIGNED_BYTE, GPU_DATA_FLOAT)); } /* Special case */ @@ -298,6 +299,7 @@ static uint gpu_get_bytesize(GPUTextureFormat data_type) case GPU_RG16: case GPU_DEPTH24_STENCIL8: case GPU_DEPTH_COMPONENT32F: + case GPU_RGBA8UI: case GPU_RGBA8: case GPU_R11F_G11F_B10F: case GPU_R32F: @@ -335,6 +337,7 @@ static GLenum gpu_get_gl_internalformat(GPUTextureFormat format) case GPU_RG16I: return GL_RG16I; case GPU_RG16: return GL_RG16; case GPU_RGBA8: return GL_RGBA8; + case GPU_RGBA8UI: return GL_RGBA8UI; case GPU_R32F: return GL_R32F; case GPU_R32UI: return GL_R32UI; case GPU_R32I: return GL_R32I; diff --git a/source/blender/gpu/intern/gpu_vertex_format.c b/source/blender/gpu/intern/gpu_vertex_format.c index f1aaa99fbc6..c3de3d52b47 100644 --- a/source/blender/gpu/intern/gpu_vertex_format.c +++ b/source/blender/gpu/intern/gpu_vertex_format.c @@ -29,6 +29,8 @@ * GPU vertex format */ +#include "GPU_shader_interface.h" + #include "GPU_vertex_format.h" #include "gpu_vertex_format_private.h" #include <stddef.h> @@ -278,6 +280,115 @@ void VertexFormat_pack(GPUVertFormat *format) format->packed = true; } +static uint calc_input_component_size(const GPUShaderInput *input) +{ + int size = input->size; + switch (input->gl_type) { + case GL_FLOAT_VEC2: + case GL_INT_VEC2: + case GL_UNSIGNED_INT_VEC2: + return size * 2; + case GL_FLOAT_VEC3: + case GL_INT_VEC3: + case GL_UNSIGNED_INT_VEC3: + return size * 3; + case GL_FLOAT_VEC4: + case GL_FLOAT_MAT2: + case GL_INT_VEC4: + case GL_UNSIGNED_INT_VEC4: + return size * 4; + case GL_FLOAT_MAT3: + return size * 9; + case GL_FLOAT_MAT4: + return size * 16; + case GL_FLOAT_MAT2x3: + case GL_FLOAT_MAT3x2: + return size * 6; + case GL_FLOAT_MAT2x4: + case GL_FLOAT_MAT4x2: + return size * 8; + case GL_FLOAT_MAT3x4: + case GL_FLOAT_MAT4x3: + return size * 12; + default: + return size; + } +} + +static void get_fetch_mode_and_comp_type( + int gl_type, + GPUVertCompType *r_comp_type, + uint *r_gl_comp_type, + GPUVertFetchMode *r_fetch_mode) +{ + switch (gl_type) { + case GL_FLOAT: + case GL_FLOAT_VEC2: + case GL_FLOAT_VEC3: + case GL_FLOAT_VEC4: + case GL_FLOAT_MAT2: + case GL_FLOAT_MAT3: + case GL_FLOAT_MAT4: + case GL_FLOAT_MAT2x3: + case GL_FLOAT_MAT2x4: + case GL_FLOAT_MAT3x2: + case GL_FLOAT_MAT3x4: + case GL_FLOAT_MAT4x2: + case GL_FLOAT_MAT4x3: + *r_comp_type = GPU_COMP_F32; + *r_gl_comp_type = GL_FLOAT; + *r_fetch_mode = GPU_FETCH_FLOAT; + break; + case GL_INT: + case GL_INT_VEC2: + case GL_INT_VEC3: + case GL_INT_VEC4: + *r_comp_type = GPU_COMP_I32; + *r_gl_comp_type = GL_INT; + *r_fetch_mode = GPU_FETCH_INT; + break; + case GL_UNSIGNED_INT: + case GL_UNSIGNED_INT_VEC2: + case GL_UNSIGNED_INT_VEC3: + case GL_UNSIGNED_INT_VEC4: + *r_comp_type = GPU_COMP_U32; + *r_gl_comp_type = GL_UNSIGNED_INT; + *r_fetch_mode = GPU_FETCH_INT; + break; + default: + BLI_assert(0); + } +} + +void GPU_vertformat_from_interface(GPUVertFormat *format, const GPUShaderInterface *shaderface) +{ + const char *name_buffer = shaderface->name_buffer; + + for (int i = 0; i < GPU_NUM_SHADERINTERFACE_BUCKETS; i++) { + const GPUShaderInput *input = shaderface->attrib_buckets[i]; + if (input == NULL) { + continue; + } + + const GPUShaderInput *next = input; + while (next != NULL) { + input = next; + next = input->next; + + format->name_len++; /* multiname support */ + format->attr_len++; + + GPUVertAttr *attrib = format->attribs + input->location; + + attrib->name[attrib->name_len++] = copy_attrib_name(format, name_buffer + input->name_offset); + attrib->offset = 0; /* offsets & stride are calculated later (during pack) */ + attrib->comp_len = calc_input_component_size(input); + attrib->sz = attrib->comp_len * 4; + get_fetch_mode_and_comp_type(input->gl_type, &attrib->comp_type, &attrib->gl_comp_type, &attrib->fetch_mode); + } + } +} + /* OpenGL ES packs in a different order as desktop GL but component conversion is the same. * Of the code here, only struct GPUPackedNormal needs to change. */ diff --git a/source/blender/gpu/shaders/gpu_shader_fire_frag.glsl b/source/blender/gpu/shaders/gpu_shader_fire_frag.glsl deleted file mode 100644 index fc9cafb6b02..00000000000 --- a/source/blender/gpu/shaders/gpu_shader_fire_frag.glsl +++ /dev/null @@ -1,15 +0,0 @@ - -in vec3 coords; -out vec4 fragColor; - -uniform sampler3D flame_texture; -uniform sampler1D spectrum_texture; - -void main() -{ - float flame = texture(flame_texture, coords).r; - vec4 emission = texture(spectrum_texture, flame); - - fragColor.rgb = emission.a * emission.rgb; - fragColor.a = emission.a; -} diff --git a/source/blender/gpu/shaders/gpu_shader_smoke_frag.glsl b/source/blender/gpu/shaders/gpu_shader_smoke_frag.glsl deleted file mode 100644 index b57bd5b6a37..00000000000 --- a/source/blender/gpu/shaders/gpu_shader_smoke_frag.glsl +++ /dev/null @@ -1,47 +0,0 @@ - -in vec3 coords; -out vec4 fragColor; - -uniform vec3 active_color; -uniform float step_size; -uniform float density_scale; - -uniform sampler3D soot_texture; -uniform sampler3D shadow_texture; - -#ifdef USE_COBA -uniform sampler1D transfer_texture; -uniform sampler3D color_band_texture; -#endif - -void main() -{ - /* compute color and density from volume texture */ - vec4 soot = texture(soot_texture, coords); - -#ifndef USE_COBA - vec3 soot_color; - if (soot.a != 0) { - soot_color = active_color * soot.rgb / soot.a; - } - else { - soot_color = vec3(0); - } - float soot_density = density_scale * soot.a; - - /* compute transmittance and alpha */ - float soot_transmittance = pow(2.71828182846, -soot_density * step_size); - float soot_alpha = 1.0 - soot_transmittance; - - /* shade */ - float shadow = texture(shadow_texture, coords).r; - soot_color *= soot_transmittance * shadow; - - /* premultiply alpha */ - fragColor = vec4(soot_alpha * soot_color, soot_alpha); -#else - float color_band = texture(color_band_texture, coords).r; - vec4 transfer_function = texture(transfer_texture, color_band); - fragColor = transfer_function * density_scale; -#endif -} diff --git a/source/blender/gpu/shaders/gpu_shader_smoke_vert.glsl b/source/blender/gpu/shaders/gpu_shader_smoke_vert.glsl deleted file mode 100644 index 8c30e9baf9e..00000000000 --- a/source/blender/gpu/shaders/gpu_shader_smoke_vert.glsl +++ /dev/null @@ -1,15 +0,0 @@ - -uniform mat4 ModelViewProjectionMatrix; - -out vec3 coords; - -uniform vec3 min_location; -uniform vec3 invsize; -uniform vec3 ob_sizei; - -void main() -{ - // TODO: swap gl_Vertex for vec3 pos, update smoke setup code - gl_Position = ModelViewProjectionMatrix * vec4(gl_Vertex.xyz * ob_sizei, 1.0); - coords = (gl_Vertex.xyz - min_location) * invsize; -} diff --git a/source/blender/imbuf/IMB_imbuf_types.h b/source/blender/imbuf/IMB_imbuf_types.h index 210fd6e86f5..d407845e45d 100644 --- a/source/blender/imbuf/IMB_imbuf_types.h +++ b/source/blender/imbuf/IMB_imbuf_types.h @@ -222,12 +222,10 @@ typedef struct ImBuf { struct DDSData dds_data; } ImBuf; -/* Moved from BKE_bmfont_types.h because it is a userflag bit mask. */ /** * \brief userflags: Flags used internally by blender for imagebuffers */ -#define IB_BITMAPFONT (1 << 0) /* this image is a font */ #define IB_BITMAPDIRTY (1 << 1) /* image needs to be saved is not the same as filename */ #define IB_MIPMAP_INVALID (1 << 2) /* image mipmaps are invalid, need recreate */ #define IB_RECT_INVALID (1 << 3) /* float buffer changed, needs recreation of byte rect */ diff --git a/source/blender/imbuf/intern/allocimbuf.c b/source/blender/imbuf/intern/allocimbuf.c index 58554693aeb..f7005d7ee89 100644 --- a/source/blender/imbuf/intern/allocimbuf.c +++ b/source/blender/imbuf/intern/allocimbuf.c @@ -155,13 +155,6 @@ void imb_freetilesImBuf(ImBuf *ibuf) ibuf->mall &= ~IB_tiles; } -static void imb_free_bitmap_font(ImBuf *ibuf) -{ - if (ibuf->userdata && (ibuf->userflags & IB_BITMAPFONT)) { - MEM_freeN(ibuf->userdata); - } -} - static void freeencodedbufferImBuf(ImBuf *ibuf) { if (ibuf == NULL) return; @@ -215,7 +208,6 @@ void IMB_freeImBuf(ImBuf *ibuf) imb_freerectImBuf(ibuf); imb_freerectfloatImBuf(ibuf); imb_freetilesImBuf(ibuf); - imb_free_bitmap_font(ibuf); IMB_freezbufImBuf(ibuf); IMB_freezbuffloatImBuf(ibuf); freeencodedbufferImBuf(ibuf); diff --git a/source/blender/imbuf/intern/dds/BlockDXT.cpp b/source/blender/imbuf/intern/dds/BlockDXT.cpp index 7273ec1659c..0887576eedf 100644 --- a/source/blender/imbuf/intern/dds/BlockDXT.cpp +++ b/source/blender/imbuf/intern/dds/BlockDXT.cpp @@ -430,7 +430,7 @@ void AlphaBlockDXT5::decodeBlock(ColorBlock *block) const void AlphaBlockDXT5::flip4() { - uint64 * b = (uint64 *)this; + uint64 *b = (uint64 *)this; // @@ The masks might have to be byte swapped. uint64 tmp = (*b & (uint64)(0x000000000000FFFFLL)); @@ -444,7 +444,7 @@ void AlphaBlockDXT5::flip4() void AlphaBlockDXT5::flip2() { - uint * b = (uint *)this; + uint *b = (uint *)this; // @@ The masks might have to be byte swapped. uint tmp = (*b & 0xFF000000); diff --git a/source/blender/imbuf/intern/dds/ColorBlock.h b/source/blender/imbuf/intern/dds/ColorBlock.h index 7b5291cf976..67c0b64d53e 100644 --- a/source/blender/imbuf/intern/dds/ColorBlock.h +++ b/source/blender/imbuf/intern/dds/ColorBlock.h @@ -45,9 +45,9 @@ struct ColorBlock { ColorBlock(); ColorBlock(const uint * linearImage); ColorBlock(const ColorBlock & block); - ColorBlock(const Image * img, uint x, uint y); + ColorBlock(const Image *img, uint x, uint y); - void init(const Image * img, uint x, uint y); + void init(const Image *img, uint x, uint y); void init(uint w, uint h, const uint * data, uint x, uint y); void init(uint w, uint h, const float * data, uint x, uint y); diff --git a/source/blender/imbuf/intern/dds/Image.cpp b/source/blender/imbuf/intern/dds/Image.cpp index fd3ca1c35e6..2e9ae9da388 100644 --- a/source/blender/imbuf/intern/dds/Image.cpp +++ b/source/blender/imbuf/intern/dds/Image.cpp @@ -82,7 +82,7 @@ const Color32 * Image::scanline(uint h) const return m_data + h * m_width; } -Color32 * Image::scanline(uint h) +Color32 *Image::scanline(uint h) { if (h >= m_height) { printf("DDS: scanline beyond dimensions of image\n"); @@ -91,12 +91,12 @@ Color32 * Image::scanline(uint h) return m_data + h * m_width; } -const Color32 * Image::pixels() const +const Color32 *Image::pixels() const { return m_data; } -Color32 * Image::pixels() +Color32 *Image::pixels() { return m_data; } diff --git a/source/blender/imbuf/intern/dds/Image.h b/source/blender/imbuf/intern/dds/Image.h index bb74a9d5d15..9a8bacd93a3 100644 --- a/source/blender/imbuf/intern/dds/Image.h +++ b/source/blender/imbuf/intern/dds/Image.h @@ -65,11 +65,11 @@ public: uint width() const; uint height() const; - const Color32 * scanline(uint h) const; - Color32 * scanline(uint h); + const Color32 *scanline(uint h) const; + Color32 *scanline(uint h); - const Color32 * pixels() const; - Color32 * pixels(); + const Color32 *pixels() const; + Color32 *pixels(); const Color32 & pixel(uint idx) const; Color32 & pixel(uint idx); @@ -87,7 +87,7 @@ private: uint m_width; uint m_height; Format m_format; - Color32 * m_data; + Color32 *m_data; }; diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h index 2a79880f221..6223e456241 100644 --- a/source/blender/makesdna/DNA_gpencil_types.h +++ b/source/blender/makesdna/DNA_gpencil_types.h @@ -328,6 +328,7 @@ typedef struct bGPdata_Runtime { typedef struct bGPgrid { float color[3]; float scale[2]; + float offset[2]; char _pad1[4]; int lines; @@ -442,6 +443,8 @@ typedef enum eGPdata_Flag { GP_DATA_STROKE_FORCE_RECALC = (1 << 17), /* Special mode drawing polygons */ GP_DATA_STROKE_POLYGON = (1 << 18), + /* Use adaptative UV scales */ + GP_DATA_UV_ADAPTATIVE = (1 << 19), } eGPdata_Flag; /* gpd->onion_flag */ diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h index 656f9fa3034..c591b57002a 100644 --- a/source/blender/makesdna/DNA_mesh_types.h +++ b/source/blender/makesdna/DNA_mesh_types.h @@ -100,8 +100,14 @@ typedef struct Mesh_Runtime { /** 'BVHCache', for 'BKE_bvhutil.c' */ struct LinkNode *bvh_cache; - int deformed_only; /* set by modifier stack if only deformed from original */ - char padding[4]; + /** Set by modifier stack if only deformed from original. */ + char deformed_only; + /** + * Copied from edit-mesh (hint, draw with editmesh data). + * In the future we may leave the mesh-data empty + * since its not needed if we can use edit-mesh data. */ + char is_original; + char padding[6]; } Mesh_Runtime; typedef struct Mesh { diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h index 0b24c1cfb67..636377ffd36 100644 --- a/source/blender/makesdna/DNA_meshdata_types.h +++ b/source/blender/makesdna/DNA_meshdata_types.h @@ -174,8 +174,6 @@ typedef struct MLoop { * * \note A #MLoopTri may be in the middle of an ngon and not reference **any** edges. */ -# -# typedef struct MLoopTri { unsigned int tri[3]; unsigned int poly; diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h index e17c7e17450..9a57f1ae37b 100644 --- a/source/blender/makesdna/DNA_screen_types.h +++ b/source/blender/makesdna/DNA_screen_types.h @@ -455,6 +455,7 @@ enum { /* uiList filter orderby type */ enum { UILST_FLT_SORT_ALPHA = 1 << 0, + UILST_FLT_FORCED_REVERSE = 1 << 1, /* Special flag to indicate reverse was set by external parameter */ UILST_FLT_SORT_REVERSE = 1u << 31 /* Special value, bitflag used to reverse order! */ }; diff --git a/source/blender/makesdna/DNA_shader_fx_types.h b/source/blender/makesdna/DNA_shader_fx_types.h index 3884f72fb56..7c138f21887 100644 --- a/source/blender/makesdna/DNA_shader_fx_types.h +++ b/source/blender/makesdna/DNA_shader_fx_types.h @@ -45,6 +45,7 @@ typedef enum ShaderFxType { eShaderFxType_Rim = 7, eShaderFxType_Colorize = 8, eShaderFxType_Shadow = 9, + eShaderFxType_Glow = 10, NUM_SHADER_FX_TYPES } ShaderFxType; @@ -127,6 +128,27 @@ typedef enum eFlipShaderFx_Flag { FX_FLIP_VERTICAL = (1 << 1), } eFlipShaderFx_Flag; +typedef struct GlowShaderFxData { + ShaderFxData shaderfx; + float glow_color[3]; + float select_color[3]; + float threshold; + int flag; /* flags */ + int mode; + int blur[2]; + int samples; + ShaderFxData_Runtime runtime; +} GlowShaderFxData; + +typedef enum GlowShaderFxModes { + eShaderFxGlowMode_Luminance = 0, + eShaderFxGlowMode_Color = 1, +} GlowShaderFxModes; + +typedef enum eGlowShaderFx_Flag { + FX_GLOW_USE_ALPHA = (1 << 0), +} eGlowShaderFx_Flag; + typedef struct LightShaderFxData { ShaderFxData shaderfx; struct Object *object; diff --git a/source/blender/makesdna/DNA_smoke_types.h b/source/blender/makesdna/DNA_smoke_types.h index cc2f1a8c358..b8ac0de0090 100644 --- a/source/blender/makesdna/DNA_smoke_types.h +++ b/source/blender/makesdna/DNA_smoke_types.h @@ -137,6 +137,9 @@ typedef struct SmokeDomainSettings { struct GPUTexture *tex_wt; struct GPUTexture *tex_shadow; struct GPUTexture *tex_flame; + struct GPUTexture *tex_flame_coba; + struct GPUTexture *tex_coba; + struct GPUTexture *tex_field; struct GPUTexture *tex_velocity_x; struct GPUTexture *tex_velocity_y; struct GPUTexture *tex_velocity_z; diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index 47402085de1..01ee5c233c7 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -200,7 +200,13 @@ typedef struct ThemeUI { char gizmo_secondary[4]; char gizmo_a[4]; char gizmo_b[4]; - char pad2[4]; + + /* Icon Colors. */ + char icon_collection[4]; /* Collection items */ + char icon_object[4]; /* Object items */ + char icon_object_data[4]; /* Object data items */ + char icon_modifier[4]; /* Modifier and constraint items */ + char icon_shading[4]; /* Shading related items */ } ThemeUI; /* try to put them all in one, if needed a special struct can be created as well @@ -878,8 +884,9 @@ typedef enum eText_Draw_Options { /* Grease Pencil Settings. * UserDef.gp_settings */ typedef enum eGP_UserdefSettings { - GP_PAINT_DOSMOOTH = (1 << 0), - GP_PAINT_DOSIMPLIFY = (1 << 1), + GP_PAINT_DOSMOOTH = (1 << 0), + GP_PAINT_DOSIMPLIFY = (1 << 1), + GP_PAINT_REVERSE_LAYERS = (1 << 2), } eGP_UserdefSettings; enum { diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h index 1b8846df4bc..fca1a79c775 100644 --- a/source/blender/makesdna/DNA_view3d_types.h +++ b/source/blender/makesdna/DNA_view3d_types.h @@ -177,6 +177,10 @@ typedef struct View3DOverlay { /* Paint mode settings */ int paint_flag; + /* Weight paint mode settings */ + int wpaint_flag; + char _pad2[4]; + /* Alpha for texture, weight, vertex paint overlay */ float texture_paint_mode_opacity; float vertex_paint_mode_opacity; @@ -460,6 +464,11 @@ enum { V3D_OVERLAY_PAINT_WIRE = (1 << 0), }; +/* View3DOverlay->wpaint_flag */ +enum { + V3D_OVERLAY_WPAINT_CONTOURS = (1 << 0), +}; + /* View3D->around */ enum { /* center of the bounding box */ diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index ccce54227fe..c1eed8093c8 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -390,7 +390,7 @@ extern StructRNA RNA_MeshLoopColorLayer; extern StructRNA RNA_MeshDeformModifier; extern StructRNA RNA_MeshEdge; extern StructRNA RNA_MeshPolygon; -extern StructRNA RNA_MeshTessFace; +extern StructRNA RNA_MeshLoopTriangle; extern StructRNA RNA_MeshLoop; extern StructRNA RNA_MeshFloatProperty; extern StructRNA RNA_MeshFloatPropertyLayer; @@ -619,6 +619,7 @@ extern StructRNA RNA_ShaderFx; extern StructRNA RNA_ShaderFxBlur; extern StructRNA RNA_ShaderFxColorize; extern StructRNA RNA_ShaderFxFlip; +extern StructRNA RNA_ShaderFxGlow; extern StructRNA RNA_ShaderFxLight; extern StructRNA RNA_ShaderFxPixel; extern StructRNA RNA_ShaderFxRim; diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c index cc1c1bffff2..921a7e3561a 100644 --- a/source/blender/makesrna/intern/rna_ID.c +++ b/source/blender/makesrna/intern/rna_ID.c @@ -83,7 +83,7 @@ const EnumPropertyItem rna_enum_id_type_items[] = { {ID_TE, "TEXTURE", ICON_TEXTURE_DATA, "Texture", ""}, {ID_WM, "WINDOWMANAGER", ICON_FULLSCREEN, "Window Manager", ""}, {ID_WO, "WORLD", ICON_WORLD_DATA, "World", ""}, - {ID_WS, "WORKSPACE", ICON_SPLITSCREEN, "Workspace", ""}, + {ID_WS, "WORKSPACE", ICON_WORKSPACE, "Workspace", ""}, {0, NULL, 0, NULL, NULL} }; @@ -433,7 +433,7 @@ static struct ID *rna_ID_make_local(struct ID *self, Main *bmain, bool clear_pro } -static AnimData * rna_ID_animation_data_create(ID *id, Main *bmain) +static AnimData *rna_ID_animation_data_create(ID *id, Main *bmain) { AnimData *adt = BKE_animdata_add_id(id); DEG_relations_tag_update(bmain); diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index bd0b3e9d760..cb1453fd0bf 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -7075,7 +7075,7 @@ int RNA_function_call_direct_va(bContext *C, ReportList *reports, PointerRNA *pt case PROP_COLLECTION: { StructRNA *srna = va_arg(args, StructRNA *); - ListBase **arg = va_arg(args, ListBase * *); + ListBase **arg = va_arg(args, ListBase **); err = rna_function_parameter_parse(&funcptr, parm, type, ftype, len, arg, retdata, srna, tid, fid, pid); break; diff --git a/source/blender/makesrna/intern/rna_action.c b/source/blender/makesrna/intern/rna_action.c index 12e28d457fb..fe4c92b9163 100644 --- a/source/blender/makesrna/intern/rna_action.c +++ b/source/blender/makesrna/intern/rna_action.c @@ -322,7 +322,7 @@ static void rna_def_dopesheet(BlenderRNA *brna) prop = RNA_def_property(srna, "show_only_errors", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "filterflag", ADS_FILTER_ONLY_ERRORS); RNA_def_property_ui_text(prop, "Show Errors", "Only include F-Curves and drivers that are disabled or have errors"); - RNA_def_property_ui_icon(prop, ICON_HELP, 0); /* XXX: this doesn't quite fit */ + RNA_def_property_ui_icon(prop, ICON_ERROR, 0); RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL); /* Object Collection Filtering Settings */ diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c index 5d66742e8a3..665a694653c 100644 --- a/source/blender/makesrna/intern/rna_brush.c +++ b/source/blender/makesrna/intern/rna_brush.c @@ -46,8 +46,8 @@ #include "WM_types.h" static const EnumPropertyItem prop_direction_items[] = { - {0, "ADD", ICON_ZOOMIN, "Add", "Add effect of brush"}, - {BRUSH_DIR_IN, "SUBTRACT", ICON_ZOOMOUT, "Subtract", "Subtract effect of brush"}, + {0, "ADD", ICON_ADD, "Add", "Add effect of brush"}, + {BRUSH_DIR_IN, "SUBTRACT", ICON_REMOVE, "Subtract", "Subtract effect of brush"}, {0, NULL, 0, NULL, NULL} }; @@ -589,39 +589,39 @@ static const EnumPropertyItem *rna_Brush_direction_itemf(bContext *C, PointerRNA /* sculpt mode */ static const EnumPropertyItem prop_flatten_contrast_items[] = { - {BRUSH_DIR_IN, "CONTRAST", ICON_ZOOMIN, "Contrast", "Subtract effect of brush"}, - {0, "FLATTEN", ICON_ZOOMOUT, "Flatten", "Add effect of brush"}, + {BRUSH_DIR_IN, "CONTRAST", ICON_ADD, "Contrast", "Subtract effect of brush"}, + {0, "FLATTEN", ICON_REMOVE, "Flatten", "Add effect of brush"}, {0, NULL, 0, NULL, NULL} }; static const EnumPropertyItem prop_fill_deepen_items[] = { - {0, "FILL", ICON_ZOOMIN, "Fill", "Add effect of brush"}, - {BRUSH_DIR_IN, "DEEPEN", ICON_ZOOMOUT, "Deepen", "Subtract effect of brush"}, + {0, "FILL", ICON_ADD, "Fill", "Add effect of brush"}, + {BRUSH_DIR_IN, "DEEPEN", ICON_REMOVE, "Deepen", "Subtract effect of brush"}, {0, NULL, 0, NULL, NULL} }; static const EnumPropertyItem prop_scrape_peaks_items[] = { - {0, "SCRAPE", ICON_ZOOMIN, "Scrape", "Add effect of brush"}, - {BRUSH_DIR_IN, "PEAKS", ICON_ZOOMOUT, "Peaks", "Subtract effect of brush"}, + {0, "SCRAPE", ICON_ADD, "Scrape", "Add effect of brush"}, + {BRUSH_DIR_IN, "PEAKS", ICON_REMOVE, "Peaks", "Subtract effect of brush"}, {0, NULL, 0, NULL, NULL} }; static const EnumPropertyItem prop_pinch_magnify_items[] = { - {BRUSH_DIR_IN, "MAGNIFY", ICON_ZOOMIN, "Magnify", "Subtract effect of brush"}, - {0, "PINCH", ICON_ZOOMOUT, "Pinch", "Add effect of brush"}, + {BRUSH_DIR_IN, "MAGNIFY", ICON_ADD, "Magnify", "Subtract effect of brush"}, + {0, "PINCH", ICON_REMOVE, "Pinch", "Add effect of brush"}, {0, NULL, 0, NULL, NULL} }; static const EnumPropertyItem prop_inflate_deflate_items[] = { - {0, "INFLATE", ICON_ZOOMIN, "Inflate", "Add effect of brush"}, - {BRUSH_DIR_IN, "DEFLATE", ICON_ZOOMOUT, "Deflate", "Subtract effect of brush"}, + {0, "INFLATE", ICON_ADD, "Inflate", "Add effect of brush"}, + {BRUSH_DIR_IN, "DEFLATE", ICON_REMOVE, "Deflate", "Subtract effect of brush"}, {0, NULL, 0, NULL, NULL} }; /* texture paint mode */ static const EnumPropertyItem prop_soften_sharpen_items[] = { - {BRUSH_DIR_IN, "SHARPEN", ICON_ZOOMIN, "Sharpen", "Sharpen effect of brush"}, - {0, "SOFTEN", ICON_ZOOMOUT, "Soften", "Blur effect of brush"}, + {BRUSH_DIR_IN, "SHARPEN", ICON_ADD, "Sharpen", "Sharpen effect of brush"}, + {0, "SOFTEN", ICON_REMOVE, "Soften", "Blur effect of brush"}, {0, NULL, 0, NULL, NULL} }; @@ -710,6 +710,11 @@ static const EnumPropertyItem *rna_Brush_stroke_itemf(bContext *C, PointerRNA *U } /* Grease Pencil Drawing Brushes Settings */ +static char *rna_BrushGpencilSettings_path(PointerRNA *UNUSED(ptr)) +{ + return BLI_strdup("tool_settings.gpencil_paint.brush.gpencil_settings"); +} + static void rna_BrushGpencilSettings_default_eraser_update(Main *bmain, Scene *scene, PointerRNA *UNUSED(ptr)) { ToolSettings *ts = scene->toolsettings; @@ -967,6 +972,7 @@ static void rna_def_gpencil_options(BlenderRNA *brna) srna = RNA_def_struct(brna, "BrushGpencilSettings", NULL); RNA_def_struct_sdna(srna, "BrushGpencilSettings"); + RNA_def_struct_path_func(srna, "rna_BrushGpencilSettings_path"); RNA_def_struct_ui_text(srna, "Grease Pencil Brush Settings", "Settings for grease pencil brush"); /* grease pencil drawing brushes */ @@ -988,9 +994,10 @@ static void rna_def_gpencil_options(BlenderRNA *brna) RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL); /* Strength factor for new strokes */ - prop = RNA_def_property(srna, "pen_strength", PROP_FLOAT, PROP_NONE); + prop = RNA_def_property(srna, "pen_strength", PROP_FLOAT, PROP_FACTOR); RNA_def_property_float_sdna(prop, NULL, "draw_strength"); RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.001, 3); RNA_def_property_ui_text(prop, "Strength", "Color strength for new strokes (affect alpha factor of color)"); RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0); RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL); diff --git a/source/blender/makesrna/intern/rna_color.c b/source/blender/makesrna/intern/rna_color.c index 4cbe365167c..3cf959eaee1 100644 --- a/source/blender/makesrna/intern/rna_color.c +++ b/source/blender/makesrna/intern/rna_color.c @@ -1005,7 +1005,7 @@ static void rna_def_histogram(BlenderRNA *brna) prop = RNA_def_property(srna, "show_line", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", HISTO_FLAG_LINE); RNA_def_property_ui_text(prop, "Show Line", "Display lines rather than filled shapes"); - RNA_def_property_ui_icon(prop, ICON_IPO, 0); + RNA_def_property_ui_icon(prop, ICON_GRAPH, 0); } static void rna_def_scopes(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_constraint.c b/source/blender/makesrna/intern/rna_constraint.c index ba87d08fdac..1e7ed90a4a5 100644 --- a/source/blender/makesrna/intern/rna_constraint.c +++ b/source/blender/makesrna/intern/rna_constraint.c @@ -48,63 +48,63 @@ /* please keep the names in sync with constraint.c */ const EnumPropertyItem rna_enum_constraint_type_items[] = { {0, "", 0, N_("Motion Tracking"), ""}, - {CONSTRAINT_TYPE_CAMERASOLVER, "CAMERA_SOLVER", ICON_CONSTRAINT_DATA, "Camera Solver", ""}, - {CONSTRAINT_TYPE_FOLLOWTRACK, "FOLLOW_TRACK", ICON_CONSTRAINT_DATA, "Follow Track", ""}, - {CONSTRAINT_TYPE_OBJECTSOLVER, "OBJECT_SOLVER", ICON_CONSTRAINT_DATA, "Object Solver", ""}, + {CONSTRAINT_TYPE_CAMERASOLVER, "CAMERA_SOLVER", ICON_CONSTRAINT, "Camera Solver", ""}, + {CONSTRAINT_TYPE_FOLLOWTRACK, "FOLLOW_TRACK", ICON_CONSTRAINT, "Follow Track", ""}, + {CONSTRAINT_TYPE_OBJECTSOLVER, "OBJECT_SOLVER", ICON_CONSTRAINT, "Object Solver", ""}, {0, "", 0, N_("Transform"), ""}, - {CONSTRAINT_TYPE_LOCLIKE, "COPY_LOCATION", ICON_CONSTRAINT_DATA, "Copy Location", + {CONSTRAINT_TYPE_LOCLIKE, "COPY_LOCATION", ICON_CONSTRAINT, "Copy Location", "Copy the location of a target (with an optional offset), so that they move together"}, - {CONSTRAINT_TYPE_ROTLIKE, "COPY_ROTATION", ICON_CONSTRAINT_DATA, "Copy Rotation", + {CONSTRAINT_TYPE_ROTLIKE, "COPY_ROTATION", ICON_CONSTRAINT, "Copy Rotation", "Copy the rotation of a target (with an optional offset), so that they rotate together"}, - {CONSTRAINT_TYPE_SIZELIKE, "COPY_SCALE", ICON_CONSTRAINT_DATA, "Copy Scale", + {CONSTRAINT_TYPE_SIZELIKE, "COPY_SCALE", ICON_CONSTRAINT, "Copy Scale", "Copy the scale factors of a target (with an optional offset), so that they are scaled by the same amount"}, - {CONSTRAINT_TYPE_TRANSLIKE, "COPY_TRANSFORMS", ICON_CONSTRAINT_DATA, "Copy Transforms", + {CONSTRAINT_TYPE_TRANSLIKE, "COPY_TRANSFORMS", ICON_CONSTRAINT, "Copy Transforms", "Copy all the transformations of a target, so that they move together"}, - {CONSTRAINT_TYPE_DISTLIMIT, "LIMIT_DISTANCE", ICON_CONSTRAINT_DATA, "Limit Distance", + {CONSTRAINT_TYPE_DISTLIMIT, "LIMIT_DISTANCE", ICON_CONSTRAINT, "Limit Distance", "Restrict movements to within a certain distance of a target (at the time of constraint evaluation only)"}, - {CONSTRAINT_TYPE_LOCLIMIT, "LIMIT_LOCATION", ICON_CONSTRAINT_DATA, "Limit Location", + {CONSTRAINT_TYPE_LOCLIMIT, "LIMIT_LOCATION", ICON_CONSTRAINT, "Limit Location", "Restrict movement along each axis within given ranges"}, - {CONSTRAINT_TYPE_ROTLIMIT, "LIMIT_ROTATION", ICON_CONSTRAINT_DATA, "Limit Rotation", + {CONSTRAINT_TYPE_ROTLIMIT, "LIMIT_ROTATION", ICON_CONSTRAINT, "Limit Rotation", "Restrict rotation along each axis within given ranges"}, - {CONSTRAINT_TYPE_SIZELIMIT, "LIMIT_SCALE", ICON_CONSTRAINT_DATA, "Limit Scale", + {CONSTRAINT_TYPE_SIZELIMIT, "LIMIT_SCALE", ICON_CONSTRAINT, "Limit Scale", "Restrict scaling along each axis with given ranges"}, - {CONSTRAINT_TYPE_SAMEVOL, "MAINTAIN_VOLUME", ICON_CONSTRAINT_DATA, "Maintain Volume", + {CONSTRAINT_TYPE_SAMEVOL, "MAINTAIN_VOLUME", ICON_CONSTRAINT, "Maintain Volume", "Compensate for scaling one axis by applying suitable scaling to the other two axes"}, - {CONSTRAINT_TYPE_TRANSFORM, "TRANSFORM", ICON_CONSTRAINT_DATA, "Transformation", + {CONSTRAINT_TYPE_TRANSFORM, "TRANSFORM", ICON_CONSTRAINT, "Transformation", "Use one transform property from target to control another (or same) property on owner"}, - {CONSTRAINT_TYPE_TRANSFORM_CACHE, "TRANSFORM_CACHE", ICON_CONSTRAINT_DATA, "Transform Cache", + {CONSTRAINT_TYPE_TRANSFORM_CACHE, "TRANSFORM_CACHE", ICON_CONSTRAINT, "Transform Cache", "Look up the transformation matrix from an external file"}, {0, "", 0, N_("Tracking"), ""}, - {CONSTRAINT_TYPE_CLAMPTO, "CLAMP_TO", ICON_CONSTRAINT_DATA, "Clamp To", + {CONSTRAINT_TYPE_CLAMPTO, "CLAMP_TO", ICON_CONSTRAINT, "Clamp To", "Restrict movements to lie along a curve by remapping location along curve's longest axis"}, - {CONSTRAINT_TYPE_DAMPTRACK, "DAMPED_TRACK", ICON_CONSTRAINT_DATA, "Damped Track", + {CONSTRAINT_TYPE_DAMPTRACK, "DAMPED_TRACK", ICON_CONSTRAINT, "Damped Track", "Point towards a target by performing the smallest rotation necessary"}, - {CONSTRAINT_TYPE_KINEMATIC, "IK", ICON_CONSTRAINT_DATA, "Inverse Kinematics", + {CONSTRAINT_TYPE_KINEMATIC, "IK", ICON_CONSTRAINT, "Inverse Kinematics", "Control a chain of bones by specifying the endpoint target (Bones only)"}, - {CONSTRAINT_TYPE_LOCKTRACK, "LOCKED_TRACK", ICON_CONSTRAINT_DATA, "Locked Track", + {CONSTRAINT_TYPE_LOCKTRACK, "LOCKED_TRACK", ICON_CONSTRAINT, "Locked Track", "Rotate around the specified ('locked') axis to point towards a target"}, - {CONSTRAINT_TYPE_SPLINEIK, "SPLINE_IK", ICON_CONSTRAINT_DATA, "Spline IK", + {CONSTRAINT_TYPE_SPLINEIK, "SPLINE_IK", ICON_CONSTRAINT, "Spline IK", "Align chain of bones along a curve (Bones only)"}, - {CONSTRAINT_TYPE_STRETCHTO, "STRETCH_TO", ICON_CONSTRAINT_DATA, "Stretch To", + {CONSTRAINT_TYPE_STRETCHTO, "STRETCH_TO", ICON_CONSTRAINT, "Stretch To", "Stretch along Y-Axis to point towards a target"}, - {CONSTRAINT_TYPE_TRACKTO, "TRACK_TO", ICON_CONSTRAINT_DATA, "Track To", + {CONSTRAINT_TYPE_TRACKTO, "TRACK_TO", ICON_CONSTRAINT, "Track To", "Legacy tracking constraint prone to twisting artifacts"}, {0, "", 0, N_("Relationship"), ""}, - {CONSTRAINT_TYPE_ACTION, "ACTION", ICON_CONSTRAINT_DATA, "Action", + {CONSTRAINT_TYPE_ACTION, "ACTION", ICON_CONSTRAINT, "Action", "Use transform property of target to look up pose for owner from an Action"}, - {CONSTRAINT_TYPE_CHILDOF, "CHILD_OF", ICON_CONSTRAINT_DATA, "Child Of", + {CONSTRAINT_TYPE_CHILDOF, "CHILD_OF", ICON_CONSTRAINT, "Child Of", "Make target the 'detachable' parent of owner"}, - {CONSTRAINT_TYPE_MINMAX, "FLOOR", ICON_CONSTRAINT_DATA, "Floor", + {CONSTRAINT_TYPE_MINMAX, "FLOOR", ICON_CONSTRAINT, "Floor", "Use position (and optionally rotation) of target to define a 'wall' or 'floor' that the owner can not cross"}, - {CONSTRAINT_TYPE_FOLLOWPATH, "FOLLOW_PATH", ICON_CONSTRAINT_DATA, "Follow Path", + {CONSTRAINT_TYPE_FOLLOWPATH, "FOLLOW_PATH", ICON_CONSTRAINT, "Follow Path", "Use to animate an object/bone following a path"}, - {CONSTRAINT_TYPE_PIVOT, "PIVOT", ICON_CONSTRAINT_DATA, "Pivot", + {CONSTRAINT_TYPE_PIVOT, "PIVOT", ICON_CONSTRAINT, "Pivot", "Change pivot point for transforms (buggy)"}, /* {CONSTRAINT_TYPE_RIGIDBODYJOINT, "RIGID_BODY_JOINT", ICON_CONSTRAINT_DATA, "Rigid Body Joint", "Use to define a Rigid Body Constraint (for Game Engine use only)"}, */ /* {CONSTRAINT_TYPE_PYTHON, "SCRIPT", ICON_CONSTRAINT_DATA, "Script", "Custom constraint(s) written in Python (Not yet implemented)"}, */ - {CONSTRAINT_TYPE_SHRINKWRAP, "SHRINKWRAP", ICON_CONSTRAINT_DATA, "Shrinkwrap", + {CONSTRAINT_TYPE_SHRINKWRAP, "SHRINKWRAP", ICON_CONSTRAINT, "Shrinkwrap", "Restrict movements to surface of target mesh"}, {0, NULL, 0, NULL, NULL} }; diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c index cc1dc5e17b9..f576ad4866c 100644 --- a/source/blender/makesrna/intern/rna_curve.c +++ b/source/blender/makesrna/intern/rna_curve.c @@ -956,20 +956,20 @@ static void rna_def_font(BlenderRNA *UNUSED(brna), StructRNA *srna) PropertyRNA *prop; static const EnumPropertyItem prop_align_items[] = { - {CU_ALIGN_X_LEFT, "LEFT", 0, "Left", "Align text to the left"}, - {CU_ALIGN_X_MIDDLE, "CENTER", 0, "Center", "Center text"}, - {CU_ALIGN_X_RIGHT, "RIGHT", 0, "Right", "Align text to the right"}, - {CU_ALIGN_X_JUSTIFY, "JUSTIFY", 0, "Justify", "Align to the left and the right"}, - {CU_ALIGN_X_FLUSH, "FLUSH", 0, "Flush", "Align to the left and the right, with equal character spacing"}, + {CU_ALIGN_X_LEFT, "LEFT", ICON_ALIGN_LEFT, "Left", "Align text to the left"}, + {CU_ALIGN_X_MIDDLE, "CENTER", ICON_ALIGN_CENTER, "Center", "Center text"}, + {CU_ALIGN_X_RIGHT, "RIGHT", ICON_ALIGN_RIGHT, "Right", "Align text to the right"}, + {CU_ALIGN_X_JUSTIFY, "JUSTIFY", ICON_ALIGN_JUSTIFY, "Justify", "Align to the left and the right"}, + {CU_ALIGN_X_FLUSH, "FLUSH", ICON_ALIGN_FLUSH, "Flush", "Align to the left and the right, with equal character spacing"}, {0, NULL, 0, NULL, NULL} }; static const EnumPropertyItem prop_align_y_items[] = { - {CU_ALIGN_Y_TOP_BASELINE, "TOP_BASELINE", 0, "Top Base-Line", "Align to top but use the base-line of the text"}, - {CU_ALIGN_Y_TOP, "TOP", 0, "Top", "Align text to the top"}, - {CU_ALIGN_Y_CENTER, "CENTER", 0, "Center", "Align text to the middle"}, - {CU_ALIGN_Y_BOTTOM, "BOTTOM", 0, "Bottom", "Align text to the bottom"}, - {CU_ALIGN_Y_BOTTOM_BASELINE, "BOTTOM_BASELINE", 0, "Bottom Base-Line", + {CU_ALIGN_Y_TOP_BASELINE, "TOP_BASELINE", ICON_ALIGN_TOP, "Top Base-Line", "Align to top but use the base-line of the text"}, + {CU_ALIGN_Y_TOP, "TOP", ICON_ALIGN_TOP, "Top", "Align text to the top"}, + {CU_ALIGN_Y_CENTER, "CENTER", ICON_ALIGN_MIDDLE, "Center", "Align text to the middle"}, + {CU_ALIGN_Y_BOTTOM, "BOTTOM", ICON_ALIGN_BOTTOM, "Bottom", "Align text to the bottom"}, + {CU_ALIGN_Y_BOTTOM_BASELINE, "BOTTOM_BASELINE", ICON_ALIGN_BOTTOM, "Bottom Base-Line", "Align text to the bottom but use the base-line of the text"}, {0, NULL, 0, NULL, NULL} }; @@ -1179,16 +1179,19 @@ static void rna_def_charinfo(BlenderRNA *brna) prop = RNA_def_property(srna, "use_bold", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_CHINFO_BOLD); RNA_def_property_ui_text(prop, "Bold", ""); + RNA_def_property_ui_icon(prop, ICON_BOLD, 0); RNA_def_property_update(prop, 0, "rna_Curve_update_data"); prop = RNA_def_property(srna, "use_italic", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_CHINFO_ITALIC); RNA_def_property_ui_text(prop, "Italic", ""); + RNA_def_property_ui_icon(prop, ICON_ITALIC, 0); RNA_def_property_update(prop, 0, "rna_Curve_update_data"); prop = RNA_def_property(srna, "use_underline", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_CHINFO_UNDERLINE); RNA_def_property_ui_text(prop, "Underline", ""); + RNA_def_property_ui_icon(prop, ICON_UNDERLINE, 0); RNA_def_property_update(prop, 0, "rna_Curve_update_data"); /* probably there is no reason to expose this */ @@ -1202,6 +1205,7 @@ static void rna_def_charinfo(BlenderRNA *brna) prop = RNA_def_property(srna, "use_small_caps", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_CHINFO_SMALLCAPS); RNA_def_property_ui_text(prop, "Small Caps", ""); + RNA_def_property_ui_icon(prop, ICON_SMALL_CAPS, 0); RNA_def_property_update(prop, 0, "rna_Curve_update_data"); prop = RNA_def_property(srna, "material_index", PROP_INT, PROP_UNSIGNED); diff --git a/source/blender/makesrna/intern/rna_gpencil.c b/source/blender/makesrna/intern/rna_gpencil.c index 36330f1e17a..a02868622e4 100644 --- a/source/blender/makesrna/intern/rna_gpencil.c +++ b/source/blender/makesrna/intern/rna_gpencil.c @@ -1097,7 +1097,7 @@ static void rna_def_gpencil_layer(BlenderRNA *brna) /* Flags */ prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_HIDE); - RNA_def_property_ui_icon(prop, ICON_HIDE_OFF, 1); + RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 1); RNA_def_property_ui_text(prop, "Hide", "Set layer Visibility"); RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); @@ -1279,6 +1279,13 @@ static void rna_def_gpencil_grid(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Grid Subdivisions", "Number of subdivisions in each side of symmetry line"); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); + prop = RNA_def_property(srna, "offset", PROP_FLOAT, PROP_XYZ); + RNA_def_property_float_sdna(prop, NULL, "offset"); + RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); + RNA_def_property_array(prop, 2); + RNA_def_property_ui_text(prop, "Offset", "Offset of the canvas"); + RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); + prop = RNA_def_property(srna, "axis", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "axis"); RNA_def_property_enum_items(prop, rna_enum_gpencil_grid_axis_items); @@ -1383,6 +1390,11 @@ static void rna_def_gpencil_data(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Force Fill Update", "Force recalc of fill data after use deformation modifiers (reduce FPS)"); RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + prop = RNA_def_property(srna, "use_adaptative_uv", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_UV_ADAPTATIVE); + RNA_def_property_ui_text(prop, "Adaptative UV", "Automatic UVs are calculated depending of the stroke size"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + prop = RNA_def_property(srna, "edit_line_color", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, NULL, "line_color"); RNA_def_property_array(prop, 4); diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h index 2578f88a520..155c030587d 100644 --- a/source/blender/makesrna/intern/rna_internal.h +++ b/source/blender/makesrna/intern/rna_internal.h @@ -490,7 +490,7 @@ int rna_parameter_size(struct PropertyRNA *parm); struct Mesh *rna_Main_meshes_new_from_object( struct Main *bmain, struct ReportList *reports, struct Depsgraph *depsgraph, - struct Object *ob, bool apply_modifiers, bool calc_tessface, bool calc_undeformed); + struct Object *ob, bool apply_modifiers, bool calc_undeformed); /* XXX, these should not need to be defined here~! */ struct MTex *rna_mtex_texture_slots_add(struct ID *self, struct bContext *C, struct ReportList *reports); diff --git a/source/blender/makesrna/intern/rna_key.c b/source/blender/makesrna/intern/rna_key.c index 05efe350a2f..11fb5f7f94b 100644 --- a/source/blender/makesrna/intern/rna_key.c +++ b/source/blender/makesrna/intern/rna_key.c @@ -722,7 +722,7 @@ static void rna_def_keyblock(BlenderRNA *brna) prop = RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYBLOCK_MUTE); RNA_def_property_ui_text(prop, "Mute", "Mute this shape key"); - RNA_def_property_ui_icon(prop, ICON_HIDE_OFF, 1); + RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 1); RNA_def_property_update(prop, 0, "rna_Key_update_data"); prop = RNA_def_property(srna, "slider_min", PROP_FLOAT, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c index 70dcf20dcc6..59c9e523914 100644 --- a/source/blender/makesrna/intern/rna_main_api.c +++ b/source/blender/makesrna/intern/rna_main_api.c @@ -310,7 +310,7 @@ static Mesh *rna_Main_meshes_new(Main *bmain, const char *name) /* copied from Mesh_getFromObject and adapted to RNA interface */ Mesh *rna_Main_meshes_new_from_object( Main *bmain, ReportList *reports, Depsgraph *depsgraph, - Object *ob, bool apply_modifiers, bool calc_tessface, bool calc_undeformed) + Object *ob, bool apply_modifiers, bool calc_undeformed) { Scene *sce = DEG_get_evaluated_scene(depsgraph); @@ -326,7 +326,7 @@ Mesh *rna_Main_meshes_new_from_object( return NULL; } - return BKE_mesh_new_from_object(depsgraph, bmain, sce, ob, apply_modifiers, calc_tessface, calc_undeformed); + return BKE_mesh_new_from_object(depsgraph, bmain, sce, ob, apply_modifiers, calc_undeformed); } static Lamp *rna_Main_lights_new(Main *bmain, const char *name, int type) @@ -893,7 +893,6 @@ void RNA_def_main_meshes(BlenderRNA *brna, PropertyRNA *cprop) RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED); parm = RNA_def_boolean(func, "apply_modifiers", 0, "", "Apply modifiers"); RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); - RNA_def_boolean(func, "calc_tessface", true, "Calculate Tessellation", "Calculate tessellation faces"); RNA_def_boolean(func, "calc_undeformed", false, "Calculate Undeformed", "Calculate undeformed vertex coordinates"); parm = RNA_def_pointer(func, "mesh", "Mesh", "", "Mesh created from object, remove it if it is only used for export"); diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c index ee0c9e392c4..ac65c25f1da 100644 --- a/source/blender/makesrna/intern/rna_material.c +++ b/source/blender/makesrna/intern/rna_material.c @@ -555,7 +555,7 @@ static void rna_def_material_greasepencil(BlenderRNA *brna) /* Flags */ prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_STYLE_COLOR_HIDE); - RNA_def_property_ui_icon(prop, ICON_HIDE_OFF, 1); + RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 1); RNA_def_property_ui_text(prop, "Hide", "Set color Visibility"); RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_nopreview_update"); diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c index 24896570fb5..a5bae7115f9 100644 --- a/source/blender/makesrna/intern/rna_mesh.c +++ b/source/blender/makesrna/intern/rna_mesh.c @@ -70,6 +70,7 @@ const EnumPropertyItem rna_enum_mesh_delimit_mode_items[] = { #include "BKE_customdata.h" #include "BKE_main.h" #include "BKE_mesh.h" +#include "BKE_mesh_runtime.h" #include "BKE_report.h" #include "DEG_depsgraph.h" @@ -139,12 +140,6 @@ static CustomData *rna_mesh_ldata(PointerRNA *ptr) return rna_mesh_ldata_helper(me); } -static CustomData *rna_mesh_fdata(PointerRNA *ptr) -{ - Mesh *me = rna_mesh(ptr); - return rna_mesh_fdata_helper(me); -} - /* -------------------------------------------------------------------- */ /* Generic CustomData Layer Functions */ @@ -195,12 +190,6 @@ static void rna_MeshLoopLayer_name_set(PointerRNA *ptr, const char *value) { rna_cd_layer_name_set(rna_mesh_ldata(ptr), (CustomDataLayer *)ptr->data, value); } -#if 0 -static void rna_MeshTessfaceLayer_name_set(PointerRNA *ptr, const char *value) -{ - rna_cd_layer_name_set(rna_mesh_fdata(ptr), (CustomDataLayer *)ptr->data, value); -} -#endif /* only for layers shared between types */ static void rna_MeshAnyLayer_name_set(PointerRNA *ptr, const char *value) { @@ -435,232 +424,57 @@ static void rna_MeshPolygon_flip(ID *id, MPoly *mp) BKE_mesh_polygon_flip(mp, me->mloop, &me->ldata); BKE_mesh_tessface_clear(me); + BKE_mesh_runtime_clear_geometry(me); } -static void rna_MeshTessFace_normal_get(PointerRNA *ptr, float *values) +static void rna_MeshLoopTriangle_verts_get(PointerRNA *ptr, int *values) { Mesh *me = rna_mesh(ptr); - MFace *mface = (MFace *)ptr->data; - - if (mface->v4) - normal_quad_v3(values, me->mvert[mface->v1].co, me->mvert[mface->v2].co, - me->mvert[mface->v3].co, me->mvert[mface->v4].co); - else - normal_tri_v3(values, me->mvert[mface->v1].co, me->mvert[mface->v2].co, me->mvert[mface->v3].co); + MLoopTri *lt = (MLoopTri *)ptr->data; + values[0] = me->mloop[lt->tri[0]].v; + values[1] = me->mloop[lt->tri[1]].v; + values[2] = me->mloop[lt->tri[2]].v; } -static void rna_MeshTessFace_split_normals_get(PointerRNA *ptr, float *values) -{ - Mesh *me = rna_mesh(ptr); - MFace *mface = (MFace *)ptr->data; - const short (*vec)[4][3] = CustomData_get(&me->fdata, (int)(mface - me->mface), CD_TESSLOOPNORMAL); - int i = 4; - - if (!vec) { - while (i--) zero_v3(&values[i * 3]); - } - else { - while (i--) normal_short_to_float_v3(&values[i * 3], (const short *)(*vec)[i]); - } -} -static float rna_MeshTessFace_area_get(PointerRNA *ptr) +static void rna_MeshLoopTriangle_normal_get(PointerRNA *ptr, float *values) { Mesh *me = rna_mesh(ptr); - MFace *mface = (MFace *)ptr->data; - - if (mface->v4) - return area_quad_v3(me->mvert[mface->v1].co, me->mvert[mface->v2].co, me->mvert[mface->v3].co, - me->mvert[mface->v4].co); - else - return area_tri_v3(me->mvert[mface->v1].co, me->mvert[mface->v2].co, me->mvert[mface->v3].co); -} - -static void rna_MeshTextureFace_uv1_get(PointerRNA *ptr, float *values) -{ - MTFace *mtface = (MTFace *)ptr->data; - - values[0] = mtface->uv[0][0]; - values[1] = mtface->uv[0][1]; -} - -static void rna_MeshTextureFace_uv1_set(PointerRNA *ptr, const float *values) -{ - MTFace *mtface = (MTFace *)ptr->data; - - mtface->uv[0][0] = values[0]; - mtface->uv[0][1] = values[1]; -} - -static void rna_MeshTextureFace_uv2_get(PointerRNA *ptr, float *values) -{ - MTFace *mtface = (MTFace *)ptr->data; - - values[0] = mtface->uv[1][0]; - values[1] = mtface->uv[1][1]; -} - -static void rna_MeshTextureFace_uv2_set(PointerRNA *ptr, const float *values) -{ - MTFace *mtface = (MTFace *)ptr->data; - - mtface->uv[1][0] = values[0]; - mtface->uv[1][1] = values[1]; -} - -static void rna_MeshTextureFace_uv3_get(PointerRNA *ptr, float *values) -{ - MTFace *mtface = (MTFace *)ptr->data; - - values[0] = mtface->uv[2][0]; - values[1] = mtface->uv[2][1]; -} - -static void rna_MeshTextureFace_uv3_set(PointerRNA *ptr, const float *values) -{ - MTFace *mtface = (MTFace *)ptr->data; - - mtface->uv[2][0] = values[0]; - mtface->uv[2][1] = values[1]; -} - -static void rna_MeshTextureFace_uv4_get(PointerRNA *ptr, float *values) -{ - MTFace *mtface = (MTFace *)ptr->data; - - values[0] = mtface->uv[3][0]; - values[1] = mtface->uv[3][1]; -} + MLoopTri *lt = (MLoopTri *)ptr->data; + unsigned int v1 = me->mloop[lt->tri[0]].v; + unsigned int v2 = me->mloop[lt->tri[1]].v; + unsigned int v3 = me->mloop[lt->tri[2]].v; -static void rna_MeshTextureFace_uv4_set(PointerRNA *ptr, const float *values) -{ - MTFace *mtface = (MTFace *)ptr->data; - - mtface->uv[3][0] = values[0]; - mtface->uv[3][1] = values[1]; + normal_tri_v3(values, me->mvert[v1].co, me->mvert[v2].co, me->mvert[v3].co); } -static int rna_CustomDataData_numverts(PointerRNA *ptr, int type) +static void rna_MeshLoopTriangle_split_normals_get(PointerRNA *ptr, float *values) { Mesh *me = rna_mesh(ptr); - CustomData *fdata = rna_mesh_fdata(ptr); - CustomDataLayer *cdl; - int a, b; + const float (*lnors)[3] = CustomData_get_layer(&me->ldata, CD_NORMAL); - for (cdl = fdata->layers, a = 0; a < fdata->totlayer; cdl++, a++) { - if (cdl->type == type) { - b = ((char *)ptr->data - ((char *)cdl->data)) / CustomData_sizeof(type); - if (b >= 0 && b < me->totface) { - return (me->mface[b].v4 ? 4 : 3); - } - } + if (!lnors) { + zero_v3(values + 0); + zero_v3(values + 3); + zero_v3(values + 6); + } + else { + MLoopTri *lt = (MLoopTri *)ptr->data; + copy_v3_v3(values + 0, lnors[lt->tri[0]]); + copy_v3_v3(values + 3, lnors[lt->tri[1]]); + copy_v3_v3(values + 6, lnors[lt->tri[2]]); } - - return 0; -} - -static int rna_MeshTextureFace_uv_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION]) -{ - length[0] = rna_CustomDataData_numverts(ptr, CD_MTFACE); - length[1] = 2; - return length[0] * length[1]; -} - -static void rna_MeshTextureFace_uv_get(PointerRNA *ptr, float *values) -{ - MTFace *mtface = (MTFace *)ptr->data; - int totvert = rna_CustomDataData_numverts(ptr, CD_MTFACE); - - memcpy(values, mtface->uv, totvert * 2 * sizeof(float)); -} - -static void rna_MeshTextureFace_uv_set(PointerRNA *ptr, const float *values) -{ - MTFace *mtface = (MTFace *)ptr->data; - int totvert = rna_CustomDataData_numverts(ptr, CD_MTFACE); - - memcpy(mtface->uv, values, totvert * 2 * sizeof(float)); -} - -/* notice red and blue are swapped */ -static void rna_MeshColor_color1_get(PointerRNA *ptr, float *values) -{ - MCol *mcol = (MCol *)ptr->data; - - values[3] = mcol[0].a / 255.0f; - values[2] = mcol[0].r / 255.0f; - values[1] = mcol[0].g / 255.0f; - values[0] = mcol[0].b / 255.0f; -} - -static void rna_MeshColor_color1_set(PointerRNA *ptr, const float *values) -{ - MCol *mcol = (MCol *)ptr->data; - - mcol[0].a = round_fl_to_uchar_clamp(values[3] * 255.0f); - mcol[0].r = round_fl_to_uchar_clamp(values[2] * 255.0f); - mcol[0].g = round_fl_to_uchar_clamp(values[1] * 255.0f); - mcol[0].b = round_fl_to_uchar_clamp(values[0] * 255.0f); -} - -static void rna_MeshColor_color2_get(PointerRNA *ptr, float *values) -{ - MCol *mcol = (MCol *)ptr->data; - - values[3] = mcol[1].a / 255.0f; - values[2] = mcol[1].r / 255.0f; - values[1] = mcol[1].g / 255.0f; - values[0] = mcol[1].b / 255.0f; -} - -static void rna_MeshColor_color2_set(PointerRNA *ptr, const float *values) -{ - MCol *mcol = (MCol *)ptr->data; - - mcol[1].a = round_fl_to_uchar_clamp(values[3] * 255.0f); - mcol[1].r = round_fl_to_uchar_clamp(values[2] * 255.0f); - mcol[1].g = round_fl_to_uchar_clamp(values[1] * 255.0f); - mcol[1].b = round_fl_to_uchar_clamp(values[0] * 255.0f); -} - -static void rna_MeshColor_color3_get(PointerRNA *ptr, float *values) -{ - MCol *mcol = (MCol *)ptr->data; - - values[3] = mcol[2].a / 255.0f; - values[2] = mcol[2].r / 255.0f; - values[1] = mcol[2].g / 255.0f; - values[0] = mcol[2].b / 255.0f; -} - -static void rna_MeshColor_color3_set(PointerRNA *ptr, const float *values) -{ - MCol *mcol = (MCol *)ptr->data; - - mcol[2].a = round_fl_to_uchar_clamp(values[3] * 255.0f); - mcol[2].r = round_fl_to_uchar_clamp(values[2] * 255.0f); - mcol[2].g = round_fl_to_uchar_clamp(values[1] * 255.0f); - mcol[2].b = round_fl_to_uchar_clamp(values[0] * 255.0f); -} - -static void rna_MeshColor_color4_get(PointerRNA *ptr, float *values) -{ - MCol *mcol = (MCol *)ptr->data; - - values[3] = mcol[3].a / 255.0f; - values[2] = mcol[3].r / 255.0f; - values[1] = mcol[3].g / 255.0f; - values[0] = mcol[3].b / 255.0f; } -static void rna_MeshColor_color4_set(PointerRNA *ptr, const float *values) +static float rna_MeshLoopTriangle_area_get(PointerRNA *ptr) { - MCol *mcol = (MCol *)ptr->data; + Mesh *me = rna_mesh(ptr); + MLoopTri *lt = (MLoopTri *)ptr->data; + unsigned int v1 = me->mloop[lt->tri[0]].v; + unsigned int v2 = me->mloop[lt->tri[1]].v; + unsigned int v3 = me->mloop[lt->tri[2]].v; - mcol[3].a = round_fl_to_uchar_clamp(values[3] * 255.0f); - mcol[3].r = round_fl_to_uchar_clamp(values[2] * 255.0f); - mcol[3].g = round_fl_to_uchar_clamp(values[1] * 255.0f); - mcol[3].b = round_fl_to_uchar_clamp(values[0] * 255.0f); + return area_tri_v3(me->mvert[v1].co, me->mvert[v2].co, me->mvert[v3].co); } static void rna_MeshLoopColor_color_get(PointerRNA *ptr, float *values) @@ -902,93 +716,8 @@ static void rna_MeshUVLoopLayer_clone_set(PointerRNA *ptr, bool value) rna_CustomDataLayer_clone_set(ptr, rna_mesh_ldata(ptr), value, CD_MLOOPUV); } -/* face uv_textures */ - -DEFINE_CUSTOMDATA_LAYER_COLLECTION(tessface_uv_texture, fdata, CD_MTFACE) -DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(tessface_uv_texture, fdata, CD_MTFACE, active, MeshTextureFaceLayer) - -static void rna_MeshTextureFaceLayer_data_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) -{ - Mesh *me = rna_mesh(ptr); - CustomDataLayer *layer = (CustomDataLayer *)ptr->data; - rna_iterator_array_begin(iter, layer->data, sizeof(MTFace), (me->edit_btmesh) ? 0 : me->totface, 0, NULL); -} - -static int rna_MeshTextureFaceLayer_data_length(PointerRNA *ptr) -{ - Mesh *me = rna_mesh(ptr); - return (me->edit_btmesh) ? 0 : me->totface; -} - -static bool rna_MeshTextureFaceLayer_active_render_get(PointerRNA *ptr) -{ - return rna_CustomDataLayer_active_get(ptr, rna_mesh_fdata(ptr), CD_MTFACE, 1); -} - -static bool rna_MeshTextureFaceLayer_active_get(PointerRNA *ptr) -{ - return rna_CustomDataLayer_active_get(ptr, rna_mesh_fdata(ptr), CD_MTFACE, 0); -} - -static bool rna_MeshTextureFaceLayer_clone_get(PointerRNA *ptr) -{ - return rna_CustomDataLayer_clone_get(ptr, rna_mesh_fdata(ptr), CD_MTFACE); -} - -static void rna_MeshTextureFaceLayer_active_render_set(PointerRNA *ptr, bool value) -{ - rna_CustomDataLayer_active_set(ptr, rna_mesh_fdata(ptr), value, CD_MTFACE, 1); -} - -static void rna_MeshTextureFaceLayer_active_set(PointerRNA *ptr, int value) -{ - rna_CustomDataLayer_active_set(ptr, rna_mesh_fdata(ptr), value, CD_MTFACE, 0); -} - -static void rna_MeshTextureFaceLayer_clone_set(PointerRNA *ptr, int value) -{ - rna_CustomDataLayer_clone_set(ptr, rna_mesh_fdata(ptr), value, CD_MTFACE); -} - /* vertex_color_layers */ -DEFINE_CUSTOMDATA_LAYER_COLLECTION(tessface_vertex_color, fdata, CD_MCOL) -DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(tessface_vertex_color, fdata, CD_MCOL, active, MeshColorLayer) -DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(tessface_vertex_color, fdata, CD_MCOL, render, MeshColorLayer) - -static void rna_MeshColorLayer_data_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) -{ - Mesh *me = rna_mesh(ptr); - CustomDataLayer *layer = (CustomDataLayer *)ptr->data; - rna_iterator_array_begin(iter, layer->data, sizeof(MCol) * 4, me->totface, 0, NULL); -} - -static int rna_MeshColorLayer_data_length(PointerRNA *ptr) -{ - Mesh *me = rna_mesh(ptr); - return me->totface; -} - -static bool rna_MeshColorLayer_active_render_get(PointerRNA *ptr) -{ - return rna_CustomDataLayer_active_get(ptr, rna_mesh_fdata(ptr), CD_MCOL, 1); -} - -static bool rna_MeshColorLayer_active_get(PointerRNA *ptr) -{ - return rna_CustomDataLayer_active_get(ptr, rna_mesh_fdata(ptr), CD_MCOL, 0); -} - -static void rna_MeshColorLayer_active_render_set(PointerRNA *ptr, bool value) -{ - rna_CustomDataLayer_active_set(ptr, rna_mesh_fdata(ptr), value, CD_MCOL, 1); -} - -static void rna_MeshColorLayer_active_set(PointerRNA *ptr, int value) -{ - rna_CustomDataLayer_active_set(ptr, rna_mesh_fdata(ptr), value, CD_MCOL, 0); -} - DEFINE_CUSTOMDATA_LAYER_COLLECTION(vertex_color, ldata, CD_MLOOPCOL) DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(vertex_color, ldata, CD_MLOOPCOL, active, MeshLoopColorLayer) DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(vertex_color, ldata, CD_MLOOPCOL, render, MeshLoopColorLayer) @@ -1242,30 +971,6 @@ static void rna_Mesh_face_map_remove(struct Mesh *me, ReportList *reports, struc /* End face maps */ -static int rna_MeshTessFace_verts_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION]) -{ - MFace *face = (MFace *)ptr->data; - - if (face) - length[0] = (face->v4) ? 4 : 3; - else - length[0] = 4; /* XXX rna_raw_access wants the length of a dummy face. this needs fixing. - Campbell */ - - return length[0]; -} - -static void rna_MeshTessFace_verts_get(PointerRNA *ptr, int *values) -{ - MFace *face = (MFace *)ptr->data; - memcpy(values, &face->v1, (face->v4 ? 4 : 3) * sizeof(int)); -} - -static void rna_MeshTessFace_verts_set(PointerRNA *ptr, const int *values) -{ - MFace *face = (MFace *)ptr->data; - memcpy(&face->v1, values, (face->v4 ? 4 : 3) * sizeof(int)); -} - /* poly.vertices - this is faked loop access for convenience */ static int rna_MeshPoly_vertices_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION]) { @@ -1320,11 +1025,25 @@ static int rna_MeshEdge_index_get(PointerRNA *ptr) return (int)(edge - me->medge); } -static int rna_MeshTessFace_index_get(PointerRNA *ptr) +static int rna_MeshLoopTriangle_index_get(PointerRNA *ptr) +{ + Mesh *me = rna_mesh(ptr); + MLoopTri *ltri = (MLoopTri *)ptr->data; + return (int)(ltri - me->runtime.looptris.array); +} + +static int rna_MeshLoopTriangle_material_index_get(PointerRNA *ptr) +{ + Mesh *me = rna_mesh(ptr); + MLoopTri *ltri = (MLoopTri *)ptr->data; + return me->mpoly[ltri->poly].mat_nr; +} + +static bool rna_MeshLoopTriangle_use_smooth_get(PointerRNA *ptr) { Mesh *me = rna_mesh(ptr); - MFace *face = (MFace *)ptr->data; - return (int)(face - me->mface); + MLoopTri *ltri = (MLoopTri *)ptr->data; + return me->mpoly[ltri->poly].flag & ME_SMOOTH; } static int rna_MeshPolygon_index_get(PointerRNA *ptr) @@ -1363,9 +1082,9 @@ static char *rna_MeshPolygon_path(PointerRNA *ptr) return BLI_sprintfN("polygons[%d]", (int)((MPoly *)ptr->data - rna_mesh(ptr)->mpoly)); } -static char *rna_MeshTessFace_path(PointerRNA *ptr) +static char *rna_MeshLoopTriangle_path(PointerRNA *ptr) { - return BLI_sprintfN("tessfaces[%d]", (int)((MFace *)ptr->data - rna_mesh(ptr)->mface)); + return BLI_sprintfN("loop_triangles[%d]", (int)((MLoopTri *)ptr->data - rna_mesh(ptr)->runtime.looptris.array)); } static char *rna_MeshEdge_path(PointerRNA *ptr) @@ -1384,14 +1103,6 @@ static char *rna_MeshVertex_path(PointerRNA *ptr) return BLI_sprintfN("vertices[%d]", (int)((MVert *)ptr->data - rna_mesh(ptr)->mvert)); } -static char *rna_MeshTextureFaceLayer_path(PointerRNA *ptr) -{ - CustomDataLayer *cdl = ptr->data; - char name_esc[sizeof(cdl->name) * 2]; - BLI_strescape(name_esc, cdl->name, sizeof(name_esc)); - return BLI_sprintfN("tessface_uv_textures[\"%s\"]", name_esc); -} - static char *rna_VertCustomData_data_path(PointerRNA *ptr, const char *collection, int type) { CustomDataLayer *cdl; @@ -1455,46 +1166,11 @@ static char *rna_LoopCustomData_data_path(PointerRNA *ptr, const char *collectio return NULL; } -static char *rna_FaceCustomData_data_path(PointerRNA *ptr, const char *collection, int type) -{ - CustomDataLayer *cdl; - Mesh *me = rna_mesh(ptr); - CustomData *fdata = rna_mesh_fdata(ptr); - int a, b, totloop = (me->edit_btmesh) ? 0 : me->totloop; - - for (cdl = fdata->layers, a = 0; a < fdata->totlayer; cdl++, a++) { - if (cdl->type == type) { - b = ((char *)ptr->data - ((char *)cdl->data)) / CustomData_sizeof(type); - if (b >= 0 && b < totloop) { - char name_esc[sizeof(cdl->name) * 2]; - BLI_strescape(name_esc, cdl->name, sizeof(name_esc)); - return BLI_sprintfN("%s[\"%s\"].data[%d]", collection, name_esc, b); - } - } - } - - return NULL; -} - - static char *rna_MeshUVLoop_path(PointerRNA *ptr) { return rna_LoopCustomData_data_path(ptr, "uv_layers", CD_MLOOPUV); } -static char *rna_MeshTextureFace_path(PointerRNA *ptr) -{ - return rna_FaceCustomData_data_path(ptr, "tessface_uv_textures", CD_MTFACE); -} - -static char *rna_MeshColorLayer_path(PointerRNA *ptr) -{ - CustomDataLayer *cdl = ptr->data; - char name_esc[sizeof(cdl->name) * 2]; - BLI_strescape(name_esc, cdl->name, sizeof(name_esc)); - return BLI_sprintfN("tessface_vertex_colors[\"%s\"]", name_esc); -} - static char *rna_MeshLoopColorLayer_path(PointerRNA *ptr) { CustomDataLayer *cdl = ptr->data; @@ -1721,34 +1397,6 @@ static void rna_Mesh_vertex_color_remove(struct Mesh *me, ReportList *reports, C } } -static PointerRNA rna_Mesh_tessface_vertex_color_new(struct Mesh *me, ReportList *reports, const char *name) -{ - PointerRNA ptr; - CustomData *fdata; - CustomDataLayer *cdl = NULL; - int index; - - if (me->edit_btmesh) { - BKE_report(reports, RPT_ERROR, "Cannot add tessface colors in edit mode"); - return PointerRNA_NULL; - } - - if (me->mpoly) { - BKE_report(reports, RPT_ERROR, "Cannot add tessface colors when MPoly's exist"); - return PointerRNA_NULL; - } - - index = ED_mesh_color_add(me, name, false); - - if (index != -1) { - fdata = rna_mesh_fdata_helper(me); - cdl = &fdata->layers[CustomData_get_layer_index_n(fdata, CD_MCOL, index)]; - } - - RNA_pointer_create(&me->id, &RNA_MeshColorLayer, cdl, &ptr); - return ptr; -} - #define DEFINE_CUSTOMDATA_PROPERTY_API(elemname, datatype, cd_prop_type, cdata, countvar, layertype) \ static PointerRNA rna_Mesh_##elemname##_##datatype##_property_new(struct Mesh *me, const char *name) \ { \ @@ -1796,38 +1444,6 @@ static void rna_Mesh_uv_layers_remove(struct Mesh *me, ReportList *reports, Cust } } -/* while this is supposed to be readonly, - * keep it to support importers that only make tessfaces */ - -static PointerRNA rna_Mesh_tessface_uv_texture_new(struct Mesh *me, ReportList *reports, const char *name) -{ - PointerRNA ptr; - CustomData *fdata; - CustomDataLayer *cdl = NULL; - int index; - - if (me->edit_btmesh) { - BKE_report(reports, RPT_ERROR, "Cannot add tessface uv's in edit mode"); - return PointerRNA_NULL; - } - - if (me->mpoly) { - BKE_report(reports, RPT_ERROR, "Cannot add tessface uv's when MPoly's exist"); - return PointerRNA_NULL; - } - - index = ED_mesh_uv_texture_add(me, name, false); - - if (index != -1) { - fdata = rna_mesh_fdata_helper(me); - cdl = &fdata->layers[CustomData_get_layer_index_n(fdata, CD_MTFACE, index)]; - } - - RNA_pointer_create(&me->id, &RNA_MeshTextureFaceLayer, cdl, &ptr); - return ptr; -} - - static bool rna_Mesh_is_editmode_get(PointerRNA *ptr) { Mesh *me = rna_mesh(ptr); @@ -1840,14 +1456,6 @@ static void UNUSED_FUNCTION(rna_mesh_unused)(void) /* unused functions made by macros */ (void)rna_Mesh_skin_vertice_index_range; (void)rna_Mesh_vertex_paint_mask_index_range; - (void)rna_Mesh_tessface_uv_texture_active_set; - (void)rna_Mesh_tessface_uv_texture_index_range; - (void)rna_Mesh_tessface_vertex_color_active_set; - (void)rna_Mesh_tessface_vertex_color_index_range; - (void)rna_Mesh_tessface_vertex_color_render_get; - (void)rna_Mesh_tessface_vertex_color_render_index_get; - (void)rna_Mesh_tessface_vertex_color_render_index_set; - (void)rna_Mesh_tessface_vertex_color_render_set; (void)rna_Mesh_uv_layer_render_get; (void)rna_Mesh_uv_layer_render_index_get; (void)rna_Mesh_uv_layer_render_index_set; @@ -2009,83 +1617,70 @@ static void rna_def_medge(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Index", "Index of this edge"); } -static void rna_def_mface(BlenderRNA *brna) +static void rna_def_mlooptri(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; - const int splitnor_dim[] = {4, 3}; + const int splitnor_dim[] = {3, 3}; - srna = RNA_def_struct(brna, "MeshTessFace", NULL); - RNA_def_struct_sdna(srna, "MFace"); - RNA_def_struct_ui_text(srna, "Mesh TessFace", "TessFace in a Mesh data-block"); - RNA_def_struct_path_func(srna, "rna_MeshTessFace_path"); + srna = RNA_def_struct(brna, "MeshLoopTriangle", NULL); + RNA_def_struct_sdna(srna, "MLoopTri"); + RNA_def_struct_ui_text(srna, "Mesh Loop Triangle", "Tessellated triangle in a Mesh data-block"); + RNA_def_struct_path_func(srna, "rna_MeshLoopTriangle_path"); RNA_def_struct_ui_icon(srna, ICON_FACESEL); - /* XXX allows creating invalid meshes */ prop = RNA_def_property(srna, "vertices", PROP_INT, PROP_UNSIGNED); - RNA_def_property_array(prop, 4); - RNA_def_property_flag(prop, PROP_DYNAMIC); - RNA_def_property_dynamic_array_funcs(prop, "rna_MeshTessFace_verts_get_length"); - RNA_def_property_int_funcs(prop, "rna_MeshTessFace_verts_get", "rna_MeshTessFace_verts_set", NULL); - RNA_def_property_ui_text(prop, "Vertices", "Vertex indices"); - - /* leaving this fixed size array for foreach_set used in import scripts */ - prop = RNA_def_property(srna, "vertices_raw", PROP_INT, PROP_UNSIGNED); - RNA_def_property_int_sdna(prop, NULL, "v1"); - RNA_def_property_array(prop, 4); - RNA_def_property_ui_text(prop, "Vertices", "Fixed size vertex indices array"); - - prop = RNA_def_property(srna, "material_index", PROP_INT, PROP_UNSIGNED); - RNA_def_property_int_sdna(prop, NULL, "mat_nr"); - RNA_def_property_ui_text(prop, "Material Index", ""); -#if 0 - RNA_def_property_int_funcs(prop, NULL, NULL, "rna_MeshPoly_material_index_range"); /* reuse for tessface is ok */ -#endif - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); - - prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_FACE_SEL); - RNA_def_property_ui_text(prop, "Select", ""); - RNA_def_property_update(prop, 0, "rna_Mesh_update_select"); + RNA_def_property_array(prop, 3); + RNA_def_property_int_funcs(prop, "rna_MeshLoopTriangle_verts_get", NULL, NULL); + RNA_def_property_ui_text(prop, "Vertices", "Indices of triangle vertices"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); - prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_HIDE); - RNA_def_property_ui_text(prop, "Hide", ""); - RNA_def_property_update(prop, 0, "rna_Mesh_update_select"); + prop = RNA_def_property(srna, "loops", PROP_INT, PROP_UNSIGNED); + RNA_def_property_int_sdna(prop, NULL, "tri"); + RNA_def_property_ui_text(prop, "Loops", "Indices of mesh loops that make up the triangle"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); - prop = RNA_def_property(srna, "use_smooth", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_SMOOTH); - RNA_def_property_ui_text(prop, "Smooth", ""); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); + prop = RNA_def_property(srna, "polygon_index", PROP_INT, PROP_UNSIGNED); + RNA_def_property_int_sdna(prop, NULL, "poly"); + RNA_def_property_ui_text(prop, "Polygon", "Index of mesh polygon that the triangle is a part of"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); prop = RNA_def_property(srna, "normal", PROP_FLOAT, PROP_DIRECTION); RNA_def_property_array(prop, 3); RNA_def_property_range(prop, -1.0f, 1.0f); RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_float_funcs(prop, "rna_MeshTessFace_normal_get", NULL, NULL); - RNA_def_property_ui_text(prop, "Face Normal", "Local space unit length normal vector for this face"); + RNA_def_property_float_funcs(prop, "rna_MeshLoopTriangle_normal_get", NULL, NULL); + RNA_def_property_ui_text(prop, "Triangle Normal", "Local space unit length normal vector for this triangle"); prop = RNA_def_property(srna, "split_normals", PROP_FLOAT, PROP_DIRECTION); RNA_def_property_multi_array(prop, 2, splitnor_dim); RNA_def_property_range(prop, -1.0f, 1.0f); RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_float_funcs(prop, "rna_MeshTessFace_split_normals_get", NULL, NULL); + RNA_def_property_float_funcs(prop, "rna_MeshLoopTriangle_split_normals_get", NULL, NULL); RNA_def_property_ui_text(prop, "Split Normals", - "Local space unit length split normals vectors of the vertices of this face " - "(must be computed beforehand using calc_normals_split or calc_tangents, " - "and then calc_tessface)"); + "Local space unit length split normals vectors of the vertices of this triangle " + "(must be computed beforehand using calc_normals_split or calc_tangents)"); prop = RNA_def_property(srna, "area", PROP_FLOAT, PROP_UNSIGNED); RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_float_funcs(prop, "rna_MeshTessFace_area_get", NULL, NULL); - RNA_def_property_ui_text(prop, "Face Area", "Read only area of this face"); + RNA_def_property_float_funcs(prop, "rna_MeshLoopTriangle_area_get", NULL, NULL); + RNA_def_property_ui_text(prop, "Triangle Area", "Area of this triangle"); prop = RNA_def_property(srna, "index", PROP_INT, PROP_UNSIGNED); RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_int_funcs(prop, "rna_MeshTessFace_index_get", NULL, NULL); - RNA_def_property_ui_text(prop, "Index", "Index of this face"); -} + RNA_def_property_int_funcs(prop, "rna_MeshLoopTriangle_index_get", NULL, NULL); + RNA_def_property_ui_text(prop, "Index", "Index of this loop triangle"); + prop = RNA_def_property(srna, "material_index", PROP_INT, PROP_UNSIGNED); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_int_funcs(prop, "rna_MeshLoopTriangle_material_index_get", NULL, NULL); + RNA_def_property_ui_text(prop, "Material Index", ""); + + prop = RNA_def_property(srna, "use_smooth", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_boolean_funcs(prop, "rna_MeshLoopTriangle_use_smooth_get", NULL); + RNA_def_property_ui_text(prop, "Smooth", ""); +} static void rna_def_mloop(BlenderRNA *brna) { @@ -2295,179 +1890,6 @@ static void rna_def_mloopuv(BlenderRNA *brna) RNA_def_property_ui_text(prop, "UV Edge Select", ""); } -static void rna_def_mtface(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - const int uv_dim[] = {4, 2}; - - srna = RNA_def_struct(brna, "MeshTextureFaceLayer", NULL); - RNA_def_struct_ui_text(srna, "Mesh UV Map", "UV map with assigned image textures in a Mesh data-block"); - RNA_def_struct_sdna(srna, "CustomDataLayer"); - RNA_def_struct_path_func(srna, "rna_MeshTextureFaceLayer_path"); - RNA_def_struct_ui_icon(srna, ICON_GROUP_UVS); - - prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); - RNA_def_struct_name_property(srna, prop); - RNA_def_property_string_funcs(prop, NULL, NULL, "rna_MeshUVLayer_name_set"); - RNA_def_property_ui_text(prop, "Name", "Name of UV map"); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); - - prop = RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_funcs(prop, "rna_MeshTextureFaceLayer_active_get", "rna_MeshTextureFaceLayer_active_set"); - RNA_def_property_ui_text(prop, "Active", "Set the map as active for display and editing"); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); - - prop = RNA_def_property(srna, "active_render", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "active_rnd", 0); - RNA_def_property_boolean_funcs(prop, "rna_MeshTextureFaceLayer_active_render_get", - "rna_MeshTextureFaceLayer_active_render_set"); - RNA_def_property_ui_text(prop, "Active Render", "Set the map as active for rendering"); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); - - prop = RNA_def_property(srna, "active_clone", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "active_clone", 0); - RNA_def_property_boolean_funcs(prop, "rna_MeshTextureFaceLayer_clone_get", "rna_MeshTextureFaceLayer_clone_set"); - RNA_def_property_ui_text(prop, "Active Clone", "Set the map as active for cloning"); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); - - prop = RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE); - RNA_def_property_struct_type(prop, "MeshTextureFace"); - RNA_def_property_ui_text(prop, "Data", ""); - RNA_def_property_collection_funcs(prop, "rna_MeshTextureFaceLayer_data_begin", "rna_iterator_array_next", - "rna_iterator_array_end", "rna_iterator_array_get", - "rna_MeshTextureFaceLayer_data_length", NULL, NULL, NULL); - - srna = RNA_def_struct(brna, "MeshTextureFace", NULL); - RNA_def_struct_sdna(srna, "MTFace"); - RNA_def_struct_ui_text(srna, "Mesh UV Map Face", "UV map and image texture for a face"); - RNA_def_struct_path_func(srna, "rna_MeshTextureFace_path"); - RNA_def_struct_ui_icon(srna, ICON_FACESEL_HLT); - - /* these are for editing only, access at loops now */ -#if 0 - prop = RNA_def_property(srna, "select_uv", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", TF_SEL1); - RNA_def_property_array(prop, 4); - RNA_def_property_ui_text(prop, "UV Selected", ""); - RNA_def_property_update(prop, 0, "rna_Mesh_update_select"); - - prop = RNA_def_property(srna, "pin_uv", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "unwrap", TF_PIN1); - RNA_def_property_array(prop, 4); - RNA_def_property_ui_text(prop, "UV Pinned", ""); - RNA_def_property_update(prop, 0, "rna_Mesh_update_select"); -#endif - - prop = RNA_def_property(srna, "uv1", PROP_FLOAT, PROP_XYZ); - RNA_def_property_array(prop, 2); - RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv1_get", "rna_MeshTextureFace_uv1_set", NULL); - RNA_def_property_ui_text(prop, "UV 1", ""); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); - - prop = RNA_def_property(srna, "uv2", PROP_FLOAT, PROP_XYZ); - RNA_def_property_array(prop, 2); - RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv2_get", "rna_MeshTextureFace_uv2_set", NULL); - RNA_def_property_ui_text(prop, "UV 2", ""); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); - - prop = RNA_def_property(srna, "uv3", PROP_FLOAT, PROP_XYZ); - RNA_def_property_array(prop, 2); - RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv3_get", "rna_MeshTextureFace_uv3_set", NULL); - RNA_def_property_ui_text(prop, "UV 3", ""); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); - - prop = RNA_def_property(srna, "uv4", PROP_FLOAT, PROP_XYZ); - RNA_def_property_array(prop, 2); - RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv4_get", "rna_MeshTextureFace_uv4_set", NULL); - RNA_def_property_ui_text(prop, "UV 4", ""); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); - - prop = RNA_def_property(srna, "uv", PROP_FLOAT, PROP_NONE); - RNA_def_property_multi_array(prop, 2, uv_dim); - RNA_def_property_flag(prop, PROP_DYNAMIC); - RNA_def_property_dynamic_array_funcs(prop, "rna_MeshTextureFace_uv_get_length"); - RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv_get", "rna_MeshTextureFace_uv_set", NULL); - RNA_def_property_ui_text(prop, "UV", ""); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); - - prop = RNA_def_property(srna, "uv_raw", PROP_FLOAT, PROP_NONE); - RNA_def_property_multi_array(prop, 2, uv_dim); - RNA_def_property_float_sdna(prop, NULL, "uv"); - RNA_def_property_ui_text(prop, "UV Raw", "Fixed size UV coordinates array"); - -} - -static void rna_def_mcol(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - srna = RNA_def_struct(brna, "MeshColorLayer", NULL); - RNA_def_struct_ui_text(srna, "Mesh Vertex Color Layer", "Layer of vertex colors in a Mesh data-block"); - RNA_def_struct_sdna(srna, "CustomDataLayer"); - RNA_def_struct_path_func(srna, "rna_MeshColorLayer_path"); - RNA_def_struct_ui_icon(srna, ICON_GROUP_VCOL); - - prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); - RNA_def_struct_name_property(srna, prop); - RNA_def_property_string_funcs(prop, NULL, NULL, NULL); - RNA_def_property_ui_text(prop, "Name", "Name of Vertex color layer"); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); - - prop = RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_funcs(prop, "rna_MeshColorLayer_active_get", "rna_MeshColorLayer_active_set"); - RNA_def_property_ui_text(prop, "Active", "Sets the layer as active for display and editing"); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); - - prop = RNA_def_property(srna, "active_render", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "active_rnd", 0); - RNA_def_property_boolean_funcs(prop, "rna_MeshColorLayer_active_render_get", - "rna_MeshColorLayer_active_render_set"); - RNA_def_property_ui_text(prop, "Active Render", "Sets the layer as active for rendering"); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); - - prop = RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE); - RNA_def_property_struct_type(prop, "MeshColor"); - RNA_def_property_ui_text(prop, "Data", ""); - RNA_def_property_collection_funcs(prop, "rna_MeshColorLayer_data_begin", "rna_iterator_array_next", - "rna_iterator_array_end", "rna_iterator_array_get", - "rna_MeshColorLayer_data_length", NULL, NULL, NULL); - - srna = RNA_def_struct(brna, "MeshColor", NULL); - RNA_def_struct_sdna(srna, "MCol"); - RNA_def_struct_ui_text(srna, "Mesh Vertex Color", "Vertex colors for a face in a Mesh"); - RNA_def_struct_path_func(srna, "rna_MeshColor_path"); - - prop = RNA_def_property(srna, "color1", PROP_FLOAT, PROP_COLOR); - RNA_def_property_array(prop, 4); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_float_funcs(prop, "rna_MeshColor_color1_get", "rna_MeshColor_color1_set", NULL); - RNA_def_property_ui_text(prop, "Color 1", ""); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); - - prop = RNA_def_property(srna, "color2", PROP_FLOAT, PROP_COLOR); - RNA_def_property_array(prop, 4); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_float_funcs(prop, "rna_MeshColor_color2_get", "rna_MeshColor_color2_set", NULL); - RNA_def_property_ui_text(prop, "Color 2", ""); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); - - prop = RNA_def_property(srna, "color3", PROP_FLOAT, PROP_COLOR); - RNA_def_property_array(prop, 4); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_float_funcs(prop, "rna_MeshColor_color3_get", "rna_MeshColor_color3_set", NULL); - RNA_def_property_ui_text(prop, "Color 3", ""); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); - - prop = RNA_def_property(srna, "color4", PROP_FLOAT, PROP_COLOR); - RNA_def_property_array(prop, 4); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_float_funcs(prop, "rna_MeshColor_color4_get", "rna_MeshColor_color4_set", NULL); - RNA_def_property_ui_text(prop, "Color 4", ""); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); -} - static void rna_def_mloopcol(BlenderRNA *brna) { StructRNA *srna; @@ -2723,33 +2145,15 @@ static void rna_def_mesh_edges(BlenderRNA *brna, PropertyRNA *cprop) #endif } -/* mesh.faces */ -static void rna_def_mesh_tessfaces(BlenderRNA *brna, PropertyRNA *cprop) +/* mesh.loop_triangles */ +static void rna_def_mesh_looptris(BlenderRNA *brna, PropertyRNA *cprop) { StructRNA *srna; - PropertyRNA *prop; - FunctionRNA *func; - PropertyRNA *parm; - - RNA_def_property_srna(cprop, "MeshTessFaces"); - srna = RNA_def_struct(brna, "MeshTessFaces", NULL); + RNA_def_property_srna(cprop, "MeshLoopTriangle"); + srna = RNA_def_struct(brna, "MeshLoopTriangles", NULL); RNA_def_struct_sdna(srna, "Mesh"); - RNA_def_struct_ui_text(srna, "Mesh Faces", "Collection of mesh faces"); - - prop = RNA_def_property(srna, "active", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "act_face"); - RNA_def_property_ui_text(prop, "Active Face", "The active face for this mesh"); - - func = RNA_def_function(srna, "add", "ED_mesh_tessfaces_add"); - RNA_def_function_flag(func, FUNC_USE_REPORTS); - parm = RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Number of faces to add", 0, INT_MAX); - RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); -#if 0 /* BMESH_TODO Remove until BMesh merge */ - func = RNA_def_function(srna, "remove", "ED_mesh_faces_remove"); - RNA_def_function_flag(func, FUNC_USE_REPORTS); - RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Number of faces to remove", 0, INT_MAX); -#endif + RNA_def_struct_ui_text(srna, "Mesh Loop Triangles", "Tessellation of mesh polygons into triangles"); } /* mesh.loops */ @@ -2799,43 +2203,6 @@ static void rna_def_mesh_polygons(BlenderRNA *brna, PropertyRNA *cprop) } -/* mesh.vertex_colors */ -static void rna_def_tessface_vertex_colors(BlenderRNA *brna, PropertyRNA *cprop) -{ - StructRNA *srna; - PropertyRNA *prop; - - FunctionRNA *func; - PropertyRNA *parm; - - RNA_def_property_srna(cprop, "VertexColors"); - srna = RNA_def_struct(brna, "VertexColors", NULL); - RNA_def_struct_sdna(srna, "Mesh"); - RNA_def_struct_ui_text(srna, "Vertex Colors", "Collection of vertex colors"); - - /* eventually deprecate this */ - func = RNA_def_function(srna, "new", "rna_Mesh_tessface_vertex_color_new"); - RNA_def_function_flag(func, FUNC_USE_REPORTS); - RNA_def_function_ui_description(func, "Add a vertex color layer to Mesh"); - RNA_def_string(func, "name", "Col", 0, "", "Vertex color name"); - parm = RNA_def_pointer(func, "layer", "MeshColorLayer", "", "The newly created layer"); - RNA_def_parameter_flags(parm, 0, PARM_RNAPTR); - RNA_def_function_return(func, parm); - - prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE); - RNA_def_property_struct_type(prop, "MeshColorLayer"); - RNA_def_property_pointer_funcs(prop, "rna_Mesh_tessface_vertex_color_active_get", - "rna_Mesh_tessface_vertex_color_active_set", NULL, NULL); - RNA_def_property_ui_text(prop, "Active Vertex Color Layer", "Active vertex color layer"); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); - - prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED); - RNA_def_property_int_funcs(prop, "rna_Mesh_tessface_vertex_color_active_index_get", - "rna_Mesh_tessface_vertex_color_active_index_set", "rna_Mesh_vertex_color_index_range"); - RNA_def_property_ui_text(prop, "Active Vertex Color Index", "Active vertex color index"); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); -} - static void rna_def_loop_colors(BlenderRNA *brna, PropertyRNA *cprop) { StructRNA *srna; @@ -3045,43 +2412,6 @@ static void rna_def_polygon_string_layers(BlenderRNA *brna, PropertyRNA *cprop) RNA_def_function_return(func, parm); } -/* mesh.tessface_uv_layers */ -static void rna_def_tessface_uv_textures(BlenderRNA *brna, PropertyRNA *cprop) -{ - StructRNA *srna; - PropertyRNA *prop; - - FunctionRNA *func; - PropertyRNA *parm; - - RNA_def_property_srna(cprop, "TessfaceUVTextures"); - srna = RNA_def_struct(brna, "TessfaceUVTextures", NULL); - RNA_def_struct_sdna(srna, "Mesh"); - RNA_def_struct_ui_text(srna, "UV Maps", "Collection of UV maps for tessellated faces"); - - /* eventually deprecate this */ - func = RNA_def_function(srna, "new", "rna_Mesh_tessface_uv_texture_new"); - RNA_def_function_flag(func, FUNC_USE_REPORTS); - RNA_def_function_ui_description(func, "Add a UV tessface-texture layer to Mesh (only for meshes with no polygons)"); - RNA_def_string(func, "name", "UVMap", 0, "", "UV map name"); - parm = RNA_def_pointer(func, "layer", "MeshTextureFaceLayer", "", "The newly created layer"); - RNA_def_parameter_flags(parm, 0, PARM_RNAPTR); - RNA_def_function_return(func, parm); - - prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE); - RNA_def_property_struct_type(prop, "MeshTextureFaceLayer"); - RNA_def_property_pointer_funcs(prop, "rna_Mesh_tessface_uv_texture_active_get", - "rna_Mesh_tessface_uv_texture_active_set", NULL, NULL); - RNA_def_property_ui_text(prop, "Active UV Map", "Active UV Map"); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); - - prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED); - RNA_def_property_int_funcs(prop, "rna_Mesh_tessface_uv_texture_active_index_get", - "rna_Mesh_tessface_uv_texture_active_index_set", "rna_Mesh_uv_layer_index_range"); - RNA_def_property_ui_text(prop, "Active UV Map Index", "Active UV Map index"); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); -} - static void rna_def_skin_vertices(BlenderRNA *brna, PropertyRNA *UNUSED(cprop)) { StructRNA *srna; @@ -3256,12 +2586,6 @@ static void rna_def_mesh(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Edges", "Edges of the mesh"); rna_def_mesh_edges(brna, prop); - prop = RNA_def_property(srna, "tessfaces", PROP_COLLECTION, PROP_NONE); - RNA_def_property_collection_sdna(prop, NULL, "mface", "totface"); - RNA_def_property_struct_type(prop, "MeshTessFace"); - RNA_def_property_ui_text(prop, "TessFaces", "Tessellated faces of the mesh (derived from polygons)"); - rna_def_mesh_tessfaces(brna, prop); - prop = RNA_def_property(srna, "loops", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "mloop", "totloop"); RNA_def_property_struct_type(prop, "MeshLoop"); @@ -3274,6 +2598,12 @@ static void rna_def_mesh(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Polygons", "Polygons of the mesh"); rna_def_mesh_polygons(brna, prop); + prop = RNA_def_property(srna, "loop_triangles", PROP_COLLECTION, PROP_NONE); + RNA_def_property_collection_sdna(prop, NULL, "runtime.looptris.array", "runtime.looptris.len"); + RNA_def_property_struct_type(prop, "MeshLoopTriangle"); + RNA_def_property_ui_text(prop, "Loop Triangles", "Tessellation of mesh polygons into triangles"); + rna_def_mesh_looptris(brna, prop); + /* TODO, should this be allowed to be its self? */ prop = RNA_def_property(srna, "texture_mesh", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "texcomesh"); @@ -3314,27 +2644,6 @@ static void rna_def_mesh(BlenderRNA *brna) "rna_Mesh_uv_layer_stencil_index_set", "rna_Mesh_uv_layer_index_range"); RNA_def_property_ui_text(prop, "Mask UV loop layer Index", "Mask UV loop layer index"); - /* Tessellated face UV maps - used by renderers */ - prop = RNA_def_property(srna, "tessface_uv_textures", PROP_COLLECTION, PROP_NONE); - RNA_def_property_collection_sdna(prop, NULL, "fdata.layers", "fdata.totlayer"); - RNA_def_property_collection_funcs(prop, "rna_Mesh_tessface_uv_textures_begin", NULL, NULL, NULL, - "rna_Mesh_tessface_uv_textures_length", NULL, NULL, NULL); - RNA_def_property_struct_type(prop, "MeshTextureFaceLayer"); - RNA_def_property_ui_text(prop, "Tessellated Face UV Maps", - "All UV maps for tessellated faces (read-only, for use by renderers)"); - rna_def_tessface_uv_textures(brna, prop); - - /* Tessellated face colors - used by renderers */ - - prop = RNA_def_property(srna, "tessface_vertex_colors", PROP_COLLECTION, PROP_NONE); - RNA_def_property_collection_sdna(prop, NULL, "fdata.layers", "fdata.totlayer"); - RNA_def_property_collection_funcs(prop, "rna_Mesh_tessface_vertex_colors_begin", NULL, NULL, NULL, - "rna_Mesh_tessface_vertex_colors_length", NULL, NULL, NULL); - RNA_def_property_struct_type(prop, "MeshColorLayer"); - RNA_def_property_ui_text(prop, "Tessellated Face Colors", - "All tessellated face colors (read-only, for use by renderers)"); - rna_def_tessface_vertex_colors(brna, prop); - /* Vertex colors */ prop = RNA_def_property(srna, "vertex_colors", PROP_COLLECTION, PROP_NONE); @@ -3570,12 +2879,10 @@ void RNA_def_mesh(BlenderRNA *brna) rna_def_mvert(brna); rna_def_mvert_group(brna); rna_def_medge(brna); - rna_def_mface(brna); + rna_def_mlooptri(brna); rna_def_mloop(brna); rna_def_mpolygon(brna); rna_def_mloopuv(brna); - rna_def_mtface(brna); - rna_def_mcol(brna); rna_def_mloopcol(brna); rna_def_mproperties(brna); rna_def_face_map(brna); diff --git a/source/blender/makesrna/intern/rna_mesh_api.c b/source/blender/makesrna/intern/rna_mesh_api.c index 7328686af7f..b1556edd4b7 100644 --- a/source/blender/makesrna/intern/rna_mesh_api.c +++ b/source/blender/makesrna/intern/rna_mesh_api.c @@ -50,6 +50,7 @@ #include "BKE_mesh.h" #include "BKE_mesh_tangent.h" #include "BKE_mesh_mapping.h" +#include "BKE_mesh_runtime.h" #include "ED_mesh.h" static const char *rna_Mesh_unit_test_compare(struct Mesh *mesh, struct Mesh *mesh2) @@ -101,9 +102,9 @@ static void rna_Mesh_free_tangents(Mesh *mesh) CustomData_free_layers(&mesh->ldata, CD_MLOOPTANGENT, mesh->totloop); } -static void rna_Mesh_calc_tessface(Mesh *mesh, bool free_mpoly) +static void rna_Mesh_calc_looptri(Mesh *mesh) { - ED_mesh_calc_tessface(mesh, free_mpoly != 0); + BKE_mesh_runtime_looptri_ensure(mesh); } static void rna_Mesh_calc_smooth_groups(Mesh *mesh, bool use_bitflags, int *r_poly_group_len, @@ -206,6 +207,7 @@ static void rna_Mesh_flip_normals(Mesh *mesh) BKE_mesh_polygons_flip(mesh->mpoly, mesh->mloop, &mesh->ldata, mesh->totpoly); BKE_mesh_tessface_clear(mesh); BKE_mesh_calc_normals(mesh); + BKE_mesh_runtime_clear_geometry(mesh); DEG_id_tag_update(&mesh->id, 0); } @@ -269,12 +271,8 @@ void RNA_api_mesh(StructRNA *srna) func = RNA_def_function(srna, "free_tangents", "rna_Mesh_free_tangents"); RNA_def_function_ui_description(func, "Free tangents"); - func = RNA_def_function(srna, "calc_tessface", "rna_Mesh_calc_tessface"); - RNA_def_function_ui_description(func, "Calculate face tessellation (supports editmode too)"); - RNA_def_boolean(func, "free_mpoly", 0, "Free MPoly", "Free data used by polygons and loops. " - "WARNING: This destructive operation removes regular faces, " - "only used on temporary mesh data-blocks to reduce memory footprint of render " - "engines and export scripts"); + func = RNA_def_function(srna, "calc_loop_triangles", "rna_Mesh_calc_looptri"); + RNA_def_function_ui_description(func, "Calculate loop triangle tessellation (supports editmode too)"); func = RNA_def_function(srna, "calc_smooth_groups", "rna_Mesh_calc_smooth_groups"); RNA_def_function_ui_description(func, "Calculate smooth groups from sharp edges"); @@ -308,7 +306,7 @@ void RNA_api_mesh(StructRNA *srna) func = RNA_def_function(srna, "update", "ED_mesh_update"); RNA_def_boolean(func, "calc_edges", 0, "Calculate Edges", "Force recalculation of edges"); - RNA_def_boolean(func, "calc_tessface", 0, "Calculate Tessellation", "Force recalculation of tessellation faces"); + RNA_def_boolean(func, "calc_loop_triangles", 0, "Calculate Triangules", "Force recalculation of triangle tessellation"); RNA_def_function_flag(func, FUNC_USE_CONTEXT); RNA_def_function(srna, "update_gpu_tag", "rna_Mesh_update_gpu_tag"); diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index bbb6eae8945..4f366fa36c4 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -64,63 +64,63 @@ const EnumPropertyItem rna_enum_object_modifier_type_items[] = { {0, "", 0, N_("Modify"), ""}, - {eModifierType_DataTransfer, "DATA_TRANSFER", ICON_MOD_DATA_TRANSFER, "Data Transfer", ""}, - {eModifierType_MeshCache, "MESH_CACHE", ICON_MOD_MESHDEFORM, "Mesh Cache", ""}, - {eModifierType_MeshSequenceCache, "MESH_SEQUENCE_CACHE", ICON_MOD_MESHDEFORM, "Mesh Sequence Cache", ""}, - {eModifierType_NormalEdit, "NORMAL_EDIT", ICON_MOD_NORMALEDIT, "Normal Edit", ""}, - {eModifierType_WeightedNormal, "WEIGHTED_NORMAL", ICON_MOD_NORMALEDIT, "Weighted Normal", ""}, - {eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""}, - {eModifierType_UVWarp, "UV_WARP", ICON_MOD_UVPROJECT, "UV Warp", ""}, - {eModifierType_WeightVGEdit, "VERTEX_WEIGHT_EDIT", ICON_MOD_VERTEX_WEIGHT, "Vertex Weight Edit", ""}, - {eModifierType_WeightVGMix, "VERTEX_WEIGHT_MIX", ICON_MOD_VERTEX_WEIGHT, "Vertex Weight Mix", ""}, - {eModifierType_WeightVGProximity, "VERTEX_WEIGHT_PROXIMITY", ICON_MOD_VERTEX_WEIGHT, + {eModifierType_DataTransfer, "DATA_TRANSFER", ICON_MODIFIER, "Data Transfer", ""}, + {eModifierType_MeshCache, "MESH_CACHE", ICON_MODIFIER, "Mesh Cache", ""}, + {eModifierType_MeshSequenceCache, "MESH_SEQUENCE_CACHE", ICON_MODIFIER, "Mesh Sequence Cache", ""}, + {eModifierType_NormalEdit, "NORMAL_EDIT", ICON_MODIFIER, "Normal Edit", ""}, + {eModifierType_WeightedNormal, "WEIGHTED_NORMAL", ICON_MODIFIER, "Weighted Normal", ""}, + {eModifierType_UVProject, "UV_PROJECT", ICON_MODIFIER, "UV Project", ""}, + {eModifierType_UVWarp, "UV_WARP", ICON_MODIFIER, "UV Warp", ""}, + {eModifierType_WeightVGEdit, "VERTEX_WEIGHT_EDIT", ICON_MODIFIER, "Vertex Weight Edit", ""}, + {eModifierType_WeightVGMix, "VERTEX_WEIGHT_MIX", ICON_MODIFIER, "Vertex Weight Mix", ""}, + {eModifierType_WeightVGProximity, "VERTEX_WEIGHT_PROXIMITY", ICON_MODIFIER, "Vertex Weight Proximity", ""}, {0, "", 0, N_("Generate"), ""}, - {eModifierType_Array, "ARRAY", ICON_MOD_ARRAY, "Array", ""}, - {eModifierType_Bevel, "BEVEL", ICON_MOD_BEVEL, "Bevel", ""}, - {eModifierType_Boolean, "BOOLEAN", ICON_MOD_BOOLEAN, "Boolean", ""}, - {eModifierType_Build, "BUILD", ICON_MOD_BUILD, "Build", ""}, - {eModifierType_Decimate, "DECIMATE", ICON_MOD_DECIM, "Decimate", ""}, - {eModifierType_EdgeSplit, "EDGE_SPLIT", ICON_MOD_EDGESPLIT, "Edge Split", ""}, - {eModifierType_Mask, "MASK", ICON_MOD_MASK, "Mask", ""}, - {eModifierType_Mirror, "MIRROR", ICON_MOD_MIRROR, "Mirror", ""}, - {eModifierType_Multires, "MULTIRES", ICON_MOD_MULTIRES, "Multiresolution", ""}, - {eModifierType_Remesh, "REMESH", ICON_MOD_REMESH, "Remesh", ""}, - {eModifierType_Screw, "SCREW", ICON_MOD_SCREW, "Screw", ""}, - {eModifierType_Skin, "SKIN", ICON_MOD_SKIN, "Skin", ""}, - {eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", ""}, - {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""}, - {eModifierType_Triangulate, "TRIANGULATE", ICON_MOD_TRIANGULATE, "Triangulate", ""}, - {eModifierType_Wireframe, "WIREFRAME", ICON_MOD_WIREFRAME, "Wireframe", "Generate a wireframe on the edges of a mesh"}, + {eModifierType_Array, "ARRAY", ICON_MODIFIER, "Array", ""}, + {eModifierType_Bevel, "BEVEL", ICON_MODIFIER, "Bevel", ""}, + {eModifierType_Boolean, "BOOLEAN", ICON_MODIFIER, "Boolean", ""}, + {eModifierType_Build, "BUILD", ICON_MODIFIER, "Build", ""}, + {eModifierType_Decimate, "DECIMATE", ICON_MODIFIER, "Decimate", ""}, + {eModifierType_EdgeSplit, "EDGE_SPLIT", ICON_MODIFIER, "Edge Split", ""}, + {eModifierType_Mask, "MASK", ICON_MODIFIER, "Mask", ""}, + {eModifierType_Mirror, "MIRROR", ICON_MODIFIER, "Mirror", ""}, + {eModifierType_Multires, "MULTIRES", ICON_MODIFIER, "Multiresolution", ""}, + {eModifierType_Remesh, "REMESH", ICON_MODIFIER, "Remesh", ""}, + {eModifierType_Screw, "SCREW", ICON_MODIFIER, "Screw", ""}, + {eModifierType_Skin, "SKIN", ICON_MODIFIER, "Skin", ""}, + {eModifierType_Solidify, "SOLIDIFY", ICON_MODIFIER, "Solidify", ""}, + {eModifierType_Subsurf, "SUBSURF", ICON_MODIFIER, "Subdivision Surface", ""}, + {eModifierType_Triangulate, "TRIANGULATE", ICON_MODIFIER, "Triangulate", ""}, + {eModifierType_Wireframe, "WIREFRAME", ICON_MODIFIER, "Wireframe", "Generate a wireframe on the edges of a mesh"}, {0, "", 0, N_("Deform"), ""}, - {eModifierType_Armature, "ARMATURE", ICON_MOD_ARMATURE, "Armature", ""}, - {eModifierType_Cast, "CAST", ICON_MOD_CAST, "Cast", ""}, - {eModifierType_CorrectiveSmooth, "CORRECTIVE_SMOOTH", ICON_MOD_SMOOTH, "Corrective Smooth", ""}, - {eModifierType_Curve, "CURVE", ICON_MOD_CURVE, "Curve", ""}, - {eModifierType_Displace, "DISPLACE", ICON_MOD_DISPLACE, "Displace", ""}, - {eModifierType_Hook, "HOOK", ICON_HOOK, "Hook", ""}, - {eModifierType_LaplacianSmooth, "LAPLACIANSMOOTH", ICON_MOD_SMOOTH, "Laplacian Smooth", ""}, - {eModifierType_LaplacianDeform, "LAPLACIANDEFORM", ICON_MOD_MESHDEFORM, "Laplacian Deform", ""}, - {eModifierType_Lattice, "LATTICE", ICON_MOD_LATTICE, "Lattice", ""}, - {eModifierType_MeshDeform, "MESH_DEFORM", ICON_MOD_MESHDEFORM, "Mesh Deform", ""}, - {eModifierType_Shrinkwrap, "SHRINKWRAP", ICON_MOD_SHRINKWRAP, "Shrinkwrap", ""}, - {eModifierType_SimpleDeform, "SIMPLE_DEFORM", ICON_MOD_SIMPLEDEFORM, "Simple Deform", ""}, - {eModifierType_Smooth, "SMOOTH", ICON_MOD_SMOOTH, "Smooth", ""}, - {eModifierType_SurfaceDeform, "SURFACE_DEFORM", ICON_MOD_MESHDEFORM, "Surface Deform", ""}, - {eModifierType_Warp, "WARP", ICON_MOD_WARP, "Warp", ""}, - {eModifierType_Wave, "WAVE", ICON_MOD_WAVE, "Wave", ""}, + {eModifierType_Armature, "ARMATURE", ICON_MODIFIER, "Armature", ""}, + {eModifierType_Cast, "CAST", ICON_MODIFIER, "Cast", ""}, + {eModifierType_Curve, "CURVE", ICON_MODIFIER, "Curve", ""}, + {eModifierType_Displace, "DISPLACE", ICON_MODIFIER, "Displace", ""}, + {eModifierType_Hook, "HOOK", ICON_MODIFIER, "Hook", ""}, + {eModifierType_LaplacianDeform, "LAPLACIANDEFORM", ICON_MODIFIER, "Laplacian Deform", ""}, + {eModifierType_Lattice, "LATTICE", ICON_MODIFIER, "Lattice", ""}, + {eModifierType_MeshDeform, "MESH_DEFORM", ICON_MODIFIER, "Mesh Deform", ""}, + {eModifierType_Shrinkwrap, "SHRINKWRAP", ICON_MODIFIER, "Shrinkwrap", ""}, + {eModifierType_SimpleDeform, "SIMPLE_DEFORM", ICON_MODIFIER, "Simple Deform", ""}, + {eModifierType_Smooth, "SMOOTH", ICON_MODIFIER, "Smooth", ""}, + {eModifierType_CorrectiveSmooth, "CORRECTIVE_SMOOTH", ICON_MODIFIER, "Smooth Corrective", ""}, + {eModifierType_LaplacianSmooth, "LAPLACIANSMOOTH", ICON_MODIFIER, "Smooth Laplacian", ""}, + {eModifierType_SurfaceDeform, "SURFACE_DEFORM", ICON_MODIFIER, "Surface Deform", ""}, + {eModifierType_Warp, "WARP", ICON_MODIFIER, "Warp", ""}, + {eModifierType_Wave, "WAVE", ICON_MODIFIER, "Wave", ""}, {0, "", 0, N_("Simulate"), ""}, - {eModifierType_Cloth, "CLOTH", ICON_MOD_CLOTH, "Cloth", ""}, - {eModifierType_Collision, "COLLISION", ICON_MOD_PHYSICS, "Collision", ""}, - {eModifierType_DynamicPaint, "DYNAMIC_PAINT", ICON_MOD_DYNAMICPAINT, "Dynamic Paint", ""}, - {eModifierType_Explode, "EXPLODE", ICON_MOD_EXPLODE, "Explode", ""}, - {eModifierType_Fluidsim, "FLUID_SIMULATION", ICON_MOD_FLUIDSIM, "Fluid Simulation", ""}, - {eModifierType_Ocean, "OCEAN", ICON_MOD_OCEAN, "Ocean", ""}, - {eModifierType_ParticleInstance, "PARTICLE_INSTANCE", ICON_MOD_PARTICLES, "Particle Instance", ""}, - {eModifierType_ParticleSystem, "PARTICLE_SYSTEM", ICON_MOD_PARTICLES, "Particle System", ""}, - {eModifierType_Smoke, "SMOKE", ICON_MOD_SMOKE, "Smoke", ""}, - {eModifierType_Softbody, "SOFT_BODY", ICON_MOD_SOFT, "Soft Body", ""}, - {eModifierType_Surface, "SURFACE", ICON_MOD_PHYSICS, "Surface", ""}, + {eModifierType_Cloth, "CLOTH", ICON_MODIFIER, "Cloth", ""}, + {eModifierType_Collision, "COLLISION", ICON_MODIFIER, "Collision", ""}, + {eModifierType_DynamicPaint, "DYNAMIC_PAINT", ICON_MODIFIER, "Dynamic Paint", ""}, + {eModifierType_Explode, "EXPLODE", ICON_MODIFIER, "Explode", ""}, + {eModifierType_Fluidsim, "FLUID_SIMULATION", ICON_MODIFIER, "Fluid Simulation", ""}, + {eModifierType_Ocean, "OCEAN", ICON_MODIFIER, "Ocean", ""}, + {eModifierType_ParticleInstance, "PARTICLE_INSTANCE", ICON_MODIFIER, "Particle Instance", ""}, + {eModifierType_ParticleSystem, "PARTICLE_SYSTEM", ICON_MODIFIER, "Particle System", ""}, + {eModifierType_Smoke, "SMOKE", ICON_MODIFIER, "Smoke", ""}, + {eModifierType_Softbody, "SOFT_BODY", ICON_MODIFIER, "Soft Body", ""}, + {eModifierType_Surface, "SURFACE", ICON_MODIFIER, "Surface", ""}, {0, NULL, 0, NULL, NULL} }; diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c index b5e3ce4fd28..458c26f7026 100644 --- a/source/blender/makesrna/intern/rna_object_api.c +++ b/source/blender/makesrna/intern/rna_object_api.c @@ -224,11 +224,11 @@ static void rna_Object_camera_fit_coords( /* settings: 0 - preview, 1 - render */ static Mesh *rna_Object_to_mesh( Object *ob, bContext *C, ReportList *reports, Depsgraph *depsgraph, - bool apply_modifiers, bool calc_tessface, bool calc_undeformed) + bool apply_modifiers, bool calc_undeformed) { Main *bmain = CTX_data_main(C); - return rna_Main_meshes_new_from_object(bmain, reports, depsgraph, ob, apply_modifiers, calc_tessface, calc_undeformed); + return rna_Main_meshes_new_from_object(bmain, reports, depsgraph, ob, apply_modifiers, calc_undeformed); } static PointerRNA rna_Object_shape_key_add(Object *ob, bContext *C, ReportList *reports, @@ -594,7 +594,6 @@ void RNA_api_object(StructRNA *srna) RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED); parm = RNA_def_boolean(func, "apply_modifiers", 0, "", "Apply modifiers"); RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); - RNA_def_boolean(func, "calc_tessface", true, "Calculate Tessellation", "Calculate tessellation faces"); RNA_def_boolean(func, "calc_undeformed", false, "Calculate Undeformed", "Calculate undeformed vertex coordinates"); parm = RNA_def_pointer(func, "mesh", "Mesh", "", "Mesh created from object, remove it if it is only used for export"); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 08da013754b..199f74c709d 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -185,9 +185,9 @@ const EnumPropertyItem rna_enum_snap_element_items[] = { const EnumPropertyItem rna_enum_snap_node_element_items[] = { {SCE_SNAP_MODE_GRID, "GRID", ICON_SNAP_GRID, "Grid", "Snap to grid"}, - {SCE_SNAP_MODE_NODE_X, "NODE_X", ICON_SNAP_EDGE, "Node X", "Snap to left/right node border"}, - {SCE_SNAP_MODE_NODE_Y, "NODE_Y", ICON_SNAP_EDGE, "Node Y", "Snap to top/bottom node border"}, - {SCE_SNAP_MODE_NODE_X | SCE_SNAP_MODE_NODE_Y, "NODE_XY", ICON_SNAP_EDGE, "Node X / Y", "Snap to any node border"}, + {SCE_SNAP_MODE_NODE_X, "NODE_X", ICON_NODE_SIDE, "Node X", "Snap to left/right node border"}, + {SCE_SNAP_MODE_NODE_Y, "NODE_Y", ICON_NODE_TOP, "Node Y", "Snap to top/bottom node border"}, + {SCE_SNAP_MODE_NODE_X | SCE_SNAP_MODE_NODE_Y, "NODE_XY", ICON_NODE_CORNER, "Node X / Y", "Snap to any node border"}, {0, NULL, 0, NULL, NULL} }; @@ -457,27 +457,27 @@ static const EnumPropertyItem rna_enum_gpencil_interpolation_mode_items[] = { #endif const EnumPropertyItem rna_enum_transform_pivot_items_full[] = { - {V3D_AROUND_CENTER_BOUNDS, "BOUNDING_BOX_CENTER", ICON_ROTATE, "Bounding Box Center", + {V3D_AROUND_CENTER_BOUNDS, "BOUNDING_BOX_CENTER", ICON_PIVOT_BOUNDBOX, "Bounding Box Center", "Pivot around bounding box center of selected object(s)"}, - {V3D_AROUND_CURSOR, "CURSOR", ICON_CURSOR, "3D Cursor", "Pivot around the 3D cursor"}, - {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_ROTATECOLLECTION, + {V3D_AROUND_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "3D Cursor", "Pivot around the 3D cursor"}, + {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_PIVOT_INDIVIDUAL, "Individual Origins", "Pivot around each object's own origin"}, - {V3D_AROUND_CENTER_MEAN, "MEDIAN_POINT", ICON_ROTATECENTER, "Median Point", + {V3D_AROUND_CENTER_MEAN, "MEDIAN_POINT", ICON_PIVOT_MEDIAN, "Median Point", "Pivot around the median point of selected objects"}, - {V3D_AROUND_ACTIVE, "ACTIVE_ELEMENT", ICON_ROTACTIVE, "Active Element", "Pivot around active object"}, + {V3D_AROUND_ACTIVE, "ACTIVE_ELEMENT", ICON_PIVOT_ACTIVE, "Active Element", "Pivot around active object"}, {0, NULL, 0, NULL, NULL} }; /* Icons could be made a consistent set of images. */ const EnumPropertyItem rna_enum_transform_orientation_items[] = { - {V3D_MANIP_GLOBAL, "GLOBAL", ICON_SCENE_DATA, "Global", "Align the transformation axes to world space"}, - {V3D_MANIP_LOCAL, "LOCAL", ICON_MANIPUL, "Local", "Align the transformation axes to the selected objects' local space"}, - {V3D_MANIP_NORMAL, "NORMAL", ICON_SNAP_NORMAL, "Normal", + {V3D_MANIP_GLOBAL, "GLOBAL", ICON_ORIENTATION_GLOBAL, "Global", "Align the transformation axes to world space"}, + {V3D_MANIP_LOCAL, "LOCAL", ICON_ORIENTATION_LOCAL, "Local", "Align the transformation axes to the selected objects' local space"}, + {V3D_MANIP_NORMAL, "NORMAL", ICON_ORIENTATION_NORMAL, "Normal", "Align the transformation axes to average normal of selected elements " "(bone Y axis for pose mode)"}, - {V3D_MANIP_GIMBAL, "GIMBAL", ICON_NDOF_DOM, "Gimbal", "Align each axis to the Euler rotation axis as used for input"}, - {V3D_MANIP_VIEW, "VIEW", ICON_VISIBLE_IPO_ON, "View", "Align the transformation axes to the window"}, - {V3D_MANIP_CURSOR, "CURSOR", ICON_CURSOR, "Cursor", "Align the transformation axes to the 3D cursor"}, + {V3D_MANIP_GIMBAL, "GIMBAL", ICON_ORIENTATION_GIMBAL, "Gimbal", "Align each axis to the Euler rotation axis as used for input"}, + {V3D_MANIP_VIEW, "VIEW", ICON_ORIENTATION_VIEW, "View", "Align the transformation axes to the window"}, + {V3D_MANIP_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "Cursor", "Align the transformation axes to the 3D cursor"}, // {V3D_MANIP_CUSTOM, "CUSTOM", 0, "Custom", "Use a custom transform orientation"}, {0, NULL, 0, NULL, NULL} }; @@ -532,6 +532,14 @@ const EnumPropertyItem rna_enum_transform_orientation_items[] = { #include "FRS_freestyle.h" #endif +static void rna_ToolSettings_snap_mode_set(struct PointerRNA *ptr, int value) +{ + ToolSettings *ts = (ToolSettings *)ptr->data; + if (value != 0) { + ts->snap_mode = value; + } +} + /* Grease Pencil update cache */ static void rna_GPencil_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *UNUSED(ptr)) { @@ -2214,7 +2222,7 @@ static void rna_def_tool_settings(BlenderRNA *brna) static const EnumPropertyItem gpencil_stroke_placement_items[] = { {GP_PROJECT_VIEWSPACE, "ORIGIN", ICON_OBJECT_ORIGIN, "Origin", "Draw stroke at Object origin"}, - {GP_PROJECT_VIEWSPACE | GP_PROJECT_CURSOR, "CURSOR", ICON_CURSOR, "3D Cursor", "Draw stroke at 3D cursor location" }, + {GP_PROJECT_VIEWSPACE | GP_PROJECT_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "3D Cursor", "Draw stroke at 3D cursor location" }, {GP_PROJECT_VIEWSPACE | GP_PROJECT_DEPTH_VIEW, "SURFACE", ICON_FACESEL, "Surface", "Stick stroke to surfaces"}, {0, NULL, 0, NULL, NULL} }; @@ -2226,7 +2234,7 @@ static void rna_def_tool_settings(BlenderRNA *brna) }; static const EnumPropertyItem annotation_stroke_placement_items[] = { - {GP_PROJECT_VIEWSPACE | GP_PROJECT_CURSOR, "CURSOR", ICON_CURSOR, "3D Cursor", "Draw stroke at 3D cursor location" }, + {GP_PROJECT_VIEWSPACE | GP_PROJECT_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "3D Cursor", "Draw stroke at 3D cursor location" }, {0, "VIEW", ICON_VISIBLE_IPO_ON, "View", "Stick stroke to the view "}, /* weird, GP_PROJECT_VIEWALIGN is inverted */ {GP_PROJECT_VIEWSPACE | GP_PROJECT_DEPTH_VIEW, "SURFACE", ICON_FACESEL, "Surface", "Stick stroke to surfaces"}, /* Stroke option is disabled because is not working as expected and maybe is not @@ -2390,7 +2398,7 @@ static void rna_def_tool_settings(BlenderRNA *brna) prop = RNA_def_property(srna, "use_transform_pivot_point_align", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "transform_flag", SCE_XFORM_AXIS_ALIGN); RNA_def_property_ui_text(prop, "Align", "Manipulate center points (object, pose and weight paint mode only)"); - RNA_def_property_ui_icon(prop, ICON_ALIGN, 0); + RNA_def_property_ui_icon(prop, ICON_CENTER_ONLY, 0); RNA_def_property_update(prop, NC_SCENE, NULL); prop = RNA_def_property(srna, "use_mesh_automerge", PROP_BOOLEAN, PROP_NONE); @@ -2420,6 +2428,7 @@ static void rna_def_tool_settings(BlenderRNA *brna) prop = RNA_def_property(srna, "snap_elements", PROP_ENUM, PROP_NONE); RNA_def_property_enum_bitflag_sdna(prop, NULL, "snap_mode"); RNA_def_property_enum_items(prop, rna_enum_snap_element_items); + RNA_def_property_enum_funcs(prop, NULL, "rna_ToolSettings_snap_mode_set", NULL); RNA_def_property_flag(prop, PROP_ENUM_FLAG); RNA_def_property_ui_text(prop, "Snap Element", "Type of element to snap to"); RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */ @@ -2460,7 +2469,7 @@ static void rna_def_tool_settings(BlenderRNA *brna) prop = RNA_def_property(srna, "use_snap_self", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "snap_flag", SCE_SNAP_NO_SELF); RNA_def_property_ui_text(prop, "Project to Self", "Snap onto itself (editmode)"); - RNA_def_property_ui_icon(prop, ICON_ORTHO, 0); + RNA_def_property_ui_icon(prop, ICON_XRAY, 0); RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */ prop = RNA_def_property(srna, "use_gizmo_mode", PROP_ENUM, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c index f9dedc73280..05e5587c9c4 100644 --- a/source/blender/makesrna/intern/rna_screen.c +++ b/source/blender/makesrna/intern/rna_screen.c @@ -519,7 +519,7 @@ static void rna_def_screen(BlenderRNA *brna) srna = RNA_def_struct(brna, "Screen", "ID"); RNA_def_struct_sdna(srna, "Screen"); /* it is actually bScreen but for 2.5 the dna is patched! */ RNA_def_struct_ui_text(srna, "Screen", "Screen data-block, defining the layout of areas in a window"); - RNA_def_struct_ui_icon(srna, ICON_SPLITSCREEN); + RNA_def_struct_ui_icon(srna, ICON_WORKSPACE); prop = RNA_def_property(srna, "layout_name", PROP_STRING, PROP_NONE); RNA_def_property_string_funcs(prop, "rna_Screen_layout_name_get", "rna_Screen_layout_name_length", diff --git a/source/blender/makesrna/intern/rna_sculpt_paint.c b/source/blender/makesrna/intern/rna_sculpt_paint.c index 6ab591fb332..e6e9ff6664d 100644 --- a/source/blender/makesrna/intern/rna_sculpt_paint.c +++ b/source/blender/makesrna/intern/rna_sculpt_paint.c @@ -83,11 +83,11 @@ static EnumPropertyItem rna_enum_gpencil_weight_brush_items[] = { { 0, NULL, 0, NULL, NULL } }; -static const EnumPropertyItem rna_enum_gpencil_lockaxis_items[] = { +static const EnumPropertyItem rna_enum_gpencil_lock_axis_items[] = { { GP_LOCKAXIS_NONE, "GP_LOCKAXIS_NONE", ICON_UNLOCKED, "None", "" }, - { GP_LOCKAXIS_X, "GP_LOCKAXIS_X", ICON_NDOF_DOM, "Y-Z Plane", "Project strokes to plane locked to X" }, - { GP_LOCKAXIS_Y, "GP_LOCKAXIS_Y", ICON_NDOF_DOM, "X-Z Plane", "Project strokes to plane locked to Y" }, - { GP_LOCKAXIS_Z, "GP_LOCKAXIS_Z", ICON_NDOF_DOM, "X-Y Plane", "Project strokes to plane locked to Z" }, + { GP_LOCKAXIS_X, "GP_LOCKAXIS_X", ICON_AXIS_SIDE, "Y-Z Plane", "Project strokes to plane locked to X" }, + { GP_LOCKAXIS_Y, "GP_LOCKAXIS_Y", ICON_AXIS_FRONT, "X-Z Plane", "Project strokes to plane locked to Y" }, + { GP_LOCKAXIS_Z, "GP_LOCKAXIS_Z", ICON_AXIS_TOP, "X-Y Plane", "Project strokes to plane locked to Z" }, { 0, NULL, 0, NULL, NULL } }; #endif @@ -1103,8 +1103,8 @@ static void rna_def_particle_edit(BlenderRNA *brna) static void rna_def_gpencil_sculpt(BlenderRNA *brna) { static const EnumPropertyItem prop_direction_items[] = { - {0, "ADD", ICON_ZOOMIN, "Add", "Add effect of brush"}, - {GP_EDITBRUSH_FLAG_INVERT, "SUBTRACT", ICON_ZOOMOUT, "Subtract", "Subtract effect of brush"}, + {0, "ADD", ICON_ADD, "Add", "Add effect of brush"}, + {GP_EDITBRUSH_FLAG_INVERT, "SUBTRACT", ICON_REMOVE, "Subtract", "Subtract effect of brush"}, {0, NULL, 0, NULL, NULL}}; StructRNA *srna; @@ -1183,9 +1183,9 @@ static void rna_def_gpencil_sculpt(BlenderRNA *brna) RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* lock axis */ - prop = RNA_def_property(srna, "lockaxis", PROP_ENUM, PROP_NONE); + prop = RNA_def_property(srna, "lock_axis", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "lock_axis"); - RNA_def_property_enum_items(prop, rna_enum_gpencil_lockaxis_items); + RNA_def_property_enum_items(prop, rna_enum_gpencil_lock_axis_items); RNA_def_property_ui_text(prop, "Lock Axis", ""); RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); diff --git a/source/blender/makesrna/intern/rna_shader_fx.c b/source/blender/makesrna/intern/rna_shader_fx.c index 22ebd3f7567..fe4e20bbd58 100644 --- a/source/blender/makesrna/intern/rna_shader_fx.c +++ b/source/blender/makesrna/intern/rna_shader_fx.c @@ -52,6 +52,7 @@ const EnumPropertyItem rna_enum_object_shaderfx_type_items[] = { {eShaderFxType_Blur, "FX_BLUR", ICON_SHADERFX, "Blur", "Apply Gaussian Blur to object" }, {eShaderFxType_Colorize, "FX_COLORIZE", ICON_SHADERFX, "Colorize", "Apply different tint effects" }, {eShaderFxType_Flip, "FX_FLIP", ICON_SHADERFX, "Flip", "Flip image" }, + {eShaderFxType_Glow, "FX_GLOW", ICON_SHADERFX, "Glow", "Create a glow effect" }, {eShaderFxType_Light, "FX_LIGHT", ICON_SHADERFX, "Light", "Simulate ilumination" }, {eShaderFxType_Pixel, "FX_PIXEL", ICON_SHADERFX, "Pixelate", "Pixelate image"}, {eShaderFxType_Rim, "FX_RIM", ICON_SHADERFX, "Rim", "Add a rim to the image" }, @@ -71,6 +72,12 @@ static const EnumPropertyItem rna_enum_shaderfx_rim_modes_items[] = { {0, NULL, 0, NULL, NULL } }; +static const EnumPropertyItem rna_enum_shaderfx_glow_modes_items[] = { + {eShaderFxGlowMode_Luminance, "LUMINANCE", 0, "Luminance", "" }, + {eShaderFxGlowMode_Color, "COLOR", 0, "Color", "" }, + {0, NULL, 0, NULL, NULL } +}; + static const EnumPropertyItem rna_enum_shaderfx_colorize_modes_items[] = { {eShaderFxColorizeMode_GrayScale, "GRAYSCALE", 0, "Gray Scale", "" }, {eShaderFxColorizeMode_Sepia, "SEPIA", 0, "Sepia", "" }, @@ -108,6 +115,8 @@ static StructRNA *rna_ShaderFx_refine(struct PointerRNA *ptr) return &RNA_ShaderFxSwirl; case eShaderFxType_Flip: return &RNA_ShaderFxFlip; + case eShaderFxType_Glow: + return &RNA_ShaderFxGlow; case eShaderFxType_Light: return &RNA_ShaderFxLight; /* Default */ @@ -483,6 +492,64 @@ static void rna_def_shader_fx_shadow(BlenderRNA *brna) RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update"); } +static void rna_def_shader_fx_glow(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna = RNA_def_struct(brna, "ShaderFxGlow", "ShaderFx"); + RNA_def_struct_ui_text(srna, "Glow Effect", "Glow effect"); + RNA_def_struct_sdna(srna, "GlowShaderFxData"); + RNA_def_struct_ui_icon(srna, ICON_SHADERFX); + + prop = RNA_def_property(srna, "glow_color", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_range(prop, 0.0, 1.0); + RNA_def_property_float_sdna(prop, NULL, "glow_color"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Glow Color", "Color used for generated glow"); + RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update"); + + prop = RNA_def_property(srna, "select_color", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_range(prop, 0.0, 1.0); + RNA_def_property_float_sdna(prop, NULL, "select_color"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Select Color", "Color selected to apply glow"); + RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update"); + + prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "mode"); + RNA_def_property_enum_items(prop, rna_enum_shaderfx_glow_modes_items); + RNA_def_property_ui_text(prop, "Mode", "Glow mode"); + RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update"); + + prop = RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "threshold"); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1f, 3); + RNA_def_property_ui_text(prop, "Threshold", "Limit to select color for glow effect"); + RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update"); + + /* use blur fields to make compatible with blur filter, but only makes public first array element */ + prop = RNA_def_property(srna, "radius", PROP_INT, PROP_PIXEL); + RNA_def_property_int_sdna(prop, NULL, "blur[0]"); + RNA_def_property_range(prop, 0, INT_MAX); + RNA_def_property_ui_text(prop, "Radius", "Number of pixels for bluring glow (set to 0 to disable)"); + RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update"); + + prop = RNA_def_property(srna, "samples", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "samples"); + RNA_def_property_range(prop, 1, 32); + RNA_def_property_ui_range(prop, 1, 32, 2, -1); + RNA_def_property_int_default(prop, 4); + RNA_def_property_ui_text(prop, "Samples", "Number of Blur Samples"); + RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update"); + + prop = RNA_def_property(srna, "use_alpha_mode", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", FX_GLOW_USE_ALPHA); + RNA_def_property_ui_text(prop, "Use Alpha", "Glow only areas with alpha"); + RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update"); +} + static void rna_def_shader_fx_swirl(BlenderRNA *brna) { StructRNA *srna; @@ -631,6 +698,7 @@ void RNA_def_shader_fx(BlenderRNA *brna) rna_def_shader_fx_pixel(brna); rna_def_shader_fx_rim(brna); rna_def_shader_fx_shadow(brna); + rna_def_shader_fx_glow(brna); rna_def_shader_fx_swirl(brna); rna_def_shader_fx_flip(brna); rna_def_shader_fx_light(brna); diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index c2224fe767b..80053095044 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -72,7 +72,7 @@ const EnumPropertyItem rna_enum_space_type_items[] = { /* General */ {0, "", ICON_NONE, "General", ""}, {SPACE_VIEW3D, "VIEW_3D", ICON_VIEW3D, "3D View", "3D viewport"}, - {SPACE_IMAGE, "IMAGE_EDITOR", ICON_IMAGE_COL, "UV/Image Editor", "View and edit images and UV Maps"}, + {SPACE_IMAGE, "IMAGE_EDITOR", ICON_IMAGE, "UV/Image Editor", "View and edit images and UV Maps"}, {SPACE_NODE, "NODE_EDITOR", ICON_NODETREE, "Node Editor", "Editor for node-based shading and compositing tools"}, {SPACE_SEQ, "SEQUENCE_EDITOR", ICON_SEQUENCE, "Video Sequencer", "Video editing tools"}, {SPACE_CLIP, "CLIP_EDITOR", ICON_CLIP, "Movie Clip Editor", "Motion tracking tools"}, @@ -81,7 +81,7 @@ const EnumPropertyItem rna_enum_space_type_items[] = { {0, "", ICON_NONE, "Animation", ""}, //{SPACE_ACTION, "TIMELINE", ICON_TIME, "Timeline", "Timeline and playback controls (NOTE: Switch to 'Timeline' mode)"}, /* XXX */ {SPACE_ACTION, "DOPESHEET_EDITOR", ICON_ACTION, "Dope Sheet", "Adjust timing of keyframes"}, - {SPACE_IPO, "GRAPH_EDITOR", ICON_IPO, "Graph Editor", "Edit drivers and keyframe interpolation"}, + {SPACE_IPO, "GRAPH_EDITOR", ICON_GRAPH, "Graph Editor", "Edit drivers and keyframe interpolation"}, {SPACE_NLA, "NLA_EDITOR", ICON_NLA, "Nonlinear Animation", "Combine and layer Actions"}, /* Scripting */ @@ -99,16 +99,16 @@ const EnumPropertyItem rna_enum_space_type_items[] = { /* Data */ {0, "", ICON_NONE, "Data", ""}, - {SPACE_OUTLINER, "OUTLINER", ICON_OOPS, "Outliner", "Overview of scene graph and all available data-blocks"}, - {SPACE_BUTS, "PROPERTIES", ICON_BUTS, "Properties", "Edit properties of active object and related data-blocks"}, - {SPACE_FILE, "FILE_BROWSER", ICON_FILESEL, "File Browser", "Browse for files and assets"}, + {SPACE_OUTLINER, "OUTLINER", ICON_OUTLINER, "Outliner", "Overview of scene graph and all available data-blocks"}, + {SPACE_BUTS, "PROPERTIES", ICON_PROPERTIES, "Properties", "Edit properties of active object and related data-blocks"}, + {SPACE_FILE, "FILE_BROWSER", ICON_FILEBROWSER, "File Browser", "Browse for files and assets"}, {SPACE_USERPREF, "USER_PREFERENCES", ICON_PREFERENCES, "User Preferences", "Edit persistent configuration settings"}, {0, NULL, 0, NULL, NULL} }; const EnumPropertyItem rna_enum_space_graph_mode_items[] = { - {SIPO_MODE_ANIMATION, "FCURVES", ICON_IPO, "Graph Editor", + {SIPO_MODE_ANIMATION, "FCURVES", ICON_GRAPH, "Graph Editor", "Edit animation/keyframes displayed as 2D curves"}, {SIPO_MODE_DRIVERS, "DRIVERS", ICON_DRIVER, "Drivers", "Edit drivers"}, {0, NULL, 0, NULL, NULL} @@ -238,10 +238,10 @@ static const EnumPropertyItem autosnap_items[] = { #endif const EnumPropertyItem rna_enum_shading_type_items[] = { - {OB_WIRE, "WIREFRAME", ICON_WIRE, "Wireframe", "Display the object as wire edges"}, - {OB_SOLID, "SOLID", ICON_SOLID, "Solid", "Display in solid mode"}, - {OB_MATERIAL, "MATERIAL", ICON_MATERIAL_DATA, "LookDev", "Display in LookDev mode"}, - {OB_RENDER, "RENDERED", ICON_SMOOTH, "Rendered", "Display render preview"}, + {OB_WIRE, "WIREFRAME", ICON_SHADING_WIRE, "Wireframe", "Display the object as wire edges"}, + {OB_SOLID, "SOLID", ICON_SHADING_SOLID, "Solid", "Display in solid mode"}, + {OB_MATERIAL, "MATERIAL", ICON_SHADING_TEXTURE, "LookDev", "Display in LookDev mode"}, + {OB_RENDER, "RENDERED", ICON_SHADING_RENDERED, "Rendered", "Display render preview"}, {0, NULL, 0, NULL, NULL} }; @@ -1197,10 +1197,10 @@ static const EnumPropertyItem *rna_SpaceImageEditor_pivot_itemf( PropertyRNA *UNUSED(prop), bool *UNUSED(r_free)) { static const EnumPropertyItem pivot_items[] = { - {V3D_AROUND_CENTER_BOUNDS, "CENTER", ICON_ROTATE, "Bounding Box Center", ""}, - {V3D_AROUND_CENTER_MEAN, "MEDIAN", ICON_ROTATECENTER, "Median Point", ""}, - {V3D_AROUND_CURSOR, "CURSOR", ICON_CURSOR, "2D Cursor", ""}, - {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_ROTATECOLLECTION, + {V3D_AROUND_CENTER_BOUNDS, "CENTER", ICON_PIVOT_BOUNDBOX, "Bounding Box Center", ""}, + {V3D_AROUND_CENTER_MEAN, "MEDIAN", ICON_PIVOT_MEDIAN, "Median Point", ""}, + {V3D_AROUND_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "2D Cursor", ""}, + {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_PIVOT_INDIVIDUAL, "Individual Origins", "Pivot around each selected island's own median point"}, {0, NULL, 0, NULL, NULL} }; @@ -2295,7 +2295,7 @@ static void rna_def_space_outliner(BlenderRNA *brna) {SO_SEQUENCE, "SEQUENCE", ICON_SEQUENCE, "Sequence", "Display sequence data-blocks"}, {SO_LIBRARIES, "LIBRARIES", ICON_FILE_BLEND, "Blender File", "Display data of current file and linked libraries"}, {SO_DATA_API, "DATA_API", ICON_RNA, "Data API", "Display low level Blender data and its properties"}, - {SO_ID_ORPHANS, "ORPHAN_DATA", ICON_EXTERNAL_DATA, "Orphan Data", + {SO_ID_ORPHANS, "ORPHAN_DATA", ICON_ORPHAN_DATA, "Orphan Data", "Display data-blocks which are unused and/or will be lost when the file is reloaded"}, {0, NULL, 0, NULL, NULL} }; @@ -2783,6 +2783,11 @@ static void rna_def_space_view3d_overlay(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Show Wire", "Use wireframe display in painting modes"); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); + prop = RNA_def_property(srna, "show_wpaint_contours", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "overlay.wpaint_flag", V3D_OVERLAY_WPAINT_CONTOURS); + RNA_def_property_ui_text(prop, "Show Weight Contours", "Show contour lines formed by points with the same interpolated weight"); + RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); + prop = RNA_def_property(srna, "show_weight", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_WEIGHT); RNA_def_property_ui_text(prop, "Show Weights", "Display weights in editmode"); @@ -4027,9 +4032,9 @@ static void rna_def_space_graph(BlenderRNA *brna) /* this is basically the same as the one for the 3D-View, but with some entries omitted */ static const EnumPropertyItem gpivot_items[] = { - {V3D_AROUND_CENTER_BOUNDS, "BOUNDING_BOX_CENTER", ICON_ROTATE, "Bounding Box Center", ""}, - {V3D_AROUND_CURSOR, "CURSOR", ICON_CURSOR, "2D Cursor", ""}, - {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_ROTATECOLLECTION, "Individual Centers", ""}, + {V3D_AROUND_CENTER_BOUNDS, "BOUNDING_BOX_CENTER", ICON_PIVOT_BOUNDBOX, "Bounding Box Center", ""}, + {V3D_AROUND_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "2D Cursor", ""}, + {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_PIVOT_INDIVIDUAL, "Individual Centers", ""}, /*{V3D_AROUND_CENTER_MEAN, "MEDIAN_POINT", 0, "Median Point", ""}, */ /*{V3D_AROUND_ACTIVE, "ACTIVE_ELEMENT", 0, "Active Element", ""}, */ {0, NULL, 0, NULL, NULL} @@ -4921,7 +4926,7 @@ static void rna_def_space_clip(BlenderRNA *brna) static const EnumPropertyItem view_items[] = { {SC_VIEW_CLIP, "CLIP", ICON_SEQUENCE, "Clip", "Show editing clip preview"}, - {SC_VIEW_GRAPH, "GRAPH", ICON_IPO, "Graph", "Show graph view for active element"}, + {SC_VIEW_GRAPH, "GRAPH", ICON_GRAPH, "Graph", "Show graph view for active element"}, {SC_VIEW_DOPESHEET, "DOPESHEET", ICON_ACTION, "Dopesheet", "Dopesheet view for tracking data"}, {0, NULL, 0, NULL, NULL} }; @@ -4933,12 +4938,12 @@ static void rna_def_space_clip(BlenderRNA *brna) }; static const EnumPropertyItem pivot_items[] = { - {V3D_AROUND_CENTER_BOUNDS, "BOUNDING_BOX_CENTER", ICON_ROTATE, "Bounding Box Center", + {V3D_AROUND_CENTER_BOUNDS, "BOUNDING_BOX_CENTER", ICON_PIVOT_BOUNDBOX, "Bounding Box Center", "Pivot around bounding box center of selected object(s)"}, - {V3D_AROUND_CURSOR, "CURSOR", ICON_CURSOR, "2D Cursor", "Pivot around the 2D cursor"}, - {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_ROTATECOLLECTION, + {V3D_AROUND_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "2D Cursor", "Pivot around the 2D cursor"}, + {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_CENTER_ONLY, "Individual Origins", "Pivot around each object's own origin"}, - {V3D_AROUND_CENTER_MEAN, "MEDIAN_POINT", ICON_ROTATECENTER, "Median Point", + {V3D_AROUND_CENTER_MEAN, "MEDIAN_POINT", ICON_PIVOT_MEDIAN, "Median Point", "Pivot around the median point of selected objects"}, {0, NULL, 0, NULL, NULL} }; diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c index 3928b75a2b2..523c4691460 100644 --- a/source/blender/makesrna/intern/rna_ui.c +++ b/source/blender/makesrna/intern/rna_ui.c @@ -378,7 +378,7 @@ static void uilist_draw_item(uiList *ui_list, bContext *C, uiLayout *layout, Poi RNA_parameter_list_free(&list); } -static void uilist_draw_filter(uiList *ui_list, bContext *C, uiLayout *layout) +static void uilist_draw_filter(uiList *ui_list, bContext *C, uiLayout *layout, bool reverse) { extern FunctionRNA rna_UIList_draw_filter_func; @@ -392,6 +392,7 @@ static void uilist_draw_filter(uiList *ui_list, bContext *C, uiLayout *layout) RNA_parameter_list_create(&list, &ul_ptr, func); RNA_parameter_set_lookup(&list, "context", &C); RNA_parameter_set_lookup(&list, "layout", &layout); + RNA_parameter_set_lookup(&list, "reverse", &reverse); ui_list->type->ext.call((bContext *)C, &ul_ptr, func, &list); RNA_parameter_list_free(&list); @@ -1307,6 +1308,7 @@ static void rna_def_uilist(BlenderRNA *brna) RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); parm = RNA_def_pointer(func, "layout", "UILayout", "", "Layout to draw the item"); RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED); + RNA_def_boolean(func, "reverse", false, "", "Display items in reverse order"); /* filter */ func = RNA_def_function(srna, "filter_items", NULL); diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c index 87b8307fafc..f5a74c868fc 100644 --- a/source/blender/makesrna/intern/rna_ui_api.c +++ b/source/blender/makesrna/intern/rna_ui_api.c @@ -49,16 +49,12 @@ #define DEF_ICON(name) {ICON_##name, (#name), 0, (#name), ""}, #define DEF_ICON_VECTOR(name) {ICON_##name, (#name), 0, (#name), ""}, -#define DEF_ICON_MONO(name) {ICON_##name, (#name), 0, (#name), ""}, +#define DEF_ICON_COLOR(name) {ICON_##name, (#name), 0, (#name), ""}, #define DEF_ICON_BLANK(name) const EnumPropertyItem rna_enum_icon_items[] = { #include "UI_icons.h" {0, NULL, 0, NULL, NULL} }; -#undef DEF_ICON -#undef DEF_ICON_VECTOR -#undef DEF_ICON_MONO -#undef DEF_ICON_BLANK #ifdef RNA_RUNTIME @@ -1036,7 +1032,8 @@ void RNA_api_ui_layout(StructRNA *srna) RNA_def_int(func, "maxrows", 5, 0, INT_MAX, "", "Default maximum number of rows to display", 0, INT_MAX); RNA_def_enum(func, "type", rna_enum_uilist_layout_type_items, UILST_LAYOUT_DEFAULT, "Type", "Type of layout to use"); RNA_def_int(func, "columns", 9, 0, INT_MAX, "", "Number of items to display per row, for GRID layout", 0, INT_MAX); - + RNA_def_boolean(func, "reverse", false, "", "Display items in reverse order"); + func = RNA_def_function(srna, "template_running_jobs", "uiTemplateRunningJobs"); RNA_def_function_flag(func, FUNC_USE_CONTEXT); diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index d3da1eac7e7..8e6dda65e95 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -1229,6 +1229,37 @@ static void rna_def_userdef_theme_ui(BlenderRNA *brna) RNA_def_property_array(prop, 3); RNA_def_property_ui_text(prop, "Gizmo B", ""); RNA_def_property_update(prop, 0, "rna_userdef_update"); + + /* Icon colors. */ + prop = RNA_def_property(srna, "icon_collection", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_float_sdna(prop, NULL, "icon_collection"); + RNA_def_property_array(prop, 4); + RNA_def_property_ui_text(prop, "Collection", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); + + prop = RNA_def_property(srna, "icon_object", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_float_sdna(prop, NULL, "icon_object"); + RNA_def_property_array(prop, 4); + RNA_def_property_ui_text(prop, "Object", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); + + prop = RNA_def_property(srna, "icon_object_data", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_float_sdna(prop, NULL, "icon_object_data"); + RNA_def_property_array(prop, 4); + RNA_def_property_ui_text(prop, "Object Data", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); + + prop = RNA_def_property(srna, "icon_modifier", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_float_sdna(prop, NULL, "icon_modifier"); + RNA_def_property_array(prop, 4); + RNA_def_property_ui_text(prop, "Modifier", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); + + prop = RNA_def_property(srna, "icon_shading", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_float_sdna(prop, NULL, "icon_shading"); + RNA_def_property_array(prop, 4); + RNA_def_property_ui_text(prop, "Shading", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); } static void rna_def_userdef_theme_space_common(StructRNA *srna) @@ -3087,22 +3118,22 @@ static void rna_def_userdef_themes(BlenderRNA *brna) PropertyRNA *prop; static const EnumPropertyItem active_theme_area[] = { - {0, "USER_INTERFACE", ICON_UI, "User Interface", ""}, + {0, "USER_INTERFACE", ICON_WORKSPACE, "User Interface", ""}, {19, "STYLE", ICON_FONTPREVIEW, "Text Style", ""}, {18, "BONE_COLOR_SETS", ICON_COLOR, "Bone Color Sets", ""}, {1, "VIEW_3D", ICON_VIEW3D, "3D View", ""}, - {3, "GRAPH_EDITOR", ICON_IPO, "Graph Editor", ""}, + {3, "GRAPH_EDITOR", ICON_GRAPH, "Graph Editor", ""}, {4, "DOPESHEET_EDITOR", ICON_ACTION, "Dope Sheet", ""}, {5, "NLA_EDITOR", ICON_NLA, "Nonlinear Animation", ""}, - {6, "IMAGE_EDITOR", ICON_IMAGE_COL, "UV/Image Editor", ""}, + {6, "IMAGE_EDITOR", ICON_IMAGE, "UV/Image Editor", ""}, {7, "SEQUENCE_EDITOR", ICON_SEQUENCE, "Video Sequence Editor", ""}, {8, "TEXT_EDITOR", ICON_TEXT, "Text Editor", ""}, {9, "NODE_EDITOR", ICON_NODETREE, "Node Editor", ""}, - {11, "PROPERTIES", ICON_BUTS, "Properties", ""}, - {12, "OUTLINER", ICON_OOPS, "Outliner", ""}, + {11, "PROPERTIES", ICON_PROPERTIES, "Properties", ""}, + {12, "OUTLINER", ICON_OUTLINER, "Outliner", ""}, {14, "USER_PREFERENCES", ICON_PREFERENCES, "User Preferences", ""}, {15, "INFO", ICON_INFO, "Info", ""}, - {16, "FILE_BROWSER", ICON_FILESEL, "File Browser", ""}, + {16, "FILE_BROWSER", ICON_FILEBROWSER, "File Browser", ""}, {17, "CONSOLE", ICON_CONSOLE, "Python Console", ""}, {20, "CLIP_EDITOR", ICON_CLIP, "Movie Clip Editor", ""}, {21, "TOPBAR", ICON_NONE, "Top Bar", ""}, @@ -3968,6 +3999,11 @@ static void rna_def_userdef_edit(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "gp_settings", GP_PAINT_DOSIMPLIFY); RNA_def_property_ui_text(prop, "Grease Pencil Simplify Stroke", "Simplify the final stroke"); + prop = RNA_def_property(srna, "use_grease_pencil_reverse_layers", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "gp_settings", GP_PAINT_REVERSE_LAYERS); + RNA_def_property_ui_text(prop, "Layers list Top-Down", + "Order the grease pencil list of layers from Top to Down"); + prop = RNA_def_property(srna, "grease_pencil_eraser_radius", PROP_INT, PROP_PIXEL); RNA_def_property_int_sdna(prop, NULL, "gp_eraser"); RNA_def_property_range(prop, 1, 500); diff --git a/source/blender/makesrna/intern/rna_workspace.c b/source/blender/makesrna/intern/rna_workspace.c index e900b51c4eb..5504ca68c6d 100644 --- a/source/blender/makesrna/intern/rna_workspace.c +++ b/source/blender/makesrna/intern/rna_workspace.c @@ -294,7 +294,7 @@ static void rna_def_workspace(BlenderRNA *brna) RNA_def_struct_sdna(srna, "WorkSpace"); RNA_def_struct_ui_text(srna, "Workspace", "Workspace data-block, defining the working environment for the user"); /* TODO: real icon, just to show something */ - RNA_def_struct_ui_icon(srna, ICON_SPLITSCREEN); + RNA_def_struct_ui_icon(srna, ICON_WORKSPACE); prop = RNA_def_property(srna, "screens", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "layouts", NULL); diff --git a/source/blender/modifiers/intern/MOD_bevel.c b/source/blender/modifiers/intern/MOD_bevel.c index a961208755d..c071559bffe 100644 --- a/source/blender/modifiers/intern/MOD_bevel.c +++ b/source/blender/modifiers/intern/MOD_bevel.c @@ -448,7 +448,7 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes if (set_wn_strength) bevel_set_weighted_normal_face_strength(bm, scene); - result = BKE_bmesh_to_mesh_nomain(bm, &(struct BMeshToMeshParams){0}); + result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0); BLI_assert(bm->vtoolflagpool == NULL && bm->etoolflagpool == NULL && diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c index db1078fa677..8619b4e020c 100644 --- a/source/blender/modifiers/intern/MOD_boolean.c +++ b/source/blender/modifiers/intern/MOD_boolean.c @@ -317,7 +317,7 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes MEM_freeN(looptris); } - result = BKE_bmesh_to_mesh_nomain(bm, &((struct BMeshToMeshParams){0})); + result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0); BM_mesh_free(bm); diff --git a/source/blender/modifiers/intern/MOD_decimate.c b/source/blender/modifiers/intern/MOD_decimate.c index 9e35746c0a3..7af25a048f8 100644 --- a/source/blender/modifiers/intern/MOD_decimate.c +++ b/source/blender/modifiers/intern/MOD_decimate.c @@ -186,7 +186,7 @@ static Mesh *applyModifier( /* update for display only */ dmd->face_count = bm->totface; - result = BKE_bmesh_to_mesh_nomain(bm, &((struct BMeshToMeshParams){0})); + result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0); BLI_assert(bm->vtoolflagpool == NULL && bm->etoolflagpool == NULL && bm->ftoolflagpool == NULL); /* make sure we never alloc'd these */ diff --git a/source/blender/modifiers/intern/MOD_edgesplit.c b/source/blender/modifiers/intern/MOD_edgesplit.c index a8d4d55c5d3..58cbbbc7b4d 100644 --- a/source/blender/modifiers/intern/MOD_edgesplit.c +++ b/source/blender/modifiers/intern/MOD_edgesplit.c @@ -106,7 +106,7 @@ static Mesh *doEdgeSplit(Mesh *mesh, EdgeSplitModifierData *emd, const ModifierE /* BM_mesh_validate(bm); */ /* for troubleshooting */ - result = BKE_bmesh_to_mesh_nomain(bm, &((struct BMeshToMeshParams){0})); + result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0); BM_mesh_free(bm); result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c index 5aa134fc7e1..a6afa39b870 100644 --- a/source/blender/modifiers/intern/MOD_meshdeform.c +++ b/source/blender/modifiers/intern/MOD_meshdeform.c @@ -299,7 +299,7 @@ static void meshdeformModifier_do( * * Only do this is the target object is in edit mode by itself, meaning * we don't allow linked edit meshes here. - * This is because editbmesh_get_derived_cage_and_final() might easily + * This is because editbmesh_get_mesh_cage_and_final() might easily * conflict with the thread which evaluates object which is in the edit * mode for this mesh. * diff --git a/source/blender/modifiers/intern/MOD_particlesystem.c b/source/blender/modifiers/intern/MOD_particlesystem.c index aeb2bfb2467..cbdee3c1560 100644 --- a/source/blender/modifiers/intern/MOD_particlesystem.c +++ b/source/blender/modifiers/intern/MOD_particlesystem.c @@ -162,7 +162,7 @@ static void deformVerts( if (edit_btmesh) { /* In edit mode get directly from the edit mesh. */ - psmd->mesh_original = BKE_bmesh_to_mesh_nomain(edit_btmesh->bm, &(struct BMeshToMeshParams){0}); + psmd->mesh_original = BKE_mesh_from_bmesh_for_eval_nomain(edit_btmesh->bm, 0); } else { /* Otherwise get regular mesh. */ diff --git a/source/blender/modifiers/intern/MOD_shrinkwrap.c b/source/blender/modifiers/intern/MOD_shrinkwrap.c index 94bd9ae2353..7864e888a48 100644 --- a/source/blender/modifiers/intern/MOD_shrinkwrap.c +++ b/source/blender/modifiers/intern/MOD_shrinkwrap.c @@ -126,7 +126,7 @@ static void deformVertsEM( Mesh *mesh_src = mesh; if (mesh_src == NULL) { - mesh_src = BKE_bmesh_to_mesh_nomain(editData->bm, &(struct BMeshToMeshParams){0}); + mesh_src = BKE_mesh_from_bmesh_for_eval_nomain(editData->bm, 0); } BLI_assert(mesh_src->totvert == numVerts); diff --git a/source/blender/modifiers/intern/MOD_skin.c b/source/blender/modifiers/intern/MOD_skin.c index 31d556292f8..9e557b456d3 100644 --- a/source/blender/modifiers/intern/MOD_skin.c +++ b/source/blender/modifiers/intern/MOD_skin.c @@ -1880,7 +1880,7 @@ static Mesh *base_skin(Mesh *origmesh, if (!bm) return NULL; - result = BKE_bmesh_to_mesh_nomain(bm, &(struct BMeshToMeshParams){0}); + result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0); BM_mesh_free(bm); result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; diff --git a/source/blender/modifiers/intern/MOD_smooth.c b/source/blender/modifiers/intern/MOD_smooth.c index 29508524f9c..87e40f86b95 100644 --- a/source/blender/modifiers/intern/MOD_smooth.c +++ b/source/blender/modifiers/intern/MOD_smooth.c @@ -232,7 +232,7 @@ static void deformVertsEM( Mesh *mesh_src = mesh; if (mesh_src == NULL) { - mesh_src = BKE_bmesh_to_mesh_nomain(editData->bm, &(struct BMeshToMeshParams){0}); + mesh_src = BKE_mesh_from_bmesh_for_eval_nomain(editData->bm, 0); } BLI_assert(mesh_src->totvert == numVerts); diff --git a/source/blender/modifiers/intern/MOD_triangulate.c b/source/blender/modifiers/intern/MOD_triangulate.c index d845246e1a1..6c38d208c02 100644 --- a/source/blender/modifiers/intern/MOD_triangulate.c +++ b/source/blender/modifiers/intern/MOD_triangulate.c @@ -53,7 +53,7 @@ static Mesh *triangulate_mesh(Mesh *mesh, const int quad_method, const int ngon_ BM_mesh_triangulate(bm, quad_method, ngon_method, false, NULL, NULL, NULL); - result = BKE_bmesh_to_mesh_nomain(bm, &((struct BMeshToMeshParams){0})); + result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0); BM_mesh_free(bm); total_edges = result->totedge; diff --git a/source/blender/modifiers/intern/MOD_util.c b/source/blender/modifiers/intern/MOD_util.c index 466e0b89a8a..d156f119eec 100644 --- a/source/blender/modifiers/intern/MOD_util.c +++ b/source/blender/modifiers/intern/MOD_util.c @@ -177,7 +177,7 @@ Mesh *MOD_get_mesh_eval( } else if (ob->type == OB_MESH) { if (em) { - mesh = BKE_bmesh_to_mesh_nomain(em->bm, &(struct BMeshToMeshParams){0}); + mesh = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, 0); } else { /* TODO(sybren): after modifier conversion of DM to Mesh is done, check whether diff --git a/source/blender/modifiers/intern/MOD_warp.c b/source/blender/modifiers/intern/MOD_warp.c index a8f305bcc13..0329300630a 100644 --- a/source/blender/modifiers/intern/MOD_warp.c +++ b/source/blender/modifiers/intern/MOD_warp.c @@ -332,7 +332,7 @@ static void deformVertsEM( Mesh *mesh_src = mesh; if (mesh_src == NULL) { - mesh_src = BKE_bmesh_to_mesh_nomain(em->bm, &(struct BMeshToMeshParams){0}); + mesh_src = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, 0); } BLI_assert(mesh_src->totvert == numVerts); diff --git a/source/blender/modifiers/intern/MOD_wireframe.c b/source/blender/modifiers/intern/MOD_wireframe.c index cc846d08040..15e26fb5c2e 100644 --- a/source/blender/modifiers/intern/MOD_wireframe.c +++ b/source/blender/modifiers/intern/MOD_wireframe.c @@ -93,7 +93,7 @@ static Mesh *WireframeModifier_do(WireframeModifierData *wmd, Object *ob, Mesh * MAX2(ob->totcol - 1, 0), false); - result = BKE_bmesh_to_mesh_nomain(bm, &(struct BMeshToMeshParams){0}); + result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0); BM_mesh_free(bm); result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; diff --git a/source/blender/python/bmesh/bmesh_py_api.c b/source/blender/python/bmesh/bmesh_py_api.c index 7669f7eb1fd..235ede1e8fd 100644 --- a/source/blender/python/bmesh/bmesh_py_api.c +++ b/source/blender/python/bmesh/bmesh_py_api.c @@ -113,30 +113,30 @@ static PyObject *bpy_bm_from_edit_mesh(PyObject *UNUSED(self), PyObject *value) } PyDoc_STRVAR(bpy_bm_update_edit_mesh_doc, -".. method:: update_edit_mesh(mesh, tessface=True, destructive=True)\n" +".. method:: update_edit_mesh(mesh, loop_triangles=True, destructive=True)\n" "\n" " Update the mesh after changes to the BMesh in editmode, \n" " optionally recalculating n-gon tessellation.\n" "\n" " :arg mesh: The editmode mesh.\n" " :type mesh: :class:`bpy.types.Mesh`\n" -" :arg tessface: Option to recalculate n-gon tessellation.\n" -" :type tessface: boolean\n" +" :arg loop_triangles: Option to recalculate n-gon tessellation.\n" +" :type loop_triangles: boolean\n" " :arg destructive: Use when geometry has been added or removed.\n" " :type destructive: boolean\n" ); static PyObject *bpy_bm_update_edit_mesh(PyObject *UNUSED(self), PyObject *args, PyObject *kw) { - static const char *kwlist[] = {"mesh", "tessface", "destructive", NULL}; + static const char *kwlist[] = {"mesh", "loop_triangles", "destructive", NULL}; PyObject *py_me; Mesh *me; - bool do_tessface = true; + bool do_loop_triangles = true; bool is_destructive = true; if (!PyArg_ParseTupleAndKeywords( args, kw, "O|O&O&:update_edit_mesh", (char **)kwlist, &py_me, - PyC_ParseBool, &do_tessface, + PyC_ParseBool, &do_loop_triangles, PyC_ParseBool, &is_destructive)) { return NULL; @@ -157,7 +157,7 @@ static PyObject *bpy_bm_update_edit_mesh(PyObject *UNUSED(self), PyObject *args, { extern void EDBM_update_generic(BMEditMesh *em, const bool do_tessface, const bool is_destructive); - EDBM_update_generic(me->edit_btmesh, do_tessface, is_destructive); + EDBM_update_generic(me->edit_btmesh, do_loop_triangles, is_destructive); } Py_RETURN_NONE; @@ -203,21 +203,17 @@ PyObject *BPyInit_bmesh(void) /* bmesh.types */ PyModule_AddObject(mod, "types", (submodule = BPyInit_bmesh_types())); PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); - Py_INCREF(submodule); /* bmesh.ops (not a real module, exposes module like access). */ PyModule_AddObject(mod, "ops", (submodule = BPyInit_bmesh_ops())); /* PyDict_SetItemString(sys_modules, PyModule_GetNameObject(submodule), submodule); */ PyDict_SetItemString(sys_modules, "bmesh.ops", submodule); /* fake module */ - Py_INCREF(submodule); PyModule_AddObject(mod, "utils", (submodule = BPyInit_bmesh_utils())); PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); - Py_INCREF(submodule); PyModule_AddObject(mod, "geometry", (submodule = BPyInit_bmesh_geometry())); PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); - Py_INCREF(submodule); return mod; } diff --git a/source/blender/python/bmesh/bmesh_py_types.c b/source/blender/python/bmesh/bmesh_py_types.c index b380fbd416e..3ce5a26de90 100644 --- a/source/blender/python/bmesh/bmesh_py_types.c +++ b/source/blender/python/bmesh/bmesh_py_types.c @@ -1246,15 +1246,15 @@ static PyObject *bpy_bmesh_calc_volume(BPy_BMElem *self, PyObject *args, PyObjec } } -PyDoc_STRVAR(bpy_bmesh_calc_tessface_doc, -".. method:: calc_tessface()\n" +PyDoc_STRVAR(bpy_bmesh_calc_loop_triangles_doc, +".. method:: calc_loop_triangles()\n" "\n" " Calculate triangle tessellation from quads/ngons.\n" "\n" " :return: The triangulated faces.\n" " :rtype: list of :class:`BMLoop` tuples\n" ); -static PyObject *bpy_bmesh_calc_tessface(BPy_BMElem *self) +static PyObject *bpy_bmesh_calc_loop_triangles(BPy_BMElem *self) { BMesh *bm; @@ -2733,7 +2733,7 @@ static struct PyMethodDef bpy_bmesh_methods[] = { /* calculations */ {"calc_volume", (PyCFunction)bpy_bmesh_calc_volume, METH_VARARGS | METH_KEYWORDS, bpy_bmesh_calc_volume_doc}, - {"calc_tessface", (PyCFunction)bpy_bmesh_calc_tessface, METH_NOARGS, bpy_bmesh_calc_tessface_doc}, + {"calc_loop_triangles", (PyCFunction)bpy_bmesh_calc_loop_triangles, METH_NOARGS, bpy_bmesh_calc_loop_triangles_doc}, {NULL, NULL, 0, NULL} }; diff --git a/source/blender/python/generic/bgl.c b/source/blender/python/generic/bgl.c index a89525d942f..6e1c28e1310 100644 --- a/source/blender/python/generic/bgl.c +++ b/source/blender/python/generic/bgl.c @@ -480,14 +480,16 @@ int BGL_typeSize(int type) static int gl_buffer_type_from_py_buffer(Py_buffer *pybuffer) { - const char format = PyC_Formatstr_get(pybuffer->format); + const char format = PyC_StructFmt_type_from_str(pybuffer->format); Py_ssize_t itemsize = pybuffer->itemsize; - if (PyC_Formatstr_is_float(format)) { + if (PyC_StructFmt_type_is_float_any(format)) { if (itemsize == 4) return GL_FLOAT; if (itemsize == 8) return GL_DOUBLE; } - if (PyC_Formatstr_is_byte(format) || PyC_Formatstr_is_int(format)) { + if (PyC_StructFmt_type_is_byte(format) || + PyC_StructFmt_type_is_int_any(format)) + { if (itemsize == 1) return GL_BYTE; if (itemsize == 2) return GL_SHORT; if (itemsize == 4) return GL_INT; diff --git a/source/blender/python/generic/idprop_py_api.c b/source/blender/python/generic/idprop_py_api.c index 918ec8fa018..072c11b14e5 100644 --- a/source/blender/python/generic/idprop_py_api.c +++ b/source/blender/python/generic/idprop_py_api.c @@ -422,11 +422,18 @@ static IDProperty *idp_from_PyBytes(const char *name, PyObject *ob) return IDP_New(IDP_STRING, &val, name); } -static int idp_array_type_from_format_char(char format) +static int idp_array_type_from_formatstr_and_size(const char *typestr, Py_ssize_t itemsize) { - if (format == 'i') return IDP_INT; - if (format == 'f') return IDP_FLOAT; - if (format == 'd') return IDP_DOUBLE; + char format = PyC_StructFmt_type_from_str(typestr); + + if (PyC_StructFmt_type_is_float_any(format)) { + if (itemsize == 4) return IDP_FLOAT; + if (itemsize == 8) return IDP_DOUBLE; + } + if (PyC_StructFmt_type_is_int_any(format)) { + if (itemsize == 4) return IDP_INT; + } + return -1; } @@ -443,13 +450,13 @@ static IDProperty *idp_from_PySequence_Buffer(const char *name, Py_buffer *buffe IDProperty *prop; IDPropertyTemplate val = {0}; - int format = idp_array_type_from_format_char(*buffer->format); - if (format == -1) { + int id_type = idp_array_type_from_formatstr_and_size(buffer->format, buffer->itemsize); + if (id_type == -1) { /* should never happen as the type has been checked before */ return NULL; } else { - val.array.type = format; + val.array.type = id_type; val.array.len = buffer->len / buffer->itemsize; } prop = IDP_New(IDP_ARRAY, &val, name); @@ -533,8 +540,10 @@ static IDProperty *idp_from_PySequence(const char *name, PyObject *ob) if (PyObject_CheckBuffer(ob)) { PyObject_GetBuffer(ob, &buffer, PyBUF_SIMPLE | PyBUF_FORMAT); - char format = *buffer.format; - if (ELEM(format, 'i', 'f', 'd')) { + char format = PyC_StructFmt_type_from_str(buffer.format); + if (PyC_StructFmt_type_is_float_any(format) || + (PyC_StructFmt_type_is_int_any(format) && buffer.itemsize == 4)) + { use_buffer = true; } else { @@ -1802,7 +1811,6 @@ PyObject *BPyInit_idprop(void) /* idprop.types */ PyModule_AddObject(mod, "types", (submodule = BPyInit_idprop_types())); PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); - Py_INCREF(submodule); return mod; } diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c index 62b24618d3f..991a035f683 100644 --- a/source/blender/python/generic/py_capi_utils.c +++ b/source/blender/python/generic/py_capi_utils.c @@ -1327,6 +1327,84 @@ uint32_t PyC_Long_AsU32(PyObject *value) * PyC_Long_AsU64 */ +/* -------------------------------------------------------------------- */ + +/** \name Py_buffer Utils + * + * \{ */ + +char PyC_StructFmt_type_from_str(const char *typestr) +{ + switch (typestr[0]) { + case '!': + case '<': + case '=': + case '>': + case '@': + return typestr[1]; + default: + return typestr[0]; + } +} + +bool PyC_StructFmt_type_is_float_any(char format) +{ + switch (format) { + case 'f': + case 'd': + case 'e': + return true; + default: + return false; + } +} + +bool PyC_StructFmt_type_is_int_any(char format) +{ + switch (format) { + case 'i': + case 'I': + case 'l': + case 'L': + case 'h': + case 'H': + case 'b': + case 'B': + case 'q': + case 'Q': + case 'n': + case 'N': + case 'P': + return true; + default: + return false; + } +} + +bool PyC_StructFmt_type_is_byte(char format) +{ + switch (format) { + case 'c': + case 's': + case 'p': + return true; + default: + return false; + } +} + +bool PyC_StructFmt_type_is_bool(char format) +{ + switch (format) { + case '?': + return true; + default: + return false; + } +} + +/** \} */ + #ifdef __GNUC__ # pragma warning(pop) #endif diff --git a/source/blender/python/generic/py_capi_utils.h b/source/blender/python/generic/py_capi_utils.h index 609f8dc1bed..21e4ecf2e86 100644 --- a/source/blender/python/generic/py_capi_utils.h +++ b/source/blender/python/generic/py_capi_utils.h @@ -30,19 +30,19 @@ #include "BLI_sys_types.h" #include "BLI_utildefines_variadic.h" -void PyC_ObSpit(const char *name, PyObject *var); -void PyC_ObSpitStr(char *result, size_t result_len, PyObject *var); -void PyC_LineSpit(void); -void PyC_StackSpit(void); -PyObject * PyC_ExceptionBuffer(void); -PyObject * PyC_ExceptionBuffer_Simple(void); -PyObject * PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...); -PyObject * PyC_FrozenSetFromStrings(const char **strings); -PyObject * PyC_Err_Format_Prefix(PyObject *exception_type_prefix, const char *format, ...); -void PyC_Err_PrintWithFunc(PyObject *py_func); - -void PyC_FileAndNum(const char **filename, int *lineno); -void PyC_FileAndNum_Safe(const char **filename, int *lineno); /* checks python is running */ +void PyC_ObSpit(const char *name, PyObject *var); +void PyC_ObSpitStr(char *result, size_t result_len, PyObject *var); +void PyC_LineSpit(void); +void PyC_StackSpit(void); +PyObject *PyC_ExceptionBuffer(void); +PyObject *PyC_ExceptionBuffer_Simple(void); +PyObject *PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...); +PyObject *PyC_FrozenSetFromStrings(const char **strings); +PyObject *PyC_Err_Format_Prefix(PyObject *exception_type_prefix, const char *format, ...); +void PyC_Err_PrintWithFunc(PyObject *py_func); + +void PyC_FileAndNum(const char **filename, int *lineno); +void PyC_FileAndNum_Safe(const char **filename, int *lineno); /* checks python is running */ int PyC_AsArray_FAST( void *array, PyObject *value_fast, const Py_ssize_t length, const PyTypeObject *type, const bool is_double, const char *error_prefix); @@ -71,10 +71,10 @@ void PyC_Tuple_Fill(PyObject *tuple, PyObject *value); void PyC_List_Fill(PyObject *list, PyObject *value); /* follow http://www.python.org/dev/peps/pep-0383/ */ -PyObject * PyC_UnicodeFromByte(const char *str); -PyObject * PyC_UnicodeFromByteAndSize(const char *str, Py_ssize_t size); -const char * PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce); /* coerce must be NULL */ -const char * PyC_UnicodeAsByteAndSize(PyObject *py_str, Py_ssize_t *size, PyObject **coerce); +PyObject *PyC_UnicodeFromByte(const char *str); +PyObject *PyC_UnicodeFromByteAndSize(const char *str, Py_ssize_t size); +const char *PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce); /* coerce must be NULL */ +const char *PyC_UnicodeAsByteAndSize(PyObject *py_str, Py_ssize_t *size, PyObject **coerce); /* name namespace function for bpy */ PyObject *PyC_DefaultNameSpace(const char *filename); @@ -132,74 +132,10 @@ Py_LOCAL_INLINE(int64_t) PyC_Long_AsI64(PyObject *value) { return (int64_t)PyLo Py_LOCAL_INLINE(uint64_t) PyC_Long_AsU64(PyObject *value) { return (uint64_t)PyLong_AsUnsignedLongLong(value); } /* utils for format string in `struct` module style syntax */ -Py_LOCAL_INLINE(char) PyC_Formatstr_get(const char *typestr) -{ - switch (typestr[0]) { - case '!': - case '<': - case '=': - case '>': - case '@': - return typestr[1]; - default: - return typestr[0]; - } -} - -Py_LOCAL_INLINE(bool) PyC_Formatstr_is_float(char format) -{ - switch (format) { - case 'f': - case 'd': - case 'e': - return true; - default: - return false; - } -} - -Py_LOCAL_INLINE(bool) PyC_Formatstr_is_int(char format) -{ - switch (format) { - case 'i': - case 'I': - case 'l': - case 'L': - case 'h': - case 'H': - case 'b': - case 'B': - case 'q': - case 'Q': - case 'n': - case 'N': - case 'P': - return true; - default: - return false; - } -} - -Py_LOCAL_INLINE(bool) PyC_Formatstr_is_byte(char format) -{ - switch (format) { - case 'c': - case 's': - case 'p': - return true; - default: - return false; - } -} - -Py_LOCAL_INLINE(bool) PyC_Formatstr_is_bool(char format) -{ - switch (format) { - case '?': - return true; - default: - return false; - } -} +char PyC_StructFmt_type_from_str(const char *typestr); +bool PyC_StructFmt_type_is_float_any(char format); +bool PyC_StructFmt_type_is_int_any(char format); +bool PyC_StructFmt_type_is_byte(char format); +bool PyC_StructFmt_type_is_bool(char format); #endif /* __PY_CAPI_UTILS_H__ */ diff --git a/source/blender/python/gpu/gpu_py_api.c b/source/blender/python/gpu/gpu_py_api.c index 8f22a287463..b75e63dbecc 100644 --- a/source/blender/python/gpu/gpu_py_api.c +++ b/source/blender/python/gpu/gpu_py_api.c @@ -63,7 +63,6 @@ static struct PyModuleDef GPU_module_def = { PyObject *BPyInit_gpu(void) { PyObject *sys_modules = PyImport_GetModuleDict(); - PyObject *subsubmodule; PyObject *submodule; PyObject *mod; @@ -71,23 +70,15 @@ PyObject *BPyInit_gpu(void) PyModule_AddObject(mod, "types", (submodule = BPyInit_gpu_types())); PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); - Py_INCREF(submodule); PyModule_AddObject(mod, "matrix", (submodule = BPyInit_gpu_matrix())); PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); - Py_INCREF(submodule); PyModule_AddObject(mod, "select", (submodule = BPyInit_gpu_select())); PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); - Py_INCREF(submodule); PyModule_AddObject(mod, "shader", (submodule = BPyInit_gpu_shader())); PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); - Py_INCREF(submodule); - - PyModule_AddObject(submodule, "builtin", (subsubmodule = BPyInit_gpu_shader_builtin())); - PyDict_SetItem(sys_modules, PyModule_GetNameObject(subsubmodule), subsubmodule); - Py_INCREF(subsubmodule); return mod; } diff --git a/source/blender/python/gpu/gpu_py_element.c b/source/blender/python/gpu/gpu_py_element.c index 379cd0836ca..10d6970e9e8 100644 --- a/source/blender/python/gpu/gpu_py_element.c +++ b/source/blender/python/gpu/gpu_py_element.c @@ -47,6 +47,7 @@ static PyObject *bpygpu_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds) { + const char *error_prefix = "IndexBuf.__new__"; bool ok = true; struct { @@ -92,7 +93,7 @@ static PyObject *bpygpu_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args, } if (pybuffer.itemsize != 4 || - PyC_Formatstr_is_float(PyC_Formatstr_get(pybuffer.format))) + PyC_StructFmt_type_is_float_any(PyC_StructFmt_type_from_str(pybuffer.format))) { PyErr_Format(PyExc_ValueError, "Each index must be an 4-bytes integer value"); @@ -122,8 +123,7 @@ static PyObject *bpygpu_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyBuffer_Release(&pybuffer); } else { - PyObject *seq_fast = PySequence_Fast( - params.seq, "Index Buffer Initialization"); + PyObject *seq_fast = PySequence_Fast(params.seq, error_prefix); if (seq_fast == NULL) { return false; @@ -148,28 +148,27 @@ static PyObject *bpygpu_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args, } } else { + int values[4]; for (uint i = 0; i < seq_len; i++) { - PyObject *item = seq_items[i]; - if (!PyTuple_CheckExact(item)) { - PyErr_Format(PyExc_ValueError, - "expected a tuple, got %s", - Py_TYPE(item)->tp_name); - ok = false; - goto finally; - } - if (PyTuple_GET_SIZE(item) != verts_per_prim) { - PyErr_Format(PyExc_ValueError, - "Expected a Tuple of size %d, got %d", - PyTuple_GET_SIZE(item)); + PyObject *seq_fast_item = PySequence_Fast(seq_items[i], error_prefix); + if (seq_fast_item == NULL) { + PyErr_Format(PyExc_TypeError, + "%s: expected a sequence, got %s", + error_prefix, Py_TYPE(seq_items[i])->tp_name); ok = false; goto finally; } - for (uint j = 0; j < verts_per_prim; j++) { - GPU_indexbuf_add_generic_vert( - &builder, - PyC_Long_AsU32(PyTuple_GET_ITEM(item, j))); + ok = PyC_AsArray_FAST( + values, seq_fast_item, verts_per_prim, + &PyLong_Type, false, error_prefix) == 0; + + if (ok) { + for (uint j = 0; j < verts_per_prim; j++) { + GPU_indexbuf_add_generic_vert(&builder, values[j]); + } } + Py_DECREF(seq_fast_item); } } diff --git a/source/blender/python/gpu/gpu_py_shader.c b/source/blender/python/gpu/gpu_py_shader.c index 64b208ed49f..de19e8ab0cf 100644 --- a/source/blender/python/gpu/gpu_py_shader.c +++ b/source/blender/python/gpu/gpu_py_shader.c @@ -36,6 +36,7 @@ #include "../generic/python_utildefines.h" #include "gpu_py_shader.h" /* own include */ +#include "gpu_py_vertex_format.h" /* -------------------------------------------------------------------- */ @@ -43,45 +44,53 @@ /** \name Enum Conversion. * \{ */ -static void bpygpu_shader_add_enum_objects(PyObject *submodule) +static int bpygpu_ParseBultinShaderEnum(PyObject *o, void *p) { -#define ADDCONST(x) PyModule_AddIntConstant(submodule, #x, x) - - /* Shaders */ - ADDCONST(GPU_SHADER_2D_UNIFORM_COLOR); - ADDCONST(GPU_SHADER_2D_FLAT_COLOR); - ADDCONST(GPU_SHADER_2D_SMOOTH_COLOR); - ADDCONST(GPU_SHADER_2D_IMAGE); - ADDCONST(GPU_SHADER_3D_UNIFORM_COLOR); - ADDCONST(GPU_SHADER_3D_FLAT_COLOR); - ADDCONST(GPU_SHADER_3D_SMOOTH_COLOR); - -#undef ADDCONST + Py_ssize_t mode_id_len; + const char *mode_id = _PyUnicode_AsStringAndSize(o, &mode_id_len); + if (mode_id == NULL) { + PyErr_Format(PyExc_ValueError, + "expected a string, got %s", + Py_TYPE(o)->tp_name); + return 0; + } +#define MATCH_ID(id) \ + if (mode_id_len == (Py_ssize_t)strlen(STRINGIFY(id))) { \ + if (STREQ(mode_id, STRINGIFY(id))) { \ + mode = GPU_SHADER_##id; \ + goto success; \ + } \ + } ((void)0) + + GPUBuiltinShader mode; + MATCH_ID(2D_UNIFORM_COLOR); + MATCH_ID(2D_FLAT_COLOR); + MATCH_ID(2D_SMOOTH_COLOR); + MATCH_ID(2D_IMAGE); + MATCH_ID(3D_UNIFORM_COLOR); + MATCH_ID(3D_FLAT_COLOR); + MATCH_ID(3D_SMOOTH_COLOR); + +#undef MATCH_ID + PyErr_Format(PyExc_ValueError, + "unknown type literal: '%s'", + mode_id); + return 0; + +success: + (*(GPUBuiltinShader *)p) = mode; + return 1; } -static int bpygpu_pyLong_as_shader_enum(PyObject *o) +static int bpygpu_uniform_location_get(GPUShader *shader, const char *name, const char *error_prefix) { - uint id = (uint)PyLong_AsUnsignedLong(o); + int uniform = GPU_shader_get_uniform(shader, name); - if (id >= GPU_NUM_BUILTIN_SHADERS) { - PyErr_SetString(PyExc_ValueError, - "not a builtin shader identifier"); - return -1; - } - - return (int)id; -} - -static int bpygpu_uniform_location_get(const GPUShaderInterface *shaderface, const char *name) -{ - const GPUShaderInput *uniform = GPU_shaderinterface_uniform(shaderface, name); - - if (uniform == NULL) { - PyErr_SetString(PyExc_ValueError, "uniform not found"); - return -1; + if (uniform == -1) { + PyErr_Format(PyExc_ValueError, "%s: uniform %.32s %.32s not found", error_prefix, name); } - return uniform->location; + return uniform; } /** \} */ @@ -190,11 +199,10 @@ static PyObject *bpygpu_shader_uniform_from_name( return NULL; } - int uniform = GPU_shader_get_uniform(self->shader, name); + int uniform = bpygpu_uniform_location_get( + self->shader, name, "GPUShader.get_uniform"); if (uniform == -1) { - PyErr_SetString(PyExc_SyntaxError, - "GPUShader.get_uniform: uniform not found."); return NULL; } @@ -222,8 +230,8 @@ static PyObject *bpygpu_shader_uniform_block_from_name( int uniform = GPU_shader_get_uniform_block(self->shader, name); if (uniform == -1) { - PyErr_SetString(PyExc_SyntaxError, - "GPUShader.get_uniform_block: uniform not found"); + PyErr_Format(PyExc_ValueError, + "GPUShader.get_uniform_block: uniform %.32s not found", name); return NULL; } @@ -391,7 +399,9 @@ static PyObject *bpygpu_shader_uniform_bool( return NULL; } - const int location = bpygpu_uniform_location_get(GPU_shader_get_interface(self->shader), params.id); + const int location = bpygpu_uniform_location_get( + self->shader, params.id, error_prefix); + if (location == -1) { return NULL; } @@ -462,7 +472,9 @@ static PyObject *bpygpu_shader_uniform_float( return NULL; } - const int location = bpygpu_uniform_location_get(GPU_shader_get_interface(self->shader), params.id); + const int location = bpygpu_uniform_location_get( + self->shader, params.id, error_prefix); + if (location == -1) { return NULL; } @@ -530,7 +542,9 @@ static PyObject *bpygpu_shader_uniform_int( return NULL; } - const int location = bpygpu_uniform_location_get(GPU_shader_get_interface(self->shader), params.id); + const int location = bpygpu_uniform_location_get( + self->shader, params.id, error_prefix); + if (location == -1) { return NULL; } @@ -561,14 +575,29 @@ static PyObject *bpygpu_shader_attr_from_name( int attrib = GPU_shader_get_attribute(self->shader, name); if (attrib == -1) { - PyErr_SetString(PyExc_SyntaxError, - "GPUShader.attr_from_name: attribute not found."); + PyErr_Format(PyExc_ValueError, + "GPUShader.attr_from_name: attribute %.32s not found", name); return NULL; } return PyLong_FromLong(attrib); } +PyDoc_STRVAR(bpygpu_shader_calc_format_doc, +".. method:: calc_format()\n" +"\n" +" Build a new format based on the attributes of the shader.\n" +"\n" +" :return: vertex attribute format for the shader\n" +" :rtype: GPUVertFormat\n" +); +static PyObject *bpygpu_shader_calc_format(BPyGPUShader *self, PyObject *UNUSED(arg)) +{ + BPyGPUVertFormat *ret = (BPyGPUVertFormat *)BPyGPUVertFormat_CreatePyObject(NULL); + GPU_vertformat_from_interface(&ret->fmt, GPU_shader_get_interface(self->shader)); + return (PyObject *)ret; +} + static struct PyMethodDef bpygpu_shader_methods[] = { {"bind", (PyCFunction)bpygpu_shader_bind, METH_NOARGS, bpygpu_shader_bind_doc}, @@ -602,6 +631,9 @@ static struct PyMethodDef bpygpu_shader_methods[] = { {"attr_from_name", (PyCFunction)bpygpu_shader_attr_from_name, METH_O, bpygpu_shader_attr_from_name_doc}, + {"format_calc", + (PyCFunction)bpygpu_shader_calc_format, + METH_NOARGS, bpygpu_shader_calc_format_doc}, {NULL, NULL, 0, NULL} }; @@ -697,15 +729,23 @@ static PyObject *bpygpu_shader_unbind(BPyGPUShader *UNUSED(self)) } PyDoc_STRVAR(bpygpu_shader_from_builtin_doc, -".. function:: shader_from_builtin(shader_id)\n" -"\n" -" :param shader_id: shader identifier.\n" -" :type shader_id: int\n" +".. function:: shader_from_builtin(shader_name)\n" +"\n" +" :param shader_name: One of these builtin shader names: {\n" +" '2D_UNIFORM_COLOR',\n" +" '2D_FLAT_COLOR',\n" +" '2D_SMOOTH_COLOR',\n" +" '2D_IMAGE',\n" +" '3D_UNIFORM_COLOR',\n" +" '3D_FLAT_COLOR',\n" +" '3D_SMOOTH_COLOR'}\n" +" :type shader_name: str\n" ); static PyObject *bpygpu_shader_from_builtin(PyObject *UNUSED(self), PyObject *arg) { - int shader_id = bpygpu_pyLong_as_shader_enum(arg); - if (shader_id == -1) { + GPUBuiltinShader shader_id; + + if (!bpygpu_ParseBultinShaderEnum(arg, &shader_id)) { return NULL; } @@ -715,15 +755,24 @@ static PyObject *bpygpu_shader_from_builtin(PyObject *UNUSED(self), PyObject *ar } PyDoc_STRVAR(bpygpu_shader_code_from_builtin_doc, -".. function:: shader_code_from_builtin(shader_id)\n" -"\n" -" :param shader_id: shader identifier.\n" -" :type shader_id: int\n" +".. function:: shader_code_from_builtin(shader_name)\n" +"\n" +" :param shader_name: One of these builtin shader names: {\n" +" '2D_UNIFORM_COLOR',\n" +" '2D_FLAT_COLOR',\n" +" '2D_SMOOTH_COLOR',\n" +" '2D_IMAGE',\n" +" '3D_UNIFORM_COLOR',\n" +" '3D_FLAT_COLOR',\n" +" '3D_SMOOTH_COLOR'}\n" +" :type shader_name: str\n" " :return: vertex, fragment and geometry shader codes.\n" " :rtype: dict\n" ); static PyObject *bpygpu_shader_code_from_builtin(BPyGPUShader *UNUSED(self), PyObject *arg) { + GPUBuiltinShader shader_id; + const char *vert; const char *frag; const char *geom; @@ -731,8 +780,7 @@ static PyObject *bpygpu_shader_code_from_builtin(BPyGPUShader *UNUSED(self), PyO PyObject *item, *r_dict; - int shader_id = bpygpu_pyLong_as_shader_enum(arg); - if (shader_id == -1) { + if (!bpygpu_ParseBultinShaderEnum(arg, &shader_id)) { return NULL; } @@ -786,23 +834,6 @@ static PyModuleDef BPyGPU_shader_module_def = { /* -------------------------------------------------------------------- */ -/** \name gpu.shader.buitin Module API - * \{ */ - -PyDoc_STRVAR(bpygpu_shader_builtin_module_doc, -"This module contains integers that identify the built-in shader ids." -); -static PyModuleDef BPyGPU_shader_builtin_module_def = { - PyModuleDef_HEAD_INIT, - .m_name = "gpu.shader.builtin", - .m_doc = bpygpu_shader_builtin_module_doc, -}; - -/** \} */ - - -/* -------------------------------------------------------------------- */ - /** \name Public API * \{ */ @@ -826,14 +857,4 @@ PyObject *BPyInit_gpu_shader(void) return submodule; } -PyObject *BPyInit_gpu_shader_builtin(void) -{ - PyObject *submodule; - - submodule = PyModule_Create(&BPyGPU_shader_builtin_module_def); - bpygpu_shader_add_enum_objects(submodule); - - return submodule; -} - /** \} */ diff --git a/source/blender/python/gpu/gpu_py_shader.h b/source/blender/python/gpu/gpu_py_shader.h index 4460fb1ccc7..c038cf63e40 100644 --- a/source/blender/python/gpu/gpu_py_shader.h +++ b/source/blender/python/gpu/gpu_py_shader.h @@ -37,6 +37,5 @@ typedef struct BPyGPUShader { PyObject *BPyGPUShader_CreatePyObject(struct GPUShader *shader, bool is_builtin); PyObject *BPyInit_gpu_shader(void); -PyObject *BPyInit_gpu_shader_builtin(void); #endif /* __GPU_PY_SHADER_H__ */ diff --git a/source/blender/python/gpu/gpu_py_vertex_buffer.c b/source/blender/python/gpu/gpu_py_vertex_buffer.c index 0282154d681..0814e0586c9 100644 --- a/source/blender/python/gpu/gpu_py_vertex_buffer.c +++ b/source/blender/python/gpu/gpu_py_vertex_buffer.c @@ -72,9 +72,10 @@ static void fill_format_elem(void *data_dst_void, PyObject *py_src, const GPUVer } /* No error checking, callers must run PyErr_Occurred */ -static void fill_format_tuple(void *data_dst_void, PyObject *py_src, const GPUVertAttr *attr) +static void fill_format_sequence(void *data_dst_void, PyObject *py_seq_fast, const GPUVertAttr *attr) { const uint len = attr->comp_len; + PyObject **value_fast_items = PySequence_Fast_ITEMS(py_seq_fast); /** * Args are constants, so range checks will be optimized out if they're nop's. @@ -82,7 +83,7 @@ static void fill_format_tuple(void *data_dst_void, PyObject *py_src, const GPUVe #define PY_AS_NATIVE(ty_dst, py_as_native) \ ty_dst *data_dst = data_dst_void; \ for (uint i = 0; i < len; i++) { \ - data_dst[i] = py_as_native(PyTuple_GET_ITEM(py_src, i)); \ + data_dst[i] = py_as_native(value_fast_items[i]); \ } ((void)0) PY_AS_NATIVE_SWITCH(attr); @@ -96,7 +97,7 @@ static void fill_format_tuple(void *data_dst_void, PyObject *py_src, const GPUVe static bool bpygpu_vertbuf_fill_impl( GPUVertBuf *vbo, - uint data_id, PyObject *seq) + uint data_id, PyObject *seq, const char *error_prefix) { const char *exc_str_size_mismatch = "Expected a %s of size %d, got %u"; @@ -157,23 +158,23 @@ static bool bpygpu_vertbuf_fill_impl( else { for (uint i = 0; i < seq_len; i++) { uchar *data = (uchar *)GPU_vertbuf_raw_step(&data_step); - PyObject *item = seq_items[i]; - if (!PyTuple_CheckExact(item)) { - PyErr_Format(PyExc_ValueError, - "expected a tuple, got %s", - Py_TYPE(item)->tp_name); + PyObject *seq_fast_item = PySequence_Fast(seq_items[i], error_prefix); + + if (seq_fast_item == NULL) { ok = false; goto finally; } - if (PyTuple_GET_SIZE(item) != attr->comp_len) { + if (PySequence_Fast_GET_SIZE(seq_fast_item) != attr->comp_len) { PyErr_Format(PyExc_ValueError, exc_str_size_mismatch, - "tuple", attr->comp_len, PyTuple_GET_SIZE(item)); + "sequence", attr->comp_len, PySequence_Fast_GET_SIZE(seq_fast_item)); ok = false; + Py_DECREF(seq_fast_item); goto finally; } /* May trigger error, check below */ - fill_format_tuple(data, item, attr); + fill_format_sequence(data, seq_fast_item, attr); + Py_DECREF(seq_fast_item); } } @@ -188,7 +189,7 @@ finally: return ok; } -static int bpygpu_fill_attribute(GPUVertBuf *buf, int id, PyObject *py_seq_data) +static int bpygpu_fill_attribute(GPUVertBuf *buf, int id, PyObject *py_seq_data, const char *error_prefix) { if (id < 0 || id >= buf->format.attr_len) { PyErr_Format(PyExc_ValueError, @@ -203,7 +204,7 @@ static int bpygpu_fill_attribute(GPUVertBuf *buf, int id, PyObject *py_seq_data) return 0; } - if (!bpygpu_vertbuf_fill_impl(buf, (uint)id, py_seq_data)) { + if (!bpygpu_vertbuf_fill_impl(buf, (uint)id, py_seq_data, error_prefix)) { return 0; } @@ -309,7 +310,7 @@ static PyObject *bpygpu_VertBuf_fill_attribute(BPyGPUVertBuf *self, PyObject *ar } - if (!bpygpu_fill_attribute(self->buf, id, data)) { + if (!bpygpu_fill_attribute(self->buf, id, data, "GPUVertBuf.fill_attribute")) { return NULL; } diff --git a/source/blender/python/gpu/gpu_py_vertex_format.c b/source/blender/python/gpu/gpu_py_vertex_format.c index 65d41a7baf1..d42bb557cd9 100644 --- a/source/blender/python/gpu/gpu_py_vertex_format.c +++ b/source/blender/python/gpu/gpu_py_vertex_format.c @@ -160,36 +160,38 @@ static int get_default_fetch_mode(GPUVertCompType type) /** \name VertFormat Type * \{ */ -static int add_attribute_simple(GPUVertFormat *format, char *name, GPUVertCompType comp_type, int length) +static bool bpygpu_vertformat_attr_add_simple( + GPUVertFormat *format, const char *name, GPUVertCompType comp_type, int length) { if (length <= 0) { PyErr_SetString(PyExc_ValueError, "length of an attribute must greater than 0"); - return 0; + return false; } int fetch_mode = get_default_fetch_mode(comp_type); if (fetch_mode == -1) { PyErr_SetString(PyExc_ValueError, "no default fetch mode found"); - return 0; + return false; } GPU_vertformat_attr_add(format, name, comp_type, length, fetch_mode); - return 1; + return true; } -static int add_attribute_from_tuple(GPUVertFormat *format, PyObject *data) +static bool bpygpu_vertformat_attr_add_from_tuple( + GPUVertFormat *format, PyObject *data) { - char *name; + const char *name; GPUVertCompType comp_type; int length; if (!PyArg_ParseTuple(data, "sO&i", &name, bpygpu_ParseVertCompType, &comp_type, &length)) { - return 0; + return false; } - return add_attribute_simple(format, name, comp_type, length); + return bpygpu_vertformat_attr_add_simple(format, name, comp_type, length); } static PyObject *bpygpu_VertFormat_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds) @@ -308,7 +310,7 @@ bool bpygpu_vertformat_from_PyList( return false; } - if (!add_attribute_from_tuple(r_fmt, element)) { + if (!bpygpu_vertformat_attr_add_from_tuple(r_fmt, element)) { return false; } } diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c index 0db2fc189c1..fef3a0703d2 100644 --- a/source/blender/python/intern/bpy_props.c +++ b/source/blender/python/intern/bpy_props.c @@ -3203,11 +3203,6 @@ PyObject *BPY_rna_props(void) submodule = PyModule_Create(&props_module); PyDict_SetItemString(PyImport_GetModuleDict(), props_module.m_name, submodule); - /* INCREF since its its assumed that all these functions return the - * module with a new ref like PyDict_New, since they are passed to - * PyModule_AddObject which steals a ref */ - Py_INCREF(submodule); - /* api needs the PyObjects internally */ submodule_dict = PyModule_GetDict(submodule); diff --git a/source/blender/python/intern/bpy_utils_units.c b/source/blender/python/intern/bpy_utils_units.c index cbd8b67d1ce..1d1108e1af0 100644 --- a/source/blender/python/intern/bpy_utils_units.c +++ b/source/blender/python/intern/bpy_utils_units.c @@ -323,7 +323,6 @@ PyObject *BPY_utils_units(void) submodule = PyModule_Create(&bpyunits_module); PyDict_SetItemString(PyImport_GetModuleDict(), bpyunits_module.m_name, submodule); - Py_INCREF(submodule); /* Finalize our unit systems and types structseq definitions! */ diff --git a/source/blender/python/mathutils/mathutils.c b/source/blender/python/mathutils/mathutils.c index 566bac9cb09..07905d2be89 100644 --- a/source/blender/python/mathutils/mathutils.c +++ b/source/blender/python/mathutils/mathutils.c @@ -645,30 +645,25 @@ PyMODINIT_FUNC PyInit_mathutils(void) * 'from mathutils.geometry import PolyFill' * ...fails without this. */ PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); - Py_INCREF(submodule); PyModule_AddObject(mod, "interpolate", (submodule = PyInit_mathutils_interpolate())); /* XXX, python doesnt do imports with this usefully yet * 'from mathutils.geometry import PolyFill' * ...fails without this. */ PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); - Py_INCREF(submodule); #ifndef MATH_STANDALONE /* Noise submodule */ PyModule_AddObject(mod, "noise", (submodule = PyInit_mathutils_noise())); PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); - Py_INCREF(submodule); /* BVHTree submodule */ PyModule_AddObject(mod, "bvhtree", (submodule = PyInit_mathutils_bvhtree())); PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); - Py_INCREF(submodule); /* KDTree submodule */ PyModule_AddObject(mod, "kdtree", (submodule = PyInit_mathutils_kdtree())); PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); - Py_INCREF(submodule); #endif mathutils_matrix_row_cb_index = Mathutils_RegisterCallback(&mathutils_matrix_row_cb); diff --git a/source/blender/render/intern/source/bake_api.c b/source/blender/render/intern/source/bake_api.c index f60105e029d..12c13bcac81 100644 --- a/source/blender/render/intern/source/bake_api.c +++ b/source/blender/render/intern/source/bake_api.c @@ -86,9 +86,6 @@ #include "render_types.h" #include "zbuf.h" -/* Remove when Cycles moves from MFace to MLoopTri */ -#define USE_MFACE_WORKAROUND - typedef struct BakeDataZSpan { BakePixel *pixel_array; int primitive_id; @@ -393,27 +390,6 @@ static bool cast_ray_highpoly( return hit_mesh != -1; } -#ifdef USE_MFACE_WORKAROUND -/** - * Until cycles moves to #MLoopTri, we need to keep face-rotation in sync with #test_index_face - * - * We only need to consider quads since #BKE_mesh_recalc_tessellation doesn't execute this on triangles. - */ -static void test_index_face_looptri(const MPoly *mp, MLoop *mloop, MLoopTri *lt) -{ - if (mp->totloop == 4) { - if (UNLIKELY((mloop[mp->loopstart + 2].v == 0) || - (mloop[mp->loopstart + 3].v == 0))) - { - /* remap: (2, 3, 0, 1) */ - unsigned int l = mp->loopstart; - ARRAY_SET_ITEMS(lt[0].tri, l + 2, l + 3, l + 0); - ARRAY_SET_ITEMS(lt[1].tri, l + 2, l + 0, l + 1); - } - } -} -#endif - /** * This function populates an array of verts for the triangles of a mesh * Tangent and Normals are also stored @@ -433,10 +409,6 @@ static TriTessFace *mesh_calc_tri_tessface( unsigned int mpoly_prev = UINT_MAX; float no[3]; -#ifdef USE_MFACE_WORKAROUND - unsigned int mpoly_prev_testindex = UINT_MAX; -#endif - mvert = CustomData_get_layer(&me->vdata, CD_MVERT); looptri = MEM_mallocN(sizeof(*looptri) * tottri, __func__); triangles = MEM_mallocN(sizeof(TriTessFace) * tottri, __func__); @@ -463,13 +435,6 @@ static TriTessFace *mesh_calc_tri_tessface( const MLoopTri *lt = &looptri[i]; const MPoly *mp = &me->mpoly[lt->poly]; -#ifdef USE_MFACE_WORKAROUND - if (lt->poly != mpoly_prev_testindex) { - test_index_face_looptri(mp, me->mloop, &looptri[i]); - mpoly_prev_testindex = lt->poly; - } -#endif - triangles[i].mverts[0] = &mvert[me->mloop[lt->tri[0]].v]; triangles[i].mverts[1] = &mvert[me->mloop[lt->tri[1]].v]; triangles[i].mverts[2] = &mvert[me->mloop[lt->tri[2]].v]; @@ -662,9 +627,6 @@ void RE_bake_pixels_populate( const MLoopUV *mloopuv; const int tottri = poly_to_tri_count(me->totpoly, me->totloop); MLoopTri *looptri; -#ifdef USE_MFACE_WORKAROUND - unsigned int mpoly_prev_testindex = UINT_MAX; -#endif if ((uv_layer == NULL) || (uv_layer[0] == '\0')) { mloopuv = CustomData_get_layer(&me->ldata, CD_MLOOPUV); @@ -714,13 +676,6 @@ void RE_bake_pixels_populate( bd.bk_image = &bake_images->data[image_id]; bd.primitive_id = ++p_id; -#ifdef USE_MFACE_WORKAROUND - if (lt->poly != mpoly_prev_testindex) { - test_index_face_looptri(mp, me->mloop, &looptri[i]); - mpoly_prev_testindex = lt->poly; - } -#endif - for (a = 0; a < 3; a++) { const float *uv = mloopuv[lt->tri[a]].uv; diff --git a/source/blender/shader_fx/CMakeLists.txt b/source/blender/shader_fx/CMakeLists.txt index 89defbd4ac7..1807635aa8d 100644 --- a/source/blender/shader_fx/CMakeLists.txt +++ b/source/blender/shader_fx/CMakeLists.txt @@ -46,6 +46,7 @@ set(SRC intern/FX_shader_blur.c intern/FX_shader_colorize.c intern/FX_shader_flip.c + intern/FX_shader_glow.c intern/FX_shader_light.c intern/FX_shader_pixel.c intern/FX_shader_rim.c diff --git a/source/blender/shader_fx/FX_shader_types.h b/source/blender/shader_fx/FX_shader_types.h index 57b9ae71146..311f5ec52e8 100644 --- a/source/blender/shader_fx/FX_shader_types.h +++ b/source/blender/shader_fx/FX_shader_types.h @@ -35,6 +35,7 @@ extern ShaderFxTypeInfo shaderfx_Type_None; extern ShaderFxTypeInfo shaderfx_Type_Blur; extern ShaderFxTypeInfo shaderfx_Type_Colorize; extern ShaderFxTypeInfo shaderfx_Type_Flip; +extern ShaderFxTypeInfo shaderfx_Type_Glow; extern ShaderFxTypeInfo shaderfx_Type_Light; extern ShaderFxTypeInfo shaderfx_Type_Pixel; extern ShaderFxTypeInfo shaderfx_Type_Rim; diff --git a/source/blender/shader_fx/intern/FX_shader_glow.c b/source/blender/shader_fx/intern/FX_shader_glow.c new file mode 100644 index 00000000000..cd513ed1f0a --- /dev/null +++ b/source/blender/shader_fx/intern/FX_shader_glow.c @@ -0,0 +1,78 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2018, Blender Foundation + * This is a new part of Blender + * + * Contributor(s): Antonio Vazquez + * + * ***** END GPL LICENSE BLOCK ***** + * + */ + +/** \file blender/shader_fx/intern/FX_shader_glow.c + * \ingroup shader_fx + */ + +#include <stdio.h> + +#include "DNA_scene_types.h" +#include "DNA_object_types.h" +#include "DNA_gpencil_types.h" + +#include "BLI_math_base.h" +#include "BLI_utildefines.h" + +#include "BKE_library_query.h" +#include "BKE_modifier.h" +#include "BKE_shader_fx.h" + +#include "FX_shader_types.h" + +static void initData(ShaderFxData *md) +{ + GlowShaderFxData *gpfx = (GlowShaderFxData *)md; + ARRAY_SET_ITEMS(gpfx->glow_color, 0.75f, 1.0f, 1.0f); + ARRAY_SET_ITEMS(gpfx->select_color, 0.0f, 0.0f, 0.0f); + gpfx->threshold = 0.1f; + + ARRAY_SET_ITEMS(gpfx->blur, 50, 0); + gpfx->samples = 16; +} + +static void copyData(const ShaderFxData *md, ShaderFxData *target) +{ + BKE_shaderfx_copyData_generic(md, target); +} + +ShaderFxTypeInfo shaderfx_Type_Glow = { + /* name */ "Glow", + /* structName */ "GlowShaderFxData", + /* structSize */ sizeof(GlowShaderFxData), + /* type */ eShaderFxType_GpencilType, + /* flags */ 0, + + /* copyData */ copyData, + + /* initData */ initData, + /* freeData */ NULL, + /* isDisabled */ NULL, + /* updateDepsgraph */ NULL, + /* dependsOnTime */ NULL, + /* foreachObjectLink */ NULL, + /* foreachIDLink */ NULL, +}; diff --git a/source/blender/shader_fx/intern/FX_shader_util.c b/source/blender/shader_fx/intern/FX_shader_util.c index d5cbdc69ba3..b74ff45b991 100644 --- a/source/blender/shader_fx/intern/FX_shader_util.c +++ b/source/blender/shader_fx/intern/FX_shader_util.c @@ -46,6 +46,7 @@ void shaderfx_type_init(ShaderFxTypeInfo *types[]) INIT_FX_TYPE(Blur); INIT_FX_TYPE(Colorize); INIT_FX_TYPE(Flip); + INIT_FX_TYPE(Glow); INIT_FX_TYPE(Light); INIT_FX_TYPE(Pixel); INIT_FX_TYPE(Rim); diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index 965b1870838..1195348ed0d 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -1725,7 +1725,7 @@ static int wm_homefile_read_exec(bContext *C, wmOperator *op) static int wm_homefile_read_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *UNUSED(event)) { /* Draw menu which includes default startup and application templates. */ - uiPopupMenu *pup = UI_popup_menu_begin(C, IFACE_("New File"), ICON_FILE); + uiPopupMenu *pup = UI_popup_menu_begin(C, IFACE_("New File"), ICON_FILE_NEW); uiLayout *layout = UI_popup_menu_layout(pup); MenuType *mt = WM_menutype_find("TOPBAR_MT_file_new", false); @@ -2166,7 +2166,7 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op) { Main *bmain = CTX_data_main(C); char path[FILE_MAX]; - int fileflags; + int fileflags, orig_fileflags; save_set_compress(op); @@ -2178,6 +2178,7 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op) wm_filepath_default(path); } + orig_fileflags = G.fileflags; fileflags = G.fileflags & ~G_FILE_USERPREFS; /* set compression flag */ @@ -2193,8 +2194,18 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op) RNA_boolean_get(op->ptr, "copy")), G_FILE_SAVE_COPY); - if (wm_file_write(C, path, fileflags, op->reports) != 0) + int write_result = wm_file_write(C, path, fileflags, op->reports); + + if ((op->flag & OP_IS_INVOKE) == 0) { + /* OP_IS_INVOKE is set when the operator is called from the GUI. + * If it is not set, the operator is called from a script and + * shouldn't influence G.fileflags. */ + G.fileflags = orig_fileflags; + } + + if (write_result != 0) { return OPERATOR_CANCELLED; + } WM_event_add_notifier(C, NC_WM | ND_FILESAVE, NULL); diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 0b5fd186e7a..e3c96ff926c 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -2053,16 +2053,16 @@ static void radial_control_paint_tex(RadialControl *rc, float radius, float alph /* draw textured quad */ immBegin(GPU_PRIM_TRI_FAN, 4); - immAttrib2f(texCoord, 0, 0); + immAttr2f(texCoord, 0, 0); immVertex2f(pos, -radius, -radius); - immAttrib2f(texCoord, 1, 0); + immAttr2f(texCoord, 1, 0); immVertex2f(pos, radius, -radius); - immAttrib2f(texCoord, 1, 1); + immAttr2f(texCoord, 1, 1); immVertex2f(pos, radius, radius); - immAttrib2f(texCoord, 0, 1); + immAttr2f(texCoord, 0, 1); immVertex2f(pos, -radius, radius); immEnd(); diff --git a/source/blender/windowmanager/intern/wm_stereo.c b/source/blender/windowmanager/intern/wm_stereo.c index aa85dbc04b4..6b6b3bc3cbb 100644 --- a/source/blender/windowmanager/intern/wm_stereo.c +++ b/source/blender/windowmanager/intern/wm_stereo.c @@ -106,16 +106,16 @@ void wm_stereo3d_draw_interlace(wmWindow *win, ARegion *ar) immBegin(GPU_PRIM_TRI_FAN, 4); - immAttrib2f(texcoord, halfx, halfy); + immAttr2f(texcoord, halfx, halfy); immVertex2f(pos, ar->winrct.xmin, ar->winrct.ymin); - immAttrib2f(texcoord, 1.0f + halfx, halfy); + immAttr2f(texcoord, 1.0f + halfx, halfy); immVertex2f(pos, ar->winrct.xmax + 1, ar->winrct.ymin); - immAttrib2f(texcoord, 1.0f + halfx, 1.0f + halfy); + immAttr2f(texcoord, 1.0f + halfx, 1.0f + halfy); immVertex2f(pos, ar->winrct.xmax + 1, ar->winrct.ymax + 1); - immAttrib2f(texcoord, halfx, 1.0f + halfy); + immAttr2f(texcoord, halfx, 1.0f + halfy); immVertex2f(pos, ar->winrct.xmin, ar->winrct.ymax + 1); immEnd(); @@ -190,16 +190,16 @@ void wm_stereo3d_draw_sidebyside(wmWindow *win, int view) immBegin(GPU_PRIM_TRI_FAN, 4); - immAttrib2f(texcoord, halfx, halfy); + immAttr2f(texcoord, halfx, halfy); immVertex2f(pos, soffx, 0.0f); - immAttrib2f(texcoord, 1.0f + halfx, halfy); + immAttr2f(texcoord, 1.0f + halfx, halfy); immVertex2f(pos, soffx + (sizex * 0.5f), 0.0f); - immAttrib2f(texcoord, 1.0f + halfx, 1.0f + halfy); + immAttr2f(texcoord, 1.0f + halfx, 1.0f + halfy); immVertex2f(pos, soffx + (sizex * 0.5f), sizey); - immAttrib2f(texcoord, halfx, 1.0f + halfy); + immAttr2f(texcoord, halfx, 1.0f + halfy); immVertex2f(pos, soffx, sizey); immEnd(); @@ -234,16 +234,16 @@ void wm_stereo3d_draw_topbottom(wmWindow *win, int view) immBegin(GPU_PRIM_TRI_FAN, 4); - immAttrib2f(texcoord, halfx, halfy); + immAttr2f(texcoord, halfx, halfy); immVertex2f(pos, 0.0f, soffy); - immAttrib2f(texcoord, 1.0f + halfx, halfy); + immAttr2f(texcoord, 1.0f + halfx, halfy); immVertex2f(pos, sizex, soffy); - immAttrib2f(texcoord, 1.0f + halfx, 1.0f + halfy); + immAttr2f(texcoord, 1.0f + halfx, 1.0f + halfy); immVertex2f(pos, sizex, soffy + (sizey * 0.5f)); - immAttrib2f(texcoord, halfx, 1.0f + halfy); + immAttr2f(texcoord, halfx, 1.0f + halfy); immVertex2f(pos, 0.0f, soffy + (sizey * 0.5f)); immEnd(); |