forked from enlightenment/efl
378 lines
10 KiB
C
378 lines
10 KiB
C
#ifndef EVAS_PRIVATE_H
|
|
# error You shall not include this header directly
|
|
#endif
|
|
|
|
#include "Evas_3D.h"
|
|
#include "evas_3d_utils.h"
|
|
|
|
#define EVAS_3D_VERTEX_ATTRIB_COUNT 5
|
|
#define EVAS_3D_MATERIAL_ATTRIB_COUNT 5
|
|
|
|
typedef struct _Evas_3D_Object Evas_3D_Object;
|
|
typedef struct _Evas_3D_Scene_Data Evas_3D_Scene_Data;
|
|
typedef struct _Evas_3D_Vertex_Buffer Evas_3D_Vertex_Buffer;
|
|
typedef struct _Evas_3D_Mesh_Frame Evas_3D_Mesh_Frame;
|
|
typedef struct _Evas_3D_Node_Mesh Evas_3D_Node_Mesh;
|
|
typedef struct _Evas_3D_Object_Func Evas_3D_Object_Func;
|
|
typedef struct _Evas_3D_Pick_Data Evas_3D_Pick_Data;
|
|
typedef struct _Evas_3D_Interpolate_Vertex_Buffer Evas_3D_Interpolate_Vertex_Buffer;
|
|
|
|
typedef Eina_Bool (*Evas_3D_Node_Func)(Evas_3D_Node *, void *data);
|
|
|
|
typedef enum _Evas_3D_Object_Type
|
|
{
|
|
EVAS_3D_OBJECT_TYPE_INVALID = 0,
|
|
EVAS_3D_OBJECT_TYPE_SCENE,
|
|
EVAS_3D_OBJECT_TYPE_NODE,
|
|
EVAS_3D_OBJECT_TYPE_CAMERA,
|
|
EVAS_3D_OBJECT_TYPE_LIGHT,
|
|
EVAS_3D_OBJECT_TYPE_MODEL,
|
|
EVAS_3D_OBJECT_TYPE_MESH,
|
|
EVAS_3D_OBJECT_TYPE_TEXTURE,
|
|
EVAS_3D_OBJECT_TYPE_MATERIAL,
|
|
} Evas_3D_Object_Type;
|
|
|
|
typedef enum _Evas_3D_State
|
|
{
|
|
EVAS_3D_STATE_MAX = 16,
|
|
|
|
EVAS_3D_STATE_ANY = 0,
|
|
|
|
EVAS_3D_STATE_SCENE_ROOT_NODE = 1,
|
|
EVAS_3D_STATE_SCENE_CAMERA_NODE,
|
|
EVAS_3D_STATE_SCENE_BACKGROUND_COLOR,
|
|
EVAS_3D_STATE_SCENE_SIZE,
|
|
|
|
EVAS_3D_STATE_TEXTURE_DATA = 1,
|
|
EVAS_3D_STATE_TEXTURE_WRAP,
|
|
EVAS_3D_STATE_TEXTURE_FILTER,
|
|
|
|
EVAS_3D_STATE_MATERIAL_ID = 1,
|
|
EVAS_3D_STATE_MATERIAL_COLOR,
|
|
EVAS_3D_STATE_MATERIAL_TEXTURE,
|
|
|
|
EVAS_3D_STATE_MESH_VERTEX_COUNT = 1,
|
|
EVAS_3D_STATE_MESH_FRAME,
|
|
EVAS_3D_STATE_MESH_MATERIAL,
|
|
EVAS_3D_STATE_MESH_TRANSFORM,
|
|
EVAS_3D_STATE_MESH_VERTEX_DATA,
|
|
EVAS_3D_STATE_MESH_INDEX_DATA,
|
|
EVAS_3D_STATE_MESH_VERTEX_ASSEMBLY,
|
|
EVAS_3D_STATE_MESH_SHADE_MODE,
|
|
|
|
EVAS_3D_STATE_CAMERA_PROJECTION = 1,
|
|
|
|
EVAS_3D_STATE_LIGHT_AMBIENT = 1,
|
|
EVAS_3D_STATE_LIGHT_DIFFUSE,
|
|
EVAS_3D_STATE_LIGHT_SPECULAR,
|
|
EVAS_3D_STATE_LIGHT_SPOT_DIR,
|
|
EVAS_3D_STATE_LIGHT_SPOT_EXP,
|
|
EVAS_3D_STATE_LIGHT_SPOT_CUTOFF,
|
|
EVAS_3D_STATE_LIGHT_ATTENUATION,
|
|
|
|
EVAS_3D_STATE_NODE_TRANSFORM = 1,
|
|
EVAS_3D_STATE_NODE_MESH_GEOMETRY,
|
|
EVAS_3D_STATE_NODE_MESH_MATERIAL,
|
|
EVAS_3D_STATE_NODE_MESH_FRAME,
|
|
EVAS_3D_STATE_NODE_MESH_SHADE_MODE,
|
|
EVAS_3D_STATE_NODE_MESH_MATERIAL_ID,
|
|
EVAS_3D_STATE_NODE_LIGHT,
|
|
EVAS_3D_STATE_NODE_CAMERA,
|
|
EVAS_3D_STATE_NODE_PARENT,
|
|
EVAS_3D_STATE_NODE_MEMBER,
|
|
} Evas_3D_State;
|
|
|
|
typedef enum _Evas_3D_Node_Traverse_Type
|
|
{
|
|
EVAS_3D_NODE_TRAVERSE_DOWNWARD,
|
|
EVAS_3D_NODE_TRAVERSE_UPWARD,
|
|
} Evas_3D_Node_Traverse_Type;
|
|
|
|
typedef enum _Evas_3D_Tree_Traverse_Type
|
|
{
|
|
EVAS_3D_TREE_TRAVERSE_PRE_ORDER,
|
|
EVAS_3D_TREE_TRAVERSE_ANY_ORDER = EVAS_3D_TREE_TRAVERSE_PRE_ORDER,
|
|
EVAS_3D_TREE_TRAVERSE_POST_ORDER,
|
|
EVAS_3D_TREE_TRAVERSE_LEVEL_ORDER,
|
|
} Evas_3D_Tree_Traverse_Type;
|
|
|
|
struct _Evas_3D_Object_Func
|
|
{
|
|
void (*free)(Evas_3D_Object *obj);
|
|
void (*change)(Evas_3D_Object *obj, Evas_3D_State state, Evas_3D_Object *ref);
|
|
void (*update)(Evas_3D_Object *obj);
|
|
};
|
|
|
|
struct _Evas_3D_Object
|
|
{
|
|
Evas *evas;
|
|
|
|
Evas_3D_Object_Type type;
|
|
int ref_count;
|
|
Evas_3D_Object_Func func;
|
|
|
|
Eina_Bool dirty[EVAS_3D_STATE_MAX];
|
|
};
|
|
|
|
struct _Evas_3D_Scene
|
|
{
|
|
Evas_3D_Object base;
|
|
|
|
Evas_3D_Node *root_node;
|
|
Evas_3D_Node *camera_node;
|
|
Evas_Color bg_color;
|
|
|
|
void *surface;
|
|
int w, h;
|
|
Eina_List *images;
|
|
};
|
|
|
|
struct _Evas_3D_Node_Mesh
|
|
{
|
|
Evas_3D_Node *node;
|
|
Evas_3D_Mesh *mesh;
|
|
int frame;
|
|
};
|
|
|
|
struct _Evas_3D_Node
|
|
{
|
|
Evas_3D_Object base;
|
|
|
|
Eina_List *members;
|
|
Evas_3D_Node *parent;
|
|
|
|
Evas_Vec3 position;
|
|
Evas_Vec4 orientation;
|
|
Evas_Vec3 scale;
|
|
|
|
Evas_Vec3 position_world;
|
|
Evas_Vec4 orientation_world;
|
|
Evas_Vec3 scale_world;
|
|
|
|
Eina_Bool position_inherit;
|
|
Eina_Bool orientation_inherit;
|
|
Eina_Bool scale_inherit;
|
|
|
|
Evas_Box3 aabb;
|
|
|
|
Evas_3D_Node_Type type;
|
|
|
|
/* Camera node. */
|
|
union {
|
|
struct {
|
|
Evas_3D_Camera *camera;
|
|
Evas_Mat4 matrix_world_to_eye;
|
|
} camera;
|
|
|
|
struct {
|
|
Evas_3D_Light *light;
|
|
Evas_Mat4 matrix_local_to_world;
|
|
} light;
|
|
|
|
struct {
|
|
Eina_List *meshes;
|
|
Eina_Hash *node_meshes;
|
|
Evas_Mat4 matrix_local_to_world;
|
|
} mesh;
|
|
} data;
|
|
|
|
/* Scene using this node as root. */
|
|
Eina_Hash *scenes_root;
|
|
|
|
/* Scene using this node as camera. */
|
|
Eina_Hash *scenes_camera;
|
|
};
|
|
|
|
struct _Evas_3D_Camera
|
|
{
|
|
Evas_3D_Object base;
|
|
|
|
Evas_Mat4 projection;
|
|
Eina_Hash *nodes;
|
|
};
|
|
|
|
struct _Evas_3D_Light
|
|
{
|
|
Evas_3D_Object base;
|
|
|
|
Evas_Color ambient;
|
|
Evas_Color diffuse;
|
|
Evas_Color specular;
|
|
|
|
Eina_Bool directional;
|
|
Evas_Real spot_exp;
|
|
Evas_Real spot_cutoff;
|
|
Evas_Real spot_cutoff_cos;
|
|
|
|
Eina_Bool enable_attenuation;
|
|
Evas_Real atten_const;
|
|
Evas_Real atten_linear;
|
|
Evas_Real atten_quad;
|
|
|
|
Eina_Hash *nodes;
|
|
};
|
|
|
|
struct _Evas_3D_Vertex_Buffer
|
|
{
|
|
int element_count;
|
|
int stride;
|
|
void *data;
|
|
int size;
|
|
Eina_Bool owns_data;
|
|
Eina_Bool mapped;
|
|
};
|
|
|
|
struct _Evas_3D_Interpolate_Vertex_Buffer
|
|
{
|
|
void *data0;
|
|
int stride0;
|
|
int size0;
|
|
|
|
void *data1;
|
|
int stride1;
|
|
int size1;
|
|
|
|
Evas_Real weight;
|
|
};
|
|
|
|
struct _Evas_3D_Mesh_Frame
|
|
{
|
|
Evas_3D_Mesh *mesh;
|
|
|
|
int frame;
|
|
Evas_3D_Material *material;
|
|
Evas_Box3 aabb;
|
|
|
|
Evas_3D_Vertex_Buffer vertices[EVAS_3D_VERTEX_ATTRIB_COUNT];
|
|
};
|
|
|
|
struct _Evas_3D_Mesh
|
|
{
|
|
Evas_3D_Object base;
|
|
|
|
Evas_3D_Shade_Mode shade_mode;
|
|
|
|
int vertex_count;
|
|
int frame_count;
|
|
Eina_List *frames;
|
|
|
|
Evas_3D_Index_Format index_format;
|
|
int index_count;
|
|
void *indices;
|
|
int index_size;
|
|
Eina_Bool owns_indices;
|
|
Eina_Bool index_mapped;
|
|
|
|
Evas_3D_Vertex_Assembly assembly;
|
|
|
|
Eina_Hash *nodes;
|
|
};
|
|
|
|
struct _Evas_3D_Texture
|
|
{
|
|
Evas_3D_Object base;
|
|
|
|
/* List of materials using this texture. */
|
|
Eina_Hash *materials;
|
|
|
|
/* Proxy data. */
|
|
Evas_Object *source;
|
|
Eina_Bool proxy_rendering;
|
|
void *proxy_surface;
|
|
|
|
/* Engine-side object. */
|
|
void *engine_data;
|
|
};
|
|
|
|
struct _Evas_3D_Material
|
|
{
|
|
Evas_3D_Object base;
|
|
|
|
struct {
|
|
Eina_Bool enable;
|
|
Evas_Color color;
|
|
Evas_3D_Texture *texture;
|
|
} attribs[EVAS_3D_MATERIAL_ATTRIB_COUNT];
|
|
|
|
Evas_Real shininess;
|
|
|
|
Eina_Hash *meshes;
|
|
};
|
|
|
|
struct _Evas_3D_Scene_Data
|
|
{
|
|
Evas_Color bg_color;
|
|
Evas_3D_Node *camera_node;
|
|
Eina_List *light_nodes;
|
|
Eina_List *mesh_nodes;
|
|
};
|
|
|
|
struct _Evas_3D_Pick_Data
|
|
{
|
|
/* Input */
|
|
Evas_Real x, y;
|
|
Evas_Mat4 matrix_vp;
|
|
Evas_Ray3 ray_world;
|
|
|
|
/* Output */
|
|
Eina_Bool picked;
|
|
Evas_Real z;
|
|
Evas_3D_Node *node;
|
|
Evas_3D_Mesh *mesh;
|
|
Evas_Real u, v;
|
|
Evas_Real s, t;
|
|
};
|
|
|
|
/* Object generic functions. */
|
|
void evas_3d_object_init(Evas_3D_Object *obj, Evas *e, Evas_3D_Object_Type type, const Evas_3D_Object_Func *func);
|
|
Evas *evas_3d_object_evas_get(const Evas_3D_Object *obj);
|
|
Evas_3D_Object_Type evas_3d_object_type_get(const Evas_3D_Object *obj);
|
|
|
|
void evas_3d_object_reference(Evas_3D_Object *obj);
|
|
void evas_3d_object_unreference(Evas_3D_Object *obj);
|
|
int evas_3d_object_reference_count_get(const Evas_3D_Object *obj);
|
|
|
|
void evas_3d_object_change(Evas_3D_Object *obj, Evas_3D_State state, Evas_3D_Object *ref);
|
|
Eina_Bool evas_3d_object_dirty_get(const Evas_3D_Object *obj, Evas_3D_State state);
|
|
void evas_3d_object_update(Evas_3D_Object *obj);
|
|
void evas_3d_object_update_done(Evas_3D_Object *obj);
|
|
|
|
/* Node functions. */
|
|
void evas_3d_node_traverse(Evas_3D_Node *from, Evas_3D_Node *to, Evas_3D_Node_Traverse_Type type, Eina_Bool skip, Evas_3D_Node_Func func, void *data);
|
|
void evas_3d_node_tree_traverse(Evas_3D_Node *root, Evas_3D_Tree_Traverse_Type type, Eina_Bool skip, Evas_3D_Node_Func func, void *data);
|
|
Eina_Bool evas_3d_node_mesh_collect(Evas_3D_Node *node, void *data);
|
|
Eina_Bool evas_3d_node_light_collect(Evas_3D_Node *node, void *data);
|
|
|
|
void evas_3d_node_scene_root_add(Evas_3D_Node *node, Evas_3D_Scene *scene);
|
|
void evas_3d_node_scene_root_del(Evas_3D_Node *node, Evas_3D_Scene *scene);
|
|
void evas_3d_node_scene_camera_add(Evas_3D_Node *node, Evas_3D_Scene *scene);
|
|
void evas_3d_node_scene_camera_del(Evas_3D_Node *node, Evas_3D_Scene *scene);
|
|
|
|
/* Camera functions. */
|
|
void evas_3d_camera_node_add(Evas_3D_Camera *camera, Evas_3D_Node *node);
|
|
void evas_3d_camera_node_del(Evas_3D_Camera *camera, Evas_3D_Node *node);
|
|
|
|
/* Light functions. */
|
|
void evas_3d_light_node_add(Evas_3D_Light *light, Evas_3D_Node *node);
|
|
void evas_3d_light_node_del(Evas_3D_Light *light, Evas_3D_Node *node);
|
|
|
|
/* Mesh functions. */
|
|
void evas_3d_mesh_node_add(Evas_3D_Mesh *mesh, Evas_3D_Node *node);
|
|
void evas_3d_mesh_node_del(Evas_3D_Mesh *mesh, Evas_3D_Node *node);
|
|
|
|
void evas_3d_mesh_interpolate_vertex_buffer_get(Evas_3D_Mesh *mesh, int frame, Evas_3D_Vertex_Attrib attrib, Evas_3D_Vertex_Buffer *buffer0, Evas_3D_Vertex_Buffer *buffer1, Evas_Real *weight);
|
|
|
|
void evas_3d_mesh_file_md2_set(Evas_3D_Mesh *mesh, const char *file);
|
|
|
|
/* Texture functions. */
|
|
void evas_3d_texture_material_add(Evas_3D_Texture *texture, Evas_3D_Material *material);
|
|
void evas_3d_texture_material_del(Evas_3D_Texture *texture, Evas_3D_Material *material);
|
|
|
|
/* Material functions. */
|
|
void evas_3d_material_mesh_add(Evas_3D_Material *material, Evas_3D_Mesh *mesh);
|
|
void evas_3d_material_mesh_del(Evas_3D_Material *material, Evas_3D_Mesh *mesh);
|
|
|
|
/* Scene functions. */
|
|
void evas_3d_scene_data_init(Evas_3D_Scene_Data *data);
|
|
void evas_3d_scene_data_fini(Evas_3D_Scene_Data *data);
|