Project

General

Profile

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

library / src / main / java / org / distorted / library / mesh / DeferredJobs.java @ 97b6c85e

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 ArrayList<JobNode> mJobs = new ArrayList<>();
52

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

    
55
  private static class Job
56
    {
57
    private int mType;
58
    private MeshBase mTarget;
59
    private MeshBase[] mSource;
60
    private EffectQueueVertex mVertexEffects;
61
    private MatrixEffect mMatrixEffect;
62
    private Static4D[] mMaps;
63
    private int mComp, mAndAssoc, mEquAssoc;
64
    private float mX,mY,mZ;
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
    void execute()
162
      {
163
      JobNode node;
164
      int numPrev = mPrevJobs.size();
165

    
166
      for(int i=0; i<numPrev; i++)
167
        {
168
        node = mPrevJobs.get(0);  // removeNode() rips the executed job out, thus the 0
169
        node.execute();
170
        }
171

    
172
      removeNode(this);
173
      mJob.execute();
174
      }
175

    
176
    void clear()
177
      {
178
      mPrevJobs.clear();
179
      mPrevJobs = null;
180
      mNextJobs.clear();
181
      mNextJobs = null;
182

    
183
      mJob.clear();
184
      mJob = null;
185
      }
186

    
187
    void print(int level)
188
      {
189
      int numPrev = mPrevJobs.size();
190
      int numNext = mNextJobs.size();
191

    
192
      String str = "";
193
      for(int i=0; i<level; i++) str+=" ";
194

    
195
      str += mJob.print();
196

    
197
      str += (" next: "+numNext+" prev: "+numPrev);
198

    
199
      Log.e("job", str);
200

    
201
      for(int i=0; i<numPrev; i++)
202
        {
203
        JobNode node = mPrevJobs.get(i);
204
        node.print(level+1);
205
        }
206
      }
207
    }
208

    
209
///////////////////////////////////////////////////////////////////////////////////////////////////
210

    
211
  private static void removeNode(JobNode node)
212
    {
213
    mJobs.remove(node);
214
    JobNode jn;
215

    
216
    int numPrev = node.mPrevJobs.size();
217

    
218
    for(int i=0; i<numPrev; i++)
219
      {
220
      jn = node.mPrevJobs.get(i);
221
      jn.mNextJobs.remove(node);
222
      }
223

    
224
    int numNext = node.mNextJobs.size();
225

    
226
    for(int i=0; i<numNext; i++)
227
      {
228
      jn = node.mNextJobs.get(i);
229
      jn.mPrevJobs.remove(node);
230
      }
231

    
232
    node.mJob.mTarget.mJobNode[0] = null;
233
    }
234

    
235
///////////////////////////////////////////////////////////////////////////////////////////////////
236

    
237
  static JobNode vertex(MeshBase target, VertexEffect effect)
238
    {
239
    JobNode jn = target.mJobNode[0];
240

    
241
    if( jn==null )
242
      {
243
      Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null,null,0,0,0,0,0,0);
244
      JobNode node = new JobNode(job);
245
      mJobs.add(node);
246
      return node;
247
      }
248
    else
249
      {
250
      if( jn.mJob.mType==JOB_TYPE_VERTEX )
251
        {
252
        jn.mJob.addEffect(effect);
253
        return jn;
254
        }
255
      else
256
        {
257
        Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null,null,0,0,0,0,0,0);
258
        JobNode node = new JobNode(job);
259
        node.mPrevJobs.add(jn);
260
        jn.mNextJobs.add(node);
261
        mJobs.add(node);
262
        return node;
263
        }
264
      }
265
    }
266

    
267
///////////////////////////////////////////////////////////////////////////////////////////////////
268

    
269
  static JobNode matrix(MeshBase target, MatrixEffect effect, int andAssoc, int ecuAssoc)
270
    {
271
    JobNode jn = target.mJobNode[0];
272
    Job job = new Job(JOB_TYPE_MATRIX,target,null,null,effect,null,0,andAssoc,ecuAssoc,0,0,0);
273
    JobNode node = new JobNode(job);
274
    node.mPrevJobs.add(jn);
275
    jn.mNextJobs.add(node);
276
    mJobs.add(node);
277
    return node;
278
    }
279

    
280
///////////////////////////////////////////////////////////////////////////////////////////////////
281

    
282
  static JobNode mergeTex(MeshBase target)
