Project

General

Profile

Download (13.1 KB) Statistics
| Branch: | Revision:

library / src / main / java / org / distorted / library / mesh / DeferredJobs.java @ d23592bb

1 07206c71 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2 c4d06f90 Leszek Koltunski
// Copyright 2020 Leszek Koltunski  leszek@koltunski.pl                                          //
3 07206c71 Leszek Koltunski
//                                                                                               //
4
// This file is part of Distorted.                                                               //
5
//                                                                                               //
6 c4d06f90 Leszek Koltunski
// This library is free software; you can redistribute it and/or                                 //
7
// modify it under the terms of the GNU Lesser General Public                                    //
8
// License as published by the Free Software Foundation; either                                  //
9
// version 2.1 of the License, or (at your option) any later version.                            //
10 07206c71 Leszek Koltunski
//                                                                                               //
11 c4d06f90 Leszek Koltunski
// This library is distributed in the hope that it will be useful,                               //
12 07206c71 Leszek Koltunski
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13 c4d06f90 Leszek Koltunski
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU                             //
14
// Lesser General Public License for more details.                                               //
15 07206c71 Leszek Koltunski
//                                                                                               //
16 c4d06f90 Leszek Koltunski
// You should have received a copy of the GNU Lesser General Public                              //
17
// License along with this library; if not, write to the Free Software                           //
18
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA                //
19 07206c71 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
20
21
package org.distorted.library.mesh;
22
23 e8925fcd Leszek Koltunski
import org.distorted.library.effect.MatrixEffect;
24 07206c71 Leszek Koltunski
import org.distorted.library.effect.VertexEffect;
25
import org.distorted.library.effectqueue.EffectQueueVertex;
26
import org.distorted.library.main.DistortedLibrary;
27 1fad573e Leszek Koltunski
import org.distorted.library.type.Static4D;
28 07206c71 Leszek Koltunski
29
import java.util.ArrayList;
30
31 1fad573e Leszek Koltunski
import android.util.Log;
32
33 07206c71 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
34
/**
35
 * Not part of public API, do not document (public only because has to be cleaned from the main package)
36
 *
37
 * @y.exclude
38
 */
