Project

General

Profile

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

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

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

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

    
50
  //////////////////////////////////////////////////////////////////////////
51

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

    
62
    Job(int type, MeshBase target, MeshBase[] source, VertexEffect vEff, MatrixEffect mEff, Static4D[] maps, int and, int ecu)
63
      {
64
      mType     = type;
65
      mTarget   = target;
66
      mSource   = source;
67
      mMaps     = maps;
68
      mAndAssoc = and;
69
      mEcuAssoc = ecu;
70

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

    
77
      mMatrixEffect = mEff;
78
      }
79

    
80
    void addEffect(VertexEffect effect)
81
      {
82
      mVertexEffects.add(effect);
83
      }
84

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

    
110
    void clear()
111
      {
112
      if( mVertexEffects!=null ) mVertexEffects.removeAll(false);
113
      }
114

    
115
    String print()
116
      {
117
      switch(mType)
118
        {
119
        case JOB_TYPE_VERTEX   : return "VERTEX";
120
        case JOB_TYPE_MATRIX   : return "MATRIX";
121
        case JOB_TYPE_MERGE_TEX: return "MERGE_TEX";
122
        case JOB_TYPE_MERGE_EFF: return "MERGE_EFF";
123
        case JOB_TYPE_JOIN     : return "JOIN";
124
        case JOB_TYPE_COPY     : return "COPY";
125
        case JOB_TYPE_TEXTURE  : return "TEXTURE";
126
        }
127

    
128
      return null;
129
      }
130
    }
131

    
132
  //////////////////////////////////////////////////////////////////////////
133

    
134
  static class JobNode
135
    {
136
    private ArrayList<JobNode> mPrevJobs;
137
    private ArrayList<JobNode> mNextJobs;
138
    private Job mJob;
139

    
140
    JobNode(Job job)
141
      {
142
      mPrevJobs = new ArrayList<>();
143
      mNextJobs = new ArrayList<>();
144
      mJob      = job;
145
      }
146

    
147
    void execute()
148
      {
149
      JobNode node;
150
      int numPrev = mPrevJobs.size();
151

    
152
      for(int i=0; i<numPrev; i++)
153
        {
154
        node = mPrevJobs.get(0);  // removeNode() rips the executed job out, thus the 0
155
        node.execute();
156
        }
157

    
158
      removeNode(this);
159
      mJob.execute();
160
      }
161

    
162
    void clear()
163
      {
164
      mPrevJobs.clear();
165
      mPrevJobs = null;
166
      mNextJobs.clear();
167
      mNextJobs = null;
168

    
169
      mJob.clear();
170
      mJob = null;
171
      }
172

    
173
    void print(int level)
174
      {
175
      int numPrev = mPrevJobs.size();
176
      int numNext = mNextJobs.size();
177

    
178
      String str = "";
179
      for(int i=0; i<level; i++) str+=" ";
180

    
181
      str += mJob.print();
182

    
183
      str += (" next: "+numNext+" prev: "+numPrev);
184

    
185
      Log.e("job", str);
186

    
187
      for(int i=0; i<numPrev; i++)
188
        {
189
        JobNode node = mPrevJobs.get(i);
190
        node.print(level+1);
191
        }
192
      }
193
    }
194

    
195
///////////////////////////////////////////////////////////////////////////////////////////////////
196

    
197
  private static void removeNode(JobNode node)
198
    {
199
    mJobs.remove(node);
200
    JobNode jn;
201

    
202
    int numPrev = node.mPrevJobs.size();
203

    
204
    for(int i=0; i<numPrev; i++)
205
      {
206
      jn = node.mPrevJobs.get(i);
207
      jn.mNextJobs.remove(node);
208
      }
209

    
210
    int numNext = node.mNextJobs.size();
211

    
212
    for(int i=0; i<numNext; i++)
213
      {
214
      jn = node.mNextJobs.get(i);
215
      jn.mPrevJobs.remove(node);
216
      }
217

    
218
    node.mJob.mTarget.mJobNode[0] = null;
219
    }
220

    
221
///////////////////////////////////////////////////////////////////////////////////////////////////
222

    
223
  static JobNode vertex(MeshBase target, VertexEffect effect)
224
    {
225
    JobNode jn = target.mJobNode[0];
226

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

    
253
///////////////////////////////////////////////////////////////////////////////////////////////////
254

    
255
  static JobNode matrix(MeshBase target, MatrixEffect effect, int andAssoc, int ecuAssoc)
256
    {
257
    JobNode jn = target.mJobNode[0];
258
    Job job = new Job(JOB_TYPE_MATRIX,target,null,null,effect,null,andAssoc,ecuAssoc);
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
  static JobNode mergeTex(MeshBase target)
269
    {
270
    JobNode jn = target.mJobNode[0];
271
    Job job = new Job(JOB_TYPE_MERGE_TEX,target,null,null,null,null,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 mergeEff(MeshBase target)
282
    {
283
    JobNode jn = target.mJobNode[0];
284
    Job job = new Job(JOB_TYPE_MERGE_EFF,target,null,null,null,null,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 join(MeshBase target, MeshBase[] meshes)
295
    {
296
    JobNode jn;
297

    
298
    Job job = new Job(JOB_TYPE_JOIN,target,meshes,null,null,null,0,0);
299
    JobNode node = new JobNode(job);
300

    
301
    for (MeshBase mesh : meshes)
302
      {
303
      jn = mesh.mJobNode[0];
304

    
305
      if( jn!=null )
306
        {
307
        node.mPrevJobs.add(jn);
308
        jn.mNextJobs.add(node);
309
        }
310
      }
311

    
312
    mJobs.add(node);
313
    return node;
314
    }
315

    
316
///////////////////////////////////////////////////////////////////////////////////////////////////
317

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

    
331
///////////////////////////////////////////////////////////////////////////////////////////////////
332

    
333
  static JobNode textureMap(MeshBase target, Static4D[] maps)
334
    {
335
    JobNode jn = target.mJobNode[0];
336
    Job job = new Job(JOB_TYPE_TEXTURE,target,null,null,null,maps,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
 * Only for use by the library itself.
347
 *
348
 * @y.exclude
349
 */
350
  public static void onDestroy()
351
    {
352
    int num = mJobs.size();
353

    
354
    for(int i=0; i<num; i++)
355
      {
356
      mJobs.get(i).clear();
357
      }
358

    
359
    mJobs.clear();
360
    }
361
  }
(1-1/8)