OpenClonk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros
C4PXSSystem Class Reference

#include <C4PXS.h>

Collaboration diagram for C4PXSSystem:
[legend]

Public Member Functions

 C4PXSSystem ()
 
 ~C4PXSSystem ()
 
void Delete (C4PXS *pPXS)
 
void Default ()
 
void Clear ()
 
void Execute ()
 
void Draw (C4TargetFacet &cgo)
 
void Synchronize ()
 
void SyncClearance ()
 
void Cast (int32_t mat, int32_t num, int32_t tx, int32_t ty, int32_t level)
 
bool Create (int32_t mat, C4Real ix, C4Real iy, C4Real ixdir=Fix0, C4Real iydir=Fix0)
 
bool Load (C4Group &hGroup)
 
bool Save (C4Group &hGroup)
 
int32_t GetCount () const
 
int32_t GetCount (int32_t mat) const
 
int32_t GetCount (int32_t mat, int32_t x, int32_t y, int32_t wdt, int32_t hgt) const
 

Public Attributes

int32_t Count
 

Protected Member Functions

C4PXSNew ()
 

Protected Attributes

C4PXSChunk [PXSMaxChunk]
 
size_t iChunkPXS [PXSMaxChunk]
 

Detailed Description

Definition at line 39 of file C4PXS.h.

Constructor & Destructor Documentation

C4PXSSystem::C4PXSSystem ( )

Definition at line 156 of file C4PXS.cpp.

References Default().

157 {
158  Default();
159 }
void Default()
Definition: C4PXS.cpp:166

Here is the call graph for this function:

C4PXSSystem::~C4PXSSystem ( )

Definition at line 161 of file C4PXS.cpp.

References Clear().

162 {
163  Clear();
164 }
void Clear()
Definition: C4PXS.cpp:176

Here is the call graph for this function:

Member Function Documentation

void C4PXSSystem::Cast ( int32_t  mat,
int32_t  num,
int32_t  tx,
int32_t  ty,
int32_t  level 
)

Definition at line 363 of file C4PXS.cpp.

References Create(), itofix(), and Random().

Referenced by C4Landscape::P::BlastMaterial2Objects().

364 {
365  int32_t cnt;
366  for (cnt=0; cnt<num; cnt++)
367  {
368  // Must do these calculation steps separately, because the order of
369  // invokations of Random() is not defined if they're used as parameters
370  C4Real xdir = itofix(Random(level+1)-level/2); xdir/=10;
371  C4Real ydir = itofix(Random(level+1)-level); ydir/=10;
372  Create(mat,
373  itofix(tx),itofix(ty),
374  xdir,
375  ydir);
376  }
377 }
uint32_t Random()
Definition: C4Random.cpp:43
bool Create(int32_t mat, C4Real ix, C4Real iy, C4Real ixdir=Fix0, C4Real iydir=Fix0)
Definition: C4PXS.cpp:212
Definition: C4Real.h:58
C4Fixed itofix(int32_t x)
Definition: C4Real.h:261

Here is the call graph for this function:

Here is the caller graph for this function:

void C4PXSSystem::Clear ( )

Definition at line 176 of file C4PXS.cpp.

References Chunk, iChunkPXS, and PXSMaxChunk.

Referenced by C4Game::Clear(), C4Game::InitGame(), Load(), and ~C4PXSSystem().

177 {
178  for (unsigned int cnt=0; cnt<PXSMaxChunk; cnt++)
179  {
180  if (Chunk[cnt]) delete [] Chunk[cnt];
181  Chunk[cnt]=nullptr;
182  iChunkPXS[cnt]=0;
183  }
184 }
C4PXS * Chunk[PXSMaxChunk]
Definition: C4PXS.h:47
const size_t PXSMaxChunk
Definition: C4PXS.h:37
size_t iChunkPXS[PXSMaxChunk]
Definition: C4PXS.h:48

Here is the caller graph for this function:

bool C4PXSSystem::Create ( int32_t  mat,
C4Real  ix,
C4Real  iy,
C4Real  ixdir = Fix0,
C4Real  iydir = Fix0 
)

Definition at line 212 of file C4PXS.cpp.