39
public class DeferredJobs
40
  {
41 c92c163c Leszek Koltunski
  private static final int JOB_TYPE_VERTEX       = 0;
42
  private static final int JOB_TYPE_MATRIX       = 1;
43
  private static final int JOB_TYPE_MERGE_TEX    = 2;
44
  private static final int JOB_TYPE_MERGE_EFF    = 3;
45
  private static final int JOB_TYPE_JOIN         = 4;
46
  private static final int JOB_TYPE_COPY         = 5;
47
  private static final int JOB_TYPE_TEXTURE      = 6;
48
  private static final int JOB_TYPE_ASSOC        = 7;
49
  private static final int JOB_TYPE_CENTER       = 8;
50
  private static final int JOB_TYPE_ADD_EMPTY_TEX= 9;
51 07206c71 Leszek Koltunski
52 46d463a4 Leszek Koltunski
  private static final ArrayList<JobNode> mJobs = new ArrayList<>();
53 07206c71 Leszek Koltunski
54
  //////////////////////////////////////////////////////////////////////////
55
56
  private static class Job
57
    {
58 46d463a4 Leszek Koltunski
    private final int mType;
59
    private final MeshBase mTarget;
60
    private final MeshBase[] mSource;
61
    private final MatrixEffect mMatrixEffect;
62
    private final Static4D[] mMaps;
63
    private final int mComp, mAndAssoc, mEquAssoc;
64
    private final float mX,mY,mZ;
65
66 e8925fcd Leszek Koltunski
    private EffectQueueVertex mVertexEffects;
67 07206c71 Leszek Koltunski
68 c92c163c Leszek Koltunski
    Job(int type, MeshBase target, MeshBase[] source, VertexEffect vEff, MatrixEffect mEff,
69
        Static4D[] maps, int comp, int and, int equ, float x, float y, float z)
70 07206c71 Leszek Koltunski
      {
71 e8925fcd Leszek Koltunski
      mType     = type;
72
      mTarget   = target;
73
      mSource   = source;
74
      mMaps     = maps;
75 26671ef8 Leszek Koltunski
      mComp     = comp;
76 e8925fcd Leszek Koltunski
      mAndAssoc = and;
77 26671ef8 Leszek Koltunski
      mEquAssoc = equ;
78 7a9edb92 Leszek Koltunski
      mX        = x;
79
      mY        = y;
80
      mZ        = z;
81 e8925fcd Leszek Koltunski
82
      if( vEff!=null )
83 4c68cfd3 Leszek Koltunski
        {
84 e8925fcd Leszek Koltunski
        mVertexEffects= new EffectQueueVertex();
85
        mVertexEffects.add(vEff);
86 4c68cfd3 Leszek Koltunski
        }
87 e8925fcd Leszek Koltunski
88
      mMatrixEffect = mEff;
89 07206c71 Leszek Koltunski
      }
90
91
    void addEffect(VertexEffect effect)
92
      {
93 e8925fcd Leszek Koltunski
      mVertexEffects.add(effect);
94 07206c71 Leszek Koltunski
      }
95
96
    void execute()
97
      {
98
      switch(mType)
99
        {
100 c92c163c Leszek Koltunski
        case JOB_TYPE_VERTEX       : DistortedLibrary.adjustVertices(mTarget, mVertexEffects);
101
                                     break;
102
        case JOB_TYPE_MATRIX       : mTarget.applyMatrix(mMatrixEffect,mAndAssoc,mEquAssoc);
103
                                     break;
104
        case JOB_TYPE_MERGE_TEX    : mTarget.mergeTexComponentsNow();
105
                                     break;
106
        case JOB_TYPE_MERGE_EFF    : mTarget.mergeEffComponentsNow();
107
                                     break;
108
        case JOB_TYPE_JOIN         : mTarget.joinAttribs(mSource);
109
                                     break;
110
        case JOB_TYPE_COPY         : mTarget.copy(mSource[0]);
111
                                     break;
112
        case JOB_TYPE_TEXTURE      : mTarget.textureMap(mMaps,mComp);
113
                                     break;
114
        case JOB_TYPE_ASSOC        : mTarget.setEffectAssociationNow(mComp,mAndAssoc,mEquAssoc);
115
                                     break;
116
        case JOB_TYPE_CENTER       : mTarget.setComponentCenterNow(mComp,mX,mY,mZ);
117
                                     break;
118
        case JOB_TYPE_ADD_EMPTY_TEX: mTarget.addEmptyTexComponentNow();
119
                                     break;
120 07206c71 Leszek Koltunski
        }
121
      }
122
123
    void clear()
124
      {
125 e8925fcd Leszek Koltunski
      if( mVertexEffects!=null ) mVertexEffects.removeAll(false);
126 07206c71 Leszek Koltunski
      }
127 1fad573e Leszek Koltunski
128
    String print()
129
      {
130
      switch(mType)
131
        {
132 c92c163c Leszek Koltunski
        case JOB_TYPE_VERTEX       : return "VERTEX";
133
        case JOB_TYPE_MATRIX       : return "MATRIX";
134
        case JOB_TYPE_MERGE_TEX    : return "MERGE_TEX";
135
        case JOB_TYPE_MERGE_EFF    : return "MERGE_EFF";
136
        case JOB_TYPE_JOIN         : return "JOIN";
137
        case JOB_TYPE_COPY         : return "COPY";
138
        case JOB_TYPE_TEXTURE      : return "TEXTURE";
139
        case JOB_TYPE_ASSOC        : return "ASSOC";
140
        case JOB_TYPE_CENTER       : return "CENTER";
141
        case JOB_TYPE_ADD_EMPTY_TEX: return "ADD_EMPTY_TEX";
142 1fad573e Leszek Koltunski
        }
143
144
      return null;
145
      }
146 07206c71 Leszek Koltunski
    }
147
148
  //////////////////////////////////////////////////////////////////////////
149
150
  static class JobNode
151
    {
152
    private ArrayList<JobNode> mPrevJobs;
153
    private ArrayList<JobNode> mNextJobs;
154
    private Job mJob;
155
156
    JobNode(Job job)
157
      {
158
      mPrevJobs = new ArrayList<>();
159
      mNextJobs = new ArrayList<>();
160
      mJob      = job;
161
      }
162
163 51b92d1c Leszek Koltunski
    synchronized void execute()
164 07206c71 Leszek Koltunski
      {
165 51b92d1c Leszek Koltunski
      if( mPrevJobs!=null )
166 07206c71 Leszek Koltunski
        {
167 51b92d1c Leszek Koltunski
        JobNode node;
168
        int numPrev = mPrevJobs.size();
169 07206c71 Leszek Koltunski
170 51b92d1c Leszek Koltunski
        for(int i=0; i<numPrev; i++)
171
          {
172
          node = mPrevJobs.get(0);  // removeNode() rips the executed job out, thus the 0
173
          node.execute();
174
          }
175
176
        removeNode(this);
177
        mJob.execute();
178
        }
179 07206c71 Leszek Koltunski
      }
180
181 51b92d1c Leszek Koltunski
    synchronized void clear()
182 07206c71 Leszek Koltunski
      {
183
      mPrevJobs.clear();
184
      mPrevJobs = null;
185
      mNextJobs.clear();
186
      mNextJobs = null;
187
188
      mJob.clear();
189
      mJob = null;
190
      }
191 1fad573e Leszek Koltunski
192
    void print(int level)
193
      {
194
      int numPrev = mPrevJobs.size();
195
      int numNext = mNextJobs.size();
196
197
      String str = "";
198
      for(int i=0; i<level; i++) str+=" ";
199
200
      str += mJob.print();
201
202
      str += (" next: "+numNext+" prev: "+numPrev);
203
204
      Log.e("job", str);
205
206
      for(int i=0; i<numPrev; i++)
207
        {
208
        JobNode node = mPrevJobs.get(i);
209
        node.print(level+1);
210
        }
211
      }
212 07206c71 Leszek Koltunski
    }
213
214
///////////////////////////////////////////////////////////////////////////////////////////////////
215
216
  private static void removeNode(JobNode node)
217
    {
218
    mJobs.remove(node);
219
    JobNode jn;
220
221
    int numPrev = node.mPrevJobs.size();
222
223
    for(int i=0; i<numPrev; i++)
224
      {
225
      jn = node.mPrevJobs.get(i);
226
      jn.mNextJobs.remove(node);
227
      }
228
229
    int numNext = node.mNextJobs.size();
230
231
    for(int i=0; i<numNext; i++)
232
      {
233
      jn = node.mNextJobs.get(i);
234
      jn.mPrevJobs.remove(node);
235
      }
236
237 71d8aba1 Leszek Koltunski
    node.mJob.mTarget.mJobNode[0] = null;
238 07206c71 Leszek Koltunski
    }
239
240
///////////////////////////////////////////////////////////////////////////////////////////////////
241
242
  static JobNode vertex(MeshBase target, VertexEffect effect)
243
    {
244 71d8aba1 Leszek Koltunski
    JobNode jn = target.mJobNode[0];
245 07206c71 Leszek Koltunski
246
    if( jn==null )
247
      {
248 7a9edb92 Leszek Koltunski
      Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null,null,0,0,0,0,0,0);
249 07206c71 Leszek Koltunski
      JobNode node = new JobNode(job);
250
      mJobs.add(node);
251
      return node;
252
      }
253
    else
254
      {
255
      if( jn.mJob.mType==JOB_TYPE_VERTEX )
256
        {
257
        jn.mJob.addEffect(effect);
258
        return jn;
259
        }
260
      else
261
        {
262 7a9edb92 Leszek Koltunski
        Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null,null,0,0,0,0,0,0);
263 07206c71 Leszek Koltunski
        JobNode node = new JobNode(job);
264
        node.mPrevJobs.add(jn);
265
        jn.mNextJobs.add(node);
266
        mJobs.add(node);
267
        return node;
268
        }
269
      }
