From b5d3f183b0fd6f72d84fbcdd594f80e70422eb24 Mon Sep 17 00:00:00 2001 From: Antony Riakiotakis Date: Wed, 9 Apr 2014 04:03:25 +0300 Subject: Add material storage to derivedmesh. The variables are considered invalid unless DM_update_materials is called prior to use. Only use case currently is mesh drawing. This helps with excessive allocation on the stack during GPUObject creation, but may help elsewhere in the future as well. --- source/blender/blenkernel/BKE_DerivedMesh.h | 3 +++ source/blender/blenkernel/intern/DerivedMesh.c | 8 ++++++++ 2 files changed, 11 insertions(+) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index ff1c04fd00d..3afd7d851cb 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -184,6 +184,8 @@ struct DerivedMesh { DerivedMeshType type; float auto_bump_scale; DMDirtyFlag dirty; + int totmat; /* total materials. Will be valid only before object drawing. */ + struct Material **mat; /* material array. Will be valid only before object drawing */ /* use for converting to BMesh which doesn't store bevel weight and edge crease by default */ char cd_flag; @@ -578,6 +580,7 @@ void DM_ensure_tessface(DerivedMesh *dm); void DM_update_tessface_data(DerivedMesh *dm); +void DM_update_materials(DerivedMesh *dm, struct Object *ob); /** interpolates vertex data from the vertices indexed by src_indices in the * source mesh using the given weights and stores the result in the vertex * indexed by dest_index in the dest mesh diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 1a9ca234f8d..dcaf102ef01 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -54,6 +54,7 @@ #include "BKE_displist.h" #include "BKE_editmesh.h" #include "BKE_key.h" +#include "BKE_material.h" #include "BKE_modifier.h" #include "BKE_mesh.h" #include "BKE_mesh_mapping.h" @@ -482,6 +483,13 @@ void DM_update_tessface_data(DerivedMesh *dm) dm->dirty &= ~DM_DIRTY_TESS_CDLAYERS; } +void DM_update_materials(DerivedMesh *dm, Object *ob) +{ + dm->totmat = ob->totcol + 1; /* materials start from 1, default material is 0 */ + dm->mat = *give_matarar(ob); +} + + void DM_to_mesh(DerivedMesh *dm, Mesh *me, Object *ob, CustomDataMask mask) { /* dm might depend on me, so we need to do everything with a local copy */ -- cgit v1.2.3