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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/blenkernel/intern/surf_gridmesh.cpp')
-rw-r--r--source/blender/blenkernel/intern/surf_gridmesh.cpp61
1 files changed, 47 insertions, 14 deletions
diff --git a/source/blender/blenkernel/intern/surf_gridmesh.cpp b/source/blender/blenkernel/intern/surf_gridmesh.cpp
index d8f5bb433ef..b280e552784 100644
--- a/source/blender/blenkernel/intern/surf_gridmesh.cpp
+++ b/source/blender/blenkernel/intern/surf_gridmesh.cpp
@@ -51,6 +51,45 @@ static void print_kc(known_corner_t kc) {
NURBS_TESS_PRINTF("UR%c",(kc&KNOWN_CORNER_UR_EXTERIOR)?'e':'i');
}
+GridMeshVert::GridMeshVert() : next(0), prev(0),
+ next_poly(0), neighbor(0), first(0),
+ is_intersection(false), is_interior(true), is_entry(false),
+ is_used(false), corner(0), tmp(0), is_pristine(0),
+ owns_coords(0), coord_idx(0)
+{}
+
+GridMesh::GridMesh() {
+ coords = NULL;
+ coords_len = coords_reserved_len = 0;
+}
+
+GridMesh::~GridMesh() {
+ if (coords) free(coords);
+}
+
+void GridMesh::coords_reserve(int new_reserved_len) {
+ if (coords_reserved_len>=new_reserved_len) return;
+ if (!coords) {
+ coords = (GridMeshCoord*)malloc(sizeof(*coords)*new_reserved_len);
+ coords_reserved_len = new_reserved_len;
+ } else if (coords_reserved_len<new_reserved_len){
+ coords = (GridMeshCoord*)realloc(coords, sizeof(*coords)*new_reserved_len);
+ }
+}
+
+void GridMesh::coords_import(GridMeshCoord *c, int len) {
+ if (coords) printf("WARNING: coords should be imported *before* init\n");
+ coords = c;
+ coords_len = len;
+}
+
+GridMeshCoord *GridMesh::coords_export(int *len) {
+ GridMeshCoord *ret = coords;
+ if (len) *len = coords_len;
+ coords = NULL;
+ return ret;
+}
+
void GridMesh::set_ll_ur(double lowerleft_x, double lowerleft_y,
double upperright_x, double upperright_y) {
llx = lowerleft_x; lly = lowerleft_y;
@@ -63,19 +102,10 @@ void GridMesh::set_ll_ur(double lowerleft_x, double lowerleft_y,
inv_dy = 1.0/dy;
}
-GridMeshVert::GridMeshVert() : next(0), prev(0),
- next_poly(0), neighbor(0), first(0),
- is_intersection(false), is_interior(true), is_entry(false),
- is_used(false), corner(0), tmp(0), is_pristine(0),
- owns_coords(0), coord_idx(0)
-{}
-
-GridMesh::GridMesh(double lowerleft_x, double lowerleft_y,
- double upperright_x, double upperright_y,
- int num_x_cells, int num_y_cells) {
+void GridMesh::init_grid(int num_x_cells, int num_y_cells) {
nx = num_x_cells; ny = num_y_cells;
- set_ll_ur(lowerleft_x, lowerleft_y, upperright_x, upperright_y);
- coords.resize((nx+1)*(ny+1)*2);
+ int num_coords = (nx+1)*(ny+1)*2+1;
+ coords_reserve(num_coords);
for (int j=0; j<ny+1; j++) {
for (int i=0; i<nx+1; i++) {
GridMeshCoord& c = coords[gridpt_for_cell(i,j)];
@@ -144,8 +174,11 @@ void GridMesh::vert_set_coord(int vert, double x, double y, double z) {
xyz.x=x; xyz.y=y; xyz.z=z;
return;
}
- coords.push_back(GridMeshCoord(x,y,z));
- v[vert].coord_idx = int(coords.size()-1);
+ int idx = coords_len;
+ coords_reserve(coords_len++);
+ GridMeshCoord& xyz = coords[idx];
+ xyz.x=x; xyz.y=y; xyz.z=z;
+ v[vert].coord_idx = idx;
v[vert].owns_coords = 1;
}