Project

General

Profile

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

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

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 26671ef8 Leszek Koltunski
  private static final int JOB_TYPE_ASSOC    = 7;
48 7a9edb92 Leszek Koltunski
  private static final int JOB_TYPE_CENTER   = 8;
49 07206c71 Leszek Koltunski
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 e8925fcd Leszek Koltunski
    private EffectQueueVertex mVertexEffects;
60
    private MatrixEffect mMatrixEffect;
61 1fad573e Leszek Koltunski
    private Static4D[] mMaps;
62 26671ef8 Leszek Koltunski
    private int mComp, mAndAssoc, mEquAssoc;
63 7a9edb92 Leszek Koltunski
    private float mX,mY,mZ;
64 07206c71 Leszek Koltunski
65 7a9edb92 Leszek Koltunski
    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 07206c71 Leszek Koltunski
      {
67 e8925fcd Leszek Koltunski
      mType     = type;
68
      mTarget   = target;
69
      mSource   = source;
70
      mMaps     = maps;
71 26671ef8 Leszek Koltunski
      mComp     = comp;
72 e8925fcd Leszek Koltunski
      mAndAssoc = and;
73 26671ef8 Leszek Koltunski
      mEquAssoc = equ;
74 7a9edb92 Leszek Koltunski
      mX        = x;
75
      mY        = y;
76
      mZ        = z;
77 e8925fcd Leszek Koltunski
78
      if( vEff!=null )
79 4c68cfd3 Leszek Koltunski
        {
80 e8925fcd Leszek Koltunski
        mVertexEffects= new EffectQueueVertex();
81
        mVertexEffects.add(vEff);
82 4c68cfd3 Leszek Koltunski
        }
83 e8925fcd Leszek Koltunski
84
      mMatrixEffect = mEff;
85 07206c71 Leszek Koltunski
      }
86
87
    void addEffect(VertexEffect effect)
88
      {
89 e8925fcd Leszek Koltunski
      mVertexEffects.add(effect);
90 07206c71 Leszek Koltunski
      }
91
92
    void execute()
93
      {
94
      switch(mType)
95
        {
96 e8925fcd Leszek Koltunski
        case JOB_TYPE_VERTEX   : DistortedLibrary.adjustVertices(mTarget, mVertexEffects);
97
                                 break;
98 26671ef8 Leszek Koltunski
        case JOB_TYPE_MATRIX   : mTarget.applyMatrix(mMatrixEffect,mAndAssoc,mEquAssoc);
99 e8925fcd Leszek Koltunski
                                 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 dbe3079d Leszek Koltunski
        case JOB_TYPE_TEXTURE  : mTarget.textureMap(mMaps,mComp);
109 e8925fcd Leszek Koltunski
                                 break;
110 26671ef8 Leszek Koltunski
        case JOB_TYPE_ASSOC    : mTarget.setEffectAssociationNow(mComp,mAndAssoc,mEquAssoc);
111
                                 break;
112 7a9edb92 Leszek Koltunski
        case JOB_TYPE_CENTER   : mTarget.setComponentCenterNow(mComp,mX,mY,mZ);
113
                                 break;
114 07206c71 Leszek Koltunski
        }
115 e8925fcd Leszek Koltunski
/*
116
      Log.e("jobs", "executing "+print()+" job");
117
      mTarget.print();
118
*/
119 07206c71 Leszek Koltunski
      }
120
121
    void clear()
122
      {
123 e8925fcd Leszek Koltunski
      if( mVertexEffects!=null ) mVertexEffects.removeAll(false);
124 07206c71 Leszek Koltunski
      }
125 1fad573e Leszek Koltunski
126
    String print()
127
      {
128
      switch(mType)
129
        {
130 e8925fcd Leszek Koltunski
        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 26671ef8 Leszek Koltunski
        case JOB_TYPE_ASSOC    : return "ASSOC";
138 7a9edb92 Leszek Koltunski
        case JOB_TYPE_CENTER   : return "CENTER";
139 1fad573e Leszek Koltunski
        }
140
141
      return null;
142
      }
143 07206c71 Leszek Koltunski
    }
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 1fad573e Leszek Koltunski
        node = mPrevJobs.get(0);  // removeNode() rips the executed job out, thus the 0
168 07206c71 Leszek Koltunski
        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 1fad573e Leszek Koltunski
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 07206c71 Leszek Koltunski
    }
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 71d8aba1 Leszek Koltunski
    node.mJob.mTarget.mJobNode[0] = null;
232 07206c71 Leszek Koltunski
    }