270
    }
271
272
///////////////////////////////////////////////////////////////////////////////////////////////////
273
274 e8925fcd Leszek Koltunski
  static JobNode matrix(MeshBase target, MatrixEffect effect, int andAssoc, int ecuAssoc)
275
    {
276
    JobNode jn = target.mJobNode[0];
277 7a9edb92 Leszek Koltunski
    Job job = new Job(JOB_TYPE_MATRIX,target,null,null,effect,null,0,andAssoc,ecuAssoc,0,0,0);
278 e8925fcd Leszek Koltunski
    JobNode node = new JobNode(job);
279
    node.mPrevJobs.add(jn);
280
    jn.mNextJobs.add(node);
281
    mJobs.add(node);
282
    return node;
283
    }
284
285
///////////////////////////////////////////////////////////////////////////////////////////////////
286
287
  static JobNode mergeTex(MeshBase target)
288
    {
289
    JobNode jn = target.mJobNode[0];
290 7a9edb92 Leszek Koltunski
    Job job = new Job(JOB_TYPE_MERGE_TEX,target,null,null,null,null,0,0,0,0,0,0);
291 e8925fcd Leszek Koltunski
    JobNode node = new JobNode(job);
292
    node.mPrevJobs.add(jn);
293
    jn.mNextJobs.add(node);
294
    mJobs.add(node);
295
    return node;
296
    }
297
298 c92c163c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
299
300
  static JobNode addEmptyTex(MeshBase target)
301
    {
302
    JobNode jn = target.mJobNode[0];
303
    Job job = new Job(JOB_TYPE_ADD_EMPTY_TEX,target,null,null,null,null,0,0,0,0,0,0);
304
    JobNode node = new JobNode(job);
305
    node.mPrevJobs.add(jn);
306
    jn.mNextJobs.add(node);
307
    mJobs.add(node);
308
    return node;
309
    }
310
311 e8925fcd Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
312
313
  static JobNode mergeEff(MeshBase target)
