183 lines
4.8 KiB
C++
183 lines
4.8 KiB
C++
|
/*
|
||
|
* 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 2
|
||
|
* 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, write to the Free Software Foundation,
|
||
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||
|
*
|
||
|
* The Original Code is Copyright (C) 2005 Blender Foundation.
|
||
|
* All rights reserved.
|
||
|
*/
|
||
|
|
||
|
/** \file
|
||
|
* \ingroup gpu
|
||
|
*/
|
||
|
|
||
|
#ifndef __GPU_NODE_GRAPH_H__
|
||
|
#define __GPU_NODE_GRAPH_H__
|
||
|
|
||
|
#include "DNA_customdata_types.h"
|
||
|
#include "DNA_listBase.h"
|
||
|
|
||
|
#include "GPU_material.h"
|
||
|
#include "GPU_glew.h"
|
||
|
#include "GPU_shader.h"
|
||
|
|
||
|
struct GPUNode;
|
||
|
struct GPUOutput;
|
||
|
struct GPUShader;
|
||
|
struct GPUVertAttrLayers;
|
||
|
struct ListBase;
|
||
|
|
||
|
typedef enum eGPUDataSource {
|
||
|
GPU_SOURCE_OUTPUT,
|
||
|
GPU_SOURCE_CONSTANT,
|
||
|
GPU_SOURCE_UNIFORM,
|
||
|
GPU_SOURCE_ATTR,
|
||
|
GPU_SOURCE_BUILTIN,
|
||
|
GPU_SOURCE_STRUCT,
|
||
|
GPU_SOURCE_TEX,
|
||
|
} eGPUDataSource;
|
||
|
|
||
|
typedef enum {
|
||
|
GPU_NODE_LINK_NONE = 0,
|
||
|
GPU_NODE_LINK_ATTR,
|
||
|
GPU_NODE_LINK_BUILTIN,
|
||
|
GPU_NODE_LINK_COLORBAND,
|
||
|
GPU_NODE_LINK_CONSTANT,
|
||
|
GPU_NODE_LINK_IMAGE_BLENDER,
|
||
|
GPU_NODE_LINK_IMAGE_TILEMAP,
|
||
|
GPU_NODE_LINK_OUTPUT,
|
||
|
GPU_NODE_LINK_UNIFORM,
|
||
|
} GPUNodeLinkType;
|
||
|
|
||
|
struct GPUNode {
|
||
|
struct GPUNode *next, *prev;
|
||
|
|
||
|
const char *name;
|
||
|
|
||
|
/* Internal flag to mark nodes during pruning */
|
||
|
bool tag;
|
||
|
|
||
|
ListBase inputs;
|
||
|
ListBase outputs;
|
||
|
};
|
||
|
|
||
|
struct GPUNodeLink {
|
||
|
GPUNodeStack *socket;
|
||
|
|
||
|
GPUNodeLinkType link_type;
|
||
|
int users; /* Refcount */
|
||
|
|
||
|
union {
|
||
|
/* GPU_NODE_LINK_CONSTANT | GPU_NODE_LINK_UNIFORM */
|
||
|
float *data;
|
||
|
/* GPU_NODE_LINK_BUILTIN */
|
||
|
eGPUBuiltin builtin;
|
||
|
/* GPU_NODE_LINK_COLORBAND */
|
||
|
struct GPUTexture **coba;
|
||
|
/* GPU_NODE_LINK_OUTPUT */
|
||
|
struct GPUOutput *output;
|
||
|
/* GPU_NODE_LINK_ATTR */
|
||
|
struct {
|
||
|
const char *attr_name;
|
||
|
CustomDataType attr_type;
|
||
|
};
|
||
|
/* GPU_NODE_LINK_IMAGE_BLENDER | GPU_NODE_LINK_IMAGE_TILEMAP */
|
||
|
struct {
|
||
|
struct Image *ima;
|
||
|
struct ImageUser *iuser;
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
|
||
|
typedef struct GPUOutput {
|
||
|
struct GPUOutput *next, *prev;
|
||
|
|
||
|
GPUNode *node;
|
||
|
eGPUType type; /* data type = length of vector/matrix */
|
||
|
GPUNodeLink *link; /* output link */
|
||
|
int id; /* unique id as created by code generator */
|
||
|
} GPUOutput;
|
||
|
|
||
|
typedef struct GPUInput {
|
||
|
struct GPUInput *next, *prev;
|
||
|
|
||
|
GPUNode *node;
|
||
|
eGPUType type; /* datatype */
|
||
|
GPUNodeLink *link;
|
||
|
int id; /* unique id as created by code generator */
|
||
|
|
||
|
eGPUDataSource source; /* data source */
|
||
|
|
||
|
int shaderloc; /* id from opengl */
|
||
|
char shadername[32]; /* name in shader */
|
||
|
|
||
|
/* Content based on eGPUDataSource */
|
||
|
union {
|
||
|
/* GPU_SOURCE_CONSTANT | GPU_SOURCE_UNIFORM */
|
||
|
float vec[16]; /* vector data */
|
||
|
/* GPU_SOURCE_BUILTIN */
|
||
|
eGPUBuiltin builtin; /* builtin uniform */
|
||
|
/* GPU_SOURCE_TEX */
|
||
|
struct {
|
||
|
struct GPUTexture **coba; /* input texture, only set at runtime */
|
||
|
struct Image *ima; /* image */
|
||
|
struct ImageUser *iuser; /* image user */
|
||
|
bool bindtex; /* input is responsible for binding the texture? */
|
||
|
int texid; /* number for multitexture, starting from zero */
|
||
|
eGPUType textype; /* texture type (2D, 1D Array ...) */
|
||
|
};
|
||
|
/* GPU_SOURCE_ATTR */
|
||
|
struct {
|
||
|
/** Attribute name. */
|
||
|
char attr_name[MAX_CUSTOMDATA_LAYER_NAME];
|
||
|
/** ID for vertex attributes. */
|
||
|
int attr_id;
|
||
|
/** This is the first one that is bound. */
|
||
|
bool attr_first;
|
||
|
/** Attribute type. */
|
||
|
CustomDataType attr_type;
|
||
|
};
|
||
|
};
|
||
|
} GPUInput;
|
||
|
|
||
|
typedef struct GPUNodeGraph {
|
||
|
/* Nodes */
|
||
|
ListBase nodes;
|
||
|
|
||
|
/* Inputs and output. */
|
||
|
ListBase inputs;
|
||
|
GPUNodeLink *outlink;
|
||
|
|
||
|
/* Needed attributes. */
|
||
|
GPUVertAttrLayers attrs;
|
||
|
int builtins;
|
||
|
} GPUNodeGraph;
|
||
|
|
||
|
/* Node Graph */
|
||
|
|
||
|
void gpu_node_graph_prune_unused(GPUNodeGraph *graph);
|
||
|
void gpu_node_graph_extract_dynamic_inputs(struct GPUShader *shader, GPUNodeGraph *graph);
|
||
|
void gpu_node_graph_free(GPUNodeGraph *graph);
|
||
|
|
||
|
/* Material calls */
|
||
|
|
||
|
void gpu_material_add_node(struct GPUMaterial *material, struct GPUNode *node);
|
||
|
struct GPUTexture **gpu_material_ramp_texture_row_set(struct GPUMaterial *mat,
|
||
|
int size,
|
||
|
float *pixels,
|
||
|
float *row);
|
||
|
|
||
|
struct GSet *gpu_material_used_libraries(struct GPUMaterial *material);
|
||
|
|
||
|
#endif /* __GPU_NODE_GRAPH_H__ */
|