Project

General

Profile

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

library / src / main / java / org / distorted / library / mesh / DeferredJobs.java @ 1fad573e

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
import org.distorted.library.effect.VertexEffect;
23
import org.distorted.library.effectqueue.EffectQueueVertex;
24
import org.distorted.library.main.DistortedLibrary;
25 1fad573e Leszek Koltunski
import org.distorted.library.type.Static4D;
26 07206c71 Leszek Koltunski
27
import java.util.ArrayList;
28
29 1fad573e Leszek Koltunski
import android.util.Log;
30
31 07206c71 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
32
/**
33
 * Not part of public API, do not document (public only because has to be cleaned from the main package)
34
 *
35
 * @y.exclude
36
 */
37
public class DeferredJobs
38
  {
39
  private static final int JOB_TYPE_VERTEX = 0;
40
  private static final int JOB_TYPE_MERGE  = 1;
41
  private static final int JOB_TYPE_JOIN   = 2;
42
  private static final int JOB_TYPE_COPY   = 3;
43 1fad573e Leszek Koltunski
  private static final int JOB_TYPE_TEXTURE= 4;
44 07206c71 Leszek Koltunski
45
  private static ArrayList<JobNode> mJobs = new ArrayList<>();
46
47
  //////////////////////////////////////////////////////////////////////////
48
49
  private static class Job
50
    {
51
    private int mType;
52
    private MeshBase mTarget;
53
    private MeshBase[] mSource;
54
    private EffectQueueVertex mEffects;
55 1fad573e Leszek Koltunski
    private Static4D[] mMaps;
56 07206c71 Leszek Koltunski
57 1fad573e Leszek Koltunski
    Job(int type, MeshBase target, MeshBase[] source, VertexEffect effect, Static4D[] maps)
58 07206c71 Leszek Koltunski
      {
59
      mType   = type;
60
      mTarget = target;
61
      mSource = source;
62 1fad573e Leszek Koltunski
      mMaps   = maps;
63 4c68cfd3 Leszek Koltunski
64
      if( effect!=null )
65
        {
66
        mEffects= new EffectQueueVertex();
67
        mEffects.add(effect);
68
        }
69 07206c71 Leszek Koltunski
      }
70
71
    void addEffect(VertexEffect effect)
72
      {
73
      mEffects.add(effect);
74
      }
75
76
    void execute()
77
      {
78
      switch(mType)
79
        {
80 1fad573e Leszek Koltunski
        case JOB_TYPE_VERTEX : DistortedLibrary.adjustVertices(mTarget, mEffects);
81
                               //Log.e("jobs", "executing vertex job");
82
                               //mTarget.print();
83
                               break;
84
        case JOB_TYPE_MERGE  : mTarget.merge();
85
                               //Log.e("jobs", "executing merge job");
86
                               //mTarget.print();
87
                               break;
88
        case JOB_TYPE_JOIN   : mTarget.joinAttribs(mSource);
89
                               //Log.e("jobs", "executing join job");
90
                               //mTarget.print();
91
                               break;
92
        case JOB_TYPE_COPY   : mTarget.copy(mSource[0]);
93
                               //Log.e("jobs", "executing copy job");
94
                               //mTarget.print();
95
                               break;
96
        case JOB_TYPE_TEXTURE: mTarget.textureMap(mMaps);
97
                               //Log.e("jobs", "executing textureMap job");
98
                               //mTarget.print();
99
                               break;
100 07206c71 Leszek Koltunski
        }
101
      }
102
103
    void clear()
104
      {
105 4c68cfd3 Leszek Koltunski
      if( mEffects!=null ) mEffects.removeAll(false);
106 07206c71 Leszek Koltunski
      }
107 1fad573e Leszek Koltunski
108
    String print()
109
      {
110
      switch(mType)
111
        {
112
        case JOB_TYPE_VERTEX : return "VERTEX (eff: "+mEffects.getNumEffects()+" effToBe: "+mEffects.getNumEffectsToBe()+")";
113
        case JOB_TYPE_MERGE  : return "MERGE";
114
        case JOB_TYPE_JOIN   : return "JOIN: "+mSource.length;
115
        case JOB_TYPE_COPY   : return "COPY";
116
        case JOB_TYPE_TEXTURE: return "TEXTURE";
117
        }
118
119
      return null;
120
      }
121 07206c71 Leszek Koltunski
    }
122
123
  //////////////////////////////////////////////////////////////////////////
124
125
  static class JobNode
126
    {
127
    private ArrayList<JobNode> mPrevJobs;
128
    private ArrayList<JobNode> mNextJobs;
129
    private Job mJob;
130
131
    JobNode(Job job)
132
      {
133
      mPrevJobs = new ArrayList<>();
134
      mNextJobs = new ArrayList<>();
135
      mJob      = job;
136
      }
137
138
    void execute()
139
      {
140
      JobNode node;
141
      int numPrev = mPrevJobs.size();
142
143
      for(int i=0; i<numPrev; i++)
144
        {
145 1fad573e Leszek Koltunski
        node = mPrevJobs.get(0);  // removeNode() rips the executed job out, thus the 0
146 07206c71 Leszek Koltunski
        node.execute();
147
        }
148
149
      removeNode(this);
150
      mJob.execute();
151
      }
152
153
    void clear()
154
      {
155
      mPrevJobs.clear();
156
      mPrevJobs = null;
157
      mNextJobs.clear();
158
      mNextJobs = null;
159
160
      mJob.clear();
161
      mJob = null;
162
      }
163 1fad573e Leszek Koltunski
164
    void print(int level)
165
      {
166
      int numPrev = mPrevJobs.size();
167
      int numNext = mNextJobs.size();
168
169
      String str = "";
170
      for(int i=0; i<level; i++) str+=" ";
171
172
      str += mJob.print();
173
174
      str += (" next: "+numNext+" prev: "+numPrev);
175
176
      Log.e("job", str);
177
178
      for(int i=0; i<numPrev; i++)
179
        {
180
        JobNode node = mPrevJobs.get(i);
181
        node.print(level+1);
182
        }
183
      }
184 07206c71 Leszek Koltunski
    }
185
186
///////////////////////////////////////////////////////////////////////////////////////////////////
187
188
  private static void removeNode(JobNode node)
189
    {
190
    mJobs.remove(node);
191
    JobNode jn;
192
193
    int numPrev = node.mPrevJobs.size();
194
195
    for(int i=0; i<numPrev; i++)
196
      {
197
      jn = node.mPrevJobs.get(i);
198
      jn.mNextJobs.remove(node);
199
      }
200
201
    int numNext = node.mNextJobs.size();
202
203
    for(int i=0; i<numNext; i++)
204
      {
205
      jn = node.mNextJobs.get(i);
206
      jn.mPrevJobs.remove(node);
207
      }
208
209 71d8aba1 Leszek Koltunski
    node.mJob.mTarget.mJobNode[0] = null;
210 07206c71 Leszek Koltunski
    }
211
212
///////////////////////////////////////////////////////////////////////////////////////////////////
213
214
  static JobNode vertex(MeshBase target, VertexEffect effect)
215
    {
216 71d8aba1 Leszek Koltunski
    JobNode jn = target.mJobNode[0];
217 07206c71 Leszek Koltunski
218
    if( jn==null )
219
      {
220 1fad573e Leszek Koltunski
      Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null);
221 07206c71 Leszek Koltunski
      JobNode node = new JobNode(job);
222
      mJobs.add(node);
223
      return node;
224
      }
225
    else
226
      {
227
      if( jn.mJob.mType==JOB_TYPE_VERTEX )
228
        {
229
        jn.mJob.addEffect(effect);
230
        return jn;
231
        }
232
      else
233
        {
234 1fad573e Leszek Koltunski
        Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null);
235 07206c71 Leszek Koltunski
        JobNode node = new JobNode(job);
236
        node.mPrevJobs.add(jn);
237
        jn.mNextJobs.add(node);
238
        mJobs.add(node);
239
        return node;
240
        }
241
      }
242
    }
243
244
///////////////////////////////////////////////////////////////////////////////////////////////////
245
246
  static JobNode merge(MeshBase target)
247
    {
248 a8dfedcc Leszek Koltunski
    JobNode jn = target.mJobNode[0];
249 1fad573e Leszek Koltunski
    Job job = new Job(JOB_TYPE_MERGE,target,null,null,null);
250 6923706f Leszek Koltunski
    JobNode node = new JobNode(job);
251
    node.mPrevJobs.add(jn);
252
    jn.mNextJobs.add(node);
253
    mJobs.add(node);
254
    return node;
255 07206c71 Leszek Koltunski
    }
256
257
///////////////////////////////////////////////////////////////////////////////////////////////////
258
259 1fad573e Leszek Koltunski
  static JobNode join(MeshBase target, MeshBase[] meshes)
260 07206c71 Leszek Koltunski
    {
261 6923706f Leszek Koltunski
    JobNode jn;
262 a8dfedcc Leszek Koltunski
263 1fad573e Leszek Koltunski
    Job job = new Job(JOB_TYPE_JOIN,target,meshes,null,null);
264 6923706f Leszek Koltunski
    JobNode node = new JobNode(job);
265
266
    for (MeshBase mesh : meshes)
267 a8dfedcc Leszek Koltunski
      {
268 6923706f Leszek Koltunski
      jn = mesh.mJobNode[0];
269 1fad573e Leszek Koltunski
270
      if( jn!=null )
271
        {
272
        node.mPrevJobs.add(jn);
273
        jn.mNextJobs.add(node);
274
        }
275 a8dfedcc Leszek Koltunski
      }
276 6923706f Leszek Koltunski
277
    mJobs.add(node);
278
    return node;
279 07206c71 Leszek Koltunski
    }
280
281
///////////////////////////////////////////////////////////////////////////////////////////////////
282
283
  static JobNode copy(MeshBase target, MeshBase mesh)
284
    {
285 6923706f Leszek Koltunski
    JobNode jn = mesh.mJobNode[0];
286
    MeshBase[] meshes = new MeshBase[1];
287
    meshes[0] = mesh;
288 1fad573e Leszek Koltunski
    Job job = new Job(JOB_TYPE_COPY,target,meshes,null,null);
289
    JobNode node = new JobNode(job);
290
    node.mPrevJobs.add(jn);
291
    jn.mNextJobs.add(node);
292
    mJobs.add(node);
293
    return node;
294
    }
295
296
///////////////////////////////////////////////////////////////////////////////////////////////////
297
298
  static JobNode textureMap(MeshBase target, Static4D[] maps)
299
    {
300
    JobNode jn = target.mJobNode[0];
301
    Job job = new Job(JOB_TYPE_TEXTURE,target,null,null,maps);
302 6923706f Leszek Koltunski
    JobNode node = new JobNode(job);
303
    node.mPrevJobs.add(jn);
304
    jn.mNextJobs.add(node);
305
    mJobs.add(node);
306
    return node;
307 07206c71 Leszek Koltunski
    }
308
309
///////////////////////////////////////////////////////////////////////////////////////////////////
310
/**
311
 * Only for use by the library itself.
312
 *
313
 * @y.exclude
314
 */
315
  public static void onDestroy()
316
    {
317
    int num = mJobs.size();
318
319
    for(int i=0; i<num; i++)
320
      {
321
      mJobs.get(i).clear();
322
      }
323
324
    mJobs.clear();
325
    }
326
  }