tornavis/source/blender/draw/intern/draw_hair_private.h

88 lines
2.3 KiB
C

/* SPDX-FileCopyrightText: 2017 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup draw
*/
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
#define MAX_LAYER_NAME_CT 4 /* `u0123456789, u, au, a0123456789`. */
#define MAX_LAYER_NAME_LEN (GPU_MAX_SAFE_ATTR_NAME + 2)
#define MAX_THICKRES 2 /* see eHairType */
#define MAX_HAIR_SUBDIV 4 /* see hair_subdiv rna */
typedef enum ParticleRefineShader {
PART_REFINE_CATMULL_ROM = 0,
PART_REFINE_MAX_SHADER,
} ParticleRefineShader;
struct ModifierData;
struct Object;
struct ParticleHairCache;
struct ParticleSystem;
typedef struct ParticleHairFinalCache {
/* Output of the subdivision stage: vertex buff sized to subdiv level. */
GPUVertBuf *proc_buf;
/* Just contains a huge index buffer used to draw the final hair. */
GPUBatch *proc_hairs[MAX_THICKRES];
int strands_res; /* points per hair, at least 2 */
} ParticleHairFinalCache;
typedef struct ParticleHairCache {
GPUVertBuf *pos;
GPUIndexBuf *indices;
GPUBatch *hairs;
/* Hair Procedural display: Interpolation is done on the GPU. */
GPUVertBuf *proc_point_buf; /* Input control points */
/** Infos of control points strands (segment count and base index) */
GPUVertBuf *proc_strand_buf;
/* Hair Length */
GPUVertBuf *proc_length_buf;
GPUVertBuf *proc_strand_seg_buf;
GPUVertBuf *proc_uv_buf[MAX_MTFACE];
GPUTexture *uv_tex[MAX_MTFACE];
char uv_layer_names[MAX_MTFACE][MAX_LAYER_NAME_CT][MAX_LAYER_NAME_LEN];
GPUVertBuf **proc_col_buf;
GPUTexture **col_tex;
char (*col_layer_names)[MAX_LAYER_NAME_CT][MAX_LAYER_NAME_LEN];
int num_uv_layers;
int num_col_layers;
ParticleHairFinalCache final[MAX_HAIR_SUBDIV];
int strands_len;
int elems_len;
int point_len;
} ParticleHairCache;
/**
* Ensure all textures and buffers needed for GPU accelerated drawing.
*/
bool particles_ensure_procedural_data(struct Object *object,
struct ParticleSystem *psys,
struct ModifierData *md,
struct ParticleHairCache **r_hair_cache,
struct GPUMaterial *gpu_material,
int subdiv,
int thickness_res);
#ifdef __cplusplus
}
#endif