bl-symmetrize-texture/src/symtex_processor.h

142 lines
4.4 KiB
C++

/*
Copyright (C) 2020 - 2022 Akaneyu
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef SYMTEX_PROCESSOR_H_
#define SYMTEX_PROCESSOR_H_
#include <vector>
#if defined(_MSC_VER)
#define EXPORT __declspec(dllexport)
#else
#define EXPORT
#endif
extern "C" {
EXPORT int SYMTEX_init(int type);
EXPORT void SYMTEX_free();
EXPORT void SYMTEX_setRegionSize(int width, int height);
EXPORT void SYMTEX_setOrthogonal(int isOrtho);
EXPORT void SYMTEX_setPerspectiveMatrix(float *mat);
EXPORT void SYMTEX_setViewPosition(float *pos);
EXPORT void SYMTEX_setViewDirection(float *dir);
EXPORT void SYMTEX_setVertexCoords(float *coords, int numCoords);
EXPORT void SYMTEX_setVertexNormals(float *normals, int numNormals);
EXPORT void SYMTEX_setVertexIndices(int *indices, int numIndices);
EXPORT void SYMTEX_setUVCoords(float *coords, int numCoords);
EXPORT void SYMTEX_setTriangles(int *indices, int numTriangles);
EXPORT void SYMTEX_setImageSize(int width, int height);
EXPORT void SYMTEX_setImagePixels(float *pixels);
EXPORT void SYMTEX_setMirrorAxis(int axis);
EXPORT void SYMTEX_setBrushSize(float size);
EXPORT void SYMTEX_setBrushStrength(float strength);
EXPORT void SYMTEX_setBrushFalloffType(int type);
EXPORT void SYMTEX_prepare();
EXPORT void SYMTEX_processStroke(float *pos);
}
class Triangle
{
public:
Triangle();
Triangle(int *indices);
virtual ~Triangle();
int *getIndices() { return m_indices; }
private:
int m_indices[3];
};
class PixelState
{
public:
PixelState();
virtual ~PixelState();
float *getScreenCoord() { return m_screenCoord; }
void setScreenCoord(float *coord);
int *getImageCoord() { return m_imageCoord; }
void setImageCoord(int *coord);
private:
float m_screenCoord[4];
int m_imageCoord[2];
};
// brush position & size
// 3D: screen coordinate, 2D: uv coordinate (0 - 1.0)
class Processor
{
public:
Processor(int type);
virtual ~Processor();
void setRegionSize(int width, int height);
void setOrthogonal(bool isOrtho) { m_orthogonal = isOrtho; }
void setPerspectiveMatrix(float *mat);
void setViewPosition(float *pos);
void setViewDirection(float *dir);
void addVertexCoord(float *coord);
void addVertexNormal(float *norm);
void addVertexIndex(int index);
void addUVCoord(float *coord);
void addTriangle(int *indices);
void setImageSize(int width, int height);
void setImagePixels(float *pixels) { m_imagePixels = pixels; }
void setMirrorAxis(int axis) { m_mirrorAxis = axis; }
void setBrushSize(float size) { m_brushSize = size; }
void setBrushStrength(float strength) { m_brushStrength = strength; }
void setBrushFalloffType(int type) { m_brushFalloffType = type; }
void prepare();
void processStroke(float *pos);
private:
void preparePixel(int x, int y, float *uvCoord,
float *v1ScrCoord, float *v2ScrCoord, float *v3ScrCoord, float **triUvCoords);
void processStroke3d(float *pos);
void processStroke2d(float *pos);
void processStrokePixel(int x, int y, float falloff);
float calcBrushFalloff(float dist, float len);
int m_processType;
int m_regionWidth;
int m_regionHeight;
bool m_orthogonal;
float m_perspectiveMatrix[16];
float m_viewPosition[3];
float m_viewDirection[3];
std::vector<float *> m_vertexCoords;
std::vector<float *> m_vertexNormals;
std::vector<float *> m_screenCoords;
std::vector<int> m_vertexIndices;
std::vector<float *> m_uvCoords;
std::vector<Triangle *> m_triangles;
std::vector<int> m_vertexStates;
int m_imageWidth;
int m_imageHeight;
float *m_imagePixels;
float *m_originalImagePixels;
unsigned short *m_imageAlpha;
std::vector<PixelState *> m_pixelStates;
int m_mirrorAxis;
float m_brushSize;
float m_brushStrength;
int m_brushFalloffType;
};
#endif // SYMTEX_PROCESSOR_H_