New files from new booleans
[blender.git] / intern / boolop / intern / BOP_Material.cpp
1 /**
2  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version. The Blender
8  * Foundation also sells licenses for use in proprietary software under
9  * the Blender License.  See http://www.blender.org/BL/ for information
10  * about this.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software Foundation,
19  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20  *
21  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
22  * All rights reserved.
23  *
24  * The Original Code is: all of this file.
25  *
26  * Contributor(s): none yet.
27  *
28  * ***** END GPL/BL DUAL LICENSE BLOCK *****
29  */
30  
31 #include "BOP_Material.h"
32 #include <iostream>
33 using namespace std;
34
35 /**
36  * Constructs a new material. 
37  * @param faceWidth face material size in bytes.
38  * @param faceVertexWidth verex face material size in bytes.
39  */
40 BOP_Material::BOP_Material(int faceWidth, int faceVertexWidth)
41 {
42         m_faceWidth = faceWidth;
43         m_faceVertexWidth = faceVertexWidth;
44         
45         m_faceMaterial = new char[m_faceWidth];
46         m_faceVertexMaterial = new char[N_FACE_VERTEX*m_faceVertexWidth];
47 }
48
49 /**
50  * Constructs a new material duplicating the other object data.
51  * @param other the other object to copy the data.
52  */
53 BOP_Material::BOP_Material(const BOP_Material& other)
54 {
55         m_faceWidth = other.getFaceWidth();
56         m_faceVertexWidth = other.getFaceVertexWidth();
57         
58         m_faceMaterial = new char[m_faceWidth];
59         m_faceVertexMaterial = new char[N_FACE_VERTEX*m_faceVertexWidth];
60         
61         duplicate(other);
62 }
63
64 /**
65  * Destroys a material. 
66  */
67 BOP_Material::~BOP_Material()
68 {
69         delete[] m_faceMaterial;
70         delete[] m_faceVertexMaterial;
71 }
72
73 /**
74  * Duplicates the face material passed by argument.
75  * @param faceMaterial pointer to face material data.
76  */
77 void BOP_Material::setFaceMaterial(char* faceMaterial)
78 {
79         memcpy(m_faceMaterial, faceMaterial, m_faceWidth);
80 }
81
82 /**
83  * Duplicates the all face vertex materials passed by argument. It's supossed
84  * that all face vertex materials positions are consecutive.
85  * @param faceVertexMaterial pointer to firts vertex face material.
86  */
87 void BOP_Material::setFaceVertexMaterial(char* faceVertexMaterial)
88 {
89         memcpy(m_faceVertexMaterial, faceVertexMaterial, N_FACE_VERTEX*m_faceVertexWidth);
90 }
91
92 /**
93  * Duplicates on i-position the face vertex material passed by argument.
94  * @param faceMaterial pointer to face vertex material.
95  * @param i destination position of new face vertex material (0<=i<4)
96  */
97 void BOP_Material::setFaceVertexMaterial(char* faceVertexMaterial, int i)
98 {
99         if (i>=0&&i<N_FACE_VERTEX)
100                 memcpy(m_faceVertexMaterial+i*m_faceVertexWidth, faceVertexMaterial, m_faceVertexWidth);
101 }
102
103 /**
104  * Duplicates the other material object data.
105  * @param other the other material object.
106  */
107 void BOP_Material::duplicate(const BOP_Material& other)
108 {
109         setOriginalFace(other.getOriginalFace());
110         setIsQuad(other.isQuad());
111         for (int i=0;i<N_FACE_VERTEX;++i)
112                 setOriginalFaceVertex(other.getOriginalFaceVertex(i),i);
113         setFaceMaterial(other.getFaceMaterial());
114         setFaceVertexMaterial(other.getFaceVertexMaterial(0));
115 }
116
117 /**
118  * Implements operator =
119  */
120 BOP_Material& BOP_Material::operator = (BOP_Material& other)
121 {
122         if (other.getFaceWidth() == m_faceWidth && other.getFaceVertexWidth() == m_faceVertexWidth)
123                 duplicate(other);
124         return (*this);
125 }
126
127 /**
128  * Returns the original face vertex material using a input vtx id. The input vtx IDs
129  * are mapped to output ids, this one is used to obtain the original face vertex 
130  * material.
131  * @param originalFaceVertex input vertex id (0..3)
132  * @return pointer to original face vertex material if it exist, NULL otherwise.
133  */
134 char* BOP_Material::getOriginalFaceVertexMaterial(int originalFaceVertex)
135 {
136         int  N = isQuad() ? 4 : 3;
137         int  i = 0;
138         bool b = false;
139         while (i<N&&!b){
140                 if (m_originalFaceVertices[i]==originalFaceVertex) b = true;
141                 else i++;
142         }
143         return b ? getFaceVertexMaterial(i) : NULL;
144 }
145
146 /**
147  * Returns the face material pointer.
148  * @return pointer to face material.
149  */
150 char* BOP_Material::getFaceMaterial() const
151 {
152         return m_faceMaterial;
153 }
154
155 /**
156  * Returns the face vertex material at i position.
157  * @param i index of face vertex material.
158  * @return pointer to face vertex material.
159  */
160 inline char* BOP_Material::getFaceVertexMaterial(int i) const
161 {
162         return i>=0&&i<N_FACE_VERTEX ? m_faceVertexMaterial + i*m_faceVertexWidth : NULL;
163 }
164
165 /**
166  * Implements operator <<
167  */
168 ostream &operator<<(ostream &stream, BOP_Material *m)
169 {
170         cout << "(" << m->getOriginalFace() << ") < ";
171         int N  = m->isQuad() ? 4 : 3;
172         for (int i=0;i<N;++i) cout << m->getOriginalFaceVertex(i) << " ";
173         cout << ">" << endl;
174
175         return stream;
176 }