Project

General

Profile

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

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

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