Project

General

Profile

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

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

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

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

    
51
  //////////////////////////////////////////////////////////////////////////
52

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

    
63
    Job(int type, MeshBase target, MeshBase[] source, VertexEffect vEff, MatrixEffect mEff, Static4D[] maps, int comp, int and, int equ)
64
      {
65
      mType     = type;
66
      mTarget   = target;
67
      mSource   = source;
68
      mMaps     = maps;
69
      mComp     = comp;
70
      mAndAssoc = and;
71
      mEquAssoc = equ;
72

    
73
      if( vEff!=null )
74
        {
75
        mVertexEffects= new EffectQueueVertex();
76
        mVertexEffects.add(vEff);
77
        }
78

    
79
      mMatrixEffect = mEff;
80
      }
81

    
82
    void addEffect(VertexEffect effect)
83
      {
84
      mVertexEffects.add(effect);
85
      }
86

    
87
    void execute()
88
      {
89
      switch(mType)
90
        {
91
        case JOB_TYPE_VERTEX   : DistortedLibrary.adjustVertices(mTarget, mVertexEffects);
92
                                 break;
93
        case JOB_TYPE_MATRIX   : mTarget.applyMatrix(mMatrixEffect,mAndAssoc,mEquAssoc);
94
                                 break;
95
        case JOB_TYPE_MERGE_TEX: mTarget.mergeTexComponentsNow();
96
                                 break;
97
        case JOB_TYPE_MERGE_EFF: mTarget.mergeEffComponentsNow();
98
                                 break;
99
        case JOB_TYPE_JOIN     : mTarget.joinAttribs(mSource);
100
                                 break;
101
        case JOB_TYPE_COPY     : mTarget.copy(mSource[0]);
102
                                 break;
103
        case JOB_TYPE_TEXTURE  : mTarget.textureMap(mMaps,mComp);
104
                                 break;
105
        case JOB_TYPE_ASSOC    : mTarget.setEffectAssociationNow(mComp,mAndAssoc,mEquAssoc);
106
                                 break;
107
        }
108
/*
109
      Log.e("jobs", "executing "+print()+" job");
110
      mTarget.print();
111
*/
112
      }
113

    
114
    void clear()
115
      {
116
      if( mVertexEffects!=null ) mVertexEffects.removeAll(false);
117
      }
118

    
119
    String print()
120
      {
121
      switch(mType)
122
        {
123
        case JOB_TYPE_VERTEX   : return "VERTEX";
124
        case JOB_TYPE_MATRIX   : return "MATRIX";
125
        case JOB_TYPE_MERGE_TEX: return "MERGE_TEX";
126
        case JOB_TYPE_MERGE_EFF: return "MERGE_EFF";
127
        case JOB_TYPE_JOIN     : return "JOIN";
128
        case JOB_TYPE_COPY     : return "COPY";
129
        case JOB_TYPE_TEXTURE  : return "TEXTURE";
130
        case JOB_TYPE_ASSOC    : return "ASSOC";
131
        }
132

    
133
      return null;
134
      }
135
    }
136

    
137
  //////////////////////////////////////////////////////////////////////////
138

    
139
  static class JobNode
140
    {
141
    private ArrayList<JobNode> mPrevJobs;
142
    private ArrayList<JobNode> mNextJobs;
143
    private Job mJob;
144

    
145
    JobNode(Job job)
146
      {
147
      mPrevJobs = new ArrayList<>();
148
      mNextJobs = new ArrayList<>();
149
      mJob      = job;
150
      }
151

    
152
    void execute()
153
      {
154
      JobNode node;
155
      int numPrev = mPrevJobs.size();
156

    
157
      for(int i=0; i<numPrev; i++)
158
        {
159
        node = mPrevJobs.get(0);  // removeNode() rips the executed job out, thus the 0
160
        node.execute();
161
        }
162

    
163
      removeNode(this);
164
      mJob.execute();
165
      }
166

    
167
    void clear()
168
      {
169
      mPrevJobs.clear();
170
      mPrevJobs = null;
171
      mNextJobs.clear();
172
      mNextJobs = null;
173

    
174
      mJob.clear();
175
      mJob = null;
176
      }
177

    
178
    void print(int level)
179
      {
180
      int numPrev = mPrevJobs.size();
181
      int numNext = mNextJobs.size();
182

    
183
      String str = "";
184
      for(int i=0; i<level; i++) str+=" ";
185

    
186
      str += mJob.print();
187

    
188
      str += (" next: "+numNext+" prev: "+numPrev);
189

    
190
      Log.e("job", str);
191

    
192
      for(int i=0; i<numPrev; i++)
193
        {
194
        JobNode node = mPrevJobs.get(i);
195
        node.print(level+1);
196
        }
197
      }
198
    }
199

    
200
///////////////////////////////////////////////////////////////////////////////////////////////////
201

    
202
  private static void removeNode(JobNode node)
