Project

General

Profile

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

library / src / main / java / org / distorted / library / mesh / DeferredJobs.java @ 51b92d1c

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