314 07206c71 Leszek Koltunski
    {
315 a8dfedcc Leszek Koltunski
    JobNode jn = target.mJobNode[0];
316 7a9edb92 Leszek Koltunski
    Job job = new Job(JOB_TYPE_MERGE_EFF,target,null,null,null,null,0,0,0,0,0,0);
317 6923706f Leszek Koltunski
    JobNode node = new JobNode(job);
318
    node.mPrevJobs.add(jn);
319
    jn.mNextJobs.add(node);
320
    mJobs.add(node);
321
    return node;
322 07206c71 Leszek Koltunski
    }
323
324
///////////////////////////////////////////////////////////////////////////////////////////////////
325
326 1fad573e Leszek Koltunski
  static JobNode join(MeshBase target, MeshBase[] meshes)
327 07206c71 Leszek Koltunski
    {
328 6923706f Leszek Koltunski
    JobNode jn;
329 a8dfedcc Leszek Koltunski
330 7a9edb92 Leszek Koltunski
    Job job = new Job(JOB_TYPE_JOIN,target,meshes,null,null,null,0,0,0,0,0,0);
331 6923706f Leszek Koltunski
    JobNode node = new JobNode(job);
332
333
    for (MeshBase mesh : meshes)
334 a8dfedcc Leszek Koltunski
      {
335 6923706f Leszek Koltunski
      jn = mesh.mJobNode[0];
336 1fad573e Leszek Koltunski
337
      if( jn!=null )
338
        {
339
        node.mPrevJobs.add(jn);
340
        jn.mNextJobs.add(node);
341
        }
342 a8dfedcc Leszek Koltunski
      }
343 6923706f Leszek Koltunski
344
    mJobs.add(node);
345
    return node;
346 07206c71 Leszek Koltunski
    }
347
348
///////////////////////////////////////////////////////////////////////////////////////////////////
349
350
  static JobNode copy(MeshBase target, MeshBase mesh)
351
    {
352 6923706f Leszek Koltunski
    JobNode jn = mesh.mJobNode[0];
353
    MeshBase[] meshes = new MeshBase[1];
354
    meshes[0] = mesh;
355 7a9edb92 Leszek Koltunski
    Job job = new Job(JOB_TYPE_COPY,target,meshes,null,null,null,0,0,0,0,0,0);
356 1fad573e Leszek Koltunski
    JobNode node = new JobNode(job);
357
    node.mPrevJobs.add(jn);
358
    jn.mNextJobs.add(node);
359
    mJobs.add(node);
360
    return node;
361
    }
362
363
///////////////////////////////////////////////////////////////////////////////////////////////////
364
365 dbe3079d Leszek Koltunski
  static JobNode textureMap(MeshBase target, Static4D[] maps, int comp)
366 1fad573e Leszek Koltunski
    {
367
    JobNode jn = target.mJobNode[0];
368 7a9edb92 Leszek Koltunski
    Job job = new Job(JOB_TYPE_TEXTURE,target,null,null,null,maps,comp,0,0,0,0,0);
369 26671ef8 Leszek Koltunski
    JobNode node = new JobNode(job);
370
    node.mPrevJobs.add(jn);
371
    jn.mNextJobs.add(node);
372
    mJobs.add(node);
373
    return node;
374
    }
375
376
///////////////////////////////////////////////////////////////////////////////////////////////////
377
378
  static JobNode effectAssoc(MeshBase target, int comp, int andAssoc, int equAssoc)
379
    {
380
    JobNode jn = target.mJobNode[0];
381 7a9edb92 Leszek Koltunski
    Job job = new Job(JOB_TYPE_ASSOC,target,null,null,null,null,comp,andAssoc,equAssoc,0,0,0);
382
    JobNode node = new JobNode(job);
383
    node.mPrevJobs.add(jn);
384
    jn.mNextJobs.add(node);
385
    mJobs.add(node);
386
    return node;
387
    }
388
389
///////////////////////////////////////////////////////////////////////////////////////////////////
390
391
  static JobNode componentCenter(MeshBase target, int comp, float x, float y, float z)
392
    {
393
    JobNode jn = target.mJobNode[0];
394
    Job job = new Job(JOB_TYPE_CENTER,target,null,null,null,null,comp,0,0,x,y,z);
395 6923706f Leszek Koltunski
    JobNode node = new JobNode(job);
396
    node.mPrevJobs.add(jn);
397
    jn.mNextJobs.add(node);
398
    mJobs.add(node);
399
    return node;
400 07206c71 Leszek Koltunski
    }
401
402
///////////////////////////////////////////////////////////////////////////////////////////////////
403
/**
404
 * Only for use by the library itself.
405
 *
406
 * @y.exclude
407
 */
408 8d98b65f Leszek Koltunski
  public static void onPause()
409 07206c71 Leszek Koltunski
    {
410
    int num = mJobs.size();
411
412
    for(int i=0; i<num; i++)
413
      {
414
      mJobs.get(i).clear();
415
      }
416
417
    mJobs.clear();
418
    }
419
  }