283
    {
284
    JobNode jn = target.mJobNode[0];
285
    Job job = new Job(JOB_TYPE_MERGE_TEX,target,null,null,null,null,0,0,0,0,0,0);
286
    JobNode node = new JobNode(job);
287
    node.mPrevJobs.add(jn);
288
    jn.mNextJobs.add(node);
289
    mJobs.add(node);
290
    return node;
291
    }
292

    
293
///////////////////////////////////////////////////////////////////////////////////////////////////
294

    
295
  static JobNode addEmptyTex(MeshBase target)
296
    {
297
    JobNode jn = target.mJobNode[0];
298
    Job job = new Job(JOB_TYPE_ADD_EMPTY_TEX,target,null,null,null,null,0,0,0,0,0,0);
299
    JobNode node = new JobNode(job);
300
    node.mPrevJobs.add(jn);
301
    jn.mNextJobs.add(node);
302
    mJobs.add(node);
303
    return node;
304
    }
305

    
306
///////////////////////////////////////////////////////////////////////////////////////////////////
307

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

    
319
///////////////////////////////////////////////////////////////////////////////////////////////////
320

    
321
  static JobNode join(MeshBase target, MeshBase[] meshes)
322
    {
323
    JobNode jn;
324

    
325
    Job job = new Job(JOB_TYPE_JOIN,target,meshes,null,null,null,0,0,0,0,0,0);
326
    JobNode node = new JobNode(job);
327

    
328
    for (MeshBase mesh : meshes)
329
      {
330
      jn = mesh.mJobNode[0];
331

    
332
      if( jn!=null )
333
        {
334
        node.mPrevJobs.add(jn);
335
        jn.mNextJobs.add(node);
336
        }
337
      }
338

    
339
    mJobs.add(node);
340
    return node;
341
    }
342

    
343
///////////////////////////////////////////////////////////////////////////////////////////////////
344

    
345
  static JobNode copy(MeshBase target, MeshBase mesh)
346
    {
347
    JobNode jn = mesh.mJobNode[0];
348
    MeshBase[] meshes = new MeshBase[1];
349
    meshes[0] = mesh;
350
    Job job = new Job(JOB_TYPE_COPY,target,meshes,null,null,null,0,0,0,0,0,0);
351
    JobNode node = new JobNode(job);
352
    node.mPrevJobs.add(jn);
353
    jn.mNextJobs.add(node);
354
    mJobs.add(node);
355
    return node;
356
    }
357

    
358
///////////////////////////////////////////////////////////////////////////////////////////////////
359

    
360
  static JobNode textureMap(MeshBase target, Static4D[] maps, int comp)
361
    {
362
    JobNode jn = target.mJobNode[0];
363
    Job job = new Job(JOB_TYPE_TEXTURE,target,null,null,null,maps,comp,0,0,0,0,0);
364
    JobNode node = new JobNode(job);
365
    node.mPrevJobs.add(jn);
366
    jn.mNextJobs.add(node);
367
    mJobs.add(node);
368
    return node;
369
    }
370

    
371
///////////////////////////////////////////////////////////////////////////////////////////////////
372

    
373
  static JobNode effectAssoc(MeshBase target, int comp, int andAssoc, int equAssoc)
374
    {
375
    JobNode jn = target.mJobNode[0];
376
    Job job = new Job(JOB_TYPE_ASSOC,target,null,null,null,null,comp,andAssoc,equAssoc,0,0,0);
377
    JobNode node = new JobNode(job);
378
    node.mPrevJobs.add(jn);
379
    jn.mNextJobs.add(node);
380
    mJobs.add(node);
381
    return node;
382
    }
383

    
384
///////////////////////////////////////////////////////////////////////////////////////////////////
385

    
386
  static JobNode componentCenter(MeshBase target, int comp, float x, float y, float z)
387
    {
388
    JobNode jn = target.mJobNode[0];
389
    Job job = new Job(JOB_TYPE_CENTER,target,null,null,null,null,comp,0,0,x,y,z);
390
    JobNode node = new JobNode(job);
391
    node.mPrevJobs.add(jn);
392
    jn.mNextJobs.add(node);
393
    mJobs.add(node);
394
    return node;
395
    }
396

    
397
///////////////////////////////////////////////////////////////////////////////////////////////////
398
/**
399
 * Only for use by the library itself.
400
 *
401
 * @y.exclude
402
 */
403
  public static void onDestroy()
404
    {
405
    int num = mJobs.size();
406

    
407
    for(int i=0; i<num; i++)
408
      {
409
      mJobs.get(i).clear();
410
      }
411

    
412
    mJobs.clear();
413
    }
414
  }
(1-1/10)