References C4PXS::Mat, MatValid(), New(), C4PXS::x, C4PXS::xdir, C4PXS::y, and C4PXS::ydir.

Referenced by Cast(), C4Landscape::CheckInstability(), C4Landscape::InsertMaterial(), C4MaterialMap::mrfConvert(), and C4Landscape::P::ShakeFreePix().

213 {
214  C4PXS *pxp;
215  if (!MatValid(mat)) return false;
216  if (!(pxp=New())) return false;
217  pxp->Mat=mat;
218  pxp->x=ix; pxp->y=iy;
219  pxp->xdir=ixdir; pxp->ydir=iydir;
220  return true;
221 }
C4PXS * New()
Definition: C4PXS.cpp:186
Definition: C4PXS.h:25
C4Real y
Definition: C4PXS.h:31
C4Real ydir
Definition: C4PXS.h:31
int32_t Mat
Definition: C4PXS.h:30
C4Real xdir
Definition: C4PXS.h:31
C4Real x
Definition: C4PXS.h:31
bool MatValid(int32_t mat)
Definition: C4Material.h:212

Here is the call graph for this function:

Here is the caller graph for this function:

void C4PXSSystem::Default ( )

Definition at line 166 of file C4PXS.cpp.

References Chunk, Count, iChunkPXS, and PXSMaxChunk.

Referenced by C4PXSSystem(), and C4Game::Default().

167 {
168  Count=0;
169  for (unsigned int cnt=0; cnt<PXSMaxChunk; cnt++)
170  {
171  Chunk[cnt]=nullptr;
172  iChunkPXS[cnt]=0;
173  }
174 }
C4PXS * Chunk[PXSMaxChunk]
Definition: C4PXS.h:47
const size_t PXSMaxChunk
Definition: C4PXS.h:37
size_t iChunkPXS[PXSMaxChunk]
Definition: C4PXS.h:48
int32_t Count
Definition: C4PXS.h:45

Here is the caller graph for this function:

void C4PXSSystem::Delete ( C4PXS pPXS)

Definition at line 492 of file C4PXS.cpp.

References Chunk, iChunkPXS, PXSChunkSize, and PXSMaxChunk.

Referenced by C4PXS::Deactivate().

493 {
494  // find chunk
495  unsigned int cnt;
496  for (cnt = 0; cnt < PXSMaxChunk; cnt++)
497  if (Chunk[cnt] && iChunkPXS[cnt])
498  if (pPXS >= Chunk[cnt] && pPXS < Chunk[cnt] + PXSChunkSize)
499  break;
500  // decrease pxs counter
501  if (cnt < PXSMaxChunk)
502  iChunkPXS[cnt]--;
503 }
C4PXS * Chunk[PXSMaxChunk]
Definition: C4PXS.h:47
const size_t PXSMaxChunk
Definition: C4PXS.h:37
const size_t PXSChunkSize
Definition: C4PXS.h:37
size_t iChunkPXS[PXSMaxChunk]
Definition: C4PXS.h:48

Here is the caller graph for this function:

void C4PXSSystem::Draw ( C4TargetFacet cgo)

Definition at line 247 of file C4PXS.cpp.

References Abs(), Chunk, C4BltVertex::color, Config, C4Rect::Contains(), DwTo4UB(), C4Rect::Enlarge(), fixtof(), fixtoi(), C4BltVertex::ftx, C4BltVertex::fty, CStdPalette::GetClr(), C4Landscape::GetPal(), C4Facet::GetPhaseNum(), C4Config::Graphics, C4Surface::Hgt, C4Facet::Hgt, iChunkPXS, Landscape, C4MaterialMap::Map, C4PXS::Mat, Mat2PixColDefault(), MaterialMap, MNone, pDraw, C4Draw::PerformMultiLines(), C4Draw::PerformMultiPix(), C4Draw::PerformMultiTris(), PXSChunkSize, C4Material::PXSFace, C4ConfigGraphics::PXSGfx, C4MaterialCore::PXSGfxRt, C4MaterialCore::PXSGfxSize, PXSMaxChunk, C4Facet::Surface, C4TargetFacet::TargetX, C4TargetFacet::TargetY, C4Surface::texture, C4BltVertex::tx, C4TargetRect::tx, C4BltVertex::ty, C4TargetRect::ty, C4Surface::Wdt, C4Facet::Wdt, C4PXS::x, C4Facet::X, C4PXS::xdir, C4PXS::y, C4Facet::Y, C4PXS::ydir, and z.