233
234
///////////////////////////////////////////////////////////////////////////////////////////////////
235
236
  static JobNode vertex(MeshBase target, VertexEffect effect)
237
    {
238 71d8aba1 Leszek Koltunski
    JobNode jn = target.mJobNode[0];
239 07206c71 Leszek Koltunski
240
    if( jn==null )
241
      {
242 7a9edb92 Leszek Koltunski
      Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null,null,0,0,0,0,0,0);
243 07206c71 Leszek Koltunski
      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 7a9edb92 Leszek Koltunski
        Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null,null,0,0,0,0,0,0);
257 07206c71 Leszek Koltunski
        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 e8925fcd Leszek Koltunski
  static JobNode matrix(MeshBase target, MatrixEffect effect, int andAssoc, int ecuAssoc)
269
    {
270
    JobNode jn = target.mJobNode[0];
271 7a9edb92 Leszek Koltunski
    Job job = new Job(JOB_TYPE_MATRIX,target,null,null,effect,null,0,andAssoc,ecuAssoc,0,0,0);
272 e8925fcd Leszek Koltunski
    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 7a9edb92 Leszek Koltunski
    Job job = new Job(JOB_TYPE_MERGE_TEX,target,null,null,null,null,0,0,0,0,0,0);
285 e8925fcd 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
    }
291
292
///////////////////////////////////////////////////////////////////////////////////////////////////
293
294
  static JobNode mergeEff(MeshBase target)
295 07206c71 Leszek Koltunski
    {
296 a8dfedcc Leszek Koltunski
    JobNode jn = target.mJobNode[0];
297 7a9edb92 Leszek Koltunski
    Job job = new Job(JOB_TYPE_MERGE_EFF,target,null,null,null,null,0,0,0,0,0,0);
298 6923706f Leszek Koltunski
    JobNode node = new JobNode(job);
299
    node.mPrevJobs.add(jn);
300
    jn.mNextJobs.add(node);
301
    mJobs.add(node);
302
    return node;
303 07206c71 Leszek Koltunski
    }
304
305
///////////////////////////////////////////////////////////////////////////////////////////////////
306
307 1fad573e Leszek Koltunski
  static JobNode join(MeshBase target, MeshBase[] meshes)
308 07206c71 Leszek Koltunski
    {
309 6923706f Leszek Koltunski
    JobNode jn;
310 a8dfedcc Leszek Koltunski
311 7a9edb92 Leszek Koltunski
    Job job = new Job(JOB_TYPE_JOIN,target,meshes,null,null,null,0,0,0,0,0,0);
312 6923706f Leszek Koltunski
    JobNode node = new JobNode(job);
313
314
    for (MeshBase mesh : meshes)
315 a8dfedcc Leszek Koltunski
      {
316 6923706f Leszek Koltunski
      jn = mesh.mJobNode[0];
317 1fad573e Leszek Koltunski
318
      if( jn!=null )
319
        {
320
        node.mPrevJobs.add(jn);
321
        jn.mNextJobs.add(node);
322
        }
323 a8dfedcc Leszek Koltunski
      }
324 6923706f Leszek Koltunski
325
    mJobs.add(node);
326
    return node;
327 07206c71 Leszek Koltunski
    }
328
329
///////////////////////////////////////////////////////////////////////////////////////////////////
330
331
  static JobNode copy(MeshBase target, MeshBase mesh)
332
    {
333 6923706f Leszek Koltunski
    JobNode jn = mesh.mJobNode[0];
334
    MeshBase[] meshes = new MeshBase[1];
335
    meshes[0] = mesh;
336 7a9edb92 Leszek Koltunski
    Job job = new Job(JOB_TYPE_COPY,target,meshes,null,null,null,0,0,0,0,0,0);
337 1fad573e 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
    }
343
344
///////////////////////////////////////////////////////////////////////////////////////////////////
345
346 dbe3079d Leszek Koltunski
  static JobNode textureMap(MeshBase target, Static4D[] maps, int comp)
347 1fad573e Leszek Koltunski
    {
348
    JobNode jn = target.mJobNode[0];
349 7a9edb92 Leszek Koltunski
    Job job = new Job(JOB_TYPE_TEXTURE,target,null,null,null,maps,comp,0,0,0,0,0);
350 26671ef8 Leszek Koltunski
    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 7a9edb92 Leszek Koltunski
    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 6923706f Leszek Koltunski
    JobNode node = new JobNode(job);
377
    node.mPrevJobs.add(jn);
378
    jn.mNextJobs.add(node);
379
    mJobs.add(node);
380
    return node;
381 07206c71 Leszek Koltunski
    }
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
  }