Project

General

Profile

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

library / src / main / java / org / distorted / library / mesh / DeferredJobs.java @ 7a9edb92

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

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

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

    
54
  private static class Job
55
    {
56
    private int mType;
57
    private MeshBase mTarget;
58
    private MeshBase[] mSource;
59
    private EffectQueueVertex mVertexEffects;
60
    private MatrixEffect mMatrixEffect;
61
    private Static4D[] mMaps;
62
    private int mComp, mAndAssoc, mEquAssoc;
63
    private float mX,mY,mZ;
64

    
65
    Job(int type, MeshBase target, MeshBase[] source, VertexEffect vEff, MatrixEffect mEff, Static4D[] maps, int comp, int and, int equ, float x, float y, float z)
66
      {
67
      mType     = type;
68
      mTarget   = target;
69
      mSource   = source;
70
      mMaps     = maps;
71
      mComp     = comp;
72
      mAndAssoc = and;
73
      mEquAssoc = equ;
74
      mX        = x;
75
      mY        = y;
76
      mZ        = z;
77

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

    
84
      mMatrixEffect = mEff;
85
      }
86

    
87
    void addEffect(VertexEffect effect)
88
      {
89
      mVertexEffects.add(effect);
90
      }
91

    
92
    void execute()
93
      {
94
      switch(mType)
95
        {
96
        case JOB_TYPE_VERTEX   : DistortedLibrary.adjustVertices(mTarget, mVertexEffects);
97
                                 break;
98
        case JOB_TYPE_MATRIX   : mTarget.applyMatrix(mMatrixEffect,mAndAssoc,mEquAssoc);
99
                                 break;
100
        case JOB_TYPE_MERGE_TEX: mTarget.mergeTexComponentsNow();
101
                                 break;
102
        case JOB_TYPE_MERGE_EFF: mTarget.mergeEffComponentsNow();
103
                                 break;
104
        case JOB_TYPE_JOIN     : mTarget.joinAttribs(mSource);
105
                                 break;
106
        case JOB_TYPE_COPY     : mTarget.copy(mSource[0]);
107
                                 break;
108
        case JOB_TYPE_TEXTURE  : mTarget.textureMap(mMaps,mComp);
109
                                 break;
110
        case JOB_TYPE_ASSOC    : mTarget.setEffectAssociationNow(mComp,mAndAssoc,mEquAssoc);
111
                                 break;
112
        case JOB_TYPE_CENTER   : mTarget.setComponentCenterNow(mComp,mX,mY,mZ);
113
                                 break;
114
        }
115
/*
116
      Log.e("jobs", "executing "+print()+" job");
117
      mTarget.print();
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
        }
140

    
141
      return null;
142
      }
143
    }
144

    
145
  //////////////////////////////////////////////////////////////////////////
146

    
147
  static class JobNode
148
    {
149
    private ArrayList<JobNode> mPrevJobs;
150
    private ArrayList<JobNode> mNextJobs;
151
    private Job mJob;
152

    
153
    JobNode(Job job)
154
      {
155
      mPrevJobs = new ArrayList<>();
156
      mNextJobs = new ArrayList<>();
157
      mJob      = job;
158
      }
159

    
160
    void execute()
161
      {
162
      JobNode node;
163
      int numPrev = mPrevJobs.size();
164

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

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

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

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

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

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

    
194
      str += mJob.print();
195

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

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

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

    
208
///////////////////////////////////////////////////////////////////////////////////////////////////
209

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

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

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

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

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

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

    
234
///////////////////////////////////////////////////////////////////////////////////////////////////
235

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

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

    
266
///////////////////////////////////////////////////////////////////////////////////////////////////
267

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

    
279
///////////////////////////////////////////////////////////////////////////////////////////////////
280

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

    
292
///////////////////////////////////////////////////////////////////////////////////////////////////
293

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

    
305
///////////////////////////////////////////////////////////////////////////////////////////////////
306

    
307
  static JobNode join(MeshBase target, MeshBase[] meshes)
308
    {
309
    JobNode jn;
310

    
311
    Job job = new Job(JOB_TYPE_JOIN,target,meshes,null,null,null,0,0,0,0,0,0);
312
    JobNode node = new JobNode(job);
313

    
314
    for (MeshBase mesh : meshes)
315
      {
316
      jn = mesh.mJobNode[0];
317

    
318
      if( jn!=null )
319
        {
320
        node.mPrevJobs.add(jn);
321
        jn.mNextJobs.add(node);
322
        }
323
      }
324

    
325
    mJobs.add(node);
326
    return node;
327
    }
328

    
329
///////////////////////////////////////////////////////////////////////////////////////////////////
330

    
331
  static JobNode copy(MeshBase target, MeshBase mesh)
332
    {
333
    JobNode jn = mesh.mJobNode[0];
334
    MeshBase[] meshes = new MeshBase[1];
335
    meshes[0] = mesh;
336
    Job job = new Job(JOB_TYPE_COPY,target,meshes,null,null,null,0,0,0,0,0,0);
337
    JobNode node = new JobNode(job);
338
    node.mPrevJobs.add(jn);
339
    jn.mNextJobs.add(node);
340
    mJobs.add(node);
341
    return node;
342
    }
343

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

    
346
  static JobNode textureMap(MeshBase target, Static4D[] maps, int comp)
347
    {
348
    JobNode jn = target.mJobNode[0];
349
    Job job = new Job(JOB_TYPE_TEXTURE,target,null,null,null,maps,comp,0,0,0,0,0);
350
    JobNode node = new JobNode(job);
351
    node.mPrevJobs.add(jn);
352
    jn.mNextJobs.add(node);
353
    mJobs.add(node);
354
    return node;
355
    }
356

    
357
///////////////////////////////////////////////////////////////////////////////////////////////////
358

    
359
  static JobNode effectAssoc(MeshBase target, int comp, int andAssoc, int equAssoc)
360
    {
361
    JobNode jn = target.mJobNode[0];
362
    Job job = new Job(JOB_TYPE_ASSOC,target,null,null,null,null,comp,andAssoc,equAssoc,0,0,0);
363
    JobNode node = new JobNode(job);
364
    node.mPrevJobs.add(jn);
365
    jn.mNextJobs.add(node);
366
    mJobs.add(node);
367
    return node;
368
    }
369

    
370
///////////////////////////////////////////////////////////////////////////////////////////////////
371

    
372
  static JobNode componentCenter(MeshBase target, int comp, float x, float y, float z)
373
    {
374
    JobNode jn = target.mJobNode[0];
375
    Job job = new Job(JOB_TYPE_CENTER,target,null,null,null,null,comp,0,0,x,y,z);
376
    JobNode node = new JobNode(job);
377
    node.mPrevJobs.add(jn);
378
    jn.mNextJobs.add(node);
379
    mJobs.add(node);
380
    return node;
381
    }
382

    
383
///////////////////////////////////////////////////////////////////////////////////////////////////
384
/**
385
 * Only for use by the library itself.
386
 *
387
 * @y.exclude
388
 */
389
  public static void onDestroy()
390
    {
391
    int num = mJobs.size();
392

    
393
    for(int i=0; i<num; i++)
394
      {
395
      mJobs.get(i).clear();
396
      }
397

    
398
    mJobs.clear();
399
    }
400
  }
(1-1/11)