OpenClonk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros
C4PXS.cpp
Go to the documentation of this file.
1 /*
2  * OpenClonk, http://www.openclonk.org
3  *
4  * Copyright (c) 1998-2000, Matthes Bender
5  * Copyright (c) 2001-2009, RedWolf Design GmbH, http://www.clonk.de/
6  * Copyright (c) 2009-2016, The OpenClonk Team and contributors
7  *
8  * Distributed under the terms of the ISC license; see accompanying file
9  * "COPYING" for details.
10  *
11  * "Clonk" is a registered trademark of Matthes Bender, used with permission.
12  * See accompanying file "TRADEMARK" for details.
13  *
14  * To redistribute this file separately, substitute the full license texts
15  * for the above references.
16  */
17 
18 /* Pixel Sprite system for tiny bits of moving material */
19 
20 #include "C4Include.h"
21 #include "landscape/C4PXS.h"
22 
23 #include "c4group/C4Components.h"
24 #include "config/C4Config.h"
25 #include "game/C4Physics.h"
26 #include "lib/C4Random.h"
27 #include "landscape/C4Weather.h"
28 #include "control/C4Record.h"
29 #include "lib/StdColors.h"
30 #include "graphics/C4Draw.h"
31 
32 static const C4Real WindDrift_Factor = itofix(1, 800);
33 
35 {
37  {
38  C4RCExecPXS rc;
39  rc.x=x; rc.y=y; rc.iMat=Mat;
40  rc.pos = 0;
41  AddDbgRec(RCT_ExecPXS, &rc, sizeof(rc));
42  }
43  int32_t inmat;
44 
45  // Safety
46  if (!MatValid(Mat))
47  { Deactivate(); return; }
48 
49  // Out of bounds
50  if ((x<0) || (x>=::Landscape.GetWidth()) || (y<-10) || (y>=::Landscape.GetHeight()))
51  { Deactivate(); return; }
52 
53  // Material conversion
54  int32_t iX = fixtoi(x), iY = fixtoi(y);
55  inmat=GBackMat(iX,iY);
57  if (pReact && (*pReact->pFunc)(pReact, iX,iY, iX,iY, xdir,ydir, Mat,inmat, meePXSPos, nullptr))
58  { Deactivate(); return; }
59 
60  // Gravity
61  ydir+=GravAccel;
62 
63  if (GBackDensity(iX, iY + 1) < ::MaterialMap.Map[Mat].Density)
64  {
65  // Air speed: Wind plus some random
66  int32_t iWind = Weather.GetWind(iX, iY);
67  C4Real txdir = itofix(iWind, 15) + C4REAL256(Random(1200) - 600);
68  C4Real tydir = C4REAL256(Random(1200) - 600);
69 
70  // Air friction, based on WindDrift. MaxSpeed is ignored.
71  int32_t iWindDrift = std::max(::MaterialMap.Map[Mat].WindDrift - 20, 0);
72  xdir += ((txdir - xdir) * iWindDrift) * WindDrift_Factor;
73  ydir += ((tydir - ydir) * iWindDrift) * WindDrift_Factor;
74  }
75 
76  C4Real ctcox = x + xdir;
77  C4Real ctcoy = y + ydir;
78 
79  int32_t iToX = fixtoi(ctcox), iToY = fixtoi(ctcoy);
80 
81  // In bounds?
82  if (Inside<int32_t>(iToX, 0, ::Landscape.GetWidth()-1) && Inside<int32_t>(iToY, 0, ::Landscape.GetHeight()-1))
83  // Check path
84  if (::Landscape._PathFree(iX, iY, iToX, iToY))
85  {
86  x=ctcox; y=ctcoy;
87  return;
88  }
89 
90  // Test path to target position
91  int32_t iX0 = iX, iY0 = iY;
92  bool fStopMovement = false;
93  do
94  {
95  // Step
96  int32_t inX = iX + Sign(iToX - iX), inY = iY + Sign(iToY - iY);
97  // Contact?
98  inmat = GBackMat(inX, inY);
100  if (pReact)
101  {
102  if ((*pReact->pFunc)(pReact, iX,iY, inX,inY, xdir,ydir, Mat,inmat, meePXSMove, &fStopMovement))
103  {
104  // destructive contact
105  Deactivate();
106  return;
107  }
108  else
109  {
110  // no destructive contact, but speed or position changed: Stop moving for now
111  if (fStopMovement)
112  {
113  // But keep fractional positions to allow proper movement on moving ground
114  if (iX != iX0) x = itofix(iX);
115  if (iY != iY0) y = itofix(iY);
116  return;
117  }
118  // there was a reaction func, but it didn't do anything - continue movement
119  }
120  }
121  iX = inX; iY = inY;
122  }
123  while (iX != iToX || iY != iToY);
124 
125  // No contact? Free movement
126  x=ctcox; y=ctcoy;
128  {
129  C4RCExecPXS rc;
130  rc.x=x; rc.y=y; rc.iMat=Mat;
131  rc.pos = 1;
132  AddDbgRec(RCT_ExecPXS, &rc, sizeof(rc));
133  }
134  return;
135 }
136 
138 {
140  {
141  C4RCExecPXS rc;
142  rc.x=x; rc.y=y; rc.iMat=Mat;
143  rc.pos = 2;
144  AddDbgRec(RCT_ExecPXS, &rc, sizeof(rc));
145  }
146  Mat=MNone;
147  ::PXS.Delete(this);
148 }
149 
151 {
152  Default();
153 }
154 
156 {
157  Clear();
158 }
159 
161 {
162  Count=0;
163  for (unsigned int cnt=0; cnt<PXSMaxChunk; cnt++)
164  {
165  Chunk[cnt]=nullptr;
166  iChunkPXS[cnt]=0;
167  }
168 }
169 
171 {
172  for (unsigned int cnt=0; cnt<PXSMaxChunk; cnt++)
173  {
174  if (Chunk[cnt]) delete [] Chunk[cnt];
175  Chunk[cnt]=nullptr;
176  iChunkPXS[cnt]=0;
177  }
178 }
179 
181 {
182  unsigned int cnt,cnt2;
183  C4PXS *pxp;
184  // Check chunks for available space
185  for (cnt=0; cnt<PXSMaxChunk; cnt++)
186  {
187  // Create new chunk if necessary
188  if (!Chunk[cnt])
189  {
190  if (!(Chunk[cnt]=new C4PXS[PXSChunkSize])) return nullptr;
191  iChunkPXS[cnt] = 0;
192  }
193  // Check this chunk for space
194  if (iChunkPXS[cnt] < PXSChunkSize)
195  for (cnt2=0,pxp=Chunk[cnt]; cnt2<PXSChunkSize; cnt2++,pxp++)
196  if (pxp->Mat==MNone)
197  {
198  // count them
199  iChunkPXS[cnt]++;
200  return pxp;
201  }
202  }
203  return nullptr;
204 }
205 
206 bool C4PXSSystem::Create(int32_t mat, C4Real ix, C4Real iy, C4Real ixdir, C4Real iydir)
207 {
208  C4PXS *pxp;
209  if (!MatValid(mat)) return false;
210  if (!(pxp=New())) return false;
211  pxp->Mat=mat;
212  pxp->x=ix; pxp->y=iy;
213  pxp->xdir=ixdir; pxp->ydir=iydir;
214  return true;
215 }
216 
218 {
219  // Execute all chunks
220  Count=0;
221  for (unsigned int cchunk=0; cchunk<PXSMaxChunk; cchunk++)
222  if (Chunk[cchunk])
223  {
224  // empty chunk?
225  if (!iChunkPXS[cchunk])
226  { delete [] Chunk[cchunk]; Chunk[cchunk]=nullptr; }
227  else
228  {
229  // Execute chunk pxs, check for empty
230  C4PXS *pxp = Chunk[cchunk];
231  for (unsigned int cnt2=0; cnt2<PXSChunkSize; cnt2++,pxp++)
232  if (pxp->Mat!=MNone)
233  {
234  pxp->Execute();
235  Count++;
236  }
237  }
238  }
239 }
240 
242 {
243  // Draw PXS in this region
244  C4Rect VisibleRect(cgo.TargetX, cgo.TargetY, cgo.Wdt, cgo.Hgt);
245  VisibleRect.Enlarge(20);
246 
247  // Go through all PXS and build vertex arrays. The vertex arrays are
248  // then submitted to the GL in one go.
249  std::vector<C4BltVertex> pixVtx;
250  std::vector<C4BltVertex> lineVtx;
251  std::map<int, std::vector<C4BltVertex> > bltVtx;
252  // TODO: reserve some space to avoid too many allocations
253  // TODO: keep vertex mem allocated between draw invocations
254 
255  float cgox = cgo.X - cgo.TargetX, cgoy = cgo.Y - cgo.TargetY;
256  // First pass: draw simple PXS (lines/pixels)
257  unsigned int cnt;
258  for (cnt=0; cnt < PXSMaxChunk; cnt++)
259  {
260  if (Chunk[cnt] && iChunkPXS[cnt])
261  {
262  C4PXS *pxp = Chunk[cnt];
263  for (unsigned int cnt2 = 0; cnt2 < PXSChunkSize; cnt2++, pxp++)
264  if (pxp->Mat != MNone && VisibleRect.Contains(fixtoi(pxp->x), fixtoi(pxp->y)))
265  {
266  C4Material *pMat = &::MaterialMap.Map[pxp->Mat];
267  const DWORD dwMatClr = ::Landscape.GetPal()->GetClr((BYTE) (Mat2PixColDefault(pxp->Mat)));
268  if(pMat->PXSFace.Surface)
269  {
270  int32_t pnx, pny;
271  pMat->PXSFace.GetPhaseNum(pnx, pny);
272  int32_t fcWdt = pMat->PXSFace.Wdt;
273  int32_t fcHgt = pMat->PXSFace.Hgt;
274  // calculate draw width and tile to use (random-ish)
275  uint32_t size = (1103515245 * (cnt * PXSChunkSize + cnt2) + 12345) >> 3;
276  float z = pMat->PXSGfxSize * (0.625f + 0.05f * int(size % 16));
277  pny = (cnt2 / pnx) % pny; pnx = cnt2 % pnx;
278 
279  const float w = z;
280  const float h = z * fcHgt / fcWdt;
281  const float x1 = fixtof(pxp->x) + cgox + z * pMat->PXSGfxRt.tx / fcWdt;
282  const float y1 = fixtof(pxp->y) + cgoy + z * pMat->PXSGfxRt.ty / fcHgt;
283  const float x2 = x1 + w;
284  const float y2 = y1 + h;
285 
286  const float sfcWdt = pMat->PXSFace.Surface->Wdt;
287  const float sfcHgt = pMat->PXSFace.Surface->Hgt;
288 
289  C4BltVertex vtx[6];
290  vtx[0].tx = (pnx + 0.f) * fcWdt / sfcWdt; vtx[0].ty = (pny + 0.f) * fcHgt / sfcHgt;
291  vtx[0].ftx = x1; vtx[0].fty = y1;
292  vtx[1].tx = (pnx + 1.f) * fcWdt / sfcWdt; vtx[1].ty = (pny + 0.f) * fcHgt / sfcHgt;
293  vtx[1].ftx = x2; vtx[1].fty = y1;
294  vtx[2].tx = (pnx + 1.f) * fcWdt / sfcWdt; vtx[2].ty = (pny + 1.f) * fcHgt / sfcHgt;
295  vtx[2].ftx = x2; vtx[2].fty = y2;
296  vtx[3].tx = (pnx + 0.f) * fcWdt / sfcWdt; vtx[3].ty = (pny + 1.f) * fcHgt / sfcHgt;
297  vtx[3].ftx = x1; vtx[3].fty = y2;
298  DwTo4UB(0xFFFFFFFF, vtx[0].color);
299  DwTo4UB(0xFFFFFFFF, vtx[1].color);
300  DwTo4UB(0xFFFFFFFF, vtx[2].color);
301  DwTo4UB(0xFFFFFFFF, vtx[3].color);
302  vtx[4] = vtx[2];
303  vtx[5] = vtx[0];
304 
305  std::vector<C4BltVertex>& vec = bltVtx[pxp->Mat];
306  vec.push_back(vtx[0]);
307  vec.push_back(vtx[1]);
308  vec.push_back(vtx[2]);
309  vec.push_back(vtx[3]);
310  vec.push_back(vtx[4]);
311  vec.push_back(vtx[5]);
312  }
313  else
314  {
315  // old-style: unicolored pixels or lines
316  if (fixtoi(pxp->xdir) || fixtoi(pxp->ydir))
317  {
318  // lines for stuff that goes whooosh!
319  int len = fixtoi(Abs(pxp->xdir) + Abs(pxp->ydir));
320  const DWORD dwMatClrLen = uint32_t(std::max<int>(dwMatClr >> 24, 195 - (195 - (dwMatClr >> 24)) / len)) << 24 | (dwMatClr & 0xffffff);
321  C4BltVertex begin, end;
322  begin.ftx = fixtof(pxp->x - pxp->xdir) + cgox; begin.fty = fixtof(pxp->y - pxp->ydir) + cgoy;
323  end.ftx = fixtof(pxp->x) + cgox; end.fty = fixtof(pxp->y) + cgoy;
324  DwTo4UB(dwMatClrLen, begin.color);
325  DwTo4UB(dwMatClrLen, end.color);
326  lineVtx.push_back(begin);
327  lineVtx.push_back(end);
328  }
329  else
330  {
331  // single pixels for slow stuff
332  C4BltVertex vtx;
333  vtx.ftx = fixtof(pxp->x) + cgox;
334  vtx.fty = fixtof(pxp->y) + cgoy;
335  DwTo4UB(dwMatClr, vtx.color);
336  pixVtx.push_back(vtx);
337  }
338  }
339  }
340  }
341  }
342 
343  if(!pixVtx.empty()) pDraw->PerformMultiPix(cgo.Surface, &pixVtx[0], pixVtx.size(), nullptr);
344  if(!lineVtx.empty()) pDraw->PerformMultiLines(cgo.Surface, &lineVtx[0], lineVtx.size(), 1.0f, nullptr);
345 
346  // PXS graphics disabled?
347  if (!Config.Graphics.PXSGfx)
348  return;
349 
350  for(std::map<int, std::vector<C4BltVertex> >::const_iterator iter = bltVtx.begin(); iter != bltVtx.end(); ++iter)
351  {
352  C4Material *pMat = &::MaterialMap.Map[iter->first];
353  pDraw->PerformMultiTris(cgo.Surface, &iter->second[0], iter->second.size(), nullptr, pMat->PXSFace.Surface->texture.get(), nullptr, nullptr, 0, nullptr);
354  }
355 }
356 
357 void C4PXSSystem::Cast(int32_t mat, int32_t num, int32_t tx, int32_t ty, int32_t level)
358 {
359  int32_t cnt;
360  for (cnt=0; cnt<num; cnt++)
361  {
362  // Must do these calculation steps separately, because the order of
363  // invokations of Random() is not defined if they're used as parameters
364  C4Real xdir = itofix(Random(level+1)-level/2); xdir/=10;
365  C4Real ydir = itofix(Random(level+1)-level); ydir/=10;
366  Create(mat,
367  itofix(tx),itofix(ty),
368  xdir,
369  ydir);
370  }
371 }
372 
374 {
375  unsigned int cnt;
376 
377  // Check used chunk count
378  int32_t iChunks=0;
379  for (cnt=0; cnt<PXSMaxChunk; cnt++)
380  if (Chunk[cnt] && iChunkPXS[cnt])
381  iChunks++;
382  if (!iChunks)
383  {
384  hGroup.Delete(C4CFN_PXS);
385  return true;
386  }
387 
388  // Save chunks to temp file
389  CStdFile hTempFile;
390  if (!hTempFile.Create(Config.AtTempPath(C4CFN_TempPXS)))
391  return false;
392 #ifdef C4REAL_USE_FIXNUM
393  int32_t iNumFormat = 1;
394 #else
395  int32_t iNumFormat = 2;
396 #endif
397  if (!hTempFile.Write(&iNumFormat, sizeof (iNumFormat)))
398  return false;
399  for (cnt=0; cnt<PXSMaxChunk; cnt++)
400  if (Chunk[cnt]) // must save all chunks in order to keep order consistent on all clients
401  if (!hTempFile.Write(Chunk[cnt],PXSChunkSize * sizeof(C4PXS)))
402  return false;
403 
404  if (!hTempFile.Close())
405  return false;
406 
407  // Move temp file to group
408  if (!hGroup.Move( Config.AtTempPath(C4CFN_TempPXS),
409  C4CFN_PXS ))
410  return false;
411 
412  return true;
413 }
414 
416 {
417  // load new
418  size_t iBinSize,iChunkNum,cnt2;
419  size_t iChunkSize = PXSChunkSize * sizeof(C4PXS);
420  if (!hGroup.AccessEntry(C4CFN_PXS,&iBinSize)) return false;
421  // clear previous
422  Clear();
423  // using C4Real or float?
424  int32_t iNumForm = 1;
425  if (iBinSize % iChunkSize == 4)
426  {
427  if (!hGroup.Read(&iNumForm, sizeof (iNumForm))) return false;
428  if (!Inside<int32_t>(iNumForm, 1, 2)) return false;
429  iBinSize -= 4;
430  }
431  // old pxs-files have no tag for the number format
432  else if (iBinSize % iChunkSize != 0) return false;
433  // calc chunk count
434  iChunkNum = iBinSize / iChunkSize;
435  if (iChunkNum > PXSMaxChunk) return false;
436  for (uint32_t cnt=0; cnt<iChunkNum; cnt++)
437  {
438  if (!(Chunk[cnt]=new C4PXS[PXSChunkSize])) return false;
439  if (!hGroup.Read(Chunk[cnt],iChunkSize)) return false;
440  // count the PXS, Peter!
441  // convert num format, if neccessary
442  C4PXS *pxp; iChunkPXS[cnt]=0;
443  for (cnt2=0,pxp=Chunk[cnt]; cnt2<PXSChunkSize; cnt2++,pxp++)
444  if (pxp->Mat != MNone)
445  {
446  ++iChunkPXS[cnt];
447  // convert number format
448 #ifdef C4REAL_USE_FIXNUM
449  if (iNumForm == 2) { FLOAT_TO_FIXED(&pxp->x); FLOAT_TO_FIXED(&pxp->y); FLOAT_TO_FIXED(&pxp->xdir); FLOAT_TO_FIXED(&pxp->ydir); }
450 #else
451  if (iNumForm == 1) { FIXED_TO_FLOAT(&pxp->x); FIXED_TO_FLOAT(&pxp->y); FIXED_TO_FLOAT(&pxp->xdir); FIXED_TO_FLOAT(&pxp->ydir); }
452 #endif
453  }
454  }
455  return true;
456 }
457 
459 {
460  Count=0;
461 }
462 
464 {
465  // consolidate chunks; remove empty chunks
466  C4PXS **pDestChunk = Chunk;
467  int32_t iDestChunk = 0;
468  for (unsigned int cnt=0; cnt<PXSMaxChunk; cnt++)
469  {
470  if (Chunk[cnt])
471  {
472  if (iChunkPXS[cnt])
473  {
474  *pDestChunk++ = Chunk[cnt];
475  iChunkPXS[iDestChunk++] = iChunkPXS[cnt];
476  }
477  else
478  {
479  delete [] Chunk[cnt];
480  Chunk[cnt] = nullptr;
481  }
482  }
483  }
484 }
485 
487 {
488  // find chunk
489  unsigned int cnt;
490  for (cnt = 0; cnt < PXSMaxChunk; cnt++)
491  if (Chunk[cnt] && iChunkPXS[cnt])
492  if (pPXS >= Chunk[cnt] && pPXS < Chunk[cnt] + PXSChunkSize)
493  break;
494  // decrease pxs counter
495  if (cnt < PXSMaxChunk)
496  iChunkPXS[cnt]--;
497 }
498 
499 int32_t C4PXSSystem::GetCount(int32_t mat) const
500 {
501  // count PXS of given material
502  int32_t result = 0;
503  for (size_t cnt = 0; cnt < PXSMaxChunk; cnt++) if (Chunk[cnt] && iChunkPXS[cnt])
504  {
505  C4PXS *pxp = Chunk[cnt];
506  for (size_t cnt2 = 0; cnt2 < PXSChunkSize; cnt2++, pxp++) if (pxp->Mat == mat) ++result;
507  }
508  return result;
509 }
510 
511 int32_t C4PXSSystem::GetCount(int32_t mat, int32_t x, int32_t y, int32_t wdt, int32_t hgt) const
512 {
513  // count PXS of given material in given area
514  int32_t result = 0;
515  for (size_t cnt = 0; cnt < PXSMaxChunk; cnt++) if (Chunk[cnt] && iChunkPXS[cnt])
516  {
517  C4PXS *pxp = Chunk[cnt];
518  for (size_t cnt2 = 0; cnt2 < PXSChunkSize; cnt2++, pxp++)
519  if (pxp->Mat != MNone)
520  if (pxp->Mat == mat || mat == MNone)
521  if (Inside(pxp->x, x, x + wdt - 1) && Inside(pxp->y, y, y + hgt - 1)) ++result;
522  }
523  return result;
524 }
525 
C4PXS * New()
Definition: C4PXS.cpp:180
bool Close(StdBuf **ppMemory=nullptr)
Definition: CStdFile.cpp:155
C4MaterialReaction * GetReactionUnsafe(int32_t iPXSMat, int32_t iLandscapeMat)
Definition: C4Material.h:193
float fty
Definition: C4Draw.h:64
C4Real y
Definition: C4Record.h:171
bool Contains(int32_t iX, int32_t iY) const
Definition: C4Rect.h:42
C4Config Config
Definition: C4Config.cpp:837
int32_t iMat
Definition: C4Record.h:173
void Cast(int32_t mat, int32_t num, int32_t tx, int32_t ty, int32_t level)
Definition: C4PXS.cpp:357
float Y
Definition: C4Facet.h:120
#define z
uint32_t Random()
Definition: C4Random.cpp:43
int Wdt
Definition: C4Surface.h:67
float tx
Definition: C4Draw.h:62
C4TargetRect PXSGfxRt
Definition: C4Material.h:119
bool Create(const char *szFileName, bool fCompressed=false, bool fExecutable=false, bool fMemory=false)
Definition: CStdFile.cpp:53
bool AccessEntry(const char *szWildCard, size_t *iSize=nullptr, char *sFileName=nullptr, bool NeedsToBeAGroup=false)
Definition: C4Group.cpp:1695
C4ConfigGeneral General
Definition: C4Config.h:252
unsigned char color[4]
Definition: C4Draw.h:63
bool GetPhaseNum(int32_t &rX, int32_t &rY)
Definition: C4Facet.cpp:472
C4Material * Map
Definition: C4Material.h:171
void Default()
Definition: C4PXS.cpp:160
C4PXS * Chunk[PXSMaxChunk]
Definition: C4PXS.h:47
Definition: C4PXS.h:25
void Synchronize()
Definition: C4PXS.cpp:458
#define GravAccel
Definition: C4Physics.h:29
Definition: C4Rect.h:29
uint8_t BYTE
bool _PathFree(int32_t x, int32_t y, int32_t x2, int32_t y2) const
int Sign(T val)
Definition: Standard.h:47
bool Delete(const char *szFiles, bool fRecursive=false)
Definition: C4Group.cpp:1334
bool Create(int32_t mat, C4Real ix, C4Real iy, C4Real ixdir=Fix0, C4Real iydir=Fix0)
Definition: C4PXS.cpp:206
float ty
Definition: C4Draw.h:62
C4Real y
Definition: C4PXS.h:31
int Hgt
Definition: C4Surface.h:67
virtual void PerformMultiTris(C4Surface *sfcTarget, const C4BltVertex *vertices, unsigned int n_vertices, const C4BltTransform *pTransform, C4TexRef *pTex, C4TexRef *pOverlay, C4TexRef *pNormal, DWORD dwOverlayClrMod, C4ShaderCall *shader_call)=0
bool Save(C4Group &hGroup)
Definition: C4PXS.cpp:373
Definition: C4Real.h:58
C4MaterialReactionFunc pFunc
Definition: C4Material.h:49
DWORD GetClr(BYTE byCol)
Definition: StdColors.h:188
C4ConfigGraphics Graphics
Definition: C4Config.h:254
void DwTo4UB(DWORD dwClr, unsigned char(&r)[4])
Definition: C4Draw.h:29
C4Real ydir
Definition: C4PXS.h:31
C4PXSSystem()
Definition: C4PXS.cpp:150
void Deactivate()
Definition: C4PXS.cpp:137
bool Write(const void *pBuffer, int iSize)
Definition: CStdFile.cpp:244
const int32_t MNone
Definition: C4Constants.h:178
void Clear()
Definition: C4PXS.cpp:170
C4Real x
Definition: C4Record.h:171
virtual void PerformMultiPix(C4Surface *sfcTarget, const C4BltVertex *vertices, unsigned int n_vertices, C4ShaderCall *shader_call)=0
bool Load(C4Group &hGroup)
Definition: C4PXS.cpp:415
C4Landscape Landscape
void SyncClearance()
Definition: C4PXS.cpp:463
bool Move(const char *szFile, const char *szAddAs)
Definition: C4Group.cpp:1325
int32_t tx
Definition: C4Rect.h:81
void AddDbgRec(C4RecordChunkType eType, const void *pData, int iSize)
Definition: C4Record.cpp:36
C4Fixed itofix(int32_t x)
Definition: C4Real.h:261
C4Draw * pDraw
Definition: C4Draw.cpp:45
int32_t ty
Definition: C4Rect.h:81
virtual void PerformMultiLines(C4Surface *sfcTarget, const C4BltVertex *vertices, unsigned int n_vertices, float width, C4ShaderCall *shader_call)=0
C4Weather Weather
Definition: C4Weather.cpp:207
C4PXSSystem PXS
Definition: C4PXS.cpp:526
void Draw(C4TargetFacet &cgo)
Definition: C4PXS.cpp:241
const size_t PXSMaxChunk
Definition: C4PXS.h:37
int32_t Mat
Definition: C4PXS.h:30
int32_t PXSGfx
Definition: C4Config.h:110
const size_t PXSChunkSize
Definition: C4PXS.h:37
int32_t Density
Definition: C4Material.h:94
int32_t GetHeight() const
constexpr bool DEBUGREC_PXS
Definition: C4Include.h:32
int32_t PXSGfxSize
Definition: C4Material.h:120
std::unique_ptr< C4TexRef > texture
Definition: C4Surface.h:80
float TargetX
Definition: C4Facet.h:167
int32_t WindDrift
Definition: C4Material.h:107
~C4PXSSystem()
Definition: C4PXS.cpp:155
float Hgt
Definition: C4Facet.h:120
int32_t GBackDensity(int32_t x, int32_t y)
Definition: C4Landscape.h:227
void Enlarge(int32_t iByX, int32_t iByY)
Definition: C4Rect.h:53
int32_t pos
Definition: C4Record.h:175
C4Real xdir
Definition: C4PXS.h:31
int32_t GetCount() const
Definition: C4PXS.h:61
C4MaterialMap MaterialMap
Definition: C4Material.cpp:970
CStdPalette * GetPal() const
C4Real x
Definition: C4PXS.h:31
float ftx
Definition: C4Draw.h:64
float fixtof(const C4Fixed &x)
Definition: C4Real.h:257
BYTE Mat2PixColDefault(int32_t mat)
Definition: C4Material.h:237
#define C4CFN_PXS
Definition: C4Components.h:75
int32_t DebugRec
Definition: C4Config.h:61
const char * AtTempPath(const char *szFilename)
Definition: C4Config.cpp:544
T Abs(T val)
Definition: Standard.h:44
void Execute()
Definition: C4PXS.cpp:217
C4Surface * Surface
Definition: C4Facet.h:119
float TargetY
Definition: C4Facet.h:167
uint32_t DWORD
#define C4CFN_TempPXS
Definition: C4Components.h:158
int fixtoi(const C4Fixed &x)
Definition: C4Real.h:259
void Execute()
Definition: C4PXS.cpp:34
bool MatValid(int32_t mat)
Definition: C4Material.h:212
C4Facet PXSFace
Definition: C4Material.h:159
float Wdt
Definition: C4Facet.h:120
bool Inside(T ival, U lbound, V rbound)
Definition: Standard.h:45
float X
Definition: C4Facet.h:120
int32_t GBackMat(int32_t x, int32_t y)
Definition: C4Landscape.h:222
void FLOAT_TO_FIXED(C4Real *pVal)
Definition: C4Real.h:318
int32_t GetWidth() const
size_t iChunkPXS[PXSMaxChunk]
Definition: C4PXS.h:48
C4Real C4REAL256(int x)
Definition: C4Real.h:268
int32_t GetWind(int32_t x, int32_t y)
Definition: C4Weather.cpp:95
int32_t Count
Definition: C4PXS.h:45
bool Read(void *pBuffer, size_t iSize) override
Definition: C4Group.cpp:1125
void Delete(C4PXS *pPXS)
Definition: C4PXS.cpp:486