2
* $Id: BSP_CSGMesh.cpp,v 1.8 2005/10/28 20:23:18 intrr Exp $
3
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
2
* $Id: BSP_CSGMesh.cpp 14444 2008-04-16 22:40:48Z hos $
3
* ***** BEGIN GPL LICENSE BLOCK *****
5
5
* This program is free software; you can redistribute it and/or
6
6
* modify it under the terms of the GNU General Public License
7
7
* as published by the Free Software Foundation; either version 2
8
* of the License, or (at your option) any later version. The Blender
9
* Foundation also sells licenses for use in proprietary software under
10
* the Blender License. See http://www.blender.org/BL/ for information
8
* of the License, or (at your option) any later version.
13
10
* This program is distributed in the hope that it will be useful,
14
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
79
69
if (m_edges != NULL) {
80
70
mesh->m_edges = new vector<BSP_MEdge>(*m_edges);
81
if (mesh->m_edges == NULL) return NULL;
71
if (mesh->m_edges == NULL) {
83
76
if (m_verts != NULL) {
84
77
mesh->m_verts = new vector<BSP_MVertex>(*m_verts);
85
if (mesh->m_verts == NULL) return NULL;
78
if (mesh->m_verts == NULL) {
79
if (m_edges != NULL) free(mesh->m_edges);
87
84
if (m_faces != NULL) {
88
85
mesh->m_faces = new vector<BSP_MFace>(*m_faces);
89
if (mesh->m_faces == NULL) return NULL;
91
if (m_fv_data != NULL) {
92
mesh->m_fv_data = new BSP_CSGUserData(*m_fv_data);
93
if (mesh->m_fv_data == NULL) return NULL;
95
if (m_face_data != NULL) {
96
mesh->m_face_data = new BSP_CSGUserData(*m_face_data);
97
if (mesh->m_face_data == NULL) return NULL;
86
if (mesh->m_faces == NULL) {
176
151
face.m_plane = face_plane;
183
const int * fv_indices,
186
// This creates a new polygon on the end of the face list.
187
AddPolygon(verts,num_verts);
189
BSP_MFace & face = m_faces->back();
190
// now we just fill in the fv indices
193
insert_iterator<vector<BSP_UserFVInd> > insert_point(face.m_fv_data,face.m_fv_data.end());
194
copy(fv_indices,fv_indices + num_verts,insert_point);
196
face.m_fv_data.insert(face.m_fv_data.end(),num_verts,BSP_UserFVInd::Empty());
204
const BSP_MFace &iface,
205
const int * index_info
207
// This creates a new polygon on the end of the face list.
209
m_faces->push_back(BSP_MFace());
210
BSP_MFace & face = m_faces->back();
212
face.m_verts.push_back(iface.m_verts[index_info[0]]);
213
face.m_verts.push_back(iface.m_verts[index_info[1]]);
214
face.m_verts.push_back(iface.m_verts[index_info[2]]);
216
face.m_fv_data.push_back(iface.m_fv_data[index_info[0]]);
217
face.m_fv_data.push_back(iface.m_fv_data[index_info[1]]);
218
face.m_fv_data.push_back(iface.m_fv_data[index_info[2]]);
220
face.m_plane = iface.m_plane;
224
154
// assumes that the face already has a plane equation
593
InsertVertexIntoFace(
595
const BSP_VertexInd & v1,
596
const BSP_VertexInd & v2,
597
const BSP_VertexInd & vi,
598
CSG_InterpolateUserFaceVertexDataFunc fv_split_func,
601
// We assume that the face vertex data indices
602
// are consistent with the vertex inidex data.
605
vector<BSP_VertexInd>::iterator result =
606
find(face.m_verts.begin(),face.m_verts.end(),v1);
608
MT_assert(result != face.m_verts.end());
610
BSP_CSGUserData & fv_data = *m_fv_data;
612
// now we have to check on either side of the result for the
615
vector<BSP_VertexInd>::iterator prev = result - 1;
616
if (prev < face.m_verts.begin()) {
617
prev = face.m_verts.end() -1;
621
// so result <=> v2 and prev <=> v1
623
// create space for new face vertex data
625
int vf_i = fv_data.Size();
628
int vf_i2 = prev - face.m_verts.begin();
629
int vf_i1 = result - face.m_verts.begin();
632
fv_data[int(face.m_fv_data[vf_i1])],
633
fv_data[int(face.m_fv_data[vf_i2])],
638
// insert vertex data index.
639
face.m_fv_data.insert(face.m_fv_data.begin() + vf_i1,vf_i);
640
face.m_verts.insert(result,vi);
645
vector<BSP_VertexInd>::iterator next = result + 1;
646
if (next >= face.m_verts.end()) {
647
next = face.m_verts.begin();
651
// so result <=> v1 and next <=> v2
653
int vf_i = fv_data.Size();
656
int vf_i2 = int(next - face.m_verts.begin());
657
int vf_i1 = int(result - face.m_verts.begin());
660
fv_data[int(face.m_fv_data[vf_i1])],
661
fv_data[int(face.m_fv_data[vf_i2])],
666
// insert vertex data index.
667
face.m_fv_data.insert(face.m_fv_data.begin() + vf_i2,vf_i);
668
face.m_verts.insert(next,vi);
673
// if we get here we are in trouble.
675
BSP_CSGException e(e_mesh_error);
682
const MT_Vector3 & min,
683
const MT_Vector3 & max
715
const MT_Plane3& plane
717
const BSP_MFace & face = FaceSet()[f];
719
vector<BSP_VertexInd>::const_iterator f_verts_it = face.m_verts.begin();
720
vector<BSP_VertexInd>::const_iterator f_verts_end = face.m_verts.end();
722
for (;f_verts_it != f_verts_end; ++f_verts_it) {
724
const BSP_MVertex & vert = VertexSet()[*f_verts_it];
726
MT_Scalar dist = plane.signedDistance(
730
if (fabs(dist) <= BSP_SPLIT_EPSILON ){
731
MT_assert(BSP_Classification(vert.OpenTag()) == e_classified_on);
733
if (dist > BSP_SPLIT_EPSILON) {
734
MT_assert(BSP_Classification(vert.OpenTag()) == e_classified_out);
736
if (dist < BSP_SPLIT_EPSILON) {
737
MT_assert(BSP_Classification(vert.OpenTag()) == e_classified_in);