Referenced by C4Viewport::Draw().

248 {
249  // Draw PXS in this region
250  C4Rect VisibleRect(cgo.TargetX, cgo.TargetY, cgo.Wdt, cgo.Hgt);
251  VisibleRect.Enlarge(20);
252 
253  // Go through all PXS and build vertex arrays. The vertex arrays are
254  // then submitted to the GL in one go.
255  std::vector<C4BltVertex> pixVtx;
256  std::vector<C4BltVertex> lineVtx;
257  std::map<int, std::vector<C4BltVertex> > bltVtx;
258  // TODO: reserve some space to avoid too many allocations
259  // TODO: keep vertex mem allocated between draw invocations
260 
261  float cgox = cgo.X - cgo.TargetX, cgoy = cgo.Y - cgo.TargetY;
262  // First pass: draw simple PXS (lines/pixels)
263  unsigned int cnt;
264  for (cnt=0; cnt < PXSMaxChunk; cnt++)
265  {
266  if (Chunk[cnt] && iChunkPXS[cnt])
267  {
268  C4PXS *pxp = Chunk[cnt];
269  for (unsigned int cnt2 = 0; cnt2 < PXSChunkSize; cnt2++, pxp++)
270  if (pxp->Mat != MNone && VisibleRect.Contains(fixtoi(pxp->x), fixtoi(pxp->y)))
271  {
272  C4Material *pMat = &::MaterialMap.Map[pxp->Mat];
273  const DWORD dwMatClr = ::Landscape.GetPal()->GetClr((BYTE) (Mat2PixColDefault(pxp->Mat)));
274  if(pMat->PXSFace.Surface)
275  {
276  int32_t pnx, pny;
277  pMat->PXSFace.GetPhaseNum(pnx, pny);
278  int32_t fcWdt = pMat->PXSFace.Wdt;
279  int32_t fcHgt = pMat->PXSFace.Hgt;
280  // calculate draw width and tile to use (random-ish)
281  uint32_t size = (1103515245 * (cnt * PXSChunkSize + cnt2) + 12345) >> 3;
282  float z = pMat->PXSGfxSize * (0.625f + 0.05f * int(size % 16));
283  pny = (cnt2 / pnx) % pny; pnx = cnt2 % pnx;
284 
285  const float w = z;
286  const float h = z * fcHgt / fcWdt;
287  const float x1 = fixtof(pxp->x) + cgox + z * pMat->PXSGfxRt.tx / fcWdt;
288  const float y1 = fixtof(pxp->y) + cgoy + z * pMat->PXSGfxRt.ty / fcHgt;
289  const float x2 = x1 + w;
290  const float y2 = y1 + h;
291 
292  const float sfcWdt = pMat->PXSFace.Surface->Wdt;
293  const float sfcHgt = pMat->PXSFace.Surface->Hgt;
294 
295  C4BltVertex vtx[6];
296  vtx[0].tx = (pnx + 0.f) * fcWdt / sfcWdt; vtx[0].ty = (pny + 0.f) * fcHgt / sfcHgt;
297  vtx[0].ftx = x1; vtx[0].fty = y1;
298  vtx[1].tx = (pnx + 1.f) * fcWdt / sfcWdt; vtx[1].ty = (pny + 0.f) * fcHgt / sfcHgt;
299  vtx[1].ftx = x2; vtx[1].fty = y1;
300  vtx[2].tx = (pnx + 1.f) * fcWdt / sfcWdt; vtx[2].ty = (pny + 1.f) * fcHgt / sfcHgt;
301  vtx[2].ftx = x2; vtx[2].fty = y2;
302  vtx[3].tx = (pnx + 0.f) * fcWdt / sfcWdt; vtx[3].ty = (pny + 1.f) * fcHgt / sfcHgt;
303  vtx[3].ftx = x1; vtx[3].fty = y2;
304  DwTo4UB(0xFFFFFFFF, vtx[0].color);
305  DwTo4UB(0xFFFFFFFF, vtx[1].color);
306  DwTo4UB(0xFFFFFFFF, vtx[2].color);
307  DwTo4UB(0xFFFFFFFF, vtx[3].color);
308  vtx[4] = vtx[2];
309  vtx[5] = vtx[0];
310 
311  std::vector<C4BltVertex>& vec = bltVtx[pxp->Mat];
312  vec.push_back(vtx[0]);
313  vec.push_back(vtx[1]);
314  vec.push_back(vtx[2]);
315  vec.push_back(vtx[3]);
316  vec.push_back(vtx[4]);
317  vec.push_back(vtx[5]);
318  }
319  else
320  {
321  // old-style: unicolored pixels or lines
322  if (fixtoi(pxp->xdir) || fixtoi(pxp->ydir))
323  {
324  // lines for stuff that goes whooosh!
325  int len = fixtoi(Abs(pxp->xdir) + Abs(pxp->ydir));
326  const DWORD dwMatClrLen = uint32_t(std::max<int>(dwMatClr >> 24, 195 - (195 - (dwMatClr >> 24)) / len)) << 24 | (dwMatClr & 0xffffff);
327  C4BltVertex begin, end;
328  begin.ftx = fixtof(pxp->x - pxp->xdir) + cgox; begin.fty = fixtof(pxp->y - pxp->ydir) + cgoy;
329  end.ftx = fixtof(pxp->x) + cgox; end.fty = fixtof(pxp->y) + cgoy;
330  DwTo4UB(dwMatClrLen, begin.color);
331  DwTo4UB(dwMatClrLen, end.color);
332  lineVtx.push_back(begin);
333  lineVtx.push_back(end);
334  }
335  else
336  {
337  // single pixels for slow stuff
338  C4BltVertex vtx;
339  vtx.ftx = fixtof(pxp->x) + cgox;
340  vtx.fty = fixtof(pxp->y) + cgoy;
341  DwTo4UB(dwMatClr, vtx.color);
342  pixVtx.push_back(vtx);
343  }
344  }
345  }
346  }
347  }
348 
349  if(!pixVtx.empty()) pDraw->PerformMultiPix(cgo.Surface, &pixVtx[0], pixVtx.size(), nullptr);
350  if(!lineVtx.empty()) pDraw->PerformMultiLines(cgo.Surface, &lineVtx[0], lineVtx.size(), 1.0f, nullptr);
351 
352  // PXS graphics disabled?
353  if (!Config.Graphics.PXSGfx)
354  return;
355 
356  for(std::map<int, std::vector<C4BltVertex> >::const_iterator iter = bltVtx.begin(); iter != bltVtx.end(); ++iter)
357  {
358  C4Material *pMat = &::MaterialMap.Map[iter->first];
359  pDraw->PerformMultiTris(cgo.Surface, &iter->second[0], iter->second.size(), nullptr, pMat->PXSFace.Surface->texture.get(), nullptr, nullptr, 0, nullptr);
360  }
361 }
float fty
Definition: C4Draw.h:64
C4Config Config
Definition: C4Config.cpp:837
float Y
Definition: C4Facet.h:120
#define z
int Wdt
Definition: C4Surface.h:67
float tx
Definition: C4Draw.h:62
C4TargetRect PXSGfxRt
Definition: C4Material.h:119
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
C4PXS * Chunk[PXSMaxChunk]
Definition: C4PXS.h:47
Definition: C4PXS.h:25
Definition: C4Rect.h:29
uint8_t BYTE
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
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
const int32_t MNone
Definition: C4Constants.h:178
virtual void PerformMultiPix(C4Surface *sfcTarget, const C4BltVertex *vertices, unsigned int n_vertices, C4ShaderCall *shader_call)=0
C4Landscape Landscape
int32_t tx
Definition: C4Rect.h:81
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
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 PXSGfxSize
Definition: C4Material.h:120
std::unique_ptr< C4TexRef > texture
Definition: C4Surface.h:80
float TargetX
Definition: C4Facet.h:167
float Hgt
Definition: C4Facet.h:120
C4Real xdir
Definition: C4PXS.h:31
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
T Abs(T val)
Definition: Standard.h:44
C4Surface * Surface
Definition: C4Facet.h:119
float TargetY
Definition: C4Facet.h:167
uint32_t DWORD
int fixtoi(const C4Fixed &x)
Definition: C4Real.h:259
C4Facet PXSFace
Definition: C4Material.h:159
float Wdt
Definition: C4Facet.h:120
float X
Definition: C4Facet.h:120
size_t iChunkPXS[PXSMaxChunk]
Definition: C4PXS.h:48