203
    {
204
    mJobs.remove(node);
205
    JobNode jn;
206

    
207
    int numPrev = node.mPrevJobs.size();
208

    
209
    for(int i=0; i<numPrev; i++)
210
      {
211
      jn = node.mPrevJobs.get(i);
212
      jn.mNextJobs.remove(node);
213
      }
214

    
215
    int numNext = node.mNextJobs.size();
216

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

    
223
    node.mJob.mTarget.mJobNode[0] = null;
224
    }
225

    
226
///////////////////////////////////////////////////////////////////////////////////////////////////
227

    
228
  static JobNode vertex(MeshBase target, VertexEffect effect)
229
    {
230
    JobNode jn = target.mJobNode[0];
231

    
232
    if( jn==null )
233
      {
234
      Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null,null,0,0,0);
235
      JobNode node = new JobNode(job);
236
      mJobs.add(node);
237
      return node;
238
      }
239
    else
240
      {
241
      if( jn.mJob.mType==JOB_TYPE_VERTEX )
242
        {
243
        jn.mJob.addEffect(effect);
244
        return jn;
245
        }
246
      else
247
        {
248
        Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null,null,0,0,0);
249
        JobNode node = new JobNode(job);
250
        node.mPrevJobs.add(jn);
251
        jn.mNextJobs.add(node);
252
        mJobs.add(node);
253
        return node;
254
        }
255
      }
256
    }
257

    
258
///////////////////////////////////////////////////////////////////////////////////////////////////
259

    
260
  static JobNode matrix(MeshBase target, MatrixEffect effect, int andAssoc, int ecuAssoc)
261
    {
262
    JobNode jn = target.mJobNode[0];
263
    Job job = new Job(JOB_TYPE_MATRIX,target,null,null,effect,null,0,andAssoc,ecuAssoc);
264
    JobNode node = new JobNode(job);
265
    node.mPrevJobs.add(jn);
266
    jn.mNextJobs.add(node);
267
    mJobs.add(node);
268
    return node;
269
    }
270

    
271
///////////////////////////////////////////////////////////////////////////////////////////////////
272

    
273
  static JobNode mergeTex(MeshBase target)
274
    {
275
    JobNode jn = target.mJobNode[0];
276
    Job job = new Job(JOB_TYPE_MERGE_TEX,target,null,null,null,null,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 mergeEff(MeshBase target)
287
    {
288
    JobNode jn = target.mJobNode[0];
289
    Job job = new Job(JOB_TYPE_MERGE_EFF,target,null,null,null,null,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 join(MeshBase target, MeshBase[] meshes)
300
    {
301
    JobNode jn;
302

    
303
    Job job = new Job(JOB_TYPE_JOIN,target,meshes,null,null,null,0,0,0);
304
    JobNode node = new JobNode(job);
305

    
306
    for (MeshBase mesh : meshes)
307
      {
308
      jn = mesh.mJobNode[0];
309

    
310
      if( jn!=null )
311
        {
312
        node.mPrevJobs.add(jn);
313
        jn.mNextJobs.add(node);
314
        }
315
      }
316

    
317
    mJobs.add(node);
318
    return node;
319
    }
320

    
321
///////////////////////////////////////////////////////////////////////////////////////////////////
322

    
323
  static JobNode copy(MeshBase target, MeshBase mesh)
324
    {
325
    JobNode jn = mesh.mJobNode[0];
326
    MeshBase[] meshes = new MeshBase[1];
327
    meshes[0] = mesh;
328
    Job job = new Job(JOB_TYPE_COPY,target,meshes,null,null,null,0,0,0);
329
    JobNode node = new JobNode(job);
330
    node.mPrevJobs.add(jn);
331
    jn.mNextJobs.add(node);
332
    mJobs.add(node);
333
    return node;
334
    }
335

    
336
///////////////////////////////////////////////////////////////////////////////////////////////////
337

    
338
  static JobNode textureMap(MeshBase target, Static4D[] maps, int comp)
339
    {
340
    JobNode jn = target.mJobNode[0];
341
    Job job = new Job(JOB_TYPE_TEXTURE,target,null,null,null,maps,comp,0,0);
342
    JobNode node = new JobNode(job);
343
    node.mPrevJobs.add(jn);
344
    jn.mNextJobs.add(node);
345
    mJobs.add(node);
346
    return node;
347
    }
348

    
349
///////////////////////////////////////////////////////////////////////////////////////////////////
350

    
351
  static JobNode effectAssoc(MeshBase target, int comp, int andAssoc, int equAssoc)
352
    {
353
    JobNode jn = target.mJobNode[0];
354
    Job job = new Job(JOB_TYPE_ASSOC,target,null,null,null,null,comp,andAssoc,equAssoc);
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
 * Only for use by the library itself.
365
 *
366
 * @y.exclude
367
 */
368
  public static void onDestroy()
369
    {
370
    int num = mJobs.size();
371

    
372
    for(int i=0; i<num; i++)
373
      {
374
      mJobs.get(i).clear();
375
      }
376

    
377
    mJobs.clear();
378
    }
379
  }
(1-1/8)