Project

General

Profile

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

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

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski  leszek@koltunski.pl                                          //
3
//                                                                                               //
4
// This file is part of Distorted.                                                               //
5
//                                                                                               //
6
// 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
//                                                                                               //
11
// This library 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 GNU                             //
14
// Lesser General Public License for more details.                                               //
15
//                                                                                               //
16
// 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
///////////////////////////////////////////////////////////////////////////////////////////////////
20

    
21
package org.distorted.library.mesh;
22

    
23
import org.distorted.library.effect.MatrixEffect;
24
import org.distorted.library.effect.VertexEffect;
25
import org.distorted.library.effectqueue.EffectQueueVertex;
26
import org.distorted.library.main.DistortedLibrary;
27
import org.distorted.library.type.Static4D;
28

    
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
  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

    
50
  private static final ArrayList<JobNode> mJobs = new ArrayList<>();
51

    
52
  //////////////////////////////////////////////////////////////////////////
53

    
54
  private static class Job
55
    {
56
    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
    private EffectQueueVertex mVertexEffects;
65

    
66
    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
      {
69
      mType     = type;
70
      mTarget   = target;
71
      mSource   = source;
72
      mMaps     = maps;
73
      mComp     = comp;
74
      mAndAssoc = and;
75
      mEquAssoc = equ;
76
      mX        = x;
77
      mY        = y;
78
      mZ        = z;
79

    
80
      if( vEff!=null )
81
        {
82
        mVertexEffects= new EffectQueueVertex();
83
        mVertexEffects.add(vEff);
84
        }
85

    
86
      mMatrixEffect = mEff;
87
      }
88

    
89
    void addEffect(VertexEffect effect)
90
      {
91
      mVertexEffects.add(effect);
92
      }
93

    
94
    void execute()
95
      {
96
      switch(mType)
97
        {
98
        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
        }
119
      }
120

    
121
    void clear()
122
      {
123
      if( mVertexEffects!=null ) mVertexEffects.removeAll(false);
124
      }
125

    
126
    String print()
127
      {
128
      switch(mType)
129
        {
130
        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
        }
141

    
142
      return null;
143
      }
144
    }
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
    synchronized void execute()
162
      {
163
      if( mPrevJobs!=null )
164
        {
165
        JobNode node;
166
        int numPrev = mPrevJobs.size();
167

    
168
        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
      }
178

    
179
    synchronized void clear()
180
      {
181
      mPrevJobs.clear();
182
      mPrevJobs = null;
183
      mNextJobs.clear();
184
      mNextJobs = null;
185

    
186
      mJob.clear();
187
      mJob = null;
188
      }
189

    
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
      DistortedLibrary.logMessage("DeferredJobs: "+str);
203

    
204
      for(int i=0; i<numPrev; i++)
205
        {
206
        JobNode node = mPrevJobs.get(i);
207
        node.print(level+1);
208
        }
209
      }
210
    }
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
    node.mJob.mTarget.mJobNode[0] = null;
236
    }
237

    
238
///////////////////////////////////////////////////////////////////////////////////////////////////
239

    
240
  static JobNode vertex(MeshBase target, VertexEffect effect)
241
    {
242
    JobNode jn = target.mJobNode[0];
243

    
244
    if( jn==null )
245
      {
246
      Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null,null,0,0,0,0,0,0);
247
      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
        Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null,null,0,0,0,0,0,0);
261
        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
  static JobNode matrix(MeshBase target, MatrixEffect effect, int andAssoc, int ecuAssoc)
273
    {
274
    JobNode jn = target.mJobNode[0];
275
    Job job = new Job(JOB_TYPE_MATRIX,target,null,null,effect,null,0,andAssoc,ecuAssoc,0,0,0);
276
    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
    Job job = new Job(JOB_TYPE_MERGE_TEX,target,null,null,null,null,0,0,0,0,0,0);
289
    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
///////////////////////////////////////////////////////////////////////////////////////////////////
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
///////////////////////////////////////////////////////////////////////////////////////////////////
310

    
311
  static JobNode mergeEff(MeshBase target)
312
    {
313
    JobNode jn = target.mJobNode[0];
314
    Job job = new Job(JOB_TYPE_MERGE_EFF,target,null,null,null,null,0,0,0,0,0,0);
315
    JobNode node = new JobNode(job);
316
    node.mPrevJobs.add(jn);
317
    jn.mNextJobs.add(node);
318
    mJobs.add(node);
319
    return node;
320
    }
321

    
322
///////////////////////////////////////////////////////////////////////////////////////////////////
323

    
324
  static JobNode join(MeshBase target, MeshBase[] meshes)
325
    {
326
    JobNode jn;
327

    
328
    Job job = new Job(JOB_TYPE_JOIN,target,meshes,null,null,null,0,0,0,0,0,0);
329
    JobNode node = new JobNode(job);
330

    
331
    for (MeshBase mesh : meshes)
332
      {
333
      jn = mesh.mJobNode[0];
334

    
335
      if( jn!=null )
336
        {
337
        node.mPrevJobs.add(jn);
338
        jn.mNextJobs.add(node);
339
        }
340
      }
341

    
342
    mJobs.add(node);
343
    return node;
344
    }
345

    
346
///////////////////////////////////////////////////////////////////////////////////////////////////
347

    
348
  static JobNode copy(MeshBase target, MeshBase mesh)
349
    {
350
    JobNode jn = mesh.mJobNode[0];
351
    MeshBase[] meshes = new MeshBase[1];
352
    meshes[0] = mesh;
353
    Job job = new Job(JOB_TYPE_COPY,target,meshes,null,null,null,0,0,0,0,0,0);
354
    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
  static JobNode textureMap(MeshBase target, Static4D[] maps, int comp)
364
    {
365
    JobNode jn = target.mJobNode[0];
366
    Job job = new Job(JOB_TYPE_TEXTURE,target,null,null,null,maps,comp,0,0,0,0,0);
367
    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
    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
    JobNode node = new JobNode(job);
394
    node.mPrevJobs.add(jn);
395
    jn.mNextJobs.add(node);
396
    mJobs.add(node);
397
    return node;
398
    }
399

    
400
///////////////////////////////////////////////////////////////////////////////////////////////////
401
/**
402
 * Only for use by the library itself.
403
 *
404
 * @y.exclude
405
 */
406
  public static void onPause()
407
    {
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
  }
(1-1/10)