virtualx-engine/thirdparty/thekla_atlas/nvmesh/param/AtlasPacker.h

64 lines
2.2 KiB
C++
Raw Normal View History

// This code is in the public domain -- castano@gmail.com
#pragma once
#ifndef NV_MESH_ATLASPACKER_H
#define NV_MESH_ATLASPACKER_H
#include "nvcore/RadixSort.h"
#include "nvmath/Vector.h"
#include "nvmath/Random.h"
#include "nvimage/BitMap.h"
#include "nvimage/Image.h"
#include "nvmesh/nvmesh.h"
namespace nv
{
class Atlas;
class Chart;
struct AtlasPacker
{
AtlasPacker(Atlas * atlas);
~AtlasPacker();
void packCharts(int quality, float texelArea, bool blockAligned, bool conservative);
float computeAtlasUtilization() const;
private:
void findChartLocation(int quality, const BitMap * bitmap, Vector2::Arg extents, int w, int h, int * best_x, int * best_y, int * best_w, int * best_h, int * best_r);
void findChartLocation_bruteForce(const BitMap * bitmap, Vector2::Arg extents, int w, int h, int * best_x, int * best_y, int * best_w, int * best_h, int * best_r);
void findChartLocation_random(const BitMap * bitmap, Vector2::Arg extents, int w, int h, int * best_x, int * best_y, int * best_w, int * best_h, int * best_r, int minTrialCount);
void drawChartBitmapDilate(const Chart * chart, BitMap * bitmap, int padding);
void drawChartBitmap(const Chart * chart, BitMap * bitmap, const Vector2 & scale, const Vector2 & offset);
bool canAddChart(const BitMap * bitmap, int w, int h, int x, int y, int r);
void addChart(const BitMap * bitmap, int w, int h, int x, int y, int r, Image * debugOutput);
//void checkCanAddChart(const Chart * chart, int w, int h, int x, int y, int r);
void addChart(const Chart * chart, int w, int h, int x, int y, int r, Image * debugOutput);
static bool checkBitsCallback(void * param, int x, int y, Vector3::Arg bar, Vector3::Arg dx, Vector3::Arg dy, float coverage);
static bool setBitsCallback(void * param, int x, int y, Vector3::Arg bar, Vector3::Arg dx, Vector3::Arg dy, float coverage);
private:
Atlas * m_atlas;
BitMap m_bitmap;
Image m_debug_bitmap;
RadixSort m_radix;
uint m_width;
uint m_height;
MTRand m_rand;
};
} // nv namespace
#endif // NV_MESH_ATLASPACKER_H