Here is the call graph for this function:

Here is the caller graph for this function:

void C4PXSSystem::Execute ( )

Definition at line 223 of file C4PXS.cpp.

References Chunk, Count, C4PXS::Execute(), iChunkPXS, C4PXS::Mat, MNone, PXSChunkSize, and PXSMaxChunk.

Referenced by C4Game::Execute().

224 {
225  // Execute all chunks
226  Count=0;
227  for (unsigned int cchunk=0; cchunk<PXSMaxChunk; cchunk++)
228  if (Chunk[cchunk])
229  {
230  // empty chunk?
231  if (!iChunkPXS[cchunk])
232  { delete [] Chunk[cchunk]; Chunk[cchunk]=nullptr; }
233  else
234  {
235  // Execute chunk pxs, check for empty
236  C4PXS *pxp = Chunk[cchunk];
237  for (unsigned int cnt2=0; cnt2<PXSChunkSize; cnt2++,pxp++)
238  if (pxp->Mat!=MNone)
239  {
240  pxp->Execute();
241  Count++;
242  }
243  }
244  }
245 }
C4PXS * Chunk[PXSMaxChunk]
Definition: C4PXS.h:47
Definition: C4PXS.h:25
const int32_t MNone
Definition: C4Constants.h:178
const size_t PXSMaxChunk
Definition: C4PXS.h:37
int32_t Mat
Definition: C4PXS.h:30
const size_t PXSChunkSize
Definition: C4PXS.h:37
void Execute()
Definition: C4PXS.cpp:34
size_t iChunkPXS[PXSMaxChunk]
Definition: C4PXS.h:48
int32_t Count
Definition: C4PXS.h:45

