rasterizer_iphone.h 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895
  1. /*************************************************************************/
  2. /* rasterizer_iphone.h */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* http://www.godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2015 Juan Linietsky, Ariel Manzur. */
  9. /* */
  10. /* Permission is hereby granted, free of charge, to any person obtaining */
  11. /* a copy of this software and associated documentation files (the */
  12. /* "Software"), to deal in the Software without restriction, including */
  13. /* without limitation the rights to use, copy, modify, merge, publish, */
  14. /* distribute, sublicense, and/or sell copies of the Software, and to */
  15. /* permit persons to whom the Software is furnished to do so, subject to */
  16. /* the following conditions: */
  17. /* */
  18. /* The above copyright notice and this permission notice shall be */
  19. /* included in all copies or substantial portions of the Software. */
  20. /* */
  21. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  22. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  23. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  24. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  25. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  26. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  27. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  28. /*************************************************************************/
  29. #ifdef IPHONE_ENABLED
  30. #ifndef RASTERIZER_IPHONE_H
  31. #define RASTERIZER_IPHONE_H
  32. #include "servers/visual/rasterizer.h"
  33. #include "image.h"
  34. #include "rid.h"
  35. #include "servers/visual_server.h"
  36. #include "list.h"
  37. #include "map.h"
  38. #include "camera_matrix.h"
  39. #include "sort.h"
  40. #include <ES1/gl.h>
  41. /**
  42. @author Juan Linietsky <reduzio@gmail.com>
  43. */
  44. class RasterizerIPhone : public Rasterizer {
  45. enum {
  46. SKINNED_BUFFER_SIZE = 1024 * 128, // 10k vertices
  47. MAX_LIGHTS = 8,
  48. };
  49. uint8_t skinned_buffer[SKINNED_BUFFER_SIZE];
  50. struct Texture {
  51. uint32_t flags;
  52. int width,height;
  53. Image::Format format;
  54. GLenum target;
  55. GLenum gl_format_cache;
  56. int gl_components_cache;
  57. bool has_alpha;
  58. bool format_has_alpha;
  59. bool active;
  60. GLuint tex_id;
  61. bool mipmap_dirty;
  62. Texture() {
  63. flags=width=height=0;
  64. tex_id=0;
  65. format=Image::FORMAT_GRAYSCALE;
  66. gl_components_cache=0;
  67. format_has_alpha=false;
  68. has_alpha=false;
  69. active=false;
  70. mipmap_dirty=true;
  71. }
  72. ~Texture() {
  73. if (tex_id!=0) {
  74. glDeleteTextures(1,&tex_id);
  75. }
  76. }
  77. };
  78. mutable RID_Owner<Texture> texture_owner;
  79. struct Material {
  80. bool flags[VS::MATERIAL_FLAG_MAX];
  81. Variant parameters[VisualServer::FIXED_MATERIAL_PARAM_MAX];
  82. RID textures[VisualServer::FIXED_MATERIAL_PARAM_MAX];
  83. Transform uv_transform;
  84. VS::FixedMaterialTexCoordMode texcoord_mode[VisualServer::FIXED_MATERIAL_PARAM_MAX];
  85. VS::MaterialBlendMode detail_blend_mode;
  86. VS::FixedMaterialTexGenMode texgen_mode;
  87. Material() {
  88. flags[VS::MATERIAL_FLAG_VISIBLE]=true;
  89. flags[VS::MATERIAL_FLAG_DOUBLE_SIDED]=false;
  90. flags[VS::MATERIAL_FLAG_INVERT_FACES]=false;
  91. flags[VS::MATERIAL_FLAG_UNSHADED]=false;
  92. flags[VS::MATERIAL_FLAG_WIREFRAME]=false;
  93. parameters[VS::FIXED_MATERIAL_PARAM_DIFFUSE] = Color(0.8, 0.8, 0.8);
  94. parameters[VS::FIXED_MATERIAL_PARAM_SPECULAR_EXP] = 12;
  95. for (int i=0; i<VisualServer::FIXED_MATERIAL_PARAM_MAX; i++) {
  96. texcoord_mode[i] = VS::FIXED_MATERIAL_TEXCOORD_UV;
  97. };
  98. detail_blend_mode = VS::MATERIAL_BLEND_MODE_MIX;
  99. texgen_mode = VS::FIXED_MATERIAL_TEXGEN_SPHERE;
  100. }
  101. };
  102. mutable RID_Owner<Material> material_owner;
  103. struct Geometry {
  104. enum Type {
  105. GEOMETRY_INVALID,
  106. GEOMETRY_SURFACE,
  107. GEOMETRY_POLY,
  108. GEOMETRY_PARTICLES,
  109. GEOMETRY_BEAM,
  110. GEOMETRY_DETAILER,
  111. };
  112. Type type;
  113. RID material;
  114. bool has_alpha;
  115. bool material_owned;
  116. Vector3 scale;
  117. Vector3 uv_scale;
  118. Geometry() : scale(1, 1, 1) { has_alpha=false; material_owned = false; }
  119. virtual ~Geometry() {};
  120. };
  121. struct GeometryOwner {
  122. virtual ~GeometryOwner() {}
  123. };
  124. struct Surface : public Geometry {
  125. struct ArrayData {
  126. uint32_t ofs,size;
  127. bool configured;
  128. int components;
  129. ArrayData() { ofs=0; size=0; configured=false; }
  130. };
  131. ArrayData array[VS::ARRAY_MAX];
  132. // support for vertex array objects
  133. GLuint array_object_id;
  134. // support for vertex buffer object
  135. GLuint vertex_id; // 0 means, unconfigured
  136. GLuint index_id; // 0 means, unconfigured
  137. // no support for the above, array in localmem.
  138. uint8_t *array_local;
  139. uint8_t *index_array_local;
  140. AABB aabb;
  141. int array_len;
  142. int index_array_len;
  143. VS::PrimitiveType primitive;
  144. uint32_t format;
  145. int stride;
  146. bool active;
  147. Point2 uv_min;
  148. Point2 uv_max;
  149. bool has_alpha_cache;
  150. Surface() {
  151. array_len=0;
  152. type=GEOMETRY_SURFACE;
  153. primitive=VS::PRIMITIVE_POINTS;
  154. index_array_len=VS::NO_INDEX_ARRAY;
  155. format=0;
  156. stride=0;
  157. array_local = index_array_local = 0;
  158. vertex_id = index_id = 0;
  159. active=false;
  160. }
  161. ~Surface() {
  162. }
  163. };
  164. struct Mesh {
  165. bool active;
  166. Vector<Surface*> surfaces;
  167. mutable uint64_t last_pass;
  168. Mesh() {
  169. last_pass=0;
  170. active=false;
  171. }
  172. };
  173. mutable RID_Owner<Mesh> mesh_owner;
  174. struct Poly : public Geometry {
  175. struct Primitive {
  176. Vector<Vector3> vertices;
  177. Vector<Vector3> normals;
  178. Vector<Vector3> uvs;
  179. Vector<Color> colors;
  180. };
  181. AABB aabb;
  182. List<Primitive> primitives;
  183. Poly() {
  184. type=GEOMETRY_POLY;
  185. }
  186. };
  187. mutable RID_Owner<Poly> poly_owner;
  188. struct Skeleton {
  189. Vector<Transform> bones;
  190. };
  191. mutable RID_Owner<Skeleton> skeleton_owner;
  192. struct Light {
  193. VS::LightType type;
  194. float vars[VS::LIGHT_PARAM_MAX];
  195. Color colors[3];
  196. bool shadow_enabled;
  197. RID projector;
  198. bool volumetric_enabled;
  199. Color volumetric_color;
  200. Light() {
  201. vars[VS::LIGHT_PARAM_SPOT_ATTENUATION]=1;
  202. vars[VS::LIGHT_PARAM_SPOT_ANGLE]=45;
  203. vars[VS::LIGHT_PARAM_ATTENUATION]=1.0;
  204. vars[VS::LIGHT_PARAM_ENERGY]=1.0;
  205. vars[VS::LIGHT_PARAM_RADIUS]=1.0;
  206. colors[VS::LIGHT_COLOR_AMBIENT]=Color(0,0,0);
  207. colors[VS::LIGHT_COLOR_DIFFUSE]=Color(1,1,1);
  208. colors[VS::LIGHT_COLOR_SPECULAR]=Color(1,1,1);
  209. shadow_enabled=false;
  210. volumetric_enabled=false;
  211. }
  212. };
  213. struct ShadowBuffer;
  214. struct LightInstance {
  215. struct SplitInfo {
  216. CameraMatrix camera;
  217. Transform transform;
  218. float near;
  219. float far;
  220. };
  221. RID light;
  222. Light *base;
  223. uint64_t last_pass;
  224. Transform transform;
  225. CameraMatrix projection;
  226. Vector<SplitInfo> splits;
  227. Vector3 light_vector;
  228. Vector3 spot_vector;
  229. float linear_att;
  230. uint64_t hash_aux;
  231. };
  232. mutable RID_Owner<Light> light_owner;
  233. mutable RID_Owner<LightInstance> light_instance_owner;
  234. LightInstance *light_instances[MAX_LIGHTS];
  235. int light_instance_count;
  236. struct RenderList {
  237. enum {
  238. MAX_ELEMENTS=4096,
  239. MAX_LIGHTS=4
  240. };
  241. struct Element {
  242. float depth;
  243. const Skeleton *skeleton;
  244. Transform transform;
  245. LightInstance* lights[MAX_LIGHTS];
  246. int light_count;
  247. const Geometry *geometry;
  248. const Material *material;
  249. uint64_t light_hash;
  250. GeometryOwner *owner;
  251. const ParamOverrideMap* material_overrides;
  252. };
  253. Element _elements[MAX_ELEMENTS];
  254. Element *elements[MAX_ELEMENTS];
  255. int element_count;
  256. void clear() {
  257. element_count=0;
  258. }
  259. struct SortZ {
  260. _FORCE_INLINE_ bool operator()(const Element* A, const Element* B ) const {
  261. return A->depth > B->depth;
  262. }
  263. };
  264. void sort_z() {
  265. SortArray<Element*,SortZ> sorter;
  266. sorter.sort(elements,element_count);
  267. }
  268. struct SortSkel {
  269. _FORCE_INLINE_ bool operator()(const Element* A, const Element* B ) const {
  270. if (A->geometry < B->geometry)
  271. return true;
  272. else if (A->geometry > B->geometry)
  273. return false;
  274. else return (!A->skeleton && B->skeleton);
  275. }
  276. };
  277. void sort_skel() {
  278. SortArray<Element*,SortSkel> sorter;
  279. sorter.sort(elements,element_count);
  280. }
  281. struct SortMat {
  282. _FORCE_INLINE_ bool operator()(const Element* A, const Element* B ) const {
  283. if (A->geometry == B->geometry) {
  284. if (A->material == B->material) {
  285. return (A->material_overrides < B->material_overrides);
  286. } else {
  287. return (A->material < B->material);
  288. }
  289. } else {
  290. return (A->geometry < B->geometry);
  291. }
  292. }
  293. };
  294. void sort_mat() {
  295. SortArray<Element*,SortMat> sorter;
  296. sorter.sort(elements,element_count);
  297. }
  298. struct SortMatLight {
  299. _FORCE_INLINE_ bool operator()(const Element* A, const Element* B ) const {
  300. if (A->geometry == B->geometry) {
  301. if (A->material == B->material) {
  302. if (A->light_hash == B->light_hash)
  303. return (A->material_overrides < B->material_overrides);
  304. else
  305. return A->light_hash<B->light_hash;
  306. } else {
  307. return (A->material < B->material);
  308. }
  309. } else {
  310. return (A->geometry < B->geometry);
  311. }
  312. }
  313. };
  314. void sort_mat_light() {
  315. SortArray<Element*,SortMatLight> sorter;
  316. sorter.sort(elements,element_count);
  317. }
  318. struct LISort {
  319. _FORCE_INLINE_ bool operator ()(const LightInstance *A, const LightInstance *B) const {
  320. return (A->hash_aux < B->hash_aux);
  321. }
  322. };
  323. _FORCE_INLINE_ void add_element( const Geometry *p_geometry, const Material* p_material,const Transform& p_transform, LightInstance **p_light_instances, int p_light_count, const ParamOverrideMap* p_material_overrides, const Skeleton *p_skeleton, float p_depth, GeometryOwner *p_owner=NULL) {
  324. ERR_FAIL_COND( element_count >= MAX_ELEMENTS );
  325. Element *e = elements[element_count++];
  326. e->geometry=p_geometry;
  327. e->material=p_material;
  328. e->transform=p_transform;
  329. e->skeleton=p_skeleton;
  330. e->light_hash=0;
  331. e->light_count=p_light_count;
  332. e->owner=p_owner;
  333. e->material_overrides=p_material_overrides;
  334. if (e->light_count>0) {
  335. SortArray<LightInstance*,LISort> light_sort;
  336. light_sort.sort(p_light_instances,p_light_count);
  337. //@TODO OPTIOMIZE
  338. for (int i=0;i<p_light_count;i++) {
  339. e->lights[i]=p_light_instances[i];
  340. if (i==0)
  341. e->light_hash=hash_djb2_one_64( make_uint64_t(e->lights[i]) );
  342. else
  343. e->light_hash=hash_djb2_one_64( make_uint64_t(e->lights[i]),e->light_hash);
  344. }
  345. }
  346. }
  347. RenderList() {
  348. for (int i=0;i<MAX_ELEMENTS;i++)
  349. elements[i]=&_elements[i]; // assign elements
  350. }
  351. };
  352. RenderList opaque_render_list;
  353. RenderList alpha_render_list;
  354. RID default_material;
  355. struct FX {
  356. bool bgcolor_active;
  357. Color bgcolor;
  358. bool skybox_active;
  359. RID skybox_cubemap;
  360. bool antialias_active;
  361. float antialias_tolerance;
  362. bool glow_active;
  363. int glow_passes;
  364. float glow_attenuation;
  365. float glow_bloom;
  366. bool ssao_active;
  367. float ssao_attenuation;
  368. float ssao_radius;
  369. float ssao_max_distance;
  370. float ssao_range_max;
  371. float ssao_range_min;
  372. bool ssao_only;
  373. bool fog_active;
  374. float fog_distance;
  375. float fog_attenuation;
  376. Color fog_color_near;
  377. Color fog_color_far;
  378. bool fog_bg;
  379. bool toon_active;
  380. float toon_treshold;
  381. float toon_soft;
  382. bool edge_active;
  383. Color edge_color;
  384. float edge_size;
  385. FX();
  386. };
  387. mutable RID_Owner<FX> fx_owner;
  388. FX *scene_fx;
  389. CameraMatrix camera_projection;
  390. Transform camera_transform;
  391. Transform camera_transform_inverse;
  392. float camera_z_near;
  393. float camera_z_far;
  394. Size2 camera_vp_size;
  395. Plane camera_plane;
  396. void _add_geometry( const Geometry* p_geometry, const Transform& p_world, uint32_t p_vertex_format, const RID* p_light_instances, int p_light_count, const ParamOverrideMap* p_material_overrides,const Skeleton* p_skeleton,GeometryOwner *p_owner);
  397. void _render_list_forward(RenderList *p_render_list);
  398. void _setup_light(LightInstance* p_instance, int p_idx);
  399. void _setup_lights(LightInstance **p_lights,int p_light_count);
  400. void _setup_material(const Geometry *p_geometry,const Material *p_material);
  401. void _setup_geometry(const Geometry *p_geometry, const Material* p_material);
  402. void _render(const Geometry *p_geometry,const Material *p_material, const Skeleton* p_skeleton);
  403. /*********/
  404. /* FRAME */
  405. /*********/
  406. Size2 window_size;
  407. VS::ViewportRect viewport;
  408. Transform canvas_transform;
  409. double last_time;
  410. double time_delta;
  411. uint64_t frame;
  412. public:
  413. /* TEXTURE API */
  414. virtual RID texture_create();
  415. virtual void texture_allocate(RID p_texture,int p_width, int p_height,Image::Format p_format,uint32_t p_flags=VS::TEXTURE_FLAGS_DEFAULT);
  416. virtual void texture_blit_rect(RID p_texture,int p_x,int p_y, const Image& p_image,VS::CubeMapSide p_cube_side=VS::CUBEMAP_LEFT);
  417. virtual Image texture_get_rect(RID p_texture,int p_x,int p_y,int p_width, int p_height,VS::CubeMapSide p_cube_side=VS::CUBEMAP_LEFT) const;
  418. virtual void texture_set_flags(RID p_texture,uint32_t p_flags);
  419. virtual uint32_t texture_get_flags(RID p_texture) const;
  420. virtual Image::Format texture_get_format(RID p_texture) const;
  421. virtual uint32_t texture_get_width(RID p_texture) const;
  422. virtual uint32_t texture_get_height(RID p_texture) const;
  423. virtual bool texture_has_alpha(RID p_texture) const;
  424. /* SHADER API */
  425. virtual RID shader_create();
  426. virtual void shader_node_add(RID p_shader,VS::ShaderNodeType p_type,int p_id);
  427. virtual void shader_node_remove(RID p_shader,int p_id);
  428. virtual void shader_node_change_type(RID p_shader, int p_id, VS::ShaderNodeType p_type);
  429. virtual void shader_node_set_param(RID p_shader, int p_id, const Variant& p_value);
  430. virtual void shader_get_node_list(RID p_shader,List<int> *p_node_list) const;
  431. virtual VS::ShaderNodeType shader_node_get_type(RID p_shader,int p_id) const;
  432. virtual Variant shader_node_get_param(RID p_shader,int p_id) const;
  433. virtual void shader_connect(RID p_shader,int p_src_id,int p_src_slot, int p_dst_id,int p_dst_slot);
  434. virtual bool shader_is_connected(RID p_shader,int p_src_id,int p_src_slot, int p_dst_id,int p_dst_slot) const;
  435. virtual void shader_disconnect(RID p_shader,int p_src_id,int p_src_slot, int p_dst_id,int p_dst_slot);
  436. virtual void shader_get_connections(RID p_shader,List<VS::ShaderConnection> *p_connections) const;
  437. virtual void shader_clear(RID p_shader);
  438. /* COMMON MATERIAL API */
  439. virtual void material_set_param(RID p_material, const StringName& p_param, const Variant& p_value);
  440. virtual Variant material_get_param(RID p_material, const StringName& p_param) const;
  441. virtual void material_get_param_list(RID p_material, List<String> *p_param_list) const;
  442. virtual void material_set_flag(RID p_material, VS::MaterialFlag p_flag,bool p_enabled);
  443. virtual bool material_get_flag(RID p_material,VS::MaterialFlag p_flag) const;
  444. virtual void material_set_blend_mode(RID p_material,VS::MaterialBlendMode p_mode);
  445. virtual VS::MaterialBlendMode material_get_blend_mode(RID p_material) const;
  446. virtual void material_set_line_width(RID p_material,float p_line_width);
  447. virtual float material_get_line_width(RID p_material) const;
  448. /* FIXED MATERIAL */
  449. virtual RID material_create();
  450. virtual void fixed_material_set_parameter(RID p_material, VS::FixedMaterialParam p_parameter, const Variant& p_value);
  451. virtual Variant fixed_material_get_parameter(RID p_material,VS::FixedMaterialParam p_parameter) const;
  452. virtual void fixed_material_set_texture(RID p_material,VS::FixedMaterialParam p_parameter, RID p_texture);
  453. virtual RID fixed_material_get_texture(RID p_material,VS::FixedMaterialParam p_parameter) const;
  454. virtual void fixed_material_set_detail_blend_mode(RID p_material,VS::MaterialBlendMode p_mode);
  455. virtual VS::MaterialBlendMode fixed_material_get_detail_blend_mode(RID p_material) const;
  456. virtual void fixed_material_set_texgen_mode(RID p_material,VS::FixedMaterialTexGenMode p_mode);
  457. virtual VS::FixedMaterialTexGenMode fixed_material_get_texgen_mode(RID p_material) const;
  458. virtual void fixed_material_set_texcoord_mode(RID p_material,VS::FixedMaterialParam p_parameter, VS::FixedMaterialTexCoordMode p_mode);
  459. virtual VS::FixedMaterialTexCoordMode fixed_material_get_texcoord_mode(RID p_material,VS::FixedMaterialParam p_parameter) const;
  460. virtual void fixed_material_set_uv_transform(RID p_material,const Transform& p_transform);
  461. virtual Transform fixed_material_get_uv_transform(RID p_material) const;
  462. /* SHADER MATERIAL */
  463. virtual RID shader_material_create() const;
  464. virtual void shader_material_set_vertex_shader(RID p_material,RID p_shader,bool p_owned=false);
  465. virtual RID shader_material_get_vertex_shader(RID p_material) const;
  466. virtual void shader_material_set_fragment_shader(RID p_material,RID p_shader,bool p_owned=false);
  467. virtual RID shader_material_get_fragment_shader(RID p_material) const;
  468. /* MESH API */
  469. virtual RID mesh_create();
  470. virtual void mesh_add_surface(RID p_mesh,VS::PrimitiveType p_primitive,uint32_t p_format,int p_array_len,int p_index_array_len=VS::NO_INDEX_ARRAY);
  471. virtual Error mesh_surface_set_array(RID p_mesh, int p_surface,VS::ArrayType p_type,const Variant& p_array) ;
  472. virtual Variant mesh_surface_get_array(RID p_mesh, int p_surface,VS::ArrayType p_type) const;
  473. virtual void mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material,bool p_owned=false);
  474. virtual RID mesh_surface_get_material(RID p_mesh, int p_surface) const;
  475. virtual int mesh_surface_get_array_len(RID p_mesh, int p_surface) const;
  476. virtual int mesh_surface_get_array_index_len(RID p_mesh, int p_surface) const;
  477. virtual uint32_t mesh_surface_get_format(RID p_mesh, int p_surface) const;
  478. virtual VS::PrimitiveType mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const;
  479. virtual void mesh_erase_surface(RID p_mesh,int p_index);
  480. virtual int mesh_get_surface_count(RID p_mesh) const;
  481. virtual AABB mesh_get_aabb(RID p_mesh) const;
  482. /* MULTIMESH API */
  483. virtual RID multimesh_create();
  484. virtual void multimesh_set_instance_count(RID p_multimesh,int p_count);
  485. virtual int multimesh_get_instance_count(RID p_multimesh) const;
  486. virtual void multimesh_set_mesh(RID p_multimesh,RID p_mesh);
  487. virtual void multimesh_set_aabb(RID p_multimesh,const AABB& p_aabb);
  488. virtual void multimesh_instance_set_transform(RID p_multimesh,int p_index,const Transform& p_transform);
  489. virtual void multimesh_instance_set_color(RID p_multimesh,int p_index,const Color& p_color);
  490. virtual RID multimesh_get_mesh(RID p_multimesh) const;
  491. virtual AABB multimesh_get_aabb(RID p_multimesh) const;;
  492. virtual Transform multimesh_instance_get_transform(RID p_multimesh,int p_index) const;
  493. virtual Color multimesh_instance_get_color(RID p_multimesh,int p_index) const;
  494. /* POLY API */
  495. virtual RID poly_create();
  496. virtual void poly_set_material(RID p_poly, RID p_material,bool p_owned=false);
  497. virtual void poly_add_primitive(RID p_poly, const Vector<Vector3>& p_points,const Vector<Vector3>& p_normals,const Vector<Color>& p_colors,const Vector<Vector3>& p_uvs);
  498. virtual void poly_clear(RID p_poly);
  499. virtual AABB poly_get_aabb(RID p_poly) const;
  500. /* PARTICLES API */
  501. virtual RID particles_create();
  502. virtual void particles_set_amount(RID p_particles, int p_amount);
  503. virtual int particles_get_amount(RID p_particles) const;
  504. virtual void particles_set_emitting(RID p_particles, bool p_emitting);
  505. virtual bool particles_is_emitting(RID p_particles) const;
  506. virtual void particles_set_visibility_aabb(RID p_particles, const AABB& p_visibility);
  507. virtual AABB particles_get_visibility_aabb(RID p_particles) const;
  508. virtual void particles_set_emission_half_extents(RID p_particles, const Vector3& p_half_extents);
  509. virtual Vector3 particles_get_emission_half_extents(RID p_particles) const;
  510. virtual void particles_set_gravity_normal(RID p_particles, const Vector3& p_normal);
  511. virtual Vector3 particles_get_gravity_normal(RID p_particles) const;
  512. virtual void particles_set_variable(RID p_particles, VS::ParticleVariable p_variable,float p_value);
  513. virtual float particles_get_variable(RID p_particles, VS::ParticleVariable p_variable) const;
  514. virtual void particles_set_randomness(RID p_particles, VS::ParticleVariable p_variable,float p_randomness);
  515. virtual float particles_get_randomness(RID p_particles, VS::ParticleVariable p_variable) const;
  516. virtual void particles_set_color_phase_pos(RID p_particles, int p_phase, float p_pos);
  517. virtual float particles_get_color_phase_pos(RID p_particles, int p_phase) const;
  518. virtual void particles_set_color_phases(RID p_particles, int p_phases);
  519. virtual int particles_get_color_phases(RID p_particles) const;
  520. virtual void particles_set_color_phase_color(RID p_particles, int p_phase, const Color& p_color);
  521. virtual Color particles_get_color_phase_color(RID p_particles, int p_phase) const;
  522. virtual void particles_set_attractors(RID p_particles, int p_attractors);
  523. virtual int particles_get_attractors(RID p_particles) const;
  524. virtual void particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3& p_pos);
  525. virtual Vector3 particles_get_attractor_pos(RID p_particles,int p_attractor) const;
  526. virtual void particles_set_attractor_strength(RID p_particles, int p_attractor, float p_force);
  527. virtual float particles_get_attractor_strength(RID p_particles,int p_attractor) const;
  528. virtual void particles_set_material(RID p_particles, RID p_material,bool p_owned=false);
  529. virtual RID particles_get_material(RID p_particles) const;
  530. virtual AABB particles_get_aabb(RID p_particles) const;
  531. /* BEAM API */
  532. virtual RID beam_create();
  533. virtual void beam_set_point_count(RID p_beam, int p_count);
  534. virtual int beam_get_point_count(RID p_beam) const;
  535. virtual void beam_clear(RID p_beam);
  536. virtual void beam_set_point(RID p_beam,int p_point,Vector3& p_pos);
  537. virtual Vector3 beam_get_point(RID p_beam,int p_point) const;
  538. virtual void beam_set_primitive(RID p_beam,VS::BeamPrimitive p_primitive);
  539. virtual VS::BeamPrimitive beam_get_primitive(RID p_beam) const;
  540. virtual void beam_set_material(RID p_beam, RID p_material);
  541. virtual RID beam_get_material(RID p_beam) const;
  542. virtual AABB beam_get_aabb(RID p_particles) const;
  543. /* SKELETON API */
  544. virtual RID skeleton_create();
  545. virtual void skeleton_resize(RID p_skeleton,int p_bones);
  546. virtual int skeleton_get_bone_count(RID p_skeleton) const;
  547. virtual void skeleton_bone_set_transform(RID p_skeleton,int p_bone, const Transform& p_transform);
  548. virtual Transform skeleton_bone_get_transform(RID p_skeleton,int p_bone);
  549. /* LIGHT API */
  550. virtual RID light_create(VS::LightType p_type);
  551. virtual VS::LightType light_get_type(RID p_light) const;
  552. virtual void light_set_color(RID p_light,VS::LightColor p_type, const Color& p_color);
  553. virtual Color light_get_color(RID p_light,VS::LightColor p_type) const;
  554. virtual void light_set_shadow(RID p_light,bool p_enabled);
  555. virtual bool light_has_shadow(RID p_light) const;
  556. virtual void light_set_volumetric(RID p_light,bool p_enabled);
  557. virtual bool light_is_volumetric(RID p_light) const;
  558. virtual void light_set_projector(RID p_light,RID p_texture);
  559. virtual RID light_get_projector(RID p_light) const;
  560. virtual void light_set_var(RID p_light, VS::LightParam p_var, float p_value);
  561. virtual float light_get_var(RID p_light, VS::LightParam p_var) const;
  562. virtual AABB light_get_aabb(RID p_poly) const;
  563. virtual RID light_instance_create(RID p_light);
  564. virtual void light_instance_set_transform(RID p_light_instance,const Transform& p_transform);
  565. virtual void light_instance_set_active_hint(RID p_light_instance);
  566. virtual bool light_instance_has_shadow(RID p_light_instance) const;
  567. virtual bool light_instance_assign_shadow(RID p_light_instance);
  568. virtual ShadowType light_instance_get_shadow_type(RID p_light_instance) const;
  569. virtual int light_instance_get_shadow_passes(RID p_light_instance) const;
  570. virtual void light_instance_set_pssm_split_info(RID p_light_instance, int p_split, float p_near,float p_far, const CameraMatrix& p_camera, const Transform& p_transform);
  571. /* PARTICLES INSTANCE */
  572. virtual RID particles_instance_create(RID p_particles);
  573. virtual void particles_instance_set_transform(RID p_particles_instance,const Transform& p_transform);
  574. /* RENDER API */
  575. /* all calls (inside begin/end shadow) are always warranted to be in the following order: */
  576. virtual void begin_frame();
  577. virtual void set_viewport(const VS::ViewportRect& p_viewport);
  578. virtual void begin_scene(RID p_fx=RID(),VS::ScenarioDebugMode p_debug=VS::SCENARIO_DEBUG_DISABLED);
  579. virtual void begin_shadow_map( RID p_light_instance, int p_shadow_pass );
  580. virtual void set_camera(const Transform& p_world,const CameraMatrix& p_projection);
  581. virtual void add_light( RID p_light_instance ); ///< all "add_light" calls happen before add_geometry calls
  582. typedef Map<StringName,Variant> ParamOverrideMap;
  583. virtual void add_mesh( RID p_mesh, const Transform* p_world, const RID* p_light_instances, int p_light_count, const ParamOverrideMap* p_material_overrides = NULL, RID p_skeleton=RID());
  584. virtual void add_multimesh( RID p_multimesh, const Transform* p_world, const RID* p_light_instances, int p_light_count, const ParamOverrideMap* p_material_overrides = NULL);
  585. virtual void add_poly( RID p_poly, const Transform* p_world, const RID* p_light_instances, int p_light_count, const ParamOverrideMap* p_material_overrides = NULL);
  586. virtual void add_beam( RID p_beam, const Transform* p_world, const RID* p_light_instances, int p_light_count, const ParamOverrideMap* p_material_overrides = NULL);
  587. virtual void add_particles( RID p_particle_instance, const RID* p_light_instances, int p_light_count, const ParamOverrideMap* p_material_overrides = NULL);
  588. virtual void end_scene();
  589. virtual void end_shadow_map();
  590. virtual void end_frame();
  591. /* CANVAS API */
  592. virtual void canvas_begin();
  593. virtual void canvas_set_transparency(float p_transparency);
  594. virtual void canvas_set_rect(const Rect2& p_rect, bool p_clip);;
  595. virtual void canvas_draw_line(const Point2& p_from, const Point2& p_to,const Color& p_color,float p_width);
  596. virtual void canvas_draw_rect(const Rect2& p_rect, bool p_region, const Rect2& p_source,bool p_tile,RID p_texture,const Color& p_modulate);
  597. virtual void canvas_draw_style_box(const Rect2& p_rect, RID p_texture,const float *p_margins, bool p_draw_center=true);
  598. virtual void canvas_draw_primitive(const Vector<Point2>& p_points, const Vector<Color>& p_colors,const Vector<Point2>& p_uvs, RID p_texture);
  599. /* FX */
  600. virtual RID fx_create();
  601. virtual void fx_get_effects(RID p_fx,List<String> *p_effects) const;
  602. virtual void fx_set_active(RID p_fx,const String& p_effect, bool p_active);
  603. virtual bool fx_is_active(RID p_fx,const String& p_effect) const;
  604. virtual void fx_get_effect_params(RID p_fx,const String& p_effect,List<PropertyInfo> *p_params) const;
  605. virtual Variant fx_get_effect_param(RID p_fx,const String& p_effect,const String& p_param) const;
  606. virtual void fx_set_effect_param(RID p_fx,const String& p_effect, const String& p_param, const Variant& p_pvalue);
  607. /*MISC*/
  608. virtual bool is_texture(const RID& p_rid) const;
  609. virtual bool is_material(const RID& p_rid) const;
  610. virtual bool is_mesh(const RID& p_rid) const;
  611. virtual bool is_multimesh(const RID& p_rid) const;
  612. virtual bool is_poly(const RID& p_rid) const;
  613. virtual bool is_particles(const RID &p_beam) const;
  614. virtual bool is_beam(const RID &p_beam) const;
  615. virtual bool is_light(const RID& p_rid) const;
  616. virtual bool is_light_instance(const RID& p_rid) const;
  617. virtual bool is_particles_instance(const RID& p_rid) const;
  618. virtual bool is_skeleton(const RID& p_rid) const;
  619. virtual bool is_fx(const RID& p_rid) const;
  620. virtual bool is_shader(const RID& p_rid) const;
  621. virtual void free(const RID& p_rid) const;
  622. virtual void init();
  623. virtual void finish();
  624. virtual int get_render_info(VS::RenderInfo p_info);
  625. RasterizerIPhone();
  626. virtual ~RasterizerIPhone();
  627. };
  628. #endif
  629. #endif