Project

General

Profile

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

library / src / main / java / org / distorted / library / mesh / DeferredJobs.java @ 46d463a4

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
    void execute()
163
      {
164
      JobNode node;
165
      int numPrev = mPrevJobs.size();
166

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

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

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

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

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

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

    
196
      str += mJob.print();
197

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

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

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

    
210
///////////////////////////////////////////////////////////////////////////////////////////////////
211

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

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

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

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

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

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

    
236
///////////////////////////////////////////////////////////////////////////////////////////////////
237

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

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

    
268
///////////////////////////////////////////////////////////////////////////////////////////////////
269

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

    
281
///////////////////////////////////////////////////////////////////////////////////////////////////
282

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

    
294
///////////////////////////////////////////////////////////////////////////////////////////////////
295

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

    
307
///////////////////////////////////////////////////////////////////////////////////////////////////
308

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

    
320
///////////////////////////////////////////////////////////////////////////////////////////////////
321

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

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

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

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

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

    
344
///////////////////////////////////////////////////////////////////////////////////////////////////
345

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

    
359
///////////////////////////////////////////////////////////////////////////////////////////////////
360

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

    
372
///////////////////////////////////////////////////////////////////////////////////////////////////
373

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

    
385
///////////////////////////////////////////////////////////////////////////////////////////////////
386

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

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

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

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