Project

General

Profile

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

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

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
import android.util.Log;
32

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

    
52
  private static final ArrayList<JobNode> mJobs = new ArrayList<>();
53

    
54
  //////////////////////////////////////////////////////////////////////////
55

    
56
  private static class Job
57
    {
58
    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
    private EffectQueueVertex mVertexEffects;
67

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

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

    
88
      mMatrixEffect = mEff;
89
      }
90

    
91
    void addEffect(VertexEffect effect)
92
      {
93
      mVertexEffects.add(effect);
94
      }
95

    
96
    void execute()
97
      {
98
      switch(mType)
99
        {
100
        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
        }
121
      }
122

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

    
128
    String print()
129
      {
130
      switch(mType)
131
        {
132
        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
        }
143

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

    
170
        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
      }
180

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

    
188
      mJob.clear();
189
      mJob = null;
190
      }
191

    
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
    }
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
    node.mJob.mTarget.mJobNode[0] = null;
238
    }
239

    
240
///////////////////////////////////////////////////////////////////////////////////////////////////
241

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

    
246
    if( jn==null )
247
      {
248
      Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null,null,0,0,0,0,0,0);
249
      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
        Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null,null,0,0,0,0,0,0);
263
        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
  static JobNode matrix(MeshBase target, MatrixEffect effect, int andAssoc, int ecuAssoc)
275
    {
276
    JobNode jn = target.mJobNode[0];
277
    Job job = new Job(JOB_TYPE_MATRIX,target,null,null,effect,null,0,andAssoc,ecuAssoc,0,0,0);
278
    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
    Job job = new Job(JOB_TYPE_MERGE_TEX,target,null,null,null,null,0,0,0,0,0,0);
291
    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
///////////////////////////////////////////////////////////////////////////////////////////////////
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
///////////////////////////////////////////////////////////////////////////////////////////////////
312

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

    
324
///////////////////////////////////////////////////////////////////////////////////////////////////
325

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

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

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

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

    
344
    mJobs.add(node);
345
    return node;
346
    }
347

    
348
///////////////////////////////////////////////////////////////////////////////////////////////////
349

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

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