Project

General

Profile

« Previous | Next » 

Revision e54bfada

Added by Leszek Koltunski almost 4 years ago

Have VERTEX_QUATERNION, VERTEX_ROTATE and VERTEX_SHEAR modify inflate vectors.
Split Vertex attribute array into two (the one modified by preapply effects and the one not)

View differences:

src/main/java/org/distorted/library/mesh/MeshSphere.java
77 77

  
78 78
///////////////////////////////////////////////////////////////////////////////////////////////////
79 79

  
80
  private void repeatVertex(float[] attribs)
80
  private void repeatVertex(float[] attribs1, float[] attribs2)
81 81
    {
82 82
    if( currentVert>0 )
83 83
      {
84
      attribs[VERT_ATTRIBS*currentVert + POS_ATTRIB  ] = attribs[VERT_ATTRIBS*(currentVert-1) + POS_ATTRIB  ];
85
      attribs[VERT_ATTRIBS*currentVert + POS_ATTRIB+1] = attribs[VERT_ATTRIBS*(currentVert-1) + POS_ATTRIB+1];
86
      attribs[VERT_ATTRIBS*currentVert + POS_ATTRIB+2] = attribs[VERT_ATTRIBS*(currentVert-1) + POS_ATTRIB+2];
84
      attribs1[VERT1_ATTRIBS*currentVert + POS_ATTRIB  ] = attribs1[VERT1_ATTRIBS*(currentVert-1) + POS_ATTRIB  ];
85
      attribs1[VERT1_ATTRIBS*currentVert + POS_ATTRIB+1] = attribs1[VERT1_ATTRIBS*(currentVert-1) + POS_ATTRIB+1];
86
      attribs1[VERT1_ATTRIBS*currentVert + POS_ATTRIB+2] = attribs1[VERT1_ATTRIBS*(currentVert-1) + POS_ATTRIB+2];
87 87

  
88
      attribs[VERT_ATTRIBS*currentVert + NOR_ATTRIB  ] = attribs[VERT_ATTRIBS*(currentVert-1) + NOR_ATTRIB  ];
89
      attribs[VERT_ATTRIBS*currentVert + NOR_ATTRIB+1] = attribs[VERT_ATTRIBS*(currentVert-1) + NOR_ATTRIB+1];
90
      attribs[VERT_ATTRIBS*currentVert + NOR_ATTRIB+2] = attribs[VERT_ATTRIBS*(currentVert-1) + NOR_ATTRIB+2];
88
      attribs1[VERT1_ATTRIBS*currentVert + NOR_ATTRIB  ] = attribs1[VERT1_ATTRIBS*(currentVert-1) + NOR_ATTRIB  ];
89
      attribs1[VERT1_ATTRIBS*currentVert + NOR_ATTRIB+1] = attribs1[VERT1_ATTRIBS*(currentVert-1) + NOR_ATTRIB+1];
90
      attribs1[VERT1_ATTRIBS*currentVert + NOR_ATTRIB+2] = attribs1[VERT1_ATTRIBS*(currentVert-1) + NOR_ATTRIB+2];
91 91

  
92
      attribs[VERT_ATTRIBS*currentVert + INF_ATTRIB  ] = attribs[VERT_ATTRIBS*(currentVert-1) + INF_ATTRIB  ];
93
      attribs[VERT_ATTRIBS*currentVert + INF_ATTRIB+1] = attribs[VERT_ATTRIBS*(currentVert-1) + INF_ATTRIB+1];
94
      attribs[VERT_ATTRIBS*currentVert + INF_ATTRIB+2] = attribs[VERT_ATTRIBS*(currentVert-1) + INF_ATTRIB+2];
92
      attribs1[VERT1_ATTRIBS*currentVert + INF_ATTRIB  ] = attribs1[VERT1_ATTRIBS*(currentVert-1) + INF_ATTRIB  ];
93
      attribs1[VERT1_ATTRIBS*currentVert + INF_ATTRIB+1] = attribs1[VERT1_ATTRIBS*(currentVert-1) + INF_ATTRIB+1];
94
      attribs1[VERT1_ATTRIBS*currentVert + INF_ATTRIB+2] = attribs1[VERT1_ATTRIBS*(currentVert-1) + INF_ATTRIB+2];
95 95

  
96
      attribs[VERT_ATTRIBS*currentVert + TEX_ATTRIB  ] = attribs[VERT_ATTRIBS*(currentVert-1) + TEX_ATTRIB  ];
97
      attribs[VERT_ATTRIBS*currentVert + TEX_ATTRIB+1] = attribs[VERT_ATTRIBS*(currentVert-1) + TEX_ATTRIB+1];
96
      attribs2[VERT2_ATTRIBS*currentVert + TEX_ATTRIB  ] = attribs2[VERT2_ATTRIBS*(currentVert-1) + TEX_ATTRIB  ];
97
      attribs2[VERT2_ATTRIBS*currentVert + TEX_ATTRIB+1] = attribs2[VERT2_ATTRIBS*(currentVert-1) + TEX_ATTRIB+1];
98 98

  
99 99
      currentVert++;
100 100
      }
......
151 151
// (      0, level-1, level) -> (lonV3,latV3 )
152 152
// (level-1,       0, level) -> (lonV2,latV12)
153 153

  
154
  private void addVertex(float[] attribs, int column, int row, int level,
154
  private void addVertex(float[] attribs1, float[] attribs2, int column, int row, int level,
155 155
                         double lonV1, double lonV2, double latV12, double latV3)
156 156
    {
157 157
    double quotX = (double)column/level;
......
184 184

  
185 185
    double texY = 0.5 + latitude/P;
186 186

  
187
    attribs[VERT_ATTRIBS*currentVert + POS_ATTRIB  ] = x;  //
188
    attribs[VERT_ATTRIBS*currentVert + POS_ATTRIB+1] = y;  //
189
    attribs[VERT_ATTRIBS*currentVert + POS_ATTRIB+2] = z;  //
190
                                                           //  In case of this Mesh so it happens that
191
    attribs[VERT_ATTRIBS*currentVert + NOR_ATTRIB  ] = 2*x;//  the vertex coords, normal vector, and
192
    attribs[VERT_ATTRIBS*currentVert + NOR_ATTRIB+1] = 2*y;//  inflate vector have identical (x,y,z).
193
    attribs[VERT_ATTRIBS*currentVert + NOR_ATTRIB+2] = 2*z;//
194
                                                           //  TODO: think about some more efficient
195
    attribs[VERT_ATTRIBS*currentVert + INF_ATTRIB  ] = x;  //  representation.
196
    attribs[VERT_ATTRIBS*currentVert + INF_ATTRIB+1] = y;  //
197
    attribs[VERT_ATTRIBS*currentVert + INF_ATTRIB+2] = z;  //
198

  
199
    attribs[VERT_ATTRIBS*currentVert + TEX_ATTRIB  ] = (float)texX;
200
    attribs[VERT_ATTRIBS*currentVert + TEX_ATTRIB+1] = (float)texY;
187
    attribs1[VERT1_ATTRIBS*currentVert + POS_ATTRIB  ] = x;  //
188
    attribs1[VERT1_ATTRIBS*currentVert + POS_ATTRIB+1] = y;  //
189
    attribs1[VERT1_ATTRIBS*currentVert + POS_ATTRIB+2] = z;  //
190
                                                             //  In case of this Mesh so it happens that
191
    attribs1[VERT1_ATTRIBS*currentVert + NOR_ATTRIB  ] = 2*x;//  the vertex coords, normal vector, and
192
    attribs1[VERT1_ATTRIBS*currentVert + NOR_ATTRIB+1] = 2*y;//  inflate vector have identical (x,y,z).
193
    attribs1[VERT1_ATTRIBS*currentVert + NOR_ATTRIB+2] = 2*z;//
194
                                                             //  TODO: think about some more efficient
195
    attribs1[VERT1_ATTRIBS*currentVert + INF_ATTRIB  ] = x;  //  representation.
196
    attribs1[VERT1_ATTRIBS*currentVert + INF_ATTRIB+1] = y;  //
197
    attribs1[VERT1_ATTRIBS*currentVert + INF_ATTRIB+2] = z;  //
198

  
199
    attribs2[VERT2_ATTRIBS*currentVert + TEX_ATTRIB  ] = (float)texX;
200
    attribs2[VERT2_ATTRIBS*currentVert + TEX_ATTRIB+1] = (float)texY;
201 201

  
202 202
    currentVert++;
203 203

  
......
209 209

  
210 210
    if( currentVert>=3 && texX==0.0 )
211 211
      {
212
      double tex1 = attribs[VERT_ATTRIBS*(currentVert-2) + TEX_ATTRIB];
213
      double tex2 = attribs[VERT_ATTRIBS*(currentVert-3) + TEX_ATTRIB];
212
      double tex1 = attribs2[VERT2_ATTRIBS*(currentVert-2) + TEX_ATTRIB];
213
      double tex2 = attribs2[VERT2_ATTRIBS*(currentVert-3) + TEX_ATTRIB];
214 214

  
215 215
      // if the triangle is not degenerate and last vertex was on the western hemisphere
216 216
      if( tex1!=tex2 && tex1>0.5 )
217 217
        {
218
        attribs[VERT_ATTRIBS*(currentVert-1) + TEX_ATTRIB] = 1.0f;
218
        attribs2[VERT2_ATTRIBS*(currentVert-1) + TEX_ATTRIB] = 1.0f;
219 219
        }
220 220
      }
221 221
    }
222 222

  
223 223
///////////////////////////////////////////////////////////////////////////////////////////////////
224 224

  
225
  private void buildFace(float[] attribs, int level, int face, double lonV1, double lonV2, double latV12, double latV3)
225
  private void buildFace(float[] attribs1, float[] attribs2, int level, int face, double lonV1, double lonV2, double latV12, double latV3)
226 226
    {
227 227
    for(int row=0; row<level; row++)
228 228
      {
229 229
      for (int column=0; column<level-row; column++)
230 230
        {
231
        addVertex(attribs, column, row  , level, lonV1, lonV2, latV12, latV3);
232
        if (column==0 && !(face==0 && row==0 ) ) repeatVertex(attribs);
233
        addVertex(attribs, column, row+1, level, lonV1, lonV2, latV12, latV3);
231
        addVertex(attribs1, attribs2, column, row  , level, lonV1, lonV2, latV12, latV3);
232
        if (column==0 && !(face==0 && row==0 ) ) repeatVertex(attribs1, attribs2);
233
        addVertex(attribs1, attribs2, column, row+1, level, lonV1, lonV2, latV12, latV3);
234 234
        }
235 235

  
236
      addVertex(attribs, level-row, row , level, lonV1, lonV2, latV12, latV3);
237
      if( row!=level-1 || face!=NUMFACES-1 ) repeatVertex(attribs);
236
      addVertex(attribs1, attribs2, level-row, row , level, lonV1, lonV2, latV12, latV3);
237
      if( row!=level-1 || face!=NUMFACES-1 ) repeatVertex(attribs1, attribs2);
238 238
      }
239 239
    }
240 240

  
......
254 254
  public MeshSphere(int level)
255 255
    {
256 256
    super();
257

  
257 258
    computeNumberOfVertices(level);
258
    float[] attribs= new float[VERT_ATTRIBS*numVertices];
259
    float[] attribs1= new float[VERT1_ATTRIBS*numVertices];
260
    float[] attribs2= new float[VERT2_ATTRIBS*numVertices];
259 261

  
260 262
    for(int face=0; face<NUMFACES; face++ )
261 263
      {
262
      buildFace(attribs, level, face, FACES[face][0], FACES[face][1], FACES[face][2], FACES[face][3]);
264
      buildFace(attribs1, attribs2, level, face, FACES[face][0], FACES[face][1], FACES[face][2], FACES[face][3]);
263 265
      }
264 266

  
265 267
    if( currentVert!=numVertices )
266 268
      android.util.Log.d("MeshSphere", "currentVert= " +currentVert+" numVertices="+numVertices );
267 269

  
268
    setAttribs(attribs);
270
    setAttribs(attribs1, attribs2);
269 271
    }
270 272

  
271 273
///////////////////////////////////////////////////////////////////////////////////////////////////

Also available in: Unified diff