Project

General

Profile

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

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

1 07206c71 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
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 e8925fcd Leszek Koltunski
import org.distorted.library.effect.MatrixEffect;
23 07206c71 Leszek Koltunski
import org.distorted.library.effect.VertexEffect;
24
import org.distorted.library.effectqueue.EffectQueueVertex;
25
import org.distorted.library.main.DistortedLibrary;
26 1fad573e Leszek Koltunski
import org.distorted.library.type.Static4D;
27 07206c71 Leszek Koltunski
28
import java.util.ArrayList;
29
30 1fad573e Leszek Koltunski
import android.util.Log;
31
32 07206c71 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
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 e8925fcd Leszek Koltunski
  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 07206c71 Leszek Koltunski
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 e8925fcd Leszek Koltunski
    private EffectQueueVertex mVertexEffects;
58
    private MatrixEffect mMatrixEffect;
59 1fad573e Leszek Koltunski
    private Static4D[] mMaps;
60 e8925fcd Leszek Koltunski
    private int mAndAssoc, mEcuAssoc;
61 07206c71 Leszek Koltunski
62 e8925fcd Leszek Koltunski
    Job(int type, MeshBase target, MeshBase[] source, VertexEffect vEff, MatrixEffect mEff, Static4D[] maps, int and, int ecu)
63 07206c71 Leszek Koltunski
      {
64 e8925fcd Leszek Koltunski
      mType     = type;
65
      mTarget   = target;
66
      mSource   = source;
67
      mMaps     = maps;
68
      mAndAssoc = and;
69
      mEcuAssoc = ecu;
70
71
      if( vEff!=null )
72 4c68cfd3 Leszek Koltunski
        {
73 e8925fcd Leszek Koltunski
        mVertexEffects= new EffectQueueVertex();
74
        mVertexEffects.add(vEff);
75 4c68cfd3 Leszek Koltunski
        }
76 e8925fcd Leszek Koltunski
77
      mMatrixEffect = mEff;
78 07206c71 Leszek Koltunski
      }
79
80
    void addEffect(VertexEffect effect)
81
      {
82 e8925fcd Leszek Koltunski
      mVertexEffects.add(effect);
83 07206c71 Leszek Koltunski
      }
84
85
    void execute()
86
      {
87
      switch(mType)
88
        {
89 e8925fcd Leszek Koltunski
        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 07206c71 Leszek Koltunski
        }
104 e8925fcd Leszek Koltunski
/*
105
      Log.e("jobs", "executing "+print()+" job");
106
      mTarget.print();
107
*/
108 07206c71 Leszek Koltunski
      }
109
110
    void clear()
111
      {
112 e8925fcd Leszek Koltunski
      if( mVertexEffects!=null ) mVertexEffects.removeAll(false);
113 07206c71 Leszek Koltunski
      }
114 1fad573e Leszek Koltunski
115
    String print()
116
      {
117
      switch(mType)
118
        {
119 e8925fcd Leszek Koltunski
        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 1fad573e Leszek Koltunski
        }
127
128
      return null;
129
      }
130 07206c71 Leszek Koltunski
    }
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 1fad573e Leszek Koltunski
        node = mPrevJobs.get(0);  // removeNode() rips the executed job out, thus the 0
155 07206c71 Leszek Koltunski
        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 1fad573e Leszek Koltunski
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 07206c71 Leszek Koltunski
    }
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 71d8aba1 Leszek Koltunski
    node.mJob.mTarget.mJobNode[0] = null;
219 07206c71 Leszek Koltunski
    }
220
221
///////////////////////////////////////////////////////////////////////////////////////////////////
222
223
  static JobNode vertex(MeshBase target, VertexEffect effect)
224
    {
225 71d8aba1 Leszek Koltunski
    JobNode jn = target.mJobNode[0];
226 07206c71 Leszek Koltunski
227
    if( jn==null )
228
      {
229 e8925fcd Leszek Koltunski
      Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null,null,0,0);
230 07206c71 Leszek Koltunski
      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 e8925fcd Leszek Koltunski
        Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null,null,0,0);
244 07206c71 Leszek Koltunski
        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 e8925fcd Leszek Koltunski
  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 07206c71 Leszek Koltunski
    {
283 a8dfedcc Leszek Koltunski
    JobNode jn = target.mJobNode[0];
284 e8925fcd Leszek Koltunski
    Job job = new Job(JOB_TYPE_MERGE_EFF,target,null,null,null,null,0,0);
285 6923706f Leszek Koltunski
    JobNode node = new JobNode(job);
286
    node.mPrevJobs.add(jn);
287
    jn.mNextJobs.add(node);
288
    mJobs.add(node);
289
    return node;
290 07206c71 Leszek Koltunski
    }
291
292
///////////////////////////////////////////////////////////////////////////////////////////////////
293
294 1fad573e Leszek Koltunski
  static JobNode join(MeshBase target, MeshBase[] meshes)
295 07206c71 Leszek Koltunski
    {
296 6923706f Leszek Koltunski
    JobNode jn;
297 a8dfedcc Leszek Koltunski
298 e8925fcd Leszek Koltunski
    Job job = new Job(JOB_TYPE_JOIN,target,meshes,null,null,null,0,0);
299 6923706f Leszek Koltunski
    JobNode node = new JobNode(job);
300
301
    for (MeshBase mesh : meshes)
302 a8dfedcc Leszek Koltunski
      {
303 6923706f Leszek Koltunski
      jn = mesh.mJobNode[0];
304 1fad573e Leszek Koltunski
305
      if( jn!=null )
306
        {
307
        node.mPrevJobs.add(jn);
308
        jn.mNextJobs.add(node);
309
        }
310 a8dfedcc Leszek Koltunski
      }
311 6923706f Leszek Koltunski
312
    mJobs.add(node);
313
    return node;
314 07206c71 Leszek Koltunski
    }
315
316
///////////////////////////////////////////////////////////////////////////////////////////////////
317
318
  static JobNode copy(MeshBase target, MeshBase mesh)
319
    {
320 6923706f Leszek Koltunski
    JobNode jn = mesh.mJobNode[0];
321
    MeshBase[] meshes = new MeshBase[1];
322
    meshes[0] = mesh;
323 e8925fcd Leszek Koltunski
    Job job = new Job(JOB_TYPE_COPY,target,meshes,null,null,null,0,0);
324 1fad573e Leszek Koltunski
    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 e8925fcd Leszek Koltunski
    Job job = new Job(JOB_TYPE_TEXTURE,target,null,null,null,maps,0,0);
337 6923706f Leszek Koltunski
    JobNode node = new JobNode(job);
338
    node.mPrevJobs.add(jn);
339
    jn.mNextJobs.add(node);
340
    mJobs.add(node);
341
    return node;
342 07206c71 Leszek Koltunski
    }
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
  }