Here is the call graph for this function:

Here is the caller graph for this function:

int32_t C4PXSSystem::GetCount ( ) const
inline

Definition at line 61 of file C4PXS.h.

References Count.

61 { return Count; } // count all PXS
int32_t Count
Definition: C4PXS.h:45
int32_t C4PXSSystem::GetCount ( int32_t  mat) const

Definition at line 505 of file C4PXS.cpp.

References Chunk, iChunkPXS, C4PXS::Mat, PXSChunkSize, and PXSMaxChunk.

506 {
507  // count PXS of given material
508  int32_t result = 0;
509  for (size_t cnt = 0; cnt < PXSMaxChunk; cnt++) if (Chunk[cnt] && iChunkPXS[cnt])
510  {
511  C4PXS *pxp = Chunk[cnt];
512  for (size_t cnt2 = 0; cnt2 < PXSChunkSize; cnt2++, pxp++) if (pxp->Mat == mat) ++result;
513  }
514  return result;
515 }
C4PXS * Chunk[PXSMaxChunk]
Definition: C4PXS.h:47
Definition: C4PXS.h:25
const size_t PXSMaxChunk
Definition: C4PXS.h:37
int32_t Mat
Definition: C4PXS.h:30
const size_t PXSChunkSize
Definition: C4PXS.h:37
size_t iChunkPXS[PXSMaxChunk]
Definition: C4PXS.h:48
int32_t C4PXSSystem::GetCount ( int32_t  mat,
int32_t  x,
int32_t  y,
int32_t  wdt,
int32_t  hgt 
) const

Definition at line 517 of file C4PXS.cpp.

References Chunk, iChunkPXS, Inside(), C4PXS::Mat, MNone, PXSChunkSize, PXSMaxChunk, C4PXS::x, and C4PXS::y.

