Project

General

Profile

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

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

1
///////////////////////////////////////////////////////////////////////////////////////////////////
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
import org.distorted.library.effect.MatrixEffect;
23
import org.distorted.library.effect.VertexEffect;
24
import org.distorted.library.effectqueue.EffectQueueVertex;
25
import org.distorted.library.main.DistortedLibrary;
26
import org.distorted.library.type.Static4D;
27

    
28
import java.util.ArrayList;
29

    
30
import android.util.Log;
31

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

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

    
53
  //////////////////////////////////////////////////////////////////////////
54

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

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

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

    
87
      mMatrixEffect = mEff;
88
      }
89

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

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

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

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

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

    
169
        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
      }
179

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

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

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

    
239
///////////////////////////////////////////////////////////////////////////////////////////////////
240

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

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

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

    
323
///////////////////////////////////////////////////////////////////////////////////////////////////
324

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

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

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

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

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

    
347
///////////////////////////////////////////////////////////////////////////////////////////////////
348

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

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