Project

General

Profile

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

library / src / main / java / org / distorted / library / mesh / DeferredJobs.java @ 4c68cfd3

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

    
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
    private int mArg;
49
    private MeshBase mTarget;
50
    private MeshBase[] mSource;
51
    private EffectQueueVertex mEffects;
52

    
53
    Job(int type, MeshBase target, MeshBase[] source, VertexEffect effect, int arg)
54
      {
55
      mType   = type;
56
      mTarget = target;
57
      mSource = source;
58
      mArg    = arg;
59

    
60
      if( effect!=null )
61
        {
62
        mEffects= new EffectQueueVertex();
63
        mEffects.add(effect);
64
        }
65
      }
66

    
67
    void addEffect(VertexEffect effect)
68
      {
69
      mEffects.add(effect);
70
      }
71

    
72
    void execute()
73
      {
74
      switch(mType)
75
        {
76
        case JOB_TYPE_VERTEX: DistortedLibrary.adjustVertices(mTarget, mEffects);
77
                              break;
78
        case JOB_TYPE_MERGE : mTarget.merge();
79
                              break;
80
        case JOB_TYPE_JOIN  : mTarget.joinAttrib1(mSource,mArg);
81
                              break;
82
        case JOB_TYPE_COPY  : mTarget.deepCopyAttribs1(mSource[0]);
83
                              break;
84
        }
85
      }
86

    
87
    void clear()
88
      {
89
      if( mEffects!=null ) mEffects.removeAll(false);
90
      }
91
    }
92

    
93
  //////////////////////////////////////////////////////////////////////////
94

    
95
  static class JobNode
96
    {
97
    private ArrayList<JobNode> mPrevJobs;
98
    private ArrayList<JobNode> mNextJobs;
99
    private Job mJob;
100

    
101
    JobNode(Job job)
102
      {
103
      mPrevJobs = new ArrayList<>();
104
      mNextJobs = new ArrayList<>();
105
      mJob      = job;
106
      }
107

    
108
    void execute()
109
      {
110
      JobNode node;
111
      int numPrev = mPrevJobs.size();
112

    
113
      for(int i=0; i<numPrev; i++)
114
        {
115
        node = mPrevJobs.get(i);
116
        node.execute();
117
        }
118

    
119
      removeNode(this);
120
      mJob.execute();
121
      }
122

    
123
    void clear()
124
      {
125
      mPrevJobs.clear();
126
      mPrevJobs = null;
127
      mNextJobs.clear();
128
      mNextJobs = null;
129

    
130
      mJob.clear();
131
      mJob = null;
132
      }
133
    }
134

    
135
///////////////////////////////////////////////////////////////////////////////////////////////////
136

    
137
  private static void removeNode(JobNode node)
138
    {
139
    mJobs.remove(node);
140
    JobNode jn;
141

    
142
    int numPrev = node.mPrevJobs.size();
143

    
144
    for(int i=0; i<numPrev; i++)
145
      {
146
      jn = node.mPrevJobs.get(i);
147
      jn.mNextJobs.remove(node);
148
      }
149

    
150
    int numNext = node.mNextJobs.size();
151

    
152
    for(int i=0; i<numNext; i++)
153
      {
154
      jn = node.mNextJobs.get(i);
155
      jn.mPrevJobs.remove(node);
156
      }
157

    
158
    node.mJob.mTarget.mJobNode[0] = null;
159
    }
160

    
161
///////////////////////////////////////////////////////////////////////////////////////////////////
162

    
163
  static JobNode vertex(MeshBase target, VertexEffect effect)
164
    {
165
    JobNode jn = target.mJobNode[0];
166

    
167
    if( jn==null )
168
      {
169
      Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,0);
170
      JobNode node = new JobNode(job);
171
      mJobs.add(node);
172
      return node;
173
      }
174
    else
175
      {
176
      if( jn.mJob.mType==JOB_TYPE_VERTEX )
177
        {
178
        jn.mJob.addEffect(effect);
179
        return jn;
180
        }
181
      else
182
        {
183
        Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,0);
184
        JobNode node = new JobNode(job);
185
        node.mPrevJobs.add(jn);
186
        jn.mNextJobs.add(node);
187
        mJobs.add(node);
188
        return node;
189
        }
190
      }
191
    }
192

    
193
///////////////////////////////////////////////////////////////////////////////////////////////////
194

    
195
  static JobNode merge(MeshBase target)
196
    {
197
    JobNode jn = target.mJobNode[0];
198

    
199
    if( jn==null )
200
      {
201
      android.util.Log.e("deferredJobs", "Error: trying to add a merge job to an empty graph!");
202
      return jn;
203
      }
204
    else
205
      {
206
      if( jn.mJob.mType==JOB_TYPE_MERGE )
207
        {
208
        android.util.Log.e("deferredJobs", "Error: trying to add a second consecutive merge job");
209
        return jn;
210
        }
211
      else
212
        {
213
        Job job = new Job(JOB_TYPE_MERGE,target,null,null,0);
214
        JobNode node = new JobNode(job);
215
        node.mPrevJobs.add(jn);
216
        jn.mNextJobs.add(node);
217
        mJobs.add(node);
218
        return node;
219
        }
220
      }
221
    }
222

    
223
///////////////////////////////////////////////////////////////////////////////////////////////////
224

    
225
  static JobNode join(MeshBase target, MeshBase[] meshes, int origVertices)
226
    {
227
    JobNode jn = target.mJobNode[0];
228

    
229
    if( jn==null )
230
      {
231
      android.util.Log.e("deferredJobs", "Error: trying to add a join job to an empty graph!");
232
      return jn;
233
      }
234
    else
235
      {
236
      if( jn.mJob.mType==JOB_TYPE_JOIN )
237
        {
238
        android.util.Log.e("deferredJobs", "Error: trying to add a second consecutive join job");
239
        return jn;
240
        }
241
      else
242
        {
243
        Job job = new Job(JOB_TYPE_JOIN,target,meshes,null,origVertices);
244
        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
  static JobNode copy(MeshBase target, MeshBase mesh)
256
    {
257
    JobNode jn = target.mJobNode[0];
258

    
259
    if( jn==null )
260
      {
261
      android.util.Log.e("deferredJobs", "Error: trying to add a copy job to an empty graph!");
262
      return jn;
263
      }
264
    else
265
      {
266
      if( jn.mJob.mType==JOB_TYPE_COPY )
267
        {
268
        android.util.Log.e("deferredJobs", "Error: trying to add a second consecutive copy job");
269
        return jn;
270
        }
271
      else
272
        {
273
        MeshBase[] meshes = new MeshBase[1];
274
        meshes[0] = mesh;
275
        Job job = new Job(JOB_TYPE_COPY,target,meshes,null,0);
276
        JobNode node = new JobNode(job);
277
        node.mPrevJobs.add(jn);
278
        jn.mNextJobs.add(node);
279
        mJobs.add(node);
280
        return node;
281
        }
282
      }
283
    }
284

    
285
///////////////////////////////////////////////////////////////////////////////////////////////////
286
/**
287
 * Only for use by the library itself.
288
 *
289
 * @y.exclude
290
 */
291
  public static void onDestroy()
292
    {
293
    int num = mJobs.size();
294

    
295
    for(int i=0; i<num; i++)
296
      {
297
      mJobs.get(i).clear();
298
      }
299

    
300
    mJobs.clear();
301
    }
302
  }
(1-1/8)