518 {
519  // count PXS of given material in given area
520  int32_t result = 0;
521  for (size_t cnt = 0; cnt < PXSMaxChunk; cnt++) if (Chunk[cnt] && iChunkPXS[cnt])
522  {
523  C4PXS *pxp = Chunk[cnt];
524  for (size_t cnt2 = 0; cnt2 < PXSChunkSize; cnt2++, pxp++)
525  if (pxp->Mat != MNone)
526  if (pxp->Mat == mat || mat == MNone)
527  if (Inside(pxp->x, x, x + wdt - 1) && Inside(pxp->y, y, y + hgt - 1)) ++result;
528  }
529  return result;
530 }
C4PXS * Chunk[PXSMaxChunk]
Definition: C4PXS.h:47
Definition: C4PXS.h:25
C4Real y
Definition: C4PXS.h:31
const int32_t MNone
Definition: C4Constants.h:178
const size_t PXSMaxChunk
Definition: C4PXS.h:37
int32_t Mat
Definition: C4PXS.h:30
const size_t PXSChunkSize
Definition: C4PXS.h:37
C4Real x
Definition: C4PXS.h:31
bool Inside(T ival, U lbound, V rbound)
Definition: Standard.h:45
size_t iChunkPXS[PXSMaxChunk]
Definition: C4PXS.h:48

Here is the call graph for this function:

bool C4PXSSystem::Load ( C4Group hGroup)

Definition at line 421 of file C4PXS.cpp.

References C4Group::AccessEntry(), C4CFN_PXS, Chunk, Clear(), FLOAT_TO_FIXED(), iChunkPXS, C4PXS::Mat, MNone, PXSChunkSize, PXSMaxChunk, C4Group::Read(), C4PXS::x, C4PXS::xdir, C4PXS::y, and C4PXS::ydir.

Referenced by C4Game::InitGame().

422 {
423  // load new
424  size_t iBinSize,iChunkNum,cnt2;
425  size_t iChunkSize = PXSChunkSize * sizeof(C4PXS);
426  if (!hGroup.AccessEntry(C4CFN_PXS,&iBinSize)) return false;
427  // clear previous
428  Clear();
429  // using C4Real or float?
430  int32_t iNumForm = 1;
431  if (iBinSize % iChunkSize == 4)
432  {
433  if (!hGroup.Read(&iNumForm, sizeof (iNumForm))) return false;
434  if (!Inside<int32_t>(iNumForm, 1, 2)) return false;
435  iBinSize -= 4;
436  }
437  // old pxs-files have no tag for the number format
438  else if (iBinSize % iChunkSize != 0) return false;
439  // calc chunk count
440  iChunkNum = iBinSize / iChunkSize;
441  if (iChunkNum > PXSMaxChunk) return false;
442  for (uint32_t cnt=0; cnt<iChunkNum; cnt++)
443  {
444  if (!(Chunk[cnt]=new C4PXS[PXSChunkSize])) return false;
445  if (!hGroup.Read(Chunk[cnt],iChunkSize)) return false;
446  // count the PXS, Peter!
447  // convert num format, if neccessary
448  C4PXS *pxp; iChunkPXS[cnt]=0;
449  for (cnt2=0,pxp=Chunk[cnt]; cnt2<PXSChunkSize; cnt2++,pxp++)
450  if (pxp->Mat != MNone)
451  {
452  ++iChunkPXS[cnt];
453  // convert number format
454 #ifdef C4REAL_USE_FIXNUM
455  if (iNumForm == 2) { FLOAT_TO_FIXED(&pxp->x); FLOAT_TO_FIXED(&pxp->y); FLOAT_TO_FIXED(&pxp->xdir); FLOAT_TO_FIXED(&pxp->ydir); }
456 #else
457  if (iNumForm == 1) { FIXED_TO_FLOAT(&pxp->x); FIXED_TO_FLOAT(&pxp->y); FIXED_TO_FLOAT(&pxp->xdir); FIXED_TO_FLOAT(&pxp->ydir); }
458 #endif
459  }
460  }
461  return true;
462 }
bool AccessEntry(const char *szWildCard, size_t *iSize=nullptr, char *sFileName=nullptr, bool NeedsToBeAGroup=false)
Definition: C4Group.cpp:1695
C4PXS * Chunk[PXSMaxChunk]
Definition: C4PXS.h:47
Definition: C4PXS.h:25
C4Real y
Definition: C4PXS.h:31
C4Real ydir
Definition: C4PXS.h:31
const int32_t MNone
Definition: C4Constants.h:178
void Clear()
Definition: C4PXS.cpp:176
const size_t PXSMaxChunk
Definition: C4PXS.h:37
int32_t Mat
Definition: C4PXS.h:30
const size_t PXSChunkSize
Definition: C4PXS.h:37
C4Real xdir
Definition: C4PXS.h:31
C4Real x
Definition: C4PXS.h:31
#define C4CFN_PXS
Definition: C4Components.h:75
void FLOAT_TO_FIXED(C4Real *pVal)
Definition: C4Real.h:318
size_t iChunkPXS[PXSMaxChunk]
Definition: C4PXS.h:48
bool Read(void *pBuffer, size_t iSize) override
Definition: C4Group.cpp:1125

Here is the call graph for this function:

Here is the caller graph for this function:

C4PXS * C4PXSSystem::New ( )
protected

Definition at line 186 of file C4PXS.cpp.

References Chunk, iChunkPXS, C4PXS::Mat, MNone, PXSChunkSize, and PXSMaxChunk.

Referenced by Create().

187 {
188  unsigned int cnt,cnt2;
189  C4PXS *pxp;
190  // Check chunks for available space
191  for (cnt=0; cnt<PXSMaxChunk; cnt++)
192  {
193  // Create new chunk if necessary
194  if (!Chunk[cnt])
195  {
196  if (!(Chunk[cnt]=new C4PXS[PXSChunkSize])) return nullptr;
197  iChunkPXS[cnt] = 0;
198  }
199  // Check this chunk for space
200  if (iChunkPXS[cnt] < PXSChunkSize)
201  for (cnt2=0,pxp=Chunk[cnt]; cnt2<PXSChunkSize; cnt2++,pxp++)
202  if (pxp->Mat==MNone)
203  {
204  // count them
205  iChunkPXS[cnt]++;
206  return pxp;
207  }
208  }
209  return nullptr;
210 }
C4PXS * Chunk[PXSMaxChunk]
Definition: C4PXS.h:47
Definition: C4PXS.h:25
const int32_t MNone
Definition: C4Constants.h:178
const size_t PXSMaxChunk
Definition: C4PXS.h:37
int32_t Mat
Definition: C4PXS.h:30
const size_t PXSChunkSize
Definition: C4PXS.h:37
size_t iChunkPXS[PXSMaxChunk]
Definition: C4PXS.h:48

Here is the caller graph for this function:

bool C4PXSSystem::Save ( C4Group hGroup)

Definition at line 379 of file C4PXS.cpp.

References C4Config::AtTempPath(), C4CFN_PXS, C4CFN_TempPXS, Chunk, CStdFile::Close(), Config, CStdFile::Create(), C4Group::Delete(), iChunkPXS, C4Group::Move(), PXSChunkSize, PXSMaxChunk, and CStdFile::Write().

Referenced by C4Game::LoadScenarioSection().

380 {
381  unsigned int cnt;
382 
383  // Check used chunk count
384  int32_t iChunks=0;
385  for (cnt=0; cnt<PXSMaxChunk; cnt++)
386  if (Chunk[cnt] && iChunkPXS[cnt])
387  iChunks++;
388  if (!iChunks)
389  {
390  hGroup.Delete(C4CFN_PXS);
391  return true;
392  }
393 
394  // Save chunks to temp file
395  CStdFile hTempFile;
396  if (!hTempFile.Create(Config.AtTempPath(C4CFN_TempPXS)))
397  return false;
398 #ifdef C4REAL_USE_FIXNUM
399  int32_t iNumFormat = 1;
400 #else
401  int32_t iNumFormat = 2;
402 #endif
403  if (!hTempFile.Write(&iNumFormat, sizeof (iNumFormat)))
404  return false;
405  for (cnt=0; cnt<PXSMaxChunk; cnt++)
406  if (Chunk[cnt]) // must save all chunks in order to keep order consistent on all clients
407  if (!hTempFile.Write(Chunk[cnt],PXSChunkSize * sizeof(C4PXS)))
408  return false;
409 
410  if (!hTempFile.Close())
411  return false;
412 
413  // Move temp file to group
414  if (!hGroup.Move( Config.AtTempPath(C4CFN_TempPXS),
415  C4CFN_PXS ))
416  return false;
417 
418  return true;
419 }
bool Close(StdBuf **ppMemory=nullptr)
Definition: CStdFile.cpp:155
C4Config Config
Definition: C4Config.cpp:837
bool Create(const char *szFileName, bool fCompressed=false, bool fExecutable=false, bool fMemory=false)
Definition: CStdFile.cpp:53
C4PXS * Chunk[PXSMaxChunk]
Definition: C4PXS.h:47
Definition: C4PXS.h:25
bool Delete(const char *szFiles, bool fRecursive=false)
Definition: C4Group.cpp:1334
bool Write(const void *pBuffer, int iSize)
Definition: CStdFile.cpp:244
bool Move(const char *szFile, const char *szAddAs)
Definition: C4Group.cpp:1325
const size_t PXSMaxChunk
Definition: C4PXS.h:37
const size_t PXSChunkSize
Definition: C4PXS.h:37
#define C4CFN_PXS
Definition: C4Components.h:75
const char * AtTempPath(const char *szFilename)
Definition: C4Config.cpp:544
#define C4CFN_TempPXS
Definition: C4Components.h:158
size_t iChunkPXS[PXSMaxChunk]
Definition: C4PXS.h:48

Here is the call graph for this function:

Here is the caller graph for this function:

void C4PXSSystem::SyncClearance ( )

Definition at line 469 of file C4PXS.cpp.

References Chunk, iChunkPXS, and PXSMaxChunk.

Referenced by C4Game::SyncClearance().

470 {
471  // consolidate chunks; remove empty chunks
472  C4PXS **pDestChunk = Chunk;
473  int32_t iDestChunk = 0;
474  for (unsigned int cnt=0; cnt<PXSMaxChunk; cnt++)
475  {
476  if (Chunk[cnt])
477  {
478  if (iChunkPXS[cnt])
479  {
480  *pDestChunk++ = Chunk[cnt];
481  iChunkPXS[iDestChunk++] = iChunkPXS[cnt];
482  }
483  else
484  {
485  delete [] Chunk[cnt];
486  Chunk[cnt] = nullptr;
487  }
488  }
489  }
490 }
C4PXS * Chunk[PXSMaxChunk]
Definition: C4PXS.h:47
Definition: C4PXS.h:25
const size_t PXSMaxChunk
Definition: C4PXS.h:37
size_t iChunkPXS[PXSMaxChunk]
Definition: C4PXS.h:48

Here is the caller graph for this function:

void C4PXSSystem::Synchronize ( )

Definition at line 464 of file C4PXS.cpp.

References Count.

Referenced by C4Game::Synchronize().

465 {
466  Count=0;
467 }
int32_t Count
Definition: C4PXS.h:45

Here is the caller graph for this function:

Member Data Documentation

C4PXS* C4PXSSystem::Chunk[PXSMaxChunk]
protected

Definition at line 47 of file C4PXS.h.

Referenced by Clear(), Default(), Delete(), Draw(), Execute(), GetCount(), Load(), New(), Save(), and SyncClearance().

int32_t C4PXSSystem::Count

Definition at line 45 of file C4PXS.h.

Referenced by Default(), Execute(), GetCount(), C4ControlSyncCheck::Set(), and Synchronize().

size_t C4PXSSystem::iChunkPXS[PXSMaxChunk]
protected

Definition at line 48 of file C4PXS.h.

Referenced by Clear(), Default(), Delete(), Draw(), Execute(), GetCount(), Load(), New(), Save(), and SyncClearance().


The documentation for this class was generated from the following files: