Project

General

Profile

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

library / src / main / java / org / distorted / library / mesh / DeferredJobs.java @ 6923706f

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 4c68cfd3 Leszek Koltunski
60
      if( effect!=null )
61
        {
62
        mEffects= new EffectQueueVertex();
63
        mEffects.add(effect);
64
        }
65 07206c71 Leszek Koltunski
      }
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 a8dfedcc Leszek Koltunski
        case JOB_TYPE_MERGE : mTarget.merge();
79
                              break;
80
        case JOB_TYPE_JOIN  : mTarget.joinAttrib1(mSource,mArg);
81
                              break;
82 f4c5a46e Leszek Koltunski
        case JOB_TYPE_COPY  : mTarget.deepCopyAttribs1(mSource[0]);
83
                              break;
84 07206c71 Leszek Koltunski
        }
85
      }
86
87
    void clear()
88
      {
89 4c68cfd3 Leszek Koltunski
      if( mEffects!=null ) mEffects.removeAll(false);
90 07206c71 Leszek Koltunski
      }
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 71d8aba1 Leszek Koltunski
    node.mJob.mTarget.mJobNode[0] = null;
159 07206c71 Leszek Koltunski
    }
160
161
///////////////////////////////////////////////////////////////////////////////////////////////////
162
163
  static JobNode vertex(MeshBase target, VertexEffect effect)
164
    {
165 71d8aba1 Leszek Koltunski
    JobNode jn = target.mJobNode[0];
166 07206c71 Leszek Koltunski
167
    if( jn==null )
168
      {
169 a8dfedcc Leszek Koltunski
      Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,0);
170 07206c71 Leszek Koltunski
      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 a8dfedcc Leszek Koltunski
        Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,0);
184 07206c71 Leszek Koltunski
        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 a8dfedcc Leszek Koltunski
    JobNode jn = target.mJobNode[0];
198 6923706f Leszek Koltunski
    Job job = new Job(JOB_TYPE_MERGE,target,null,null,0);
199
    JobNode node = new JobNode(job);
200
    node.mPrevJobs.add(jn);
201
    jn.mNextJobs.add(node);
202
    mJobs.add(node);
203
    return node;
204 07206c71 Leszek Koltunski
    }
205
206
///////////////////////////////////////////////////////////////////////////////////////////////////
207
208 a8dfedcc Leszek Koltunski
  static JobNode join(MeshBase target, MeshBase[] meshes, int origVertices)
209 07206c71 Leszek Koltunski
    {
210 6923706f Leszek Koltunski
    JobNode jn;
211 a8dfedcc Leszek Koltunski
212 6923706f Leszek Koltunski
    Job job = new Job(JOB_TYPE_JOIN,target,meshes,null,origVertices);
213
    JobNode node = new JobNode(job);
214
215
    for (MeshBase mesh : meshes)
216 a8dfedcc Leszek Koltunski
      {
217 6923706f Leszek Koltunski
      jn = mesh.mJobNode[0];
218
      node.mPrevJobs.add(jn);
219
      jn.mNextJobs.add(node);
220 a8dfedcc Leszek Koltunski
      }
221 6923706f Leszek Koltunski
222
    mJobs.add(node);
223
    return node;
224 07206c71 Leszek Koltunski
    }
225
226
///////////////////////////////////////////////////////////////////////////////////////////////////
227
228
  static JobNode copy(MeshBase target, MeshBase mesh)
229
    {
230 6923706f Leszek Koltunski
    JobNode jn = mesh.mJobNode[0];
231
    MeshBase[] meshes = new MeshBase[1];
232
    meshes[0] = mesh;
233
    Job job = new Job(JOB_TYPE_COPY,target,meshes,null,0);
234
    JobNode node = new JobNode(job);
235
    node.mPrevJobs.add(jn);
236
    jn.mNextJobs.add(node);
237
    mJobs.add(node);
238
    return node;
239 07206c71 Leszek Koltunski
    }
240
241
///////////////////////////////////////////////////////////////////////////////////////////////////
242
/**
243
 * Only for use by the library itself.
244
 *
245
 * @y.exclude
246
 */
247
  public static void onDestroy()
248
    {
249
    int num = mJobs.size();
250
251
    for(int i=0; i<num; i++)
252
      {
253
      mJobs.get(i).clear();
254
      }
255
256
    mJobs.clear();
257
    }
258
  }