Project

General

Profile

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

library / src / main / java / org / distorted / library / mesh / DeferredJobs.java @ 2aeb75aa

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.VertexEffect;
23
import org.distorted.library.effectqueue.EffectQueueVertex;
24
import org.distorted.library.main.DistortedLibrary;
25
import org.distorted.library.type.Static4D;
26

    
27
import java.util.ArrayList;
28

    
29
import android.util.Log;
30

    
31
///////////////////////////////////////////////////////////////////////////////////////////////////
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
  private static final int JOB_TYPE_TEXTURE= 4;
44

    
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
    private Static4D[] mMaps;
56

    
57
    Job(int type, MeshBase target, MeshBase[] source, VertexEffect effect, Static4D[] maps)
58
      {
59
      mType   = type;
60
      mTarget = target;
61
      mSource = source;
62
      mMaps   = maps;
63

    
64
      if( effect!=null )
65
        {
66
        mEffects= new EffectQueueVertex();
67
        mEffects.add(effect);
68
        }
69
      }
70

    
71
    void addEffect(VertexEffect effect)
72
      {
73
      mEffects.add(effect);
74
      }
75

    
76
    void execute()
77
      {
78
      switch(mType)
79
        {
80
        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
        }
101
      }
102

    
103
    void clear()
104
      {
105
      if( mEffects!=null ) mEffects.removeAll(false);
106
      }
107

    
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
    }
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
        node = mPrevJobs.get(0);  // removeNode() rips the executed job out, thus the 0
146
        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

    
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
    }
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
    node.mJob.mTarget.mJobNode[0] = null;
210
    }
211

    
212
///////////////////////////////////////////////////////////////////////////////////////////////////
213

    
214
  static JobNode vertex(MeshBase target, VertexEffect effect)
215
    {
216
    JobNode jn = target.mJobNode[0];
217

    
218
    if( jn==null )
219
      {
220
      Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null);
221
      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
        Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,null);
235
        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
    JobNode jn = target.mJobNode[0];
249
    Job job = new Job(JOB_TYPE_MERGE,target,null,null,null);
250
    JobNode node = new JobNode(job);
251
    node.mPrevJobs.add(jn);
252
    jn.mNextJobs.add(node);
253
    mJobs.add(node);
254
    return node;
255
    }
256

    
257
///////////////////////////////////////////////////////////////////////////////////////////////////
258

    
259
  static JobNode join(MeshBase target, MeshBase[] meshes)
260
    {
261
    JobNode jn;
262

    
263
    Job job = new Job(JOB_TYPE_JOIN,target,meshes,null,null);
264
    JobNode node = new JobNode(job);
265

    
266
    for (MeshBase mesh : meshes)
267
      {
268
      jn = mesh.mJobNode[0];
269

    
270
      if( jn!=null )
271
        {
272
        node.mPrevJobs.add(jn);
273
        jn.mNextJobs.add(node);
274
        }
275
      }
276

    
277
    mJobs.add(node);
278
    return node;
279
    }
280

    
281
///////////////////////////////////////////////////////////////////////////////////////////////////
282

    
283
  static JobNode copy(MeshBase target, MeshBase mesh)
284
    {
285
    JobNode jn = mesh.mJobNode[0];
286
    MeshBase[] meshes = new MeshBase[1];
287
    meshes[0] = mesh;
288
    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
    JobNode node = new JobNode(job);
303
    node.mPrevJobs.add(jn);
304
    jn.mNextJobs.add(node);
305
    mJobs.add(node);
306
    return node;
307
    }
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
  }
(1-1/8)