Project

General

Profile

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

library / src / main / java / org / distorted / library / mesh / DeferredJobs.java @ 8c57d77b

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