2014-02-10 02:10:30 +01:00
/*************************************************************************/
2020-03-28 13:19:05 +01:00
/* rendering_server.cpp */
2014-02-10 02:10:30 +01:00
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
2017-08-27 14:16:55 +02:00
/* https://godotengine.org */
2014-02-10 02:10:30 +01:00
/*************************************************************************/
2020-01-01 11:16:22 +01:00
/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
2014-02-10 02:10:30 +01:00
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
2018-01-05 00:50:27 +01:00
2020-03-27 19:21:27 +01:00
# include "rendering_server.h"
2017-08-27 21:07:15 +02:00
2018-09-11 18:13:45 +02:00
# include "core/method_bind_ext.gen.inc"
# include "core/project_settings.h"
2014-02-10 02:10:30 +01:00
2020-04-02 01:20:12 +02:00
RenderingServer * RenderingServer : : singleton = nullptr ;
RenderingServer * ( * RenderingServer : : create_func ) ( ) = nullptr ;
2014-02-10 02:10:30 +01:00
2020-03-27 19:21:27 +01:00
RenderingServer * RenderingServer : : get_singleton ( ) {
2014-02-10 02:10:30 +01:00
return singleton ;
}
2020-03-27 19:21:27 +01:00
RenderingServer * RenderingServer : : create ( ) {
2014-02-10 02:10:30 +01:00
2020-04-02 01:20:12 +02:00
ERR_FAIL_COND_V ( singleton , nullptr ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
if ( create_func )
return create_func ( ) ;
2016-03-09 00:00:52 +01:00
2020-04-02 01:20:12 +02:00
return nullptr ;
2014-02-10 02:10:30 +01:00
}
2020-03-27 19:21:27 +01:00
Array RenderingServer : : _texture_debug_usage_bind ( ) {
2017-10-20 00:24:49 +02:00
List < TextureInfo > list ;
texture_debug_usage ( & list ) ;
Array arr ;
for ( const List < TextureInfo > : : Element * E = list . front ( ) ; E ; E = E - > next ( ) ) {
Dictionary dict ;
dict [ " texture " ] = E - > get ( ) . texture ;
2018-06-26 13:59:26 +02:00
dict [ " width " ] = E - > get ( ) . width ;
dict [ " height " ] = E - > get ( ) . height ;
dict [ " depth " ] = E - > get ( ) . depth ;
2017-10-20 00:24:49 +02:00
dict [ " format " ] = E - > get ( ) . format ;
dict [ " bytes " ] = E - > get ( ) . bytes ;
dict [ " path " ] = E - > get ( ) . path ;
arr . push_back ( dict ) ;
}
return arr ;
}
2020-03-27 19:21:27 +01:00
Array RenderingServer : : _shader_get_param_list_bind ( RID p_shader ) const {
2017-10-20 00:24:49 +02:00
List < PropertyInfo > l ;
shader_get_param_list ( p_shader , & l ) ;
return convert_property_list ( & l ) ;
}
Added all missing VisualServer bindings
- Added bindings for multimesh, immediate, skeleton, light, reflection probe, gi probe, lightmap, particles, camera, environment, scenario, instance
- Removed draw and sync, were duplicates of force_* equivalents
- Bumped binders max arguments from 11 to 13
- Wrote some wrappers as not all methods were variant-friendly
2018-01-20 16:18:51 +01:00
static Array to_array ( const Vector < ObjectID > & ids ) {
Array a ;
a . resize ( ids . size ( ) ) ;
for ( int i = 0 ; i < ids . size ( ) ; + + i ) {
a [ i ] = ids [ i ] ;
}
return a ;
}
2020-03-27 19:21:27 +01:00
Array RenderingServer : : _instances_cull_aabb_bind ( const AABB & p_aabb , RID p_scenario ) const {
Added all missing VisualServer bindings
- Added bindings for multimesh, immediate, skeleton, light, reflection probe, gi probe, lightmap, particles, camera, environment, scenario, instance
- Removed draw and sync, were duplicates of force_* equivalents
- Bumped binders max arguments from 11 to 13
- Wrote some wrappers as not all methods were variant-friendly
2018-01-20 16:18:51 +01:00
Vector < ObjectID > ids = instances_cull_aabb ( p_aabb , p_scenario ) ;
return to_array ( ids ) ;
}
2020-03-27 19:21:27 +01:00
Array RenderingServer : : _instances_cull_ray_bind ( const Vector3 & p_from , const Vector3 & p_to , RID p_scenario ) const {
Added all missing VisualServer bindings
- Added bindings for multimesh, immediate, skeleton, light, reflection probe, gi probe, lightmap, particles, camera, environment, scenario, instance
- Removed draw and sync, were duplicates of force_* equivalents
- Bumped binders max arguments from 11 to 13
- Wrote some wrappers as not all methods were variant-friendly
2018-01-20 16:18:51 +01:00
Vector < ObjectID > ids = instances_cull_ray ( p_from , p_to , p_scenario ) ;
return to_array ( ids ) ;
}
2020-03-27 19:21:27 +01:00
Array RenderingServer : : _instances_cull_convex_bind ( const Array & p_convex , RID p_scenario ) const {
Added all missing VisualServer bindings
- Added bindings for multimesh, immediate, skeleton, light, reflection probe, gi probe, lightmap, particles, camera, environment, scenario, instance
- Removed draw and sync, were duplicates of force_* equivalents
- Bumped binders max arguments from 11 to 13
- Wrote some wrappers as not all methods were variant-friendly
2018-01-20 16:18:51 +01:00
Vector < Plane > planes ;
for ( int i = 0 ; i < p_convex . size ( ) ; + + i ) {
Variant v = p_convex [ i ] ;
ERR_FAIL_COND_V ( v . get_type ( ) ! = Variant : : PLANE , Array ( ) ) ;
planes . push_back ( v ) ;
}
Vector < ObjectID > ids = instances_cull_convex ( planes , p_scenario ) ;
return to_array ( ids ) ;
}
2020-03-27 19:21:27 +01:00
RID RenderingServer : : get_test_texture ( ) {
2014-02-10 02:10:30 +01:00
2016-10-03 21:33:42 +02:00
if ( test_texture . is_valid ( ) ) {
2014-02-10 02:10:30 +01:00
return test_texture ;
} ;
# define TEST_TEXTURE_SIZE 256
2020-02-17 22:06:54 +01:00
Vector < uint8_t > test_data ;
2017-03-05 16:44:50 +01:00
test_data . resize ( TEST_TEXTURE_SIZE * TEST_TEXTURE_SIZE * 3 ) ;
2014-02-10 02:10:30 +01:00
2016-10-03 21:33:42 +02:00
{
2020-02-17 22:06:54 +01:00
uint8_t * w = test_data . ptrw ( ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
for ( int x = 0 ; x < TEST_TEXTURE_SIZE ; x + + ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
for ( int y = 0 ; y < TEST_TEXTURE_SIZE ; y + + ) {
2014-02-10 02:10:30 +01:00
2016-10-03 21:33:42 +02:00
Color c ;
2017-03-05 16:44:50 +01:00
int r = 255 - ( x + y ) / 2 ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
if ( ( x % ( TEST_TEXTURE_SIZE / 8 ) ) < 2 | | ( y % ( TEST_TEXTURE_SIZE / 8 ) ) < 2 ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
c . r = y ;
c . g = r ;
c . b = x ;
2014-02-10 02:10:30 +01:00
2016-10-03 21:33:42 +02:00
} else {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
c . r = r ;
c . g = x ;
c . b = y ;
2016-10-03 21:33:42 +02:00
}
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
w [ ( y * TEST_TEXTURE_SIZE + x ) * 3 + 0 ] = uint8_t ( CLAMP ( c . r * 255 , 0 , 255 ) ) ;
w [ ( y * TEST_TEXTURE_SIZE + x ) * 3 + 1 ] = uint8_t ( CLAMP ( c . g * 255 , 0 , 255 ) ) ;
w [ ( y * TEST_TEXTURE_SIZE + x ) * 3 + 2 ] = uint8_t ( CLAMP ( c . b * 255 , 0 , 255 ) ) ;
2016-10-03 21:33:42 +02:00
}
2014-02-10 02:10:30 +01:00
}
}
2017-05-17 12:36:47 +02:00
Ref < Image > data = memnew ( Image ( TEST_TEXTURE_SIZE , TEST_TEXTURE_SIZE , false , Image : : FORMAT_RGB8 , test_data ) ) ;
2016-10-03 21:33:42 +02:00
2019-06-11 20:43:37 +02:00
test_texture = texture_2d_create ( data ) ;
2014-02-10 02:10:30 +01:00
return test_texture ;
2017-05-17 12:36:47 +02:00
}
2014-02-10 02:10:30 +01:00
2020-03-27 19:21:27 +01:00
void RenderingServer : : _free_internal_rids ( ) {
2015-04-21 00:38:02 +02:00
if ( test_texture . is_valid ( ) )
free ( test_texture ) ;
if ( white_texture . is_valid ( ) )
free ( white_texture ) ;
if ( test_material . is_valid ( ) )
free ( test_material ) ;
}
2020-03-27 19:21:27 +01:00
RID RenderingServer : : _make_test_cube ( ) {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
Vector < Vector3 > vertices ;
Vector < Vector3 > normals ;
Vector < float > tangents ;
Vector < Vector3 > uvs ;
2016-03-09 00:00:52 +01:00
2018-03-26 01:36:34 +02:00
# define ADD_VTX(m_idx) \
vertices . push_back ( face_points [ m_idx ] ) ; \
normals . push_back ( normal_points [ m_idx ] ) ; \
tangents . push_back ( normal_points [ m_idx ] [ 1 ] ) ; \
tangents . push_back ( normal_points [ m_idx ] [ 2 ] ) ; \
tangents . push_back ( normal_points [ m_idx ] [ 0 ] ) ; \
tangents . push_back ( 1.0 ) ; \
uvs . push_back ( Vector3 ( uv_points [ m_idx * 2 + 0 ] , uv_points [ m_idx * 2 + 1 ] , 0 ) ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < 6 ; i + + ) {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
Vector3 face_points [ 4 ] ;
Vector3 normal_points [ 4 ] ;
2017-03-05 16:44:50 +01:00
float uv_points [ 8 ] = { 0 , 0 , 0 , 1 , 1 , 1 , 1 , 0 } ;
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < 4 ; j + + ) {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
float v [ 3 ] ;
2017-03-05 16:44:50 +01:00
v [ 0 ] = 1.0 ;
v [ 1 ] = 1 - 2 * ( ( j > > 1 ) & 1 ) ;
v [ 2 ] = v [ 1 ] * ( 1 - 2 * ( j & 1 ) ) ;
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
for ( int k = 0 ; k < 3 ; k + + ) {
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
if ( i < 3 )
2018-04-21 16:35:23 +02:00
face_points [ j ] [ ( i + k ) % 3 ] = v [ k ] ;
2014-02-10 02:10:30 +01:00
else
2018-04-21 16:35:23 +02:00
face_points [ 3 - j ] [ ( i + k ) % 3 ] = - v [ k ] ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
normal_points [ j ] = Vector3 ( ) ;
normal_points [ j ] [ i % 3 ] = ( i > = 3 ? - 1 : 1 ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
//tri 1
2014-02-10 02:10:30 +01:00
ADD_VTX ( 0 ) ;
ADD_VTX ( 1 ) ;
ADD_VTX ( 2 ) ;
2017-03-05 16:44:50 +01:00
//tri 2
2014-02-10 02:10:30 +01:00
ADD_VTX ( 2 ) ;
ADD_VTX ( 3 ) ;
ADD_VTX ( 0 ) ;
}
RID test_cube = mesh_create ( ) ;
Array d ;
2020-03-27 19:21:27 +01:00
d . resize ( RS : : ARRAY_MAX ) ;
d [ RenderingServer : : ARRAY_NORMAL ] = normals ;
d [ RenderingServer : : ARRAY_TANGENT ] = tangents ;
d [ RenderingServer : : ARRAY_TEX_UV ] = uvs ;
d [ RenderingServer : : ARRAY_VERTEX ] = vertices ;
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
Vector < int > indices ;
2014-02-10 02:10:30 +01:00
indices . resize ( vertices . size ( ) ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < vertices . size ( ) ; i + + )
indices . set ( i , i ) ;
2020-03-27 19:21:27 +01:00
d [ RenderingServer : : ARRAY_INDEX ] = indices ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
mesh_add_surface_from_arrays ( test_cube , PRIMITIVE_TRIANGLES , d ) ;
2015-04-21 00:38:02 +02:00
2017-03-05 16:44:50 +01:00
/*
2015-04-21 00:38:02 +02:00
test_material = fixed_material_create ( ) ;
2014-02-10 02:10:30 +01:00
//material_set_flag(material, MATERIAL_FLAG_BILLBOARD_TOGGLE,true);
2015-04-21 00:38:02 +02:00
fixed_material_set_texture ( test_material , FIXED_MATERIAL_PARAM_DIFFUSE , get_test_texture ( ) ) ;
fixed_material_set_param ( test_material , FIXED_MATERIAL_PARAM_SPECULAR_EXP , 70 ) ;
fixed_material_set_param ( test_material , FIXED_MATERIAL_PARAM_EMISSION , Color ( 0.2 , 0.2 , 0.2 ) ) ;
2014-02-10 02:10:30 +01:00
2015-04-21 00:38:02 +02:00
fixed_material_set_param ( test_material , FIXED_MATERIAL_PARAM_DIFFUSE , Color ( 1 , 1 , 1 ) ) ;
fixed_material_set_param ( test_material , FIXED_MATERIAL_PARAM_SPECULAR , Color ( 1 , 1 , 1 ) ) ;
2016-10-03 21:33:42 +02:00
*/
2017-03-05 16:44:50 +01:00
mesh_surface_set_material ( test_cube , 0 , test_material ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
return test_cube ;
}
2020-03-27 19:21:27 +01:00
RID RenderingServer : : make_sphere_mesh ( int p_lats , int p_lons , float p_radius ) {
2016-03-09 00:00:52 +01:00
2020-02-17 22:06:54 +01:00
Vector < Vector3 > vertices ;
Vector < Vector3 > normals ;
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
for ( int i = 1 ; i < = p_lats ; i + + ) {
double lat0 = Math_PI * ( - 0.5 + ( double ) ( i - 1 ) / p_lats ) ;
double z0 = Math : : sin ( lat0 ) ;
double zr0 = Math : : cos ( lat0 ) ;
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
double lat1 = Math_PI * ( - 0.5 + ( double ) i / p_lats ) ;
2014-02-10 02:10:30 +01:00
double z1 = Math : : sin ( lat1 ) ;
double zr1 = Math : : cos ( lat1 ) ;
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
for ( int j = p_lons ; j > = 1 ; j - - ) {
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
double lng0 = 2 * Math_PI * ( double ) ( j - 1 ) / p_lons ;
2014-02-10 02:10:30 +01:00
double x0 = Math : : cos ( lng0 ) ;
double y0 = Math : : sin ( lng0 ) ;
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
double lng1 = 2 * Math_PI * ( double ) ( j ) / p_lons ;
2016-03-09 00:00:52 +01:00
double x1 = Math : : cos ( lng1 ) ;
2014-02-10 02:10:30 +01:00
double y1 = Math : : sin ( lng1 ) ;
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
Vector3 v [ 4 ] = {
Vector3 ( x1 * zr0 , z0 , y1 * zr0 ) ,
Vector3 ( x1 * zr1 , z1 , y1 * zr1 ) ,
Vector3 ( x0 * zr1 , z1 , y0 * zr1 ) ,
Vector3 ( x0 * zr0 , z0 , y0 * zr0 )
2014-02-10 02:10:30 +01:00
} ;
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
# define ADD_POINT(m_idx) \
normals . push_back ( v [ m_idx ] ) ; \
vertices . push_back ( v [ m_idx ] * p_radius ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
ADD_POINT ( 0 ) ;
ADD_POINT ( 1 ) ;
ADD_POINT ( 2 ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
ADD_POINT ( 2 ) ;
ADD_POINT ( 3 ) ;
ADD_POINT ( 0 ) ;
}
}
RID mesh = mesh_create ( ) ;
Array d ;
2020-03-27 19:21:27 +01:00
d . resize ( RS : : ARRAY_MAX ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
d [ ARRAY_VERTEX ] = vertices ;
d [ ARRAY_NORMAL ] = normals ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
mesh_add_surface_from_arrays ( mesh , PRIMITIVE_TRIANGLES , d ) ;
2014-02-10 02:10:30 +01:00
return mesh ;
}
2020-03-27 19:21:27 +01:00
RID RenderingServer : : get_white_texture ( ) {
2014-05-29 15:56:39 +02:00
if ( white_texture . is_valid ( ) )
return white_texture ;
2020-02-17 22:06:54 +01:00
Vector < uint8_t > wt ;
2017-03-05 16:44:50 +01:00
wt . resize ( 16 * 3 ) ;
2014-05-29 15:56:39 +02:00
{
2020-02-17 22:06:54 +01:00
uint8_t * w = wt . ptrw ( ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < 16 * 3 ; i + + )
w [ i ] = 255 ;
2014-05-29 15:56:39 +02:00
}
2017-05-17 12:36:47 +02:00
Ref < Image > white = memnew ( Image ( 4 , 4 , 0 , Image : : FORMAT_RGB8 , wt ) ) ;
2019-06-11 20:43:37 +02:00
white_texture = texture_2d_create ( white ) ;
2014-05-29 15:56:39 +02:00
return white_texture ;
}
2017-08-19 19:54:04 +02:00
# define SMALL_VEC2 Vector2(0.00001, 0.00001)
# define SMALL_VEC3 Vector3(0.00001, 0.00001, 0.00001)
2020-03-27 19:21:27 +01:00
Error RenderingServer : : _surface_set_data ( Array p_arrays , uint32_t p_format , uint32_t * p_offsets , uint32_t p_stride , Vector < uint8_t > & r_vertex_array , int p_vertex_array_len , Vector < uint8_t > & r_index_array , int p_index_array_len , AABB & r_aabb , Vector < AABB > & r_bone_aabb ) {
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
uint8_t * vw = r_vertex_array . ptrw ( ) ;
2016-10-19 16:14:41 +02:00
2020-04-02 01:20:12 +02:00
uint8_t * iw = nullptr ;
2016-10-19 16:14:41 +02:00
if ( r_index_array . size ( ) ) {
2020-02-17 22:06:54 +01:00
iw = r_index_array . ptrw ( ) ;
2016-10-19 16:14:41 +02:00
}
2017-03-05 16:44:50 +01:00
int max_bone = 0 ;
2016-10-19 16:14:41 +02:00
2020-03-27 19:21:27 +01:00
for ( int ai = 0 ; ai < RS : : ARRAY_MAX ; ai + + ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
if ( ! ( p_format & ( 1 < < ai ) ) ) // no array
2016-10-19 16:14:41 +02:00
continue ;
2017-03-05 16:44:50 +01:00
switch ( ai ) {
2016-10-19 16:14:41 +02:00
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_VERTEX : {
2016-10-19 16:14:41 +02:00
2020-03-27 19:21:27 +01:00
if ( p_format & RS : : ARRAY_FLAG_USE_2D_VERTICES ) {
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
Vector < Vector2 > array = p_arrays [ ai ] ;
2017-03-05 16:44:50 +01:00
ERR_FAIL_COND_V ( array . size ( ) ! = p_vertex_array_len , ERR_INVALID_PARAMETER ) ;
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
const Vector2 * src = array . ptr ( ) ;
2016-10-19 16:14:41 +02:00
// setting vertices means regenerating the AABB
Rect2 aabb ;
2019-08-19 00:40:52 +02:00
{
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_vertex_array_len ; i + + ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
float vector [ 2 ] = { src [ i ] . x , src [ i ] . y } ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
copymem ( & vw [ p_offsets [ ai ] + i * p_stride ] , vector , sizeof ( float ) * 2 ) ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
if ( i = = 0 ) {
2016-10-19 16:14:41 +02:00
2017-08-19 19:54:04 +02:00
aabb = Rect2 ( src [ i ] , SMALL_VEC2 ) ; //must have a bit of size
2016-10-19 16:14:41 +02:00
} else {
2017-03-05 16:44:50 +01:00
aabb . expand_to ( src [ i ] ) ;
2016-10-19 16:14:41 +02:00
}
}
}
2017-11-17 03:09:00 +01:00
r_aabb = AABB ( Vector3 ( aabb . position . x , aabb . position . y , 0 ) , Vector3 ( aabb . size . x , aabb . size . y , 0 ) ) ;
2016-10-19 16:14:41 +02:00
} else {
2020-02-17 22:06:54 +01:00
Vector < Vector3 > array = p_arrays [ ai ] ;
2017-03-05 16:44:50 +01:00
ERR_FAIL_COND_V ( array . size ( ) ! = p_vertex_array_len , ERR_INVALID_PARAMETER ) ;
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
const Vector3 * src = array . ptr ( ) ;
2016-10-19 16:14:41 +02:00
// setting vertices means regenerating the AABB
2017-11-17 03:09:00 +01:00
AABB aabb ;
2016-10-19 16:14:41 +02:00
2019-08-19 00:40:52 +02:00
{
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_vertex_array_len ; i + + ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
float vector [ 3 ] = { src [ i ] . x , src [ i ] . y , src [ i ] . z } ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
copymem ( & vw [ p_offsets [ ai ] + i * p_stride ] , vector , sizeof ( float ) * 3 ) ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
if ( i = = 0 ) {
2016-10-19 16:14:41 +02:00
2017-11-17 03:09:00 +01:00
aabb = AABB ( src [ i ] , SMALL_VEC3 ) ;
2016-10-19 16:14:41 +02:00
} else {
2017-03-05 16:44:50 +01:00
aabb . expand_to ( src [ i ] ) ;
2016-10-19 16:14:41 +02:00
}
}
}
2017-03-05 16:44:50 +01:00
r_aabb = aabb ;
2016-10-19 16:14:41 +02:00
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_NORMAL : {
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
ERR_FAIL_COND_V ( p_arrays [ ai ] . get_type ( ) ! = Variant : : PACKED_VECTOR3_ARRAY , ERR_INVALID_PARAMETER ) ;
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
Vector < Vector3 > array = p_arrays [ ai ] ;
2017-03-05 16:44:50 +01:00
ERR_FAIL_COND_V ( array . size ( ) ! = p_vertex_array_len , ERR_INVALID_PARAMETER ) ;
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
const Vector3 * src = array . ptr ( ) ;
2016-10-19 16:14:41 +02:00
// setting vertices means regenerating the AABB
2017-03-05 16:44:50 +01:00
if ( p_format & ARRAY_COMPRESS_NORMAL ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_vertex_array_len ; i + + ) {
2016-10-19 16:14:41 +02:00
2017-06-17 02:13:13 +02:00
int8_t vector [ 4 ] = {
2018-01-18 23:10:07 +01:00
( int8_t ) CLAMP ( src [ i ] . x * 127 , - 128 , 127 ) ,
( int8_t ) CLAMP ( src [ i ] . y * 127 , - 128 , 127 ) ,
( int8_t ) CLAMP ( src [ i ] . z * 127 , - 128 , 127 ) ,
2016-10-19 16:14:41 +02:00
0 ,
} ;
2017-03-05 16:44:50 +01:00
copymem ( & vw [ p_offsets [ ai ] + i * p_stride ] , vector , 4 ) ;
2016-10-19 16:14:41 +02:00
}
} else {
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_vertex_array_len ; i + + ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
float vector [ 3 ] = { src [ i ] . x , src [ i ] . y , src [ i ] . z } ;
copymem ( & vw [ p_offsets [ ai ] + i * p_stride ] , vector , 3 * 4 ) ;
2016-10-19 16:14:41 +02:00
}
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_TANGENT : {
2016-10-19 16:14:41 +02:00
Variant: Added 64-bit packed arrays, renamed Variant::REAL to FLOAT.
- Renames PackedIntArray to PackedInt32Array.
- Renames PackedFloatArray to PackedFloat32Array.
- Adds PackedInt64Array and PackedFloat64Array.
- Renames Variant::REAL to Variant::FLOAT for consistency.
Packed arrays are for storing large amount of data and creating stuff like
meshes, buffers. textures, etc. Forcing them to be 64 is a huge waste of
memory. That said, many users requested the ability to have 64 bits packed
arrays for their games, so this is just an optional added type.
For Variant, the float datatype is always 64 bits, and exposed as `float`.
We still have `real_t` which is the datatype that can change from 32 to 64
bits depending on a compile flag (not entirely working right now, but that's
the idea). It affects math related datatypes and code only.
Neither Variant nor PackedArray make use of real_t, which is only intended
for math precision, so the term is removed from there to keep only float.
2020-02-24 19:20:53 +01:00
ERR_FAIL_COND_V ( p_arrays [ ai ] . get_type ( ) ! = Variant : : PACKED_FLOAT32_ARRAY , ERR_INVALID_PARAMETER ) ;
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
Vector < real_t > array = p_arrays [ ai ] ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
ERR_FAIL_COND_V ( array . size ( ) ! = p_vertex_array_len * 4 , ERR_INVALID_PARAMETER ) ;
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
const real_t * src = array . ptr ( ) ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
if ( p_format & ARRAY_COMPRESS_TANGENT ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_vertex_array_len ; i + + ) {
2019-11-01 16:16:31 +01:00
int8_t xyzw [ 4 ] = {
( int8_t ) CLAMP ( src [ i * 4 + 0 ] * 127 , - 128 , 127 ) ,
( int8_t ) CLAMP ( src [ i * 4 + 1 ] * 127 , - 128 , 127 ) ,
( int8_t ) CLAMP ( src [ i * 4 + 2 ] * 127 , - 128 , 127 ) ,
( int8_t ) CLAMP ( src [ i * 4 + 3 ] * 127 , - 128 , 127 )
2016-10-19 16:14:41 +02:00
} ;
2017-03-05 16:44:50 +01:00
copymem ( & vw [ p_offsets [ ai ] + i * p_stride ] , xyzw , 4 ) ;
2016-10-19 16:14:41 +02:00
}
} else {
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_vertex_array_len ; i + + ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
float xyzw [ 4 ] = {
src [ i * 4 + 0 ] ,
src [ i * 4 + 1 ] ,
src [ i * 4 + 2 ] ,
src [ i * 4 + 3 ]
2016-10-19 16:14:41 +02:00
} ;
2017-03-05 16:44:50 +01:00
copymem ( & vw [ p_offsets [ ai ] + i * p_stride ] , xyzw , 4 * 4 ) ;
2016-10-19 16:14:41 +02:00
}
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_COLOR : {
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
ERR_FAIL_COND_V ( p_arrays [ ai ] . get_type ( ) ! = Variant : : PACKED_COLOR_ARRAY , ERR_INVALID_PARAMETER ) ;
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
Vector < Color > array = p_arrays [ ai ] ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
ERR_FAIL_COND_V ( array . size ( ) ! = p_vertex_array_len , ERR_INVALID_PARAMETER ) ;
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
const Color * src = array . ptr ( ) ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
if ( p_format & ARRAY_COMPRESS_COLOR ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_vertex_array_len ; i + + ) {
2016-10-19 16:14:41 +02:00
uint8_t colors [ 4 ] ;
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < 4 ; j + + ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
colors [ j ] = CLAMP ( int ( ( src [ i ] [ j ] ) * 255.0 ) , 0 , 255 ) ;
2016-10-19 16:14:41 +02:00
}
2017-03-05 16:44:50 +01:00
copymem ( & vw [ p_offsets [ ai ] + i * p_stride ] , colors , 4 ) ;
2016-10-19 16:14:41 +02:00
}
} else {
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_vertex_array_len ; i + + ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
copymem ( & vw [ p_offsets [ ai ] + i * p_stride ] , & src [ i ] , 4 * 4 ) ;
2016-10-19 16:14:41 +02:00
}
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_TEX_UV : {
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
ERR_FAIL_COND_V ( p_arrays [ ai ] . get_type ( ) ! = Variant : : PACKED_VECTOR3_ARRAY & & p_arrays [ ai ] . get_type ( ) ! = Variant : : PACKED_VECTOR2_ARRAY , ERR_INVALID_PARAMETER ) ;
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
Vector < Vector2 > array = p_arrays [ ai ] ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
ERR_FAIL_COND_V ( array . size ( ) ! = p_vertex_array_len , ERR_INVALID_PARAMETER ) ;
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
const Vector2 * src = array . ptr ( ) ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
if ( p_format & ARRAY_COMPRESS_TEX_UV ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_vertex_array_len ; i + + ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
uint16_t uv [ 2 ] = { Math : : make_half_float ( src [ i ] . x ) , Math : : make_half_float ( src [ i ] . y ) } ;
copymem ( & vw [ p_offsets [ ai ] + i * p_stride ] , uv , 2 * 2 ) ;
2016-10-19 16:14:41 +02:00
}
} else {
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_vertex_array_len ; i + + ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
float uv [ 2 ] = { src [ i ] . x , src [ i ] . y } ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
copymem ( & vw [ p_offsets [ ai ] + i * p_stride ] , uv , 2 * 4 ) ;
2016-10-19 16:14:41 +02:00
}
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_TEX_UV2 : {
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
ERR_FAIL_COND_V ( p_arrays [ ai ] . get_type ( ) ! = Variant : : PACKED_VECTOR3_ARRAY & & p_arrays [ ai ] . get_type ( ) ! = Variant : : PACKED_VECTOR2_ARRAY , ERR_INVALID_PARAMETER ) ;
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
Vector < Vector2 > array = p_arrays [ ai ] ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
ERR_FAIL_COND_V ( array . size ( ) ! = p_vertex_array_len , ERR_INVALID_PARAMETER ) ;
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
const Vector2 * src = array . ptr ( ) ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
if ( p_format & ARRAY_COMPRESS_TEX_UV2 ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_vertex_array_len ; i + + ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
uint16_t uv [ 2 ] = { Math : : make_half_float ( src [ i ] . x ) , Math : : make_half_float ( src [ i ] . y ) } ;
copymem ( & vw [ p_offsets [ ai ] + i * p_stride ] , uv , 2 * 2 ) ;
2016-10-19 16:14:41 +02:00
}
} else {
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_vertex_array_len ; i + + ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
float uv [ 2 ] = { src [ i ] . x , src [ i ] . y } ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
copymem ( & vw [ p_offsets [ ai ] + i * p_stride ] , uv , 2 * 4 ) ;
2016-10-19 16:14:41 +02:00
}
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_WEIGHTS : {
2016-10-19 16:14:41 +02:00
Variant: Added 64-bit packed arrays, renamed Variant::REAL to FLOAT.
- Renames PackedIntArray to PackedInt32Array.
- Renames PackedFloatArray to PackedFloat32Array.
- Adds PackedInt64Array and PackedFloat64Array.
- Renames Variant::REAL to Variant::FLOAT for consistency.
Packed arrays are for storing large amount of data and creating stuff like
meshes, buffers. textures, etc. Forcing them to be 64 is a huge waste of
memory. That said, many users requested the ability to have 64 bits packed
arrays for their games, so this is just an optional added type.
For Variant, the float datatype is always 64 bits, and exposed as `float`.
We still have `real_t` which is the datatype that can change from 32 to 64
bits depending on a compile flag (not entirely working right now, but that's
the idea). It affects math related datatypes and code only.
Neither Variant nor PackedArray make use of real_t, which is only intended
for math precision, so the term is removed from there to keep only float.
2020-02-24 19:20:53 +01:00
ERR_FAIL_COND_V ( p_arrays [ ai ] . get_type ( ) ! = Variant : : PACKED_FLOAT32_ARRAY , ERR_INVALID_PARAMETER ) ;
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
Vector < real_t > array = p_arrays [ ai ] ;
2016-10-19 16:14:41 +02:00
2020-03-27 19:21:27 +01:00
ERR_FAIL_COND_V ( array . size ( ) ! = p_vertex_array_len * RS : : ARRAY_WEIGHTS_SIZE , ERR_INVALID_PARAMETER ) ;
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
const real_t * src = array . ptr ( ) ;
2016-10-19 16:14:41 +02:00
2019-08-19 00:40:52 +02:00
{
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_vertex_array_len ; i + + ) {
2016-10-19 16:14:41 +02:00
2020-03-27 19:21:27 +01:00
uint16_t data [ RS : : ARRAY_WEIGHTS_SIZE ] ;
for ( int j = 0 ; j < RS : : ARRAY_WEIGHTS_SIZE ; j + + ) {
data [ j ] = CLAMP ( src [ i * RS : : ARRAY_WEIGHTS_SIZE + j ] * 65535 , 0 , 65535 ) ;
2016-10-19 16:14:41 +02:00
}
2017-03-05 16:44:50 +01:00
copymem ( & vw [ p_offsets [ ai ] + i * p_stride ] , data , 2 * 4 ) ;
2016-10-19 16:14:41 +02:00
}
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_BONES : {
2016-10-19 16:14:41 +02:00
Variant: Added 64-bit packed arrays, renamed Variant::REAL to FLOAT.
- Renames PackedIntArray to PackedInt32Array.
- Renames PackedFloatArray to PackedFloat32Array.
- Adds PackedInt64Array and PackedFloat64Array.
- Renames Variant::REAL to Variant::FLOAT for consistency.
Packed arrays are for storing large amount of data and creating stuff like
meshes, buffers. textures, etc. Forcing them to be 64 is a huge waste of
memory. That said, many users requested the ability to have 64 bits packed
arrays for their games, so this is just an optional added type.
For Variant, the float datatype is always 64 bits, and exposed as `float`.
We still have `real_t` which is the datatype that can change from 32 to 64
bits depending on a compile flag (not entirely working right now, but that's
the idea). It affects math related datatypes and code only.
Neither Variant nor PackedArray make use of real_t, which is only intended
for math precision, so the term is removed from there to keep only float.
2020-02-24 19:20:53 +01:00
ERR_FAIL_COND_V ( p_arrays [ ai ] . get_type ( ) ! = Variant : : PACKED_INT32_ARRAY & & p_arrays [ ai ] . get_type ( ) ! = Variant : : PACKED_FLOAT32_ARRAY , ERR_INVALID_PARAMETER ) ;
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
Vector < int > array = p_arrays [ ai ] ;
2016-10-19 16:14:41 +02:00
2020-03-27 19:21:27 +01:00
ERR_FAIL_COND_V ( array . size ( ) ! = p_vertex_array_len * RS : : ARRAY_WEIGHTS_SIZE , ERR_INVALID_PARAMETER ) ;
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
const int * src = array . ptr ( ) ;
2016-10-19 16:14:41 +02:00
2019-08-19 00:40:52 +02:00
for ( int i = 0 ; i < p_vertex_array_len ; i + + ) {
2016-10-19 16:14:41 +02:00
2020-03-27 19:21:27 +01:00
uint16_t data [ RS : : ARRAY_WEIGHTS_SIZE ] ;
for ( int j = 0 ; j < RS : : ARRAY_WEIGHTS_SIZE ; j + + ) {
data [ j ] = src [ i * RS : : ARRAY_WEIGHTS_SIZE + j ] ;
2019-08-19 00:40:52 +02:00
max_bone = MAX ( data [ j ] , max_bone ) ;
2016-10-19 16:14:41 +02:00
}
2019-08-19 00:40:52 +02:00
copymem ( & vw [ p_offsets [ ai ] + i * p_stride ] , data , 2 * 4 ) ;
2016-10-19 16:14:41 +02:00
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_INDEX : {
2016-10-19 16:14:41 +02:00
Fix some -Wmaybe-uninitialized warnings
Namely:
```
modules/basis_universal/register_types.cpp: In function 'Ref<Image> basis_universal_unpacker(const Vector<unsigned char>&)':
modules/basis_universal/register_types.cpp:266:15: warning: 'imgfmt' may be used uninitialized in this function [-Wmaybe-uninitialized]
266 | image->create(info.m_width, info.m_height, info.m_total_levels > 1, imgfmt, gpudata);
| ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
modules/basis_universal/register_types.cpp:255:39: warning: 'format' may be used uninitialized in this function [-Wmaybe-uninitialized]
255 | bool ret = tr.transcode_image_level(ptr, size, 0, i, dst + ofs, level.m_total_blocks - i, format);
| ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
```
```
servers/visual_server.cpp: In member function 'Error VisualServer::_surface_set_data(Array, uint32_t, uint32_t*, uint32_t, Vector<unsigned char>&, int, Vector<unsigned char>&, int, AABB&, Vector<AABB>&)':
servers/visual_server.cpp:636:15: warning: 'iw' may be used uninitialized in this function [-Wmaybe-uninitialized]
636 | copymem(&iw[i * 2], &v, 2);
| ^
```
```
core/image.cpp: In member function 'Error Image::generate_mipmap_roughness(Image::RoughnessChannel, const Ref<Image>&)':
core/image.cpp:1683:11: warning: 'roughness' may be used uninitialized in this function [-Wmaybe-uninitialized]
1683 | float roughness;
| ^~~~~~~~~
```
2020-03-27 12:36:59 +01:00
ERR_FAIL_NULL_V ( iw , ERR_INVALID_DATA ) ;
2017-03-05 16:44:50 +01:00
ERR_FAIL_COND_V ( p_index_array_len < = 0 , ERR_INVALID_DATA ) ;
Variant: Added 64-bit packed arrays, renamed Variant::REAL to FLOAT.
- Renames PackedIntArray to PackedInt32Array.
- Renames PackedFloatArray to PackedFloat32Array.
- Adds PackedInt64Array and PackedFloat64Array.
- Renames Variant::REAL to Variant::FLOAT for consistency.
Packed arrays are for storing large amount of data and creating stuff like
meshes, buffers. textures, etc. Forcing them to be 64 is a huge waste of
memory. That said, many users requested the ability to have 64 bits packed
arrays for their games, so this is just an optional added type.
For Variant, the float datatype is always 64 bits, and exposed as `float`.
We still have `real_t` which is the datatype that can change from 32 to 64
bits depending on a compile flag (not entirely working right now, but that's
the idea). It affects math related datatypes and code only.
Neither Variant nor PackedArray make use of real_t, which is only intended
for math precision, so the term is removed from there to keep only float.
2020-02-24 19:20:53 +01:00
ERR_FAIL_COND_V ( p_arrays [ ai ] . get_type ( ) ! = Variant : : PACKED_INT32_ARRAY , ERR_INVALID_PARAMETER ) ;
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
Vector < int > indices = p_arrays [ ai ] ;
2017-03-05 16:44:50 +01:00
ERR_FAIL_COND_V ( indices . size ( ) = = 0 , ERR_INVALID_PARAMETER ) ;
ERR_FAIL_COND_V ( indices . size ( ) ! = p_index_array_len , ERR_INVALID_PARAMETER ) ;
2016-10-19 16:14:41 +02:00
2018-01-18 21:37:17 +01:00
/* determine whether using 16 or 32 bits indices */
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
const int * src = indices . ptr ( ) ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_index_array_len ; i + + ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
if ( p_vertex_array_len < ( 1 < < 16 ) ) {
uint16_t v = src [ i ] ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
copymem ( & iw [ i * 2 ] , & v , 2 ) ;
2016-10-19 16:14:41 +02:00
} else {
2017-03-05 16:44:50 +01:00
uint32_t v = src [ i ] ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
copymem ( & iw [ i * 4 ] , & v , 4 ) ;
2016-10-19 16:14:41 +02:00
}
}
} break ;
default : {
2017-03-05 16:44:50 +01:00
ERR_FAIL_V ( ERR_INVALID_DATA ) ;
2016-10-19 16:14:41 +02:00
}
}
}
2020-03-27 19:21:27 +01:00
if ( p_format & RS : : ARRAY_FORMAT_BONES ) {
2016-10-19 16:14:41 +02:00
//create AABBs for each detected bone
2017-03-05 16:44:50 +01:00
int total_bones = max_bone + 1 ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
bool first = r_bone_aabb . size ( ) = = 0 ;
2016-10-19 16:14:41 +02:00
r_bone_aabb . resize ( total_bones ) ;
if ( first ) {
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < total_bones ; i + + ) {
2018-07-25 03:11:03 +02:00
r_bone_aabb . write [ i ] . size = Vector3 ( - 1 , - 1 , - 1 ) ; //negative means unused
2016-10-19 16:14:41 +02:00
}
}
2020-03-27 19:21:27 +01:00
Vector < Vector3 > vertices = p_arrays [ RS : : ARRAY_VERTEX ] ;
Vector < int > bones = p_arrays [ RS : : ARRAY_BONES ] ;
Vector < float > weights = p_arrays [ RS : : ARRAY_WEIGHTS ] ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
bool any_valid = false ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
if ( vertices . size ( ) & & bones . size ( ) = = vertices . size ( ) * 4 & & weights . size ( ) = = bones . size ( ) ) {
2016-10-19 16:14:41 +02:00
int vs = vertices . size ( ) ;
2020-02-17 22:06:54 +01:00
const Vector3 * rv = vertices . ptr ( ) ;
const int * rb = bones . ptr ( ) ;
const float * rw = weights . ptr ( ) ;
2016-10-19 16:14:41 +02:00
2017-11-25 04:07:54 +01:00
AABB * bptr = r_bone_aabb . ptrw ( ) ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < vs ; i + + ) {
2016-10-19 16:14:41 +02:00
Vector3 v = rv [ i ] ;
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < 4 ; j + + ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
int idx = rb [ i * 4 + j ] ;
float w = rw [ i * 4 + j ] ;
if ( w = = 0 )
continue ; //break;
ERR_FAIL_INDEX_V ( idx , total_bones , ERR_INVALID_DATA ) ;
2016-10-19 16:14:41 +02:00
2019-03-14 05:35:19 +01:00
if ( bptr [ idx ] . size . x < 0 ) {
2016-10-19 16:14:41 +02:00
//first
2017-11-17 03:09:00 +01:00
bptr [ idx ] = AABB ( v , SMALL_VEC3 ) ;
2017-03-05 16:44:50 +01:00
any_valid = true ;
2016-10-19 16:14:41 +02:00
} else {
bptr [ idx ] . expand_to ( v ) ;
}
}
}
}
if ( ! any_valid & & first ) {
r_bone_aabb . clear ( ) ;
}
}
return OK ;
}
2020-03-27 19:21:27 +01:00
uint32_t RenderingServer : : mesh_surface_get_format_offset ( uint32_t p_format , int p_vertex_len , int p_index_len , int p_array_index ) const {
2017-11-21 01:36:32 +01:00
uint32_t offsets [ ARRAY_MAX ] ;
mesh_surface_make_offsets_from_format ( p_format , p_vertex_len , p_index_len , offsets ) ;
return offsets [ p_array_index ] ;
}
2020-03-27 19:21:27 +01:00
uint32_t RenderingServer : : mesh_surface_get_format_stride ( uint32_t p_format , int p_vertex_len , int p_index_len ) const {
2017-11-21 01:36:32 +01:00
uint32_t offsets [ ARRAY_MAX ] ;
return mesh_surface_make_offsets_from_format ( p_format , p_vertex_len , p_index_len , offsets ) ;
}
2020-03-27 19:21:27 +01:00
uint32_t RenderingServer : : mesh_surface_make_offsets_from_format ( uint32_t p_format , int p_vertex_len , int p_index_len , uint32_t * r_offsets ) const {
2017-11-21 01:36:32 +01:00
int total_elem_size = 0 ;
2020-03-27 19:21:27 +01:00
for ( int i = 0 ; i < RS : : ARRAY_MAX ; i + + ) {
2017-11-21 01:36:32 +01:00
r_offsets [ i ] = 0 ; //reset
if ( ! ( p_format & ( 1 < < i ) ) ) // no array
continue ;
int elem_size = 0 ;
switch ( i ) {
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_VERTEX : {
2017-11-21 01:36:32 +01:00
if ( p_format & ARRAY_FLAG_USE_2D_VERTICES ) {
elem_size = 2 ;
} else {
elem_size = 3 ;
}
2019-08-19 00:40:52 +02:00
{
2017-11-21 01:36:32 +01:00
elem_size * = sizeof ( float ) ;
}
if ( elem_size = = 6 ) {
elem_size = 8 ;
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_NORMAL : {
2017-11-21 01:36:32 +01:00
if ( p_format & ARRAY_COMPRESS_NORMAL ) {
elem_size = sizeof ( uint32_t ) ;
} else {
elem_size = sizeof ( float ) * 3 ;
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_TANGENT : {
2017-11-21 01:36:32 +01:00
if ( p_format & ARRAY_COMPRESS_TANGENT ) {
elem_size = sizeof ( uint32_t ) ;
} else {
elem_size = sizeof ( float ) * 4 ;
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_COLOR : {
2017-11-21 01:36:32 +01:00
if ( p_format & ARRAY_COMPRESS_COLOR ) {
elem_size = sizeof ( uint32_t ) ;
} else {
elem_size = sizeof ( float ) * 4 ;
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_TEX_UV : {
2017-11-21 01:36:32 +01:00
if ( p_format & ARRAY_COMPRESS_TEX_UV ) {
elem_size = sizeof ( uint32_t ) ;
} else {
elem_size = sizeof ( float ) * 2 ;
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_TEX_UV2 : {
2017-11-21 01:36:32 +01:00
if ( p_format & ARRAY_COMPRESS_TEX_UV2 ) {
elem_size = sizeof ( uint32_t ) ;
} else {
elem_size = sizeof ( float ) * 2 ;
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_WEIGHTS : {
2017-11-21 01:36:32 +01:00
2019-08-19 00:40:52 +02:00
elem_size = sizeof ( uint16_t ) * 4 ;
2017-11-21 01:36:32 +01:00
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_BONES : {
2017-11-21 01:36:32 +01:00
2019-08-19 00:40:52 +02:00
elem_size = sizeof ( uint16_t ) * 4 ;
2017-11-21 01:36:32 +01:00
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_INDEX : {
2017-11-21 01:36:32 +01:00
if ( p_index_len < = 0 ) {
ERR_PRINT ( " index_array_len==NO_INDEX_ARRAY " ) ;
break ;
}
/* determine whether using 16 or 32 bits indices */
if ( p_vertex_len > = ( 1 < < 16 ) ) {
elem_size = 4 ;
} else {
elem_size = 2 ;
}
r_offsets [ i ] = elem_size ;
continue ;
2019-06-26 15:08:25 +02:00
}
2017-11-21 01:36:32 +01:00
default : {
ERR_FAIL_V ( 0 ) ;
}
}
r_offsets [ i ] = total_elem_size ;
total_elem_size + = elem_size ;
}
return total_elem_size ;
}
2020-03-27 19:21:27 +01:00
Error RenderingServer : : mesh_create_surface_data_from_arrays ( SurfaceData * r_surface_data , PrimitiveType p_primitive , const Array & p_arrays , const Array & p_blend_shapes , const Dictionary & p_lods , uint32_t p_compress_format ) {
2016-10-19 16:14:41 +02:00
2020-03-27 19:21:27 +01:00
ERR_FAIL_INDEX_V ( p_primitive , RS : : PRIMITIVE_MAX , ERR_INVALID_PARAMETER ) ;
ERR_FAIL_COND_V ( p_arrays . size ( ) ! = RS : : ARRAY_MAX , ERR_INVALID_PARAMETER ) ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
uint32_t format = 0 ;
2016-10-19 16:14:41 +02:00
// validation
2017-03-05 16:44:50 +01:00
int index_array_len = 0 ;
int array_len = 0 ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_arrays . size ( ) ; i + + ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
if ( p_arrays [ i ] . get_type ( ) = = Variant : : NIL )
2016-10-19 16:14:41 +02:00
continue ;
2017-03-05 16:44:50 +01:00
format | = ( 1 < < i ) ;
2016-10-19 16:14:41 +02:00
2020-03-27 19:21:27 +01:00
if ( i = = RS : : ARRAY_VERTEX ) {
2016-10-19 16:14:41 +02:00
Variant var = p_arrays [ i ] ;
2017-03-05 16:44:50 +01:00
switch ( var . get_type ( ) ) {
2020-02-17 22:06:54 +01:00
case Variant : : PACKED_VECTOR2_ARRAY : {
Vector < Vector2 > v2 = var ;
2016-10-19 16:14:41 +02:00
} break ;
2020-02-17 22:06:54 +01:00
case Variant : : PACKED_VECTOR3_ARRAY : {
Vector < Vector3 > v3 = var ;
2016-10-19 16:14:41 +02:00
} break ;
default : {
Array v = var ;
} break ;
}
2020-02-17 22:06:54 +01:00
array_len = PackedVector3Array ( p_arrays [ i ] ) . size ( ) ;
2019-08-19 00:40:52 +02:00
ERR_FAIL_COND_V ( array_len = = 0 , ERR_INVALID_DATA ) ;
2020-03-27 19:21:27 +01:00
} else if ( i = = RS : : ARRAY_INDEX ) {
2016-10-19 16:14:41 +02:00
Variant: Added 64-bit packed arrays, renamed Variant::REAL to FLOAT.
- Renames PackedIntArray to PackedInt32Array.
- Renames PackedFloatArray to PackedFloat32Array.
- Adds PackedInt64Array and PackedFloat64Array.
- Renames Variant::REAL to Variant::FLOAT for consistency.
Packed arrays are for storing large amount of data and creating stuff like
meshes, buffers. textures, etc. Forcing them to be 64 is a huge waste of
memory. That said, many users requested the ability to have 64 bits packed
arrays for their games, so this is just an optional added type.
For Variant, the float datatype is always 64 bits, and exposed as `float`.
We still have `real_t` which is the datatype that can change from 32 to 64
bits depending on a compile flag (not entirely working right now, but that's
the idea). It affects math related datatypes and code only.
Neither Variant nor PackedArray make use of real_t, which is only intended
for math precision, so the term is removed from there to keep only float.
2020-02-24 19:20:53 +01:00
index_array_len = PackedInt32Array ( p_arrays [ i ] ) . size ( ) ;
2016-10-19 16:14:41 +02:00
}
}
2020-03-27 19:21:27 +01:00
ERR_FAIL_COND_V ( ( format & RS : : ARRAY_FORMAT_VERTEX ) = = 0 , ERR_INVALID_PARAMETER ) ; // mandatory
2016-10-19 16:14:41 +02:00
if ( p_blend_shapes . size ( ) ) {
//validate format for morphs
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_blend_shapes . size ( ) ; i + + ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
uint32_t bsformat = 0 ;
2016-10-19 16:14:41 +02:00
Array arr = p_blend_shapes [ i ] ;
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < arr . size ( ) ; j + + ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
if ( arr [ j ] . get_type ( ) ! = Variant : : NIL )
bsformat | = ( 1 < < j ) ;
2016-10-19 16:14:41 +02:00
}
2020-03-27 19:21:27 +01:00
ERR_FAIL_COND_V ( ( bsformat ) ! = ( format & ( RS : : ARRAY_FORMAT_INDEX - 1 ) ) , ERR_INVALID_PARAMETER ) ;
2016-10-19 16:14:41 +02:00
}
}
2020-03-27 19:21:27 +01:00
uint32_t offsets [ RS : : ARRAY_MAX ] ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
int total_elem_size = 0 ;
2016-10-19 16:14:41 +02:00
2020-03-27 19:21:27 +01:00
for ( int i = 0 ; i < RS : : ARRAY_MAX ; i + + ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
offsets [ i ] = 0 ; //reset
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
if ( ! ( format & ( 1 < < i ) ) ) // no array
2016-10-19 16:14:41 +02:00
continue ;
2017-03-05 16:44:50 +01:00
int elem_size = 0 ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
switch ( i ) {
2016-10-19 16:14:41 +02:00
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_VERTEX : {
2016-10-19 16:14:41 +02:00
Variant arr = p_arrays [ 0 ] ;
2020-02-17 22:06:54 +01:00
if ( arr . get_type ( ) = = Variant : : PACKED_VECTOR2_ARRAY ) {
2017-03-05 16:44:50 +01:00
elem_size = 2 ;
p_compress_format | = ARRAY_FLAG_USE_2D_VERTICES ;
2020-02-17 22:06:54 +01:00
} else if ( arr . get_type ( ) = = Variant : : PACKED_VECTOR3_ARRAY ) {
2017-03-05 16:44:50 +01:00
p_compress_format & = ~ ARRAY_FLAG_USE_2D_VERTICES ;
elem_size = 3 ;
2016-10-19 16:14:41 +02:00
} else {
2017-03-05 16:44:50 +01:00
elem_size = ( p_compress_format & ARRAY_FLAG_USE_2D_VERTICES ) ? 2 : 3 ;
2016-10-19 16:14:41 +02:00
}
2019-08-19 00:40:52 +02:00
{
2017-03-05 16:44:50 +01:00
elem_size * = sizeof ( float ) ;
2016-10-19 16:14:41 +02:00
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_NORMAL : {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
if ( p_compress_format & ARRAY_COMPRESS_NORMAL ) {
elem_size = sizeof ( uint32_t ) ;
2016-10-19 16:14:41 +02:00
} else {
2017-03-05 16:44:50 +01:00
elem_size = sizeof ( float ) * 3 ;
2016-10-19 16:14:41 +02:00
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_TANGENT : {
2017-03-05 16:44:50 +01:00
if ( p_compress_format & ARRAY_COMPRESS_TANGENT ) {
elem_size = sizeof ( uint32_t ) ;
2016-10-19 16:14:41 +02:00
} else {
2017-03-05 16:44:50 +01:00
elem_size = sizeof ( float ) * 4 ;
2016-10-19 16:14:41 +02:00
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_COLOR : {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
if ( p_compress_format & ARRAY_COMPRESS_COLOR ) {
elem_size = sizeof ( uint32_t ) ;
2016-10-19 16:14:41 +02:00
} else {
2017-03-05 16:44:50 +01:00
elem_size = sizeof ( float ) * 4 ;
2016-10-19 16:14:41 +02:00
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_TEX_UV : {
2017-03-05 16:44:50 +01:00
if ( p_compress_format & ARRAY_COMPRESS_TEX_UV ) {
elem_size = sizeof ( uint32_t ) ;
2016-10-19 16:14:41 +02:00
} else {
2017-03-05 16:44:50 +01:00
elem_size = sizeof ( float ) * 2 ;
2016-10-19 16:14:41 +02:00
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_TEX_UV2 : {
2017-03-05 16:44:50 +01:00
if ( p_compress_format & ARRAY_COMPRESS_TEX_UV2 ) {
elem_size = sizeof ( uint32_t ) ;
2016-10-19 16:14:41 +02:00
} else {
2017-03-05 16:44:50 +01:00
elem_size = sizeof ( float ) * 2 ;
2016-10-19 16:14:41 +02:00
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_WEIGHTS : {
2016-10-19 16:14:41 +02:00
2019-08-19 00:40:52 +02:00
elem_size = sizeof ( uint16_t ) * 4 ;
2016-10-19 16:14:41 +02:00
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_BONES : {
2016-10-19 16:14:41 +02:00
2019-08-19 00:40:52 +02:00
elem_size = sizeof ( uint16_t ) * 4 ;
2016-10-19 16:14:41 +02:00
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_INDEX : {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
if ( index_array_len < = 0 ) {
2016-10-19 16:14:41 +02:00
ERR_PRINT ( " index_array_len==NO_INDEX_ARRAY " ) ;
break ;
}
2018-01-18 21:37:17 +01:00
/* determine whether using 16 or 32 bits indices */
2017-03-05 16:44:50 +01:00
if ( array_len > = ( 1 < < 16 ) ) {
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
elem_size = 4 ;
2016-10-19 16:14:41 +02:00
} else {
2017-03-05 16:44:50 +01:00
elem_size = 2 ;
2016-10-19 16:14:41 +02:00
}
2017-03-05 16:44:50 +01:00
offsets [ i ] = elem_size ;
2016-10-19 16:14:41 +02:00
continue ;
2019-07-23 09:14:31 +02:00
}
2016-10-19 16:14:41 +02:00
default : {
2019-08-19 00:40:52 +02:00
ERR_FAIL_V ( ERR_BUG ) ;
2016-10-19 16:14:41 +02:00
}
}
2017-03-05 16:44:50 +01:00
offsets [ i ] = total_elem_size ;
total_elem_size + = elem_size ;
2016-10-19 16:14:41 +02:00
}
2017-03-05 16:44:50 +01:00
uint32_t mask = ( 1 < < ARRAY_MAX ) - 1 ;
format | = ( ~ mask ) & p_compress_format ; //make the full format
2016-10-19 16:14:41 +02:00
int array_size = total_elem_size * array_len ;
2020-02-17 22:06:54 +01:00
Vector < uint8_t > vertex_array ;
2016-10-19 16:14:41 +02:00
vertex_array . resize ( array_size ) ;
2020-03-27 19:21:27 +01:00
int index_array_size = offsets [ RS : : ARRAY_INDEX ] * index_array_len ;
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
Vector < uint8_t > index_array ;
2016-10-19 16:14:41 +02:00
index_array . resize ( index_array_size ) ;
2017-11-17 03:09:00 +01:00
AABB aabb ;
Vector < AABB > bone_aabb ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
Error err = _surface_set_data ( p_arrays , format , offsets , total_elem_size , vertex_array , array_len , index_array , index_array_len , aabb , bone_aabb ) ;
2019-08-19 00:40:52 +02:00
ERR_FAIL_COND_V_MSG ( err ! = OK , ERR_INVALID_DATA , " Invalid array format for surface. " ) ;
2016-10-19 16:14:41 +02:00
2020-03-17 07:33:00 +01:00
Vector < Vector < uint8_t > > blend_shape_data ;
2016-10-19 16:14:41 +02:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_blend_shapes . size ( ) ; i + + ) {
2016-10-19 16:14:41 +02:00
2020-02-17 22:06:54 +01:00
Vector < uint8_t > vertex_array_shape ;
2016-10-19 16:14:41 +02:00
vertex_array_shape . resize ( array_size ) ;
2020-02-17 22:06:54 +01:00
Vector < uint8_t > noindex ;
2016-10-19 16:14:41 +02:00
2017-11-17 03:09:00 +01:00
AABB laabb ;
2019-02-12 21:10:08 +01:00
Error err2 = _surface_set_data ( p_blend_shapes [ i ] , format & ~ ARRAY_FORMAT_INDEX , offsets , total_elem_size , vertex_array_shape , array_len , noindex , 0 , laabb , bone_aabb ) ;
2016-10-19 16:14:41 +02:00
aabb . merge_with ( laabb ) ;
2019-08-19 00:40:52 +02:00
ERR_FAIL_COND_V_MSG ( err2 ! = OK , ERR_INVALID_DATA , " Invalid blend shape array format for surface. " ) ;
2016-10-19 16:14:41 +02:00
blend_shape_data . push_back ( vertex_array_shape ) ;
}
2019-08-19 00:40:52 +02:00
Vector < SurfaceData : : LOD > lods ;
if ( index_array_len ) {
List < Variant > keys ;
p_lods . get_key_list ( & keys ) ;
for ( List < Variant > : : Element * E = keys . front ( ) ; E ; E = E - > next ( ) ) {
float distance = E - > get ( ) ;
ERR_CONTINUE ( distance < = 0.0 ) ;
2020-02-17 22:06:54 +01:00
Vector < int > indices = p_lods [ E - > get ( ) ] ;
2019-08-19 00:40:52 +02:00
ERR_CONTINUE ( indices . size ( ) = = 0 ) ;
uint32_t index_count = indices . size ( ) ;
ERR_CONTINUE ( index_count > = ( uint32_t ) index_array_len ) ; //should be smaller..
2020-02-17 22:06:54 +01:00
const int * r = indices . ptr ( ) ;
2019-08-19 00:40:52 +02:00
2020-02-17 22:06:54 +01:00
Vector < uint8_t > data ;
2019-08-19 00:40:52 +02:00
if ( array_len < = 65536 ) {
//16 bits indices
data . resize ( indices . size ( ) * 2 ) ;
2020-02-17 22:06:54 +01:00
uint8_t * w = data . ptrw ( ) ;
uint16_t * index_ptr = ( uint16_t * ) w ;
2019-08-19 00:40:52 +02:00
for ( uint32_t i = 0 ; i < index_count ; i + + ) {
index_ptr [ i ] = r [ i ] ;
}
} else {
//32 bits indices
data . resize ( indices . size ( ) * 4 ) ;
2020-02-17 22:06:54 +01:00
uint8_t * w = data . ptrw ( ) ;
uint32_t * index_ptr = ( uint32_t * ) w ;
2019-08-19 00:40:52 +02:00
for ( uint32_t i = 0 ; i < index_count ; i + + ) {
index_ptr [ i ] = r [ i ] ;
}
}
SurfaceData : : LOD lod ;
lod . edge_length = distance ;
lod . index_data = data ;
lods . push_back ( lod ) ;
}
}
SurfaceData & surface_data = * r_surface_data ;
surface_data . format = format ;
surface_data . primitive = p_primitive ;
surface_data . aabb = aabb ;
surface_data . vertex_data = vertex_array ;
surface_data . vertex_count = array_len ;
surface_data . index_data = index_array ;
surface_data . index_count = index_array_len ;
surface_data . blend_shapes = blend_shape_data ;
surface_data . bone_aabbs = bone_aabb ;
surface_data . lods = lods ;
2016-10-19 16:14:41 +02:00
2019-08-19 00:40:52 +02:00
return OK ;
}
2020-03-27 19:21:27 +01:00
void RenderingServer : : mesh_add_surface_from_arrays ( RID p_mesh , PrimitiveType p_primitive , const Array & p_arrays , const Array & p_blend_shapes , const Dictionary & p_lods , uint32_t p_compress_format ) {
2019-08-19 00:40:52 +02:00
SurfaceData sd ;
Error err = mesh_create_surface_data_from_arrays ( & sd , p_primitive , p_arrays , p_blend_shapes , p_lods , p_compress_format ) ;
if ( err ! = OK ) {
return ;
}
mesh_add_surface ( p_mesh , sd ) ;
2016-10-03 21:33:42 +02:00
}
2020-03-27 19:21:27 +01:00
Array RenderingServer : : _get_array_from_surface ( uint32_t p_format , Vector < uint8_t > p_vertex_data , int p_vertex_len , Vector < uint8_t > p_index_data , int p_index_len ) const {
2016-11-10 03:55:06 +01:00
uint32_t offsets [ ARRAY_MAX ] ;
2017-03-05 16:44:50 +01:00
int total_elem_size = 0 ;
2016-11-10 03:55:06 +01:00
2020-03-27 19:21:27 +01:00
for ( int i = 0 ; i < RS : : ARRAY_MAX ; i + + ) {
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
offsets [ i ] = 0 ; //reset
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
if ( ! ( p_format & ( 1 < < i ) ) ) // no array
2016-11-10 03:55:06 +01:00
continue ;
2017-03-05 16:44:50 +01:00
int elem_size = 0 ;
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
switch ( i ) {
2016-11-10 03:55:06 +01:00
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_VERTEX : {
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
if ( p_format & ARRAY_FLAG_USE_2D_VERTICES ) {
elem_size = 2 ;
2016-11-10 03:55:06 +01:00
} else {
2017-03-05 16:44:50 +01:00
elem_size = 3 ;
2016-11-10 03:55:06 +01:00
}
2019-08-19 00:40:52 +02:00
{
2017-03-05 16:44:50 +01:00
elem_size * = sizeof ( float ) ;
2016-11-10 03:55:06 +01:00
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_NORMAL : {
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
if ( p_format & ARRAY_COMPRESS_NORMAL ) {
elem_size = sizeof ( uint32_t ) ;
2016-11-10 03:55:06 +01:00
} else {
2017-03-05 16:44:50 +01:00
elem_size = sizeof ( float ) * 3 ;
2016-11-10 03:55:06 +01:00
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_TANGENT : {
2017-03-05 16:44:50 +01:00
if ( p_format & ARRAY_COMPRESS_TANGENT ) {
elem_size = sizeof ( uint32_t ) ;
2016-11-10 03:55:06 +01:00
} else {
2017-03-05 16:44:50 +01:00
elem_size = sizeof ( float ) * 4 ;
2016-11-10 03:55:06 +01:00
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_COLOR : {
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
if ( p_format & ARRAY_COMPRESS_COLOR ) {
elem_size = sizeof ( uint32_t ) ;
2016-11-10 03:55:06 +01:00
} else {
2017-03-05 16:44:50 +01:00
elem_size = sizeof ( float ) * 4 ;
2016-11-10 03:55:06 +01:00
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_TEX_UV : {
2017-03-05 16:44:50 +01:00
if ( p_format & ARRAY_COMPRESS_TEX_UV ) {
elem_size = sizeof ( uint32_t ) ;
2016-11-10 03:55:06 +01:00
} else {
2017-03-05 16:44:50 +01:00
elem_size = sizeof ( float ) * 2 ;
2016-11-10 03:55:06 +01:00
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_TEX_UV2 : {
2017-03-05 16:44:50 +01:00
if ( p_format & ARRAY_COMPRESS_TEX_UV2 ) {
elem_size = sizeof ( uint32_t ) ;
2016-11-10 03:55:06 +01:00
} else {
2017-03-05 16:44:50 +01:00
elem_size = sizeof ( float ) * 2 ;
2016-11-10 03:55:06 +01:00
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_WEIGHTS : {
2016-11-10 03:55:06 +01:00
2019-08-19 00:40:52 +02:00
elem_size = sizeof ( uint16_t ) * 4 ;
2016-11-10 03:55:06 +01:00
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_BONES : {
2016-11-10 03:55:06 +01:00
2019-08-19 00:40:52 +02:00
elem_size = sizeof ( uint16_t ) * 4 ;
2016-11-10 03:55:06 +01:00
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_INDEX : {
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
if ( p_index_len < = 0 ) {
2016-11-10 03:55:06 +01:00
ERR_PRINT ( " index_array_len==NO_INDEX_ARRAY " ) ;
break ;
}
2018-01-18 21:37:17 +01:00
/* determine whether using 16 or 32 bits indices */
2017-03-05 16:44:50 +01:00
if ( p_vertex_len > = ( 1 < < 16 ) ) {
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
elem_size = 4 ;
2016-11-10 03:55:06 +01:00
} else {
2017-03-05 16:44:50 +01:00
elem_size = 2 ;
2016-11-10 03:55:06 +01:00
}
2017-03-05 16:44:50 +01:00
offsets [ i ] = elem_size ;
2016-11-10 03:55:06 +01:00
continue ;
2019-07-23 09:14:31 +02:00
}
2016-11-10 03:55:06 +01:00
default : {
2017-03-05 16:44:50 +01:00
ERR_FAIL_V ( Array ( ) ) ;
2016-11-10 03:55:06 +01:00
}
}
2017-03-05 16:44:50 +01:00
offsets [ i ] = total_elem_size ;
total_elem_size + = elem_size ;
2016-11-10 03:55:06 +01:00
}
Array ret ;
2020-03-27 19:21:27 +01:00
ret . resize ( RS : : ARRAY_MAX ) ;
2016-11-10 03:55:06 +01:00
2020-02-17 22:06:54 +01:00
const uint8_t * r = p_vertex_data . ptr ( ) ;
2016-11-10 03:55:06 +01:00
2020-03-27 19:21:27 +01:00
for ( int i = 0 ; i < RS : : ARRAY_MAX ; i + + ) {
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
if ( ! ( p_format & ( 1 < < i ) ) )
2016-11-10 03:55:06 +01:00
continue ;
2017-03-05 16:44:50 +01:00
switch ( i ) {
2016-11-10 03:55:06 +01:00
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_VERTEX : {
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
if ( p_format & ARRAY_FLAG_USE_2D_VERTICES ) {
2016-11-10 03:55:06 +01:00
2020-02-17 22:06:54 +01:00
Vector < Vector2 > arr_2d ;
2016-11-10 03:55:06 +01:00
arr_2d . resize ( p_vertex_len ) ;
2019-08-19 00:40:52 +02:00
{
2016-11-10 03:55:06 +01:00
2020-02-17 22:06:54 +01:00
Vector2 * w = arr_2d . ptrw ( ) ;
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < p_vertex_len ; j + + ) {
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
const float * v = ( const float * ) & r [ j * total_elem_size + offsets [ i ] ] ;
w [ j ] = Vector2 ( v [ 0 ] , v [ 1 ] ) ;
2016-11-10 03:55:06 +01:00
}
}
2017-03-05 16:44:50 +01:00
ret [ i ] = arr_2d ;
2016-11-10 03:55:06 +01:00
} else {
2020-02-17 22:06:54 +01:00
Vector < Vector3 > arr_3d ;
2016-11-10 03:55:06 +01:00
arr_3d . resize ( p_vertex_len ) ;
2019-08-19 00:40:52 +02:00
{
2016-11-10 03:55:06 +01:00
2020-02-17 22:06:54 +01:00
Vector3 * w = arr_3d . ptrw ( ) ;
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < p_vertex_len ; j + + ) {
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
const float * v = ( const float * ) & r [ j * total_elem_size + offsets [ i ] ] ;
w [ j ] = Vector3 ( v [ 0 ] , v [ 1 ] , v [ 2 ] ) ;
2016-11-10 03:55:06 +01:00
}
}
2017-03-05 16:44:50 +01:00
ret [ i ] = arr_3d ;
2016-11-10 03:55:06 +01:00
}
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_NORMAL : {
2020-02-17 22:06:54 +01:00
Vector < Vector3 > arr ;
2016-11-10 03:55:06 +01:00
arr . resize ( p_vertex_len ) ;
2017-03-05 16:44:50 +01:00
if ( p_format & ARRAY_COMPRESS_NORMAL ) {
2016-11-10 03:55:06 +01:00
2020-02-17 22:06:54 +01:00
Vector3 * w = arr . ptrw ( ) ;
2017-06-17 02:13:13 +02:00
const float multiplier = 1.f / 127.f ;
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < p_vertex_len ; j + + ) {
2016-11-10 03:55:06 +01:00
2017-06-17 02:13:13 +02:00
const int8_t * v = ( const int8_t * ) & r [ j * total_elem_size + offsets [ i ] ] ;
w [ j ] = Vector3 ( float ( v [ 0 ] ) * multiplier , float ( v [ 1 ] ) * multiplier , float ( v [ 2 ] ) * multiplier ) ;
2016-11-10 03:55:06 +01:00
}
} else {
2020-02-17 22:06:54 +01:00
Vector3 * w = arr . ptrw ( ) ;
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < p_vertex_len ; j + + ) {
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
const float * v = ( const float * ) & r [ j * total_elem_size + offsets [ i ] ] ;
w [ j ] = Vector3 ( v [ 0 ] , v [ 1 ] , v [ 2 ] ) ;
2016-11-10 03:55:06 +01:00
}
}
2017-03-05 16:44:50 +01:00
ret [ i ] = arr ;
2016-11-10 03:55:06 +01:00
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_TANGENT : {
2020-02-17 22:06:54 +01:00
Vector < float > arr ;
2017-03-05 16:44:50 +01:00
arr . resize ( p_vertex_len * 4 ) ;
if ( p_format & ARRAY_COMPRESS_TANGENT ) {
2020-02-17 22:06:54 +01:00
float * w = arr . ptrw ( ) ;
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < p_vertex_len ; j + + ) {
2016-11-10 03:55:06 +01:00
2017-07-03 15:44:45 +02:00
const int8_t * v = ( const int8_t * ) & r [ j * total_elem_size + offsets [ i ] ] ;
2017-03-05 16:44:50 +01:00
for ( int k = 0 ; k < 4 ; k + + ) {
2017-07-03 15:44:45 +02:00
w [ j * 4 + k ] = float ( v [ k ] / 127.0 ) ;
2016-11-10 03:55:06 +01:00
}
}
} else {
2020-02-17 22:06:54 +01:00
float * w = arr . ptrw ( ) ;
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < p_vertex_len ; j + + ) {
const float * v = ( const float * ) & r [ j * total_elem_size + offsets [ i ] ] ;
for ( int k = 0 ; k < 4 ; k + + ) {
w [ j * 4 + k ] = v [ k ] ;
2016-11-10 03:55:06 +01:00
}
}
}
2017-03-05 16:44:50 +01:00
ret [ i ] = arr ;
2016-11-10 03:55:06 +01:00
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_COLOR : {
2016-11-10 03:55:06 +01:00
2020-02-17 22:06:54 +01:00
Vector < Color > arr ;
2016-11-10 03:55:06 +01:00
arr . resize ( p_vertex_len ) ;
2017-03-05 16:44:50 +01:00
if ( p_format & ARRAY_COMPRESS_COLOR ) {
2016-11-10 03:55:06 +01:00
2020-02-17 22:06:54 +01:00
Color * w = arr . ptrw ( ) ;
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < p_vertex_len ; j + + ) {
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
const uint8_t * v = ( const uint8_t * ) & r [ j * total_elem_size + offsets [ i ] ] ;
2017-06-17 03:17:25 +02:00
w [ j ] = Color ( float ( v [ 0 ] / 255.0 ) , float ( v [ 1 ] / 255.0 ) , float ( v [ 2 ] / 255.0 ) , float ( v [ 3 ] / 255.0 ) ) ;
2016-11-10 03:55:06 +01:00
}
} else {
2020-02-17 22:06:54 +01:00
Color * w = arr . ptrw ( ) ;
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < p_vertex_len ; j + + ) {
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
const float * v = ( const float * ) & r [ j * total_elem_size + offsets [ i ] ] ;
w [ j ] = Color ( v [ 0 ] , v [ 1 ] , v [ 2 ] , v [ 3 ] ) ;
2016-11-10 03:55:06 +01:00
}
}
2017-03-05 16:44:50 +01:00
ret [ i ] = arr ;
2016-11-10 03:55:06 +01:00
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_TEX_UV : {
2016-11-10 03:55:06 +01:00
2020-02-17 22:06:54 +01:00
Vector < Vector2 > arr ;
2016-11-10 03:55:06 +01:00
arr . resize ( p_vertex_len ) ;
2017-03-05 16:44:50 +01:00
if ( p_format & ARRAY_COMPRESS_TEX_UV ) {
2016-11-10 03:55:06 +01:00
2020-02-17 22:06:54 +01:00
Vector2 * w = arr . ptrw ( ) ;
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < p_vertex_len ; j + + ) {
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
const uint16_t * v = ( const uint16_t * ) & r [ j * total_elem_size + offsets [ i ] ] ;
w [ j ] = Vector2 ( Math : : halfptr_to_float ( & v [ 0 ] ) , Math : : halfptr_to_float ( & v [ 1 ] ) ) ;
2016-11-10 03:55:06 +01:00
}
} else {
2020-02-17 22:06:54 +01:00
Vector2 * w = arr . ptrw ( ) ;
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < p_vertex_len ; j + + ) {
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
const float * v = ( const float * ) & r [ j * total_elem_size + offsets [ i ] ] ;
w [ j ] = Vector2 ( v [ 0 ] , v [ 1 ] ) ;
2016-11-10 03:55:06 +01:00
}
}
2017-03-05 16:44:50 +01:00
ret [ i ] = arr ;
2016-11-10 03:55:06 +01:00
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_TEX_UV2 : {
2020-02-17 22:06:54 +01:00
Vector < Vector2 > arr ;
2016-11-10 03:55:06 +01:00
arr . resize ( p_vertex_len ) ;
2017-03-05 16:44:50 +01:00
if ( p_format & ARRAY_COMPRESS_TEX_UV2 ) {
2016-11-10 03:55:06 +01:00
2020-02-17 22:06:54 +01:00
Vector2 * w = arr . ptrw ( ) ;
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < p_vertex_len ; j + + ) {
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
const uint16_t * v = ( const uint16_t * ) & r [ j * total_elem_size + offsets [ i ] ] ;
w [ j ] = Vector2 ( Math : : halfptr_to_float ( & v [ 0 ] ) , Math : : halfptr_to_float ( & v [ 1 ] ) ) ;
2016-11-10 03:55:06 +01:00
}
} else {
2020-02-17 22:06:54 +01:00
Vector2 * w = arr . ptrw ( ) ;
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < p_vertex_len ; j + + ) {
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
const float * v = ( const float * ) & r [ j * total_elem_size + offsets [ i ] ] ;
w [ j ] = Vector2 ( v [ 0 ] , v [ 1 ] ) ;
2016-11-10 03:55:06 +01:00
}
}
2017-03-05 16:44:50 +01:00
ret [ i ] = arr ;
2016-11-10 03:55:06 +01:00
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_WEIGHTS : {
2016-11-10 03:55:06 +01:00
2020-02-17 22:06:54 +01:00
Vector < float > arr ;
2017-03-05 16:44:50 +01:00
arr . resize ( p_vertex_len * 4 ) ;
2019-08-19 00:40:52 +02:00
{
2020-02-17 22:06:54 +01:00
float * w = arr . ptrw ( ) ;
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < p_vertex_len ; j + + ) {
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
const uint16_t * v = ( const uint16_t * ) & r [ j * total_elem_size + offsets [ i ] ] ;
for ( int k = 0 ; k < 4 ; k + + ) {
2017-11-24 04:52:14 +01:00
w [ j * 4 + k ] = float ( v [ k ] / 65535.0 ) ;
2016-11-10 03:55:06 +01:00
}
}
}
2017-03-05 16:44:50 +01:00
ret [ i ] = arr ;
2016-11-10 03:55:06 +01:00
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_BONES : {
2016-11-10 03:55:06 +01:00
2020-02-17 22:06:54 +01:00
Vector < int > arr ;
2017-03-05 16:44:50 +01:00
arr . resize ( p_vertex_len * 4 ) ;
2016-11-10 03:55:06 +01:00
2020-02-17 22:06:54 +01:00
int * w = arr . ptrw ( ) ;
2016-11-10 03:55:06 +01:00
2019-08-19 00:40:52 +02:00
for ( int j = 0 ; j < p_vertex_len ; j + + ) {
2016-11-10 03:55:06 +01:00
2019-08-19 00:40:52 +02:00
const uint16_t * v = ( const uint16_t * ) & r [ j * total_elem_size + offsets [ i ] ] ;
for ( int k = 0 ; k < 4 ; k + + ) {
w [ j * 4 + k ] = v [ k ] ;
2016-11-10 03:55:06 +01:00
}
}
2017-03-05 16:44:50 +01:00
ret [ i ] = arr ;
2016-11-10 03:55:06 +01:00
} break ;
2020-03-27 19:21:27 +01:00
case RS : : ARRAY_INDEX : {
2018-01-18 21:37:17 +01:00
/* determine whether using 16 or 32 bits indices */
2016-11-10 03:55:06 +01:00
2020-02-17 22:06:54 +01:00
const uint8_t * ir = p_index_data . ptr ( ) ;
2016-11-10 03:55:06 +01:00
2020-02-17 22:06:54 +01:00
Vector < int > arr ;
2016-11-10 03:55:06 +01:00
arr . resize ( p_index_len ) ;
2017-03-05 16:44:50 +01:00
if ( p_vertex_len < ( 1 < < 16 ) ) {
2016-11-10 03:55:06 +01:00
2020-02-17 22:06:54 +01:00
int * w = arr . ptrw ( ) ;
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < p_index_len ; j + + ) {
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
const uint16_t * v = ( const uint16_t * ) & ir [ j * 2 ] ;
w [ j ] = * v ;
2016-11-10 03:55:06 +01:00
}
} else {
2020-02-17 22:06:54 +01:00
int * w = arr . ptrw ( ) ;
2016-11-10 03:55:06 +01:00
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < p_index_len ; j + + ) {
const int * v = ( const int * ) & ir [ j * 4 ] ;
w [ j ] = * v ;
2016-11-10 03:55:06 +01:00
}
}
2017-03-05 16:44:50 +01:00
ret [ i ] = arr ;
2016-11-10 03:55:06 +01:00
} break ;
default : {
2017-03-05 16:44:50 +01:00
ERR_FAIL_V ( ret ) ;
2016-11-10 03:55:06 +01:00
}
}
}
return ret ;
}
2020-03-27 19:21:27 +01:00
Array RenderingServer : : mesh_surface_get_arrays ( RID p_mesh , int p_surface ) const {
2016-11-10 03:55:06 +01:00
2019-08-19 00:40:52 +02:00
SurfaceData sd = mesh_get_surface ( p_mesh , p_surface ) ;
return mesh_create_arrays_from_surface_data ( sd ) ;
}
2016-11-10 03:55:06 +01:00
2020-03-27 19:21:27 +01:00
Dictionary RenderingServer : : mesh_surface_get_lods ( RID p_mesh , int p_surface ) const {
2016-11-10 03:55:06 +01:00
2019-08-19 00:40:52 +02:00
SurfaceData sd = mesh_get_surface ( p_mesh , p_surface ) ;
ERR_FAIL_COND_V ( sd . vertex_count = = 0 , Dictionary ( ) ) ;
2016-11-10 03:55:06 +01:00
2019-08-19 00:40:52 +02:00
Dictionary ret ;
for ( int i = 0 ; i < sd . lods . size ( ) ; i + + ) {
2020-02-17 22:06:54 +01:00
Vector < int > lods ;
2019-08-19 00:40:52 +02:00
if ( sd . vertex_count < = 65536 ) {
uint32_t lc = sd . lods [ i ] . index_data . size ( ) / 2 ;
lods . resize ( lc ) ;
2020-02-17 22:06:54 +01:00
const uint8_t * r = sd . lods [ i ] . index_data . ptr ( ) ;
const uint16_t * rptr = ( const uint16_t * ) r ;
int * w = lods . ptrw ( ) ;
2019-08-19 00:40:52 +02:00
for ( uint32_t j = 0 ; j < lc ; j + + ) {
w [ j ] = rptr [ i ] ;
}
} else {
uint32_t lc = sd . lods [ i ] . index_data . size ( ) / 4 ;
lods . resize ( lc ) ;
2020-02-17 22:06:54 +01:00
const uint8_t * r = sd . lods [ i ] . index_data . ptr ( ) ;
const uint32_t * rptr = ( const uint32_t * ) r ;
int * w = lods . ptrw ( ) ;
2019-08-19 00:40:52 +02:00
for ( uint32_t j = 0 ; j < lc ; j + + ) {
w [ j ] = rptr [ i ] ;
}
}
ret [ sd . lods [ i ] . edge_length ] = lods ;
}
return ret ;
2016-11-10 03:55:06 +01:00
}
2020-03-27 19:21:27 +01:00
Array RenderingServer : : mesh_surface_get_blend_shape_arrays ( RID p_mesh , int p_surface ) const {
2017-09-10 12:10:28 +02:00
2019-08-19 00:40:52 +02:00
SurfaceData sd = mesh_get_surface ( p_mesh , p_surface ) ;
ERR_FAIL_COND_V ( sd . vertex_count = = 0 , Array ( ) ) ;
2020-03-17 07:33:00 +01:00
Vector < Vector < uint8_t > > blend_shape_data = sd . blend_shapes ;
2019-08-19 00:40:52 +02:00
2017-09-10 12:10:28 +02:00
if ( blend_shape_data . size ( ) > 0 ) {
2019-08-19 00:40:52 +02:00
int vertex_len = sd . vertex_count ;
2017-09-10 12:10:28 +02:00
2020-02-17 22:06:54 +01:00
Vector < uint8_t > index_data = sd . index_data ;
2019-08-19 00:40:52 +02:00
int index_len = sd . index_count ;
2017-09-10 12:10:28 +02:00
2019-08-19 00:40:52 +02:00
uint32_t format = sd . format ;
2017-09-10 12:10:28 +02:00
Array blend_shape_array ;
blend_shape_array . resize ( blend_shape_data . size ( ) ) ;
for ( int i = 0 ; i < blend_shape_data . size ( ) ; i + + ) {
blend_shape_array . set ( i , _get_array_from_surface ( format , blend_shape_data [ i ] , vertex_len , index_data , index_len ) ) ;
}
return blend_shape_array ;
} else {
return Array ( ) ;
}
}
2020-03-27 19:21:27 +01:00
Array RenderingServer : : mesh_create_arrays_from_surface_data ( const SurfaceData & p_data ) const {
2019-08-19 00:40:52 +02:00
2020-02-17 22:06:54 +01:00
Vector < uint8_t > vertex_data = p_data . vertex_data ;
2019-08-19 00:40:52 +02:00
ERR_FAIL_COND_V ( vertex_data . size ( ) = = 0 , Array ( ) ) ;
int vertex_len = p_data . vertex_count ;
2020-02-17 22:06:54 +01:00
Vector < uint8_t > index_data = p_data . index_data ;
2019-08-19 00:40:52 +02:00
int index_len = p_data . index_count ;
uint32_t format = p_data . format ;
return _get_array_from_surface ( format , vertex_data , vertex_len , index_data , index_len ) ;
}
#if 0
2020-03-27 19:21:27 +01:00
Array RenderingServer : : _mesh_surface_get_skeleton_aabb_bind ( RID p_mesh , int p_surface ) const {
2017-10-20 00:24:49 +02:00
2020-03-27 19:21:27 +01:00
Vector < AABB > vec = RS : : get_singleton ( ) - > mesh_surface_get_skeleton_aabb ( p_mesh , p_surface ) ;
2017-10-20 00:24:49 +02:00
Array arr ;
for ( int i = 0 ; i < vec . size ( ) ; i + + ) {
arr [ i ] = vec [ i ] ;
}
return arr ;
}
2019-08-19 00:40:52 +02:00
# endif
2020-03-27 19:21:27 +01:00
void RenderingServer : : _bind_methods ( ) {
2014-02-10 02:10:30 +01:00
2020-03-27 19:21:27 +01:00
ClassDB : : bind_method ( D_METHOD ( " force_sync " ) , & RenderingServer : : sync ) ;
ClassDB : : bind_method ( D_METHOD ( " force_draw " , " swap_buffers " , " frame_step " ) , & RenderingServer : : draw , DEFVAL ( true ) , DEFVAL ( 0.0 ) ) ;
2017-10-20 00:24:49 +02:00
2019-06-22 18:34:26 +02:00
# ifndef _MSC_VER
2019-06-11 20:43:37 +02:00
# warning TODO all texture methods need re-binding
2019-06-22 18:34:26 +02:00
# endif
2019-06-11 20:43:37 +02:00
2020-03-27 19:21:27 +01:00
ClassDB : : bind_method ( D_METHOD ( " texture_2d_create " , " image " ) , & RenderingServer : : texture_2d_create ) ;
ClassDB : : bind_method ( D_METHOD ( " texture_2d_get " , " texture " ) , & RenderingServer : : texture_2d_get ) ;
2019-06-26 00:49:52 +02:00
2018-07-21 22:26:14 +02:00
# ifndef _3D_DISABLED
2020-03-27 19:21:27 +01:00
ClassDB : : bind_method ( D_METHOD ( " sky_create " ) , & RenderingServer : : sky_create ) ;
ClassDB : : bind_method ( D_METHOD ( " sky_set_material " , " sky " , " material " ) , & RenderingServer : : sky_set_material ) ;
2018-07-21 22:26:14 +02:00
# endif
2020-03-27 19:21:27 +01:00
ClassDB : : bind_method ( D_METHOD ( " shader_create " ) , & RenderingServer : : shader_create ) ;
ClassDB : : bind_method ( D_METHOD ( " shader_set_code " , " shader " , " code " ) , & RenderingServer : : shader_set_code ) ;
ClassDB : : bind_method ( D_METHOD ( " shader_get_code " , " shader " ) , & RenderingServer : : shader_get_code ) ;
ClassDB : : bind_method ( D_METHOD ( " shader_get_param_list " , " shader " ) , & RenderingServer : : _shader_get_param_list_bind ) ;
ClassDB : : bind_method ( D_METHOD ( " shader_set_default_texture_param " , " shader " , " name " , " texture " ) , & RenderingServer : : shader_set_default_texture_param ) ;
ClassDB : : bind_method ( D_METHOD ( " shader_get_default_texture_param " , " shader " , " name " ) , & RenderingServer : : shader_get_default_texture_param ) ;
ClassDB : : bind_method ( D_METHOD ( " shader_get_param_default " , " material " , " parameter " ) , & RenderingServer : : shader_get_param_default ) ;
ClassDB : : bind_method ( D_METHOD ( " material_create " ) , & RenderingServer : : material_create ) ;
ClassDB : : bind_method ( D_METHOD ( " material_set_shader " , " shader_material " , " shader " ) , & RenderingServer : : material_set_shader ) ;
ClassDB : : bind_method ( D_METHOD ( " material_set_param " , " material " , " parameter " , " value " ) , & RenderingServer : : material_set_param ) ;
ClassDB : : bind_method ( D_METHOD ( " material_get_param " , " material " , " parameter " ) , & RenderingServer : : material_get_param ) ;
ClassDB : : bind_method ( D_METHOD ( " material_set_render_priority " , " material " , " priority " ) , & RenderingServer : : material_set_render_priority ) ;
ClassDB : : bind_method ( D_METHOD ( " material_set_next_pass " , " material " , " next_material " ) , & RenderingServer : : material_set_next_pass ) ;
ClassDB : : bind_method ( D_METHOD ( " mesh_create " ) , & RenderingServer : : mesh_create ) ;
ClassDB : : bind_method ( D_METHOD ( " mesh_surface_get_format_offset " , " format " , " vertex_len " , " index_len " , " array_index " ) , & RenderingServer : : mesh_surface_get_format_offset ) ;
ClassDB : : bind_method ( D_METHOD ( " mesh_surface_get_format_stride " , " format " , " vertex_len " , " index_len " ) , & RenderingServer : : mesh_surface_get_format_stride ) ;
ClassDB : : bind_method ( D_METHOD ( " mesh_add_surface_from_arrays " , " mesh " , " primitive " , " arrays " , " blend_shapes " , " lods " , " compress_format " ) , & RenderingServer : : mesh_add_surface_from_arrays , DEFVAL ( Array ( ) ) , DEFVAL ( Dictionary ( ) ) , DEFVAL ( ARRAY_COMPRESS_DEFAULT ) ) ;
ClassDB : : bind_method ( D_METHOD ( " mesh_get_blend_shape_count " , " mesh " ) , & RenderingServer : : mesh_get_blend_shape_count ) ;
ClassDB : : bind_method ( D_METHOD ( " mesh_set_blend_shape_mode " , " mesh " , " mode " ) , & RenderingServer : : mesh_set_blend_shape_mode ) ;
ClassDB : : bind_method ( D_METHOD ( " mesh_get_blend_shape_mode " , " mesh " ) , & RenderingServer : : mesh_get_blend_shape_mode ) ;
ClassDB : : bind_method ( D_METHOD ( " mesh_surface_update_region " , " mesh " , " surface " , " offset " , " data " ) , & RenderingServer : : mesh_surface_update_region ) ;
ClassDB : : bind_method ( D_METHOD ( " mesh_surface_set_material " , " mesh " , " surface " , " material " ) , & RenderingServer : : mesh_surface_set_material ) ;
ClassDB : : bind_method ( D_METHOD ( " mesh_surface_get_material " , " mesh " , " surface " ) , & RenderingServer : : mesh_surface_get_material ) ;
ClassDB : : bind_method ( D_METHOD ( " mesh_surface_get_arrays " , " mesh " , " surface " ) , & RenderingServer : : mesh_surface_get_arrays ) ;
ClassDB : : bind_method ( D_METHOD ( " mesh_surface_get_blend_shape_arrays " , " mesh " , " surface " ) , & RenderingServer : : mesh_surface_get_blend_shape_arrays ) ;
ClassDB : : bind_method ( D_METHOD ( " mesh_get_surface_count " , " mesh " ) , & RenderingServer : : mesh_get_surface_count ) ;
ClassDB : : bind_method ( D_METHOD ( " mesh_set_custom_aabb " , " mesh " , " aabb " ) , & RenderingServer : : mesh_set_custom_aabb ) ;
ClassDB : : bind_method ( D_METHOD ( " mesh_get_custom_aabb " , " mesh " ) , & RenderingServer : : mesh_get_custom_aabb ) ;
ClassDB : : bind_method ( D_METHOD ( " mesh_clear " , " mesh " ) , & RenderingServer : : mesh_clear ) ;
ClassDB : : bind_method ( D_METHOD ( " multimesh_create " ) , & RenderingServer : : multimesh_create ) ;
ClassDB : : bind_method ( D_METHOD ( " multimesh_allocate " , " multimesh " , " instances " , " transform_format " , " color_format " , " custom_data_format " ) , & RenderingServer : : multimesh_allocate , DEFVAL ( false ) , DEFVAL ( false ) ) ;
ClassDB : : bind_method ( D_METHOD ( " multimesh_get_instance_count " , " multimesh " ) , & RenderingServer : : multimesh_get_instance_count ) ;
ClassDB : : bind_method ( D_METHOD ( " multimesh_set_mesh " , " multimesh " , " mesh " ) , & RenderingServer : : multimesh_set_mesh ) ;
ClassDB : : bind_method ( D_METHOD ( " multimesh_instance_set_transform " , " multimesh " , " index " , " transform " ) , & RenderingServer : : multimesh_instance_set_transform ) ;
ClassDB : : bind_method ( D_METHOD ( " multimesh_instance_set_transform_2d " , " multimesh " , " index " , " transform " ) , & RenderingServer : : multimesh_instance_set_transform_2d ) ;
ClassDB : : bind_method ( D_METHOD ( " multimesh_instance_set_color " , " multimesh " , " index " , " color " ) , & RenderingServer : : multimesh_instance_set_color ) ;
ClassDB : : bind_method ( D_METHOD ( " multimesh_instance_set_custom_data " , " multimesh " , " index " , " custom_data " ) , & RenderingServer : : multimesh_instance_set_custom_data ) ;
ClassDB : : bind_method ( D_METHOD ( " multimesh_get_mesh " , " multimesh " ) , & RenderingServer : : multimesh_get_mesh ) ;
ClassDB : : bind_method ( D_METHOD ( " multimesh_get_aabb " , " multimesh " ) , & RenderingServer : : multimesh_get_aabb ) ;
ClassDB : : bind_method ( D_METHOD ( " multimesh_instance_get_transform " , " multimesh " , " index " ) , & RenderingServer : : multimesh_instance_get_transform ) ;
ClassDB : : bind_method ( D_METHOD ( " multimesh_instance_get_transform_2d " , " multimesh " , " index " ) , & RenderingServer : : multimesh_instance_get_transform_2d ) ;
ClassDB : : bind_method ( D_METHOD ( " multimesh_instance_get_color " , " multimesh " , " index " ) , & RenderingServer : : multimesh_instance_get_color ) ;
ClassDB : : bind_method ( D_METHOD ( " multimesh_instance_get_custom_data " , " multimesh " , " index " ) , & RenderingServer : : multimesh_instance_get_custom_data ) ;
ClassDB : : bind_method ( D_METHOD ( " multimesh_set_visible_instances " , " multimesh " , " visible " ) , & RenderingServer : : multimesh_set_visible_instances ) ;
ClassDB : : bind_method ( D_METHOD ( " multimesh_get_visible_instances " , " multimesh " ) , & RenderingServer : : multimesh_get_visible_instances ) ;
ClassDB : : bind_method ( D_METHOD ( " multimesh_set_buffer " , " multimesh " , " buffer " ) , & RenderingServer : : multimesh_set_buffer ) ;
ClassDB : : bind_method ( D_METHOD ( " multimesh_get_buffer " , " multimesh " ) , & RenderingServer : : multimesh_get_buffer ) ;
2018-07-21 22:26:14 +02:00
# ifndef _3D_DISABLED
2020-03-27 19:21:27 +01:00
ClassDB : : bind_method ( D_METHOD ( " immediate_create " ) , & RenderingServer : : immediate_create ) ;
ClassDB : : bind_method ( D_METHOD ( " immediate_begin " , " immediate " , " primitive " , " texture " ) , & RenderingServer : : immediate_begin , DEFVAL ( RID ( ) ) ) ;
ClassDB : : bind_method ( D_METHOD ( " immediate_vertex " , " immediate " , " vertex " ) , & RenderingServer : : immediate_vertex ) ;
ClassDB : : bind_method ( D_METHOD ( " immediate_vertex_2d " , " immediate " , " vertex " ) , & RenderingServer : : immediate_vertex_2d ) ;
ClassDB : : bind_method ( D_METHOD ( " immediate_normal " , " immediate " , " normal " ) , & RenderingServer : : immediate_normal ) ;
ClassDB : : bind_method ( D_METHOD ( " immediate_tangent " , " immediate " , " tangent " ) , & RenderingServer : : immediate_tangent ) ;
ClassDB : : bind_method ( D_METHOD ( " immediate_color " , " immediate " , " color " ) , & RenderingServer : : immediate_color ) ;
ClassDB : : bind_method ( D_METHOD ( " immediate_uv " , " immediate " , " tex_uv " ) , & RenderingServer : : immediate_uv ) ;
ClassDB : : bind_method ( D_METHOD ( " immediate_uv2 " , " immediate " , " tex_uv " ) , & RenderingServer : : immediate_uv2 ) ;
ClassDB : : bind_method ( D_METHOD ( " immediate_end " , " immediate " ) , & RenderingServer : : immediate_end ) ;
ClassDB : : bind_method ( D_METHOD ( " immediate_clear " , " immediate " ) , & RenderingServer : : immediate_clear ) ;
ClassDB : : bind_method ( D_METHOD ( " immediate_set_material " , " immediate " , " material " ) , & RenderingServer : : immediate_set_material ) ;
ClassDB : : bind_method ( D_METHOD ( " immediate_get_material " , " immediate " ) , & RenderingServer : : immediate_get_material ) ;
2018-07-21 22:26:14 +02:00
# endif
Added all missing VisualServer bindings
- Added bindings for multimesh, immediate, skeleton, light, reflection probe, gi probe, lightmap, particles, camera, environment, scenario, instance
- Removed draw and sync, were duplicates of force_* equivalents
- Bumped binders max arguments from 11 to 13
- Wrote some wrappers as not all methods were variant-friendly
2018-01-20 16:18:51 +01:00
2020-03-27 19:21:27 +01:00
ClassDB : : bind_method ( D_METHOD ( " skeleton_create " ) , & RenderingServer : : skeleton_create ) ;
ClassDB : : bind_method ( D_METHOD ( " skeleton_allocate " , " skeleton " , " bones " , " is_2d_skeleton " ) , & RenderingServer : : skeleton_allocate , DEFVAL ( false ) ) ;
ClassDB : : bind_method ( D_METHOD ( " skeleton_get_bone_count " , " skeleton " ) , & RenderingServer : : skeleton_get_bone_count ) ;
ClassDB : : bind_method ( D_METHOD ( " skeleton_bone_set_transform " , " skeleton " , " bone " , " transform " ) , & RenderingServer : : skeleton_bone_set_transform ) ;
ClassDB : : bind_method ( D_METHOD ( " skeleton_bone_get_transform " , " skeleton " , " bone " ) , & RenderingServer : : skeleton_bone_get_transform ) ;
ClassDB : : bind_method ( D_METHOD ( " skeleton_bone_set_transform_2d " , " skeleton " , " bone " , " transform " ) , & RenderingServer : : skeleton_bone_set_transform_2d ) ;
ClassDB : : bind_method ( D_METHOD ( " skeleton_bone_get_transform_2d " , " skeleton " , " bone " ) , & RenderingServer : : skeleton_bone_get_transform_2d ) ;
Added all missing VisualServer bindings
- Added bindings for multimesh, immediate, skeleton, light, reflection probe, gi probe, lightmap, particles, camera, environment, scenario, instance
- Removed draw and sync, were duplicates of force_* equivalents
- Bumped binders max arguments from 11 to 13
- Wrote some wrappers as not all methods were variant-friendly
2018-01-20 16:18:51 +01:00
2018-07-21 22:26:14 +02:00
# ifndef _3D_DISABLED
2020-03-27 19:21:27 +01:00
ClassDB : : bind_method ( D_METHOD ( " directional_light_create " ) , & RenderingServer : : directional_light_create ) ;
ClassDB : : bind_method ( D_METHOD ( " omni_light_create " ) , & RenderingServer : : omni_light_create ) ;
ClassDB : : bind_method ( D_METHOD ( " spot_light_create " ) , & RenderingServer : : spot_light_create ) ;
ClassDB : : bind_method ( D_METHOD ( " light_set_color " , " light " , " color " ) , & RenderingServer : : light_set_color ) ;
ClassDB : : bind_method ( D_METHOD ( " light_set_param " , " light " , " param " , " value " ) , & RenderingServer : : light_set_param ) ;
ClassDB : : bind_method ( D_METHOD ( " light_set_shadow " , " light " , " enabled " ) , & RenderingServer : : light_set_shadow ) ;
ClassDB : : bind_method ( D_METHOD ( " light_set_shadow_color " , " light " , " color " ) , & RenderingServer : : light_set_shadow_color ) ;
ClassDB : : bind_method ( D_METHOD ( " light_set_projector " , " light " , " texture " ) , & RenderingServer : : light_set_projector ) ;
ClassDB : : bind_method ( D_METHOD ( " light_set_negative " , " light " , " enable " ) , & RenderingServer : : light_set_negative ) ;
ClassDB : : bind_method ( D_METHOD ( " light_set_cull_mask " , " light " , " mask " ) , & RenderingServer : : light_set_cull_mask ) ;
ClassDB : : bind_method ( D_METHOD ( " light_set_reverse_cull_face_mode " , " light " , " enabled " ) , & RenderingServer : : light_set_reverse_cull_face_mode ) ;
ClassDB : : bind_method ( D_METHOD ( " light_set_use_gi " , " light " , " enabled " ) , & RenderingServer : : light_set_use_gi ) ;
ClassDB : : bind_method ( D_METHOD ( " light_omni_set_shadow_mode " , " light " , " mode " ) , & RenderingServer : : light_omni_set_shadow_mode ) ;
ClassDB : : bind_method ( D_METHOD ( " light_directional_set_shadow_mode " , " light " , " mode " ) , & RenderingServer : : light_directional_set_shadow_mode ) ;
ClassDB : : bind_method ( D_METHOD ( " light_directional_set_blend_splits " , " light " , " enable " ) , & RenderingServer : : light_directional_set_blend_splits ) ;
ClassDB : : bind_method ( D_METHOD ( " light_directional_set_shadow_depth_range_mode " , " light " , " range_mode " ) , & RenderingServer : : light_directional_set_shadow_depth_range_mode ) ;
ClassDB : : bind_method ( D_METHOD ( " reflection_probe_create " ) , & RenderingServer : : reflection_probe_create ) ;
ClassDB : : bind_method ( D_METHOD ( " reflection_probe_set_update_mode " , " probe " , " mode " ) , & RenderingServer : : reflection_probe_set_update_mode ) ;
ClassDB : : bind_method ( D_METHOD ( " reflection_probe_set_intensity " , " probe " , " intensity " ) , & RenderingServer : : reflection_probe_set_intensity ) ;
ClassDB : : bind_method ( D_METHOD ( " reflection_probe_set_interior_ambient " , " probe " , " color " ) , & RenderingServer : : reflection_probe_set_interior_ambient ) ;
ClassDB : : bind_method ( D_METHOD ( " reflection_probe_set_interior_ambient_energy " , " probe " , " energy " ) , & RenderingServer : : reflection_probe_set_interior_ambient_energy ) ;
ClassDB : : bind_method ( D_METHOD ( " reflection_probe_set_interior_ambient_probe_contribution " , " probe " , " contrib " ) , & RenderingServer : : reflection_probe_set_interior_ambient_probe_contribution ) ;
ClassDB : : bind_method ( D_METHOD ( " reflection_probe_set_max_distance " , " probe " , " distance " ) , & RenderingServer : : reflection_probe_set_max_distance ) ;
ClassDB : : bind_method ( D_METHOD ( " reflection_probe_set_extents " , " probe " , " extents " ) , & RenderingServer : : reflection_probe_set_extents ) ;
ClassDB : : bind_method ( D_METHOD ( " reflection_probe_set_origin_offset " , " probe " , " offset " ) , & RenderingServer : : reflection_probe_set_origin_offset ) ;
ClassDB : : bind_method ( D_METHOD ( " reflection_probe_set_as_interior " , " probe " , " enable " ) , & RenderingServer : : reflection_probe_set_as_interior ) ;
ClassDB : : bind_method ( D_METHOD ( " reflection_probe_set_enable_box_projection " , " probe " , " enable " ) , & RenderingServer : : reflection_probe_set_enable_box_projection ) ;
ClassDB : : bind_method ( D_METHOD ( " reflection_probe_set_enable_shadows " , " probe " , " enable " ) , & RenderingServer : : reflection_probe_set_enable_shadows ) ;
ClassDB : : bind_method ( D_METHOD ( " reflection_probe_set_cull_mask " , " probe " , " layers " ) , & RenderingServer : : reflection_probe_set_cull_mask ) ;
Added all missing VisualServer bindings
- Added bindings for multimesh, immediate, skeleton, light, reflection probe, gi probe, lightmap, particles, camera, environment, scenario, instance
- Removed draw and sync, were duplicates of force_* equivalents
- Bumped binders max arguments from 11 to 13
- Wrote some wrappers as not all methods were variant-friendly
2018-01-20 16:18:51 +01:00
2019-10-03 22:39:08 +02:00
# ifndef _MSC_VER
# warning TODO all giprobe methods need re-binding
# endif
#if 0
2020-03-27 19:21:27 +01:00
ClassDB : : bind_method ( D_METHOD ( " gi_probe_create " ) , & RenderingServer : : gi_probe_create ) ;
ClassDB : : bind_method ( D_METHOD ( " gi_probe_set_bounds " , " probe " , " bounds " ) , & RenderingServer : : gi_probe_set_bounds ) ;
ClassDB : : bind_method ( D_METHOD ( " gi_probe_get_bounds " , " probe " ) , & RenderingServer : : gi_probe_get_bounds ) ;
ClassDB : : bind_method ( D_METHOD ( " gi_probe_set_cell_size " , " probe " , " range " ) , & RenderingServer : : gi_probe_set_cell_size ) ;
ClassDB : : bind_method ( D_METHOD ( " gi_probe_get_cell_size " , " probe " ) , & RenderingServer : : gi_probe_get_cell_size ) ;
ClassDB : : bind_method ( D_METHOD ( " gi_probe_set_to_cell_xform " , " probe " , " xform " ) , & RenderingServer : : gi_probe_set_to_cell_xform ) ;
ClassDB : : bind_method ( D_METHOD ( " gi_probe_get_to_cell_xform " , " probe " ) , & RenderingServer : : gi_probe_get_to_cell_xform ) ;
ClassDB : : bind_method ( D_METHOD ( " gi_probe_set_dynamic_data " , " probe " , " data " ) , & RenderingServer : : gi_probe_set_dynamic_data ) ;
ClassDB : : bind_method ( D_METHOD ( " gi_probe_get_dynamic_data " , " probe " ) , & RenderingServer : : gi_probe_get_dynamic_data ) ;
ClassDB : : bind_method ( D_METHOD ( " gi_probe_set_dynamic_range " , " probe " , " range " ) , & RenderingServer : : gi_probe_set_dynamic_range ) ;
ClassDB : : bind_method ( D_METHOD ( " gi_probe_get_dynamic_range " , " probe " ) , & RenderingServer : : gi_probe_get_dynamic_range ) ;
ClassDB : : bind_method ( D_METHOD ( " gi_probe_set_energy " , " probe " , " energy " ) , & RenderingServer : : gi_probe_set_energy ) ;
ClassDB : : bind_method ( D_METHOD ( " gi_probe_get_energy " , " probe " ) , & RenderingServer : : gi_probe_get_energy ) ;
ClassDB : : bind_method ( D_METHOD ( " gi_probe_set_bias " , " probe " , " bias " ) , & RenderingServer : : gi_probe_set_bias ) ;
ClassDB : : bind_method ( D_METHOD ( " gi_probe_get_bias " , " probe " ) , & RenderingServer : : gi_probe_get_bias ) ;
ClassDB : : bind_method ( D_METHOD ( " gi_probe_set_normal_bias " , " probe " , " bias " ) , & RenderingServer : : gi_probe_set_normal_bias ) ;
ClassDB : : bind_method ( D_METHOD ( " gi_probe_get_normal_bias " , " probe " ) , & RenderingServer : : gi_probe_get_normal_bias ) ;
ClassDB : : bind_method ( D_METHOD ( " gi_probe_set_propagation " , " probe " , " propagation " ) , & RenderingServer : : gi_probe_set_propagation ) ;
ClassDB : : bind_method ( D_METHOD ( " gi_probe_get_propagation " , " probe " ) , & RenderingServer : : gi_probe_get_propagation ) ;
ClassDB : : bind_method ( D_METHOD ( " gi_probe_set_interior " , " probe " , " enable " ) , & RenderingServer : : gi_probe_set_interior ) ;
ClassDB : : bind_method ( D_METHOD ( " gi_probe_is_interior " , " probe " ) , & RenderingServer : : gi_probe_is_interior ) ;
ClassDB : : bind_method ( D_METHOD ( " gi_probe_set_compress " , " probe " , " enable " ) , & RenderingServer : : gi_probe_set_compress ) ;
ClassDB : : bind_method ( D_METHOD ( " gi_probe_is_compressed " , " probe " ) , & RenderingServer : : gi_probe_is_compressed ) ;
2019-10-03 22:39:08 +02:00
# endif
Added all missing VisualServer bindings
- Added bindings for multimesh, immediate, skeleton, light, reflection probe, gi probe, lightmap, particles, camera, environment, scenario, instance
- Removed draw and sync, were duplicates of force_* equivalents
- Bumped binders max arguments from 11 to 13
- Wrote some wrappers as not all methods were variant-friendly
2018-01-20 16:18:51 +01:00
2020-03-27 19:21:27 +01:00
ClassDB : : bind_method ( D_METHOD ( " lightmap_capture_create " ) , & RenderingServer : : lightmap_capture_create ) ;
ClassDB : : bind_method ( D_METHOD ( " lightmap_capture_set_bounds " , " capture " , " bounds " ) , & RenderingServer : : lightmap_capture_set_bounds ) ;
ClassDB : : bind_method ( D_METHOD ( " lightmap_capture_get_bounds " , " capture " ) , & RenderingServer : : lightmap_capture_get_bounds ) ;
ClassDB : : bind_method ( D_METHOD ( " lightmap_capture_set_octree " , " capture " , " octree " ) , & RenderingServer : : lightmap_capture_set_octree ) ;
ClassDB : : bind_method ( D_METHOD ( " lightmap_capture_set_octree_cell_transform " , " capture " , " xform " ) , & RenderingServer : : lightmap_capture_set_octree_cell_transform ) ;
ClassDB : : bind_method ( D_METHOD ( " lightmap_capture_get_octree_cell_transform " , " capture " ) , & RenderingServer : : lightmap_capture_get_octree_cell_transform ) ;
ClassDB : : bind_method ( D_METHOD ( " lightmap_capture_set_octree_cell_subdiv " , " capture " , " subdiv " ) , & RenderingServer : : lightmap_capture_set_octree_cell_subdiv ) ;
ClassDB : : bind_method ( D_METHOD ( " lightmap_capture_get_octree_cell_subdiv " , " capture " ) , & RenderingServer : : lightmap_capture_get_octree_cell_subdiv ) ;
ClassDB : : bind_method ( D_METHOD ( " lightmap_capture_get_octree " , " capture " ) , & RenderingServer : : lightmap_capture_get_octree ) ;
ClassDB : : bind_method ( D_METHOD ( " lightmap_capture_set_energy " , " capture " , " energy " ) , & RenderingServer : : lightmap_capture_set_energy ) ;
ClassDB : : bind_method ( D_METHOD ( " lightmap_capture_get_energy " , " capture " ) , & RenderingServer : : lightmap_capture_get_energy ) ;
2018-07-21 22:26:14 +02:00
# endif
2020-03-27 19:21:27 +01:00
ClassDB : : bind_method ( D_METHOD ( " particles_create " ) , & RenderingServer : : particles_create ) ;
ClassDB : : bind_method ( D_METHOD ( " particles_set_emitting " , " particles " , " emitting " ) , & RenderingServer : : particles_set_emitting ) ;
ClassDB : : bind_method ( D_METHOD ( " particles_get_emitting " , " particles " ) , & RenderingServer : : particles_get_emitting ) ;
ClassDB : : bind_method ( D_METHOD ( " particles_set_amount " , " particles " , " amount " ) , & RenderingServer : : particles_set_amount ) ;
ClassDB : : bind_method ( D_METHOD ( " particles_set_lifetime " , " particles " , " lifetime " ) , & RenderingServer : : particles_set_lifetime ) ;
ClassDB : : bind_method ( D_METHOD ( " particles_set_one_shot " , " particles " , " one_shot " ) , & RenderingServer : : particles_set_one_shot ) ;
ClassDB : : bind_method ( D_METHOD ( " particles_set_pre_process_time " , " particles " , " time " ) , & RenderingServer : : particles_set_pre_process_time ) ;
ClassDB : : bind_method ( D_METHOD ( " particles_set_explosiveness_ratio " , " particles " , " ratio " ) , & RenderingServer : : particles_set_explosiveness_ratio ) ;
ClassDB : : bind_method ( D_METHOD ( " particles_set_randomness_ratio " , " particles " , " ratio " ) , & RenderingServer : : particles_set_randomness_ratio ) ;
ClassDB : : bind_method ( D_METHOD ( " particles_set_custom_aabb " , " particles " , " aabb " ) , & RenderingServer : : particles_set_custom_aabb ) ;
ClassDB : : bind_method ( D_METHOD ( " particles_set_speed_scale " , " particles " , " scale " ) , & RenderingServer : : particles_set_speed_scale ) ;
ClassDB : : bind_method ( D_METHOD ( " particles_set_use_local_coordinates " , " particles " , " enable " ) , & RenderingServer : : particles_set_use_local_coordinates ) ;
ClassDB : : bind_method ( D_METHOD ( " particles_set_process_material " , " particles " , " material " ) , & RenderingServer : : particles_set_process_material ) ;
ClassDB : : bind_method ( D_METHOD ( " particles_set_fixed_fps " , " particles " , " fps " ) , & RenderingServer : : particles_set_fixed_fps ) ;
ClassDB : : bind_method ( D_METHOD ( " particles_set_fractional_delta " , " particles " , " enable " ) , & RenderingServer : : particles_set_fractional_delta ) ;
ClassDB : : bind_method ( D_METHOD ( " particles_is_inactive " , " particles " ) , & RenderingServer : : particles_is_inactive ) ;
ClassDB : : bind_method ( D_METHOD ( " particles_request_process " , " particles " ) , & RenderingServer : : particles_request_process ) ;
ClassDB : : bind_method ( D_METHOD ( " particles_restart " , " particles " ) , & RenderingServer : : particles_restart ) ;
ClassDB : : bind_method ( D_METHOD ( " particles_set_draw_order " , " particles " , " order " ) , & RenderingServer : : particles_set_draw_order ) ;
ClassDB : : bind_method ( D_METHOD ( " particles_set_draw_passes " , " particles " , " count " ) , & RenderingServer : : particles_set_draw_passes ) ;
ClassDB : : bind_method ( D_METHOD ( " particles_set_draw_pass_mesh " , " particles " , " pass " , " mesh " ) , & RenderingServer : : particles_set_draw_pass_mesh ) ;
ClassDB : : bind_method ( D_METHOD ( " particles_get_current_aabb " , " particles " ) , & RenderingServer : : particles_get_current_aabb ) ;
ClassDB : : bind_method ( D_METHOD ( " particles_set_emission_transform " , " particles " , " transform " ) , & RenderingServer : : particles_set_emission_transform ) ;
ClassDB : : bind_method ( D_METHOD ( " camera_create " ) , & RenderingServer : : camera_create ) ;
ClassDB : : bind_method ( D_METHOD ( " camera_set_perspective " , " camera " , " fovy_degrees " , " z_near " , " z_far " ) , & RenderingServer : : camera_set_perspective ) ;
ClassDB : : bind_method ( D_METHOD ( " camera_set_orthogonal " , " camera " , " size " , " z_near " , " z_far " ) , & RenderingServer : : camera_set_orthogonal ) ;
ClassDB : : bind_method ( D_METHOD ( " camera_set_frustum " , " camera " , " size " , " offset " , " z_near " , " z_far " ) , & RenderingServer : : camera_set_frustum ) ;
ClassDB : : bind_method ( D_METHOD ( " camera_set_transform " , " camera " , " transform " ) , & RenderingServer : : camera_set_transform ) ;
ClassDB : : bind_method ( D_METHOD ( " camera_set_cull_mask " , " camera " , " layers " ) , & RenderingServer : : camera_set_cull_mask ) ;
ClassDB : : bind_method ( D_METHOD ( " camera_set_environment " , " camera " , " env " ) , & RenderingServer : : camera_set_environment ) ;
ClassDB : : bind_method ( D_METHOD ( " camera_set_use_vertical_aspect " , " camera " , " enable " ) , & RenderingServer : : camera_set_use_vertical_aspect ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_create " ) , & RenderingServer : : viewport_create ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_set_use_arvr " , " viewport " , " use_arvr " ) , & RenderingServer : : viewport_set_use_arvr ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_set_size " , " viewport " , " width " , " height " ) , & RenderingServer : : viewport_set_size ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_set_active " , " viewport " , " active " ) , & RenderingServer : : viewport_set_active ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_set_parent_viewport " , " viewport " , " parent_viewport " ) , & RenderingServer : : viewport_set_parent_viewport ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_attach_to_screen " , " viewport " , " rect " , " screen " ) , & RenderingServer : : viewport_attach_to_screen , DEFVAL ( Rect2 ( ) ) , DEFVAL ( DisplayServer : : MAIN_WINDOW_ID ) ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_set_render_direct_to_screen " , " viewport " , " enabled " ) , & RenderingServer : : viewport_set_render_direct_to_screen ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_set_update_mode " , " viewport " , " update_mode " ) , & RenderingServer : : viewport_set_update_mode ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_set_clear_mode " , " viewport " , " clear_mode " ) , & RenderingServer : : viewport_set_clear_mode ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_get_texture " , " viewport " ) , & RenderingServer : : viewport_get_texture ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_set_hide_scenario " , " viewport " , " hidden " ) , & RenderingServer : : viewport_set_hide_scenario ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_set_hide_canvas " , " viewport " , " hidden " ) , & RenderingServer : : viewport_set_hide_canvas ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_set_disable_environment " , " viewport " , " disabled " ) , & RenderingServer : : viewport_set_disable_environment ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_attach_camera " , " viewport " , " camera " ) , & RenderingServer : : viewport_attach_camera ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_set_scenario " , " viewport " , " scenario " ) , & RenderingServer : : viewport_set_scenario ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_attach_canvas " , " viewport " , " canvas " ) , & RenderingServer : : viewport_attach_canvas ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_remove_canvas " , " viewport " , " canvas " ) , & RenderingServer : : viewport_remove_canvas ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_set_canvas_transform " , " viewport " , " canvas " , " offset " ) , & RenderingServer : : viewport_set_canvas_transform ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_set_transparent_background " , " viewport " , " enabled " ) , & RenderingServer : : viewport_set_transparent_background ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_set_global_canvas_transform " , " viewport " , " transform " ) , & RenderingServer : : viewport_set_global_canvas_transform ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_set_canvas_stacking " , " viewport " , " canvas " , " layer " , " sublayer " ) , & RenderingServer : : viewport_set_canvas_stacking ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_set_shadow_atlas_size " , " viewport " , " size " ) , & RenderingServer : : viewport_set_shadow_atlas_size ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_set_shadow_atlas_quadrant_subdivision " , " viewport " , " quadrant " , " subdivision " ) , & RenderingServer : : viewport_set_shadow_atlas_quadrant_subdivision ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_set_msaa " , " viewport " , " msaa " ) , & RenderingServer : : viewport_set_msaa ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_get_render_info " , " viewport " , " info " ) , & RenderingServer : : viewport_get_render_info ) ;
ClassDB : : bind_method ( D_METHOD ( " viewport_set_debug_draw " , " viewport " , " draw " ) , & RenderingServer : : viewport_set_debug_draw ) ;
ClassDB : : bind_method ( D_METHOD ( " environment_create " ) , & RenderingServer : : environment_create ) ;
ClassDB : : bind_method ( D_METHOD ( " environment_set_background " , " env " , " bg " ) , & RenderingServer : : environment_set_background ) ;
ClassDB : : bind_method ( D_METHOD ( " environment_set_sky " , " env " , " sky " ) , & RenderingServer : : environment_set_sky ) ;
ClassDB : : bind_method ( D_METHOD ( " environment_set_sky_custom_fov " , " env " , " scale " ) , & RenderingServer : : environment_set_sky_custom_fov ) ;
ClassDB : : bind_method ( D_METHOD ( " environment_set_sky_orientation " , " env " , " orientation " ) , & RenderingServer : : environment_set_sky_orientation ) ;
ClassDB : : bind_method ( D_METHOD ( " environment_set_bg_color " , " env " , " color " ) , & RenderingServer : : environment_set_bg_color ) ;
ClassDB : : bind_method ( D_METHOD ( " environment_set_bg_energy " , " env " , " energy " ) , & RenderingServer : : environment_set_bg_energy ) ;
ClassDB : : bind_method ( D_METHOD ( " environment_set_canvas_max_layer " , " env " , " max_layer " ) , & RenderingServer : : environment_set_canvas_max_layer ) ;
ClassDB : : bind_method ( D_METHOD ( " environment_set_ambient_light " , " env " , " color " , " ambient " , " energy " , " sky_contibution " , " reflection_source " , " ao_color " ) , & RenderingServer : : environment_set_ambient_light , DEFVAL ( RS : : ENV_AMBIENT_SOURCE_BG ) , DEFVAL ( 1.0 ) , DEFVAL ( 0.0 ) , DEFVAL ( RS : : ENV_REFLECTION_SOURCE_BG ) , DEFVAL ( Color ( ) ) ) ;
2020-03-31 11:56:58 +02:00
ClassDB : : bind_method ( D_METHOD ( " environment_set_glow " , " env " , " enable " , " level_flags " , " intensity " , " strength " , " mix " , " bloom_threshold " , " blend_mode " , " hdr_bleed_threshold " , " hdr_bleed_scale " , " hdr_luminance_cap " ) , & RenderingServer : : environment_set_glow ) ;
2020-03-27 19:21:27 +01:00
ClassDB : : bind_method ( D_METHOD ( " environment_set_tonemap " , " env " , " tone_mapper " , " exposure " , " white " , " auto_exposure " , " min_luminance " , " max_luminance " , " auto_exp_speed " , " auto_exp_grey " ) , & RenderingServer : : environment_set_tonemap ) ;
ClassDB : : bind_method ( D_METHOD ( " environment_set_adjustment " , " env " , " enable " , " brightness " , " contrast " , " saturation " , " ramp " ) , & RenderingServer : : environment_set_adjustment ) ;
2020-04-03 01:38:48 +02:00
ClassDB : : bind_method ( D_METHOD ( " environment_set_ssr " , " env " , " enable " , " max_steps " , " fade_in " , " fade_out " , " depth_tolerance " ) , & RenderingServer : : environment_set_ssr ) ;
2020-03-27 19:21:27 +01:00
ClassDB : : bind_method ( D_METHOD ( " environment_set_ssao " , " env " , " enable " , " radius " , " intensity " , " bias " , " light_affect " , " ao_channel_affect " , " blur " , " bilateral_sharpness " ) , & RenderingServer : : environment_set_ssao ) ;
ClassDB : : bind_method ( D_METHOD ( " environment_set_fog " , " env " , " enable " , " color " , " sun_color " , " sun_amount " ) , & RenderingServer : : environment_set_fog ) ;
ClassDB : : bind_method ( D_METHOD ( " environment_set_fog_depth " , " env " , " enable " , " depth_begin " , " depth_end " , " depth_curve " , " transmit " , " transmit_curve " ) , & RenderingServer : : environment_set_fog_depth ) ;
ClassDB : : bind_method ( D_METHOD ( " environment_set_fog_height " , " env " , " enable " , " min_height " , " max_height " , " height_curve " ) , & RenderingServer : : environment_set_fog_height ) ;
ClassDB : : bind_method ( D_METHOD ( " scenario_create " ) , & RenderingServer : : scenario_create ) ;
ClassDB : : bind_method ( D_METHOD ( " scenario_set_debug " , " scenario " , " debug_mode " ) , & RenderingServer : : scenario_set_debug ) ;
ClassDB : : bind_method ( D_METHOD ( " scenario_set_environment " , " scenario " , " environment " ) , & RenderingServer : : scenario_set_environment ) ;
ClassDB : : bind_method ( D_METHOD ( " scenario_set_fallback_environment " , " scenario " , " environment " ) , & RenderingServer : : scenario_set_fallback_environment ) ;
Added all missing VisualServer bindings
- Added bindings for multimesh, immediate, skeleton, light, reflection probe, gi probe, lightmap, particles, camera, environment, scenario, instance
- Removed draw and sync, were duplicates of force_* equivalents
- Bumped binders max arguments from 11 to 13
- Wrote some wrappers as not all methods were variant-friendly
2018-01-20 16:18:51 +01:00
2018-07-21 22:26:14 +02:00
# ifndef _3D_DISABLED
2020-03-27 19:21:27 +01:00
ClassDB : : bind_method ( D_METHOD ( " instance_create2 " , " base " , " scenario " ) , & RenderingServer : : instance_create2 ) ;
ClassDB : : bind_method ( D_METHOD ( " instance_create " ) , & RenderingServer : : instance_create ) ;
ClassDB : : bind_method ( D_METHOD ( " instance_set_base " , " instance " , " base " ) , & RenderingServer : : instance_set_base ) ;
ClassDB : : bind_method ( D_METHOD ( " instance_set_scenario " , " instance " , " scenario " ) , & RenderingServer : : instance_set_scenario ) ;
ClassDB : : bind_method ( D_METHOD ( " instance_set_layer_mask " , " instance " , " mask " ) , & RenderingServer : : instance_set_layer_mask ) ;
ClassDB : : bind_method ( D_METHOD ( " instance_set_transform " , " instance " , " transform " ) , & RenderingServer : : instance_set_transform ) ;
ClassDB : : bind_method ( D_METHOD ( " instance_attach_object_instance_id " , " instance " , " id " ) , & RenderingServer : : instance_attach_object_instance_id ) ;
ClassDB : : bind_method ( D_METHOD ( " instance_set_blend_shape_weight " , " instance " , " shape " , " weight " ) , & RenderingServer : : instance_set_blend_shape_weight ) ;
ClassDB : : bind_method ( D_METHOD ( " instance_set_surface_material " , " instance " , " surface " , " material " ) , & RenderingServer : : instance_set_surface_material ) ;
ClassDB : : bind_method ( D_METHOD ( " instance_set_visible " , " instance " , " visible " ) , & RenderingServer : : instance_set_visible ) ;
ClassDB : : bind_method ( D_METHOD ( " instance_set_use_lightmap " , " instance " , " lightmap_instance " , " lightmap " ) , & RenderingServer : : instance_set_use_lightmap ) ;
ClassDB : : bind_method ( D_METHOD ( " instance_set_custom_aabb " , " instance " , " aabb " ) , & RenderingServer : : instance_set_custom_aabb ) ;
ClassDB : : bind_method ( D_METHOD ( " instance_attach_skeleton " , " instance " , " skeleton " ) , & RenderingServer : : instance_attach_skeleton ) ;
ClassDB : : bind_method ( D_METHOD ( " instance_set_exterior " , " instance " , " enabled " ) , & RenderingServer : : instance_set_exterior ) ;
ClassDB : : bind_method ( D_METHOD ( " instance_set_extra_visibility_margin " , " instance " , " margin " ) , & RenderingServer : : instance_set_extra_visibility_margin ) ;
ClassDB : : bind_method ( D_METHOD ( " instance_geometry_set_flag " , " instance " , " flag " , " enabled " ) , & RenderingServer : : instance_geometry_set_flag ) ;
ClassDB : : bind_method ( D_METHOD ( " instance_geometry_set_cast_shadows_setting " , " instance " , " shadow_casting_setting " ) , & RenderingServer : : instance_geometry_set_cast_shadows_setting ) ;
ClassDB : : bind_method ( D_METHOD ( " instance_geometry_set_material_override " , " instance " , " material " ) , & RenderingServer : : instance_geometry_set_material_override ) ;
ClassDB : : bind_method ( D_METHOD ( " instance_geometry_set_draw_range " , " instance " , " min " , " max " , " min_margin " , " max_margin " ) , & RenderingServer : : instance_geometry_set_draw_range ) ;
ClassDB : : bind_method ( D_METHOD ( " instance_geometry_set_as_instance_lod " , " instance " , " as_lod_of_instance " ) , & RenderingServer : : instance_geometry_set_as_instance_lod ) ;
ClassDB : : bind_method ( D_METHOD ( " instances_cull_aabb " , " aabb " , " scenario " ) , & RenderingServer : : _instances_cull_aabb_bind , DEFVAL ( RID ( ) ) ) ;
ClassDB : : bind_method ( D_METHOD ( " instances_cull_ray " , " from " , " to " , " scenario " ) , & RenderingServer : : _instances_cull_ray_bind , DEFVAL ( RID ( ) ) ) ;
ClassDB : : bind_method ( D_METHOD ( " instances_cull_convex " , " convex " , " scenario " ) , & RenderingServer : : _instances_cull_convex_bind , DEFVAL ( RID ( ) ) ) ;
2018-07-21 22:26:14 +02:00
# endif
2020-03-27 19:21:27 +01:00
ClassDB : : bind_method ( D_METHOD ( " canvas_create " ) , & RenderingServer : : canvas_create ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_set_item_mirroring " , " canvas " , " item " , " mirroring " ) , & RenderingServer : : canvas_set_item_mirroring ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_set_modulate " , " canvas " , " color " ) , & RenderingServer : : canvas_set_modulate ) ;
2019-06-22 18:34:26 +02:00
# ifndef _MSC_VER
2019-06-25 03:24:07 +02:00
# warning TODO method bindings need to be fixed
2019-06-22 18:34:26 +02:00
# endif
2019-06-25 03:24:07 +02:00
#if 0
2017-10-20 00:24:49 +02:00
2020-03-27 19:21:27 +01:00
ClassDB : : bind_method ( D_METHOD ( " canvas_item_create " ) , & RenderingServer : : canvas_item_create ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_set_parent " , " item " , " parent " ) , & RenderingServer : : canvas_item_set_parent ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_set_visible " , " item " , " visible " ) , & RenderingServer : : canvas_item_set_visible ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_set_light_mask " , " item " , " mask " ) , & RenderingServer : : canvas_item_set_light_mask ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_set_transform " , " item " , " transform " ) , & RenderingServer : : canvas_item_set_transform ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_set_clip " , " item " , " clip " ) , & RenderingServer : : canvas_item_set_clip ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_set_distance_field_mode " , " item " , " enabled " ) , & RenderingServer : : canvas_item_set_distance_field_mode ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_set_custom_rect " , " item " , " use_custom_rect " , " rect " ) , & RenderingServer : : canvas_item_set_custom_rect , DEFVAL ( Rect2 ( ) ) ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_set_modulate " , " item " , " color " ) , & RenderingServer : : canvas_item_set_modulate ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_set_self_modulate " , " item " , " color " ) , & RenderingServer : : canvas_item_set_self_modulate ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_set_draw_behind_parent " , " item " , " enabled " ) , & RenderingServer : : canvas_item_set_draw_behind_parent ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_add_line " , " item " , " from " , " to " , " color " , " width " , " antialiased " ) , & RenderingServer : : canvas_item_add_line , DEFVAL ( 1.0 ) , DEFVAL ( false ) ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_add_polyline " , " item " , " points " , " colors " , " width " , " antialiased " ) , & RenderingServer : : canvas_item_add_polyline , DEFVAL ( 1.0 ) , DEFVAL ( false ) ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_add_rect " , " item " , " rect " , " color " ) , & RenderingServer : : canvas_item_add_rect ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_add_circle " , " item " , " pos " , " radius " , " color " ) , & RenderingServer : : canvas_item_add_circle ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_add_texture_rect " , " item " , " rect " , " texture " , " tile " , " modulate " , " transpose " , " normal_map " ) , & RenderingServer : : canvas_item_add_texture_rect , DEFVAL ( false ) , DEFVAL ( Color ( 1 , 1 , 1 ) ) , DEFVAL ( false ) , DEFVAL ( RID ( ) ) ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_add_texture_rect_region " , " item " , " rect " , " texture " , " src_rect " , " modulate " , " transpose " , " normal_map " , " clip_uv " ) , & RenderingServer : : canvas_item_add_texture_rect_region , DEFVAL ( Color ( 1 , 1 , 1 ) ) , DEFVAL ( false ) , DEFVAL ( RID ( ) ) , DEFVAL ( true ) ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_add_nine_patch " , " item " , " rect " , " source " , " texture " , " topleft " , " bottomright " , " x_axis_mode " , " y_axis_mode " , " draw_center " , " modulate " , " normal_map " ) , & RenderingServer : : canvas_item_add_nine_patch , DEFVAL ( NINE_PATCH_STRETCH ) , DEFVAL ( NINE_PATCH_STRETCH ) , DEFVAL ( true ) , DEFVAL ( Color ( 1 , 1 , 1 ) ) , DEFVAL ( RID ( ) ) ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_add_primitive " , " item " , " points " , " colors " , " uvs " , " texture " , " width " , " normal_map " ) , & RenderingServer : : canvas_item_add_primitive , DEFVAL ( 1.0 ) , DEFVAL ( RID ( ) ) ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_add_polygon " , " item " , " points " , " colors " , " uvs " , " texture " , " normal_map " , " antialiased " ) , & RenderingServer : : canvas_item_add_polygon , DEFVAL ( Vector < Point2 > ( ) ) , DEFVAL ( RID ( ) ) , DEFVAL ( RID ( ) ) , DEFVAL ( false ) ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_add_triangle_array " , " item " , " indices " , " points " , " colors " , " uvs " , " bones " , " weights " , " texture " , " count " , " normal_map " , " antialiased " ) , & RenderingServer : : canvas_item_add_triangle_array , DEFVAL ( Vector < Point2 > ( ) ) , DEFVAL ( Vector < int > ( ) ) , DEFVAL ( Vector < float > ( ) ) , DEFVAL ( RID ( ) ) , DEFVAL ( - 1 ) , DEFVAL ( RID ( ) ) , DEFVAL ( false ) ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_add_mesh " , " item " , " mesh " , " transform " , " modulate " , " texture " , " normal_map " ) , & RenderingServer : : canvas_item_add_mesh , DEFVAL ( Transform2D ( ) ) , DEFVAL ( Color ( 1 , 1 , 1 ) ) , DEFVAL ( RID ( ) ) , DEFVAL ( RID ( ) ) ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_add_multimesh " , " item " , " mesh " , " texture " , " normal_map " ) , & RenderingServer : : canvas_item_add_multimesh , DEFVAL ( RID ( ) ) ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_add_particles " , " item " , " particles " , " texture " , " normal_map " ) , & RenderingServer : : canvas_item_add_particles ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_add_set_transform " , " item " , " transform " ) , & RenderingServer : : canvas_item_add_set_transform ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_add_clip_ignore " , " item " , " ignore " ) , & RenderingServer : : canvas_item_add_clip_ignore ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_set_sort_children_by_y " , " item " , " enabled " ) , & RenderingServer : : canvas_item_set_sort_children_by_y ) ;
2019-06-25 03:24:07 +02:00
# endif
2020-03-27 19:21:27 +01:00
ClassDB : : bind_method ( D_METHOD ( " canvas_item_set_z_index " , " item " , " z_index " ) , & RenderingServer : : canvas_item_set_z_index ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_set_z_as_relative_to_parent " , " item " , " enabled " ) , & RenderingServer : : canvas_item_set_z_as_relative_to_parent ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_set_copy_to_backbuffer " , " item " , " enabled " , " rect " ) , & RenderingServer : : canvas_item_set_copy_to_backbuffer ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_clear " , " item " ) , & RenderingServer : : canvas_item_clear ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_set_draw_index " , " item " , " index " ) , & RenderingServer : : canvas_item_set_draw_index ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_set_material " , " item " , " material " ) , & RenderingServer : : canvas_item_set_material ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_item_set_use_parent_material " , " item " , " enabled " ) , & RenderingServer : : canvas_item_set_use_parent_material ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_create " ) , & RenderingServer : : canvas_light_create ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_attach_to_canvas " , " light " , " canvas " ) , & RenderingServer : : canvas_light_attach_to_canvas ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_set_enabled " , " light " , " enabled " ) , & RenderingServer : : canvas_light_set_enabled ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_set_scale " , " light " , " scale " ) , & RenderingServer : : canvas_light_set_scale ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_set_transform " , " light " , " transform " ) , & RenderingServer : : canvas_light_set_transform ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_set_texture " , " light " , " texture " ) , & RenderingServer : : canvas_light_set_texture ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_set_texture_offset " , " light " , " offset " ) , & RenderingServer : : canvas_light_set_texture_offset ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_set_color " , " light " , " color " ) , & RenderingServer : : canvas_light_set_color ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_set_height " , " light " , " height " ) , & RenderingServer : : canvas_light_set_height ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_set_energy " , " light " , " energy " ) , & RenderingServer : : canvas_light_set_energy ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_set_z_range " , " light " , " min_z " , " max_z " ) , & RenderingServer : : canvas_light_set_z_range ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_set_layer_range " , " light " , " min_layer " , " max_layer " ) , & RenderingServer : : canvas_light_set_layer_range ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_set_item_cull_mask " , " light " , " mask " ) , & RenderingServer : : canvas_light_set_item_cull_mask ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_set_item_shadow_cull_mask " , " light " , " mask " ) , & RenderingServer : : canvas_light_set_item_shadow_cull_mask ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_set_mode " , " light " , " mode " ) , & RenderingServer : : canvas_light_set_mode ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_set_shadow_enabled " , " light " , " enabled " ) , & RenderingServer : : canvas_light_set_shadow_enabled ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_set_shadow_buffer_size " , " light " , " size " ) , & RenderingServer : : canvas_light_set_shadow_buffer_size ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_set_shadow_filter " , " light " , " filter " ) , & RenderingServer : : canvas_light_set_shadow_filter ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_set_shadow_color " , " light " , " color " ) , & RenderingServer : : canvas_light_set_shadow_color ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_set_shadow_smooth " , " light " , " smooth " ) , & RenderingServer : : canvas_light_set_shadow_smooth ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_occluder_create " ) , & RenderingServer : : canvas_light_occluder_create ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_occluder_attach_to_canvas " , " occluder " , " canvas " ) , & RenderingServer : : canvas_light_occluder_attach_to_canvas ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_occluder_set_enabled " , " occluder " , " enabled " ) , & RenderingServer : : canvas_light_occluder_set_enabled ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_occluder_set_polygon " , " occluder " , " polygon " ) , & RenderingServer : : canvas_light_occluder_set_polygon ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_occluder_set_transform " , " occluder " , " transform " ) , & RenderingServer : : canvas_light_occluder_set_transform ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_light_occluder_set_light_mask " , " occluder " , " mask " ) , & RenderingServer : : canvas_light_occluder_set_light_mask ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_occluder_polygon_create " ) , & RenderingServer : : canvas_occluder_polygon_create ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_occluder_polygon_set_shape " , " occluder_polygon " , " shape " , " closed " ) , & RenderingServer : : canvas_occluder_polygon_set_shape ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_occluder_polygon_set_shape_as_lines " , " occluder_polygon " , " shape " ) , & RenderingServer : : canvas_occluder_polygon_set_shape_as_lines ) ;
ClassDB : : bind_method ( D_METHOD ( " canvas_occluder_polygon_set_cull_mode " , " occluder_polygon " , " mode " ) , & RenderingServer : : canvas_occluder_polygon_set_cull_mode ) ;
ClassDB : : bind_method ( D_METHOD ( " black_bars_set_margins " , " left " , " top " , " right " , " bottom " ) , & RenderingServer : : black_bars_set_margins ) ;
ClassDB : : bind_method ( D_METHOD ( " black_bars_set_images " , " left " , " top " , " right " , " bottom " ) , & RenderingServer : : black_bars_set_images ) ;
ClassDB : : bind_method ( D_METHOD ( " free_rid " , " rid " ) , & RenderingServer : : free ) ; // shouldn't conflict with Object::free()
ClassDB : : bind_method ( D_METHOD ( " request_frame_drawn_callback " , " where " , " method " , " userdata " ) , & RenderingServer : : request_frame_drawn_callback ) ;
ClassDB : : bind_method ( D_METHOD ( " has_changed " ) , & RenderingServer : : has_changed ) ;
ClassDB : : bind_method ( D_METHOD ( " init " ) , & RenderingServer : : init ) ;
ClassDB : : bind_method ( D_METHOD ( " finish " ) , & RenderingServer : : finish ) ;
ClassDB : : bind_method ( D_METHOD ( " get_render_info " , " info " ) , & RenderingServer : : get_render_info ) ;
ClassDB : : bind_method ( D_METHOD ( " get_video_adapter_name " ) , & RenderingServer : : get_video_adapter_name ) ;
ClassDB : : bind_method ( D_METHOD ( " get_video_adapter_vendor " ) , & RenderingServer : : get_video_adapter_vendor ) ;
2018-07-21 22:26:14 +02:00
# ifndef _3D_DISABLED
2017-10-20 00:24:49 +02:00
2020-03-27 19:21:27 +01:00
ClassDB : : bind_method ( D_METHOD ( " make_sphere_mesh " , " latitudes " , " longitudes " , " radius " ) , & RenderingServer : : make_sphere_mesh ) ;
ClassDB : : bind_method ( D_METHOD ( " get_test_cube " ) , & RenderingServer : : get_test_cube ) ;
2018-07-21 22:26:14 +02:00
# endif
2020-03-27 19:21:27 +01:00
ClassDB : : bind_method ( D_METHOD ( " get_test_texture " ) , & RenderingServer : : get_test_texture ) ;
ClassDB : : bind_method ( D_METHOD ( " get_white_texture " ) , & RenderingServer : : get_white_texture ) ;
2017-10-20 00:24:49 +02:00
2020-03-27 19:21:27 +01:00
ClassDB : : bind_method ( D_METHOD ( " set_boot_image " , " image " , " color " , " scale " , " use_filter " ) , & RenderingServer : : set_boot_image , DEFVAL ( true ) ) ;
ClassDB : : bind_method ( D_METHOD ( " set_default_clear_color " , " color " ) , & RenderingServer : : set_default_clear_color ) ;
2017-10-20 00:24:49 +02:00
2020-03-27 19:21:27 +01:00
ClassDB : : bind_method ( D_METHOD ( " has_feature " , " feature " ) , & RenderingServer : : has_feature ) ;
ClassDB : : bind_method ( D_METHOD ( " has_os_feature " , " feature " ) , & RenderingServer : : has_os_feature ) ;
ClassDB : : bind_method ( D_METHOD ( " set_debug_generate_wireframes " , " generate " ) , & RenderingServer : : set_debug_generate_wireframes ) ;
2017-10-20 00:24:49 +02:00
BIND_CONSTANT ( NO_INDEX_ARRAY ) ;
BIND_CONSTANT ( ARRAY_WEIGHTS_SIZE ) ;
BIND_CONSTANT ( CANVAS_ITEM_Z_MIN ) ;
BIND_CONSTANT ( CANVAS_ITEM_Z_MAX ) ;
BIND_CONSTANT ( MAX_GLOW_LEVELS ) ;
BIND_CONSTANT ( MAX_CURSORS ) ;
2020-02-12 09:59:06 +01:00
2017-10-20 00:24:49 +02:00
BIND_CONSTANT ( MATERIAL_RENDER_PRIORITY_MIN ) ;
BIND_CONSTANT ( MATERIAL_RENDER_PRIORITY_MAX ) ;
2020-02-12 09:59:06 +01:00
BIND_ENUM_CONSTANT ( TEXTURE_LAYERED_2D_ARRAY ) ;
BIND_ENUM_CONSTANT ( TEXTURE_LAYERED_CUBEMAP ) ;
BIND_ENUM_CONSTANT ( TEXTURE_LAYERED_CUBEMAP_ARRAY ) ;
2019-06-11 20:43:37 +02:00
BIND_ENUM_CONSTANT ( CUBEMAP_LAYER_LEFT ) ;
BIND_ENUM_CONSTANT ( CUBEMAP_LAYER_RIGHT ) ;
BIND_ENUM_CONSTANT ( CUBEMAP_LAYER_BOTTOM ) ;
BIND_ENUM_CONSTANT ( CUBEMAP_LAYER_TOP ) ;
BIND_ENUM_CONSTANT ( CUBEMAP_LAYER_FRONT ) ;
BIND_ENUM_CONSTANT ( CUBEMAP_LAYER_BACK ) ;
2017-10-20 00:24:49 +02:00
BIND_ENUM_CONSTANT ( SHADER_SPATIAL ) ;
BIND_ENUM_CONSTANT ( SHADER_CANVAS_ITEM ) ;
BIND_ENUM_CONSTANT ( SHADER_PARTICLES ) ;
2019-09-15 11:58:38 +02:00
BIND_ENUM_CONSTANT ( SHADER_SKY ) ;
2017-10-20 00:24:49 +02:00
BIND_ENUM_CONSTANT ( SHADER_MAX ) ;
BIND_ENUM_CONSTANT ( ARRAY_VERTEX ) ;
BIND_ENUM_CONSTANT ( ARRAY_NORMAL ) ;
BIND_ENUM_CONSTANT ( ARRAY_TANGENT ) ;
BIND_ENUM_CONSTANT ( ARRAY_COLOR ) ;
BIND_ENUM_CONSTANT ( ARRAY_TEX_UV ) ;
BIND_ENUM_CONSTANT ( ARRAY_TEX_UV2 ) ;
BIND_ENUM_CONSTANT ( ARRAY_BONES ) ;
BIND_ENUM_CONSTANT ( ARRAY_WEIGHTS ) ;
BIND_ENUM_CONSTANT ( ARRAY_INDEX ) ;
BIND_ENUM_CONSTANT ( ARRAY_MAX ) ;
BIND_ENUM_CONSTANT ( ARRAY_FORMAT_VERTEX ) ;
BIND_ENUM_CONSTANT ( ARRAY_FORMAT_NORMAL ) ;
BIND_ENUM_CONSTANT ( ARRAY_FORMAT_TANGENT ) ;
BIND_ENUM_CONSTANT ( ARRAY_FORMAT_COLOR ) ;
BIND_ENUM_CONSTANT ( ARRAY_FORMAT_TEX_UV ) ;
BIND_ENUM_CONSTANT ( ARRAY_FORMAT_TEX_UV2 ) ;
BIND_ENUM_CONSTANT ( ARRAY_FORMAT_BONES ) ;
BIND_ENUM_CONSTANT ( ARRAY_FORMAT_WEIGHTS ) ;
BIND_ENUM_CONSTANT ( ARRAY_FORMAT_INDEX ) ;
2019-08-19 00:40:52 +02:00
2017-10-20 00:24:49 +02:00
BIND_ENUM_CONSTANT ( ARRAY_COMPRESS_NORMAL ) ;
BIND_ENUM_CONSTANT ( ARRAY_COMPRESS_TANGENT ) ;
BIND_ENUM_CONSTANT ( ARRAY_COMPRESS_COLOR ) ;
BIND_ENUM_CONSTANT ( ARRAY_COMPRESS_TEX_UV ) ;
BIND_ENUM_CONSTANT ( ARRAY_COMPRESS_TEX_UV2 ) ;
BIND_ENUM_CONSTANT ( ARRAY_COMPRESS_INDEX ) ;
BIND_ENUM_CONSTANT ( ARRAY_FLAG_USE_2D_VERTICES ) ;
2020-02-12 09:59:06 +01:00
BIND_ENUM_CONSTANT ( ARRAY_FLAG_USE_DYNAMIC_UPDATE ) ;
2017-10-20 00:24:49 +02:00
BIND_ENUM_CONSTANT ( ARRAY_COMPRESS_DEFAULT ) ;
BIND_ENUM_CONSTANT ( PRIMITIVE_POINTS ) ;
BIND_ENUM_CONSTANT ( PRIMITIVE_LINES ) ;
2019-08-19 00:40:52 +02:00
BIND_ENUM_CONSTANT ( PRIMITIVE_LINE_STRIP ) ;
2017-10-20 00:24:49 +02:00
BIND_ENUM_CONSTANT ( PRIMITIVE_TRIANGLES ) ;
2019-08-19 00:40:52 +02:00
BIND_ENUM_CONSTANT ( PRIMITIVE_TRIANGLE_STRIP ) ;
2017-10-20 00:24:49 +02:00
BIND_ENUM_CONSTANT ( PRIMITIVE_MAX ) ;
BIND_ENUM_CONSTANT ( BLEND_SHAPE_MODE_NORMALIZED ) ;
BIND_ENUM_CONSTANT ( BLEND_SHAPE_MODE_RELATIVE ) ;
2020-02-12 09:59:06 +01:00
BIND_ENUM_CONSTANT ( MULTIMESH_TRANSFORM_2D ) ;
BIND_ENUM_CONSTANT ( MULTIMESH_TRANSFORM_3D ) ;
2017-10-20 00:24:49 +02:00
BIND_ENUM_CONSTANT ( LIGHT_DIRECTIONAL ) ;
BIND_ENUM_CONSTANT ( LIGHT_OMNI ) ;
BIND_ENUM_CONSTANT ( LIGHT_SPOT ) ;
BIND_ENUM_CONSTANT ( LIGHT_PARAM_ENERGY ) ;
2020-02-12 09:59:06 +01:00
BIND_ENUM_CONSTANT ( LIGHT_PARAM_INDIRECT_ENERGY ) ;
2017-10-20 00:24:49 +02:00
BIND_ENUM_CONSTANT ( LIGHT_PARAM_SPECULAR ) ;
BIND_ENUM_CONSTANT ( LIGHT_PARAM_RANGE ) ;
BIND_ENUM_CONSTANT ( LIGHT_PARAM_ATTENUATION ) ;
BIND_ENUM_CONSTANT ( LIGHT_PARAM_SPOT_ANGLE ) ;
BIND_ENUM_CONSTANT ( LIGHT_PARAM_SPOT_ATTENUATION ) ;
BIND_ENUM_CONSTANT ( LIGHT_PARAM_CONTACT_SHADOW_SIZE ) ;
BIND_ENUM_CONSTANT ( LIGHT_PARAM_SHADOW_MAX_DISTANCE ) ;
BIND_ENUM_CONSTANT ( LIGHT_PARAM_SHADOW_SPLIT_1_OFFSET ) ;
BIND_ENUM_CONSTANT ( LIGHT_PARAM_SHADOW_SPLIT_2_OFFSET ) ;
BIND_ENUM_CONSTANT ( LIGHT_PARAM_SHADOW_SPLIT_3_OFFSET ) ;
2019-09-07 19:38:17 +02:00
BIND_ENUM_CONSTANT ( LIGHT_PARAM_SHADOW_FADE_START ) ;
2017-10-20 00:24:49 +02:00
BIND_ENUM_CONSTANT ( LIGHT_PARAM_SHADOW_NORMAL_BIAS ) ;
BIND_ENUM_CONSTANT ( LIGHT_PARAM_SHADOW_BIAS ) ;
BIND_ENUM_CONSTANT ( LIGHT_PARAM_SHADOW_BIAS_SPLIT_SCALE ) ;
BIND_ENUM_CONSTANT ( LIGHT_PARAM_MAX ) ;
Added all missing VisualServer bindings
- Added bindings for multimesh, immediate, skeleton, light, reflection probe, gi probe, lightmap, particles, camera, environment, scenario, instance
- Removed draw and sync, were duplicates of force_* equivalents
- Bumped binders max arguments from 11 to 13
- Wrote some wrappers as not all methods were variant-friendly
2018-01-20 16:18:51 +01:00
BIND_ENUM_CONSTANT ( LIGHT_OMNI_SHADOW_DUAL_PARABOLOID ) ;
BIND_ENUM_CONSTANT ( LIGHT_OMNI_SHADOW_CUBE ) ;
BIND_ENUM_CONSTANT ( LIGHT_DIRECTIONAL_SHADOW_ORTHOGONAL ) ;
BIND_ENUM_CONSTANT ( LIGHT_DIRECTIONAL_SHADOW_PARALLEL_2_SPLITS ) ;
BIND_ENUM_CONSTANT ( LIGHT_DIRECTIONAL_SHADOW_PARALLEL_4_SPLITS ) ;
2020-02-12 09:59:06 +01:00
Added all missing VisualServer bindings
- Added bindings for multimesh, immediate, skeleton, light, reflection probe, gi probe, lightmap, particles, camera, environment, scenario, instance
- Removed draw and sync, were duplicates of force_* equivalents
- Bumped binders max arguments from 11 to 13
- Wrote some wrappers as not all methods were variant-friendly
2018-01-20 16:18:51 +01:00
BIND_ENUM_CONSTANT ( LIGHT_DIRECTIONAL_SHADOW_DEPTH_RANGE_STABLE ) ;
BIND_ENUM_CONSTANT ( LIGHT_DIRECTIONAL_SHADOW_DEPTH_RANGE_OPTIMIZED ) ;
2020-02-12 09:59:06 +01:00
BIND_ENUM_CONSTANT ( REFLECTION_PROBE_UPDATE_ONCE ) ;
BIND_ENUM_CONSTANT ( REFLECTION_PROBE_UPDATE_ALWAYS ) ;
BIND_ENUM_CONSTANT ( PARTICLES_DRAW_ORDER_INDEX ) ;
BIND_ENUM_CONSTANT ( PARTICLES_DRAW_ORDER_LIFETIME ) ;
BIND_ENUM_CONSTANT ( PARTICLES_DRAW_ORDER_VIEW_DEPTH ) ;
2017-10-20 00:24:49 +02:00
BIND_ENUM_CONSTANT ( VIEWPORT_UPDATE_DISABLED ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_UPDATE_ONCE ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_UPDATE_WHEN_VISIBLE ) ;
2020-03-14 17:06:39 +01:00
BIND_ENUM_CONSTANT ( VIEWPORT_UPDATE_WHEN_PARENT_VISIBLE ) ;
2017-10-20 00:24:49 +02:00
BIND_ENUM_CONSTANT ( VIEWPORT_UPDATE_ALWAYS ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_CLEAR_ALWAYS ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_CLEAR_NEVER ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_CLEAR_ONLY_NEXT_FRAME ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_MSAA_DISABLED ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_MSAA_2X ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_MSAA_4X ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_MSAA_8X ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_MSAA_16X ) ;
2019-11-10 09:30:20 +01:00
BIND_ENUM_CONSTANT ( VIEWPORT_MSAA_EXT_2X ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_MSAA_EXT_4X ) ;
2017-10-20 00:24:49 +02:00
BIND_ENUM_CONSTANT ( VIEWPORT_RENDER_INFO_OBJECTS_IN_FRAME ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_RENDER_INFO_VERTICES_IN_FRAME ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_RENDER_INFO_MATERIAL_CHANGES_IN_FRAME ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_RENDER_INFO_SHADER_CHANGES_IN_FRAME ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_RENDER_INFO_SURFACE_CHANGES_IN_FRAME ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_RENDER_INFO_DRAW_CALLS_IN_FRAME ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_RENDER_INFO_MAX ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_DEBUG_DRAW_DISABLED ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_DEBUG_DRAW_UNSHADED ) ;
2020-02-12 09:59:06 +01:00
BIND_ENUM_CONSTANT ( VIEWPORT_DEBUG_DRAW_LIGHTING ) ;
2017-10-20 00:24:49 +02:00
BIND_ENUM_CONSTANT ( VIEWPORT_DEBUG_DRAW_OVERDRAW ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_DEBUG_DRAW_WIREFRAME ) ;
2020-02-12 09:59:06 +01:00
BIND_ENUM_CONSTANT ( VIEWPORT_DEBUG_DRAW_NORMAL_BUFFER ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_DEBUG_DRAW_GI_PROBE_ALBEDO ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_DEBUG_DRAW_GI_PROBE_LIGHTING ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_DEBUG_DRAW_GI_PROBE_EMISSION ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_DEBUG_DRAW_SHADOW_ATLAS ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_DEBUG_DRAW_DIRECTIONAL_SHADOW_ATLAS ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_DEBUG_DRAW_SCENE_LUMINANCE ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_DEBUG_DRAW_SSAO ) ;
BIND_ENUM_CONSTANT ( VIEWPORT_DEBUG_DRAW_ROUGHNESS_LIMITER ) ;
BIND_ENUM_CONSTANT ( SKY_MODE_QUALITY ) ;
BIND_ENUM_CONSTANT ( SKY_MODE_REALTIME ) ;
BIND_ENUM_CONSTANT ( ENV_BG_CLEAR_COLOR ) ;
BIND_ENUM_CONSTANT ( ENV_BG_COLOR ) ;
BIND_ENUM_CONSTANT ( ENV_BG_SKY ) ;
BIND_ENUM_CONSTANT ( ENV_BG_CANVAS ) ;
BIND_ENUM_CONSTANT ( ENV_BG_KEEP ) ;
BIND_ENUM_CONSTANT ( ENV_BG_CAMERA_FEED ) ;
BIND_ENUM_CONSTANT ( ENV_BG_MAX ) ;
BIND_ENUM_CONSTANT ( ENV_AMBIENT_SOURCE_BG ) ;
BIND_ENUM_CONSTANT ( ENV_AMBIENT_SOURCE_DISABLED ) ;
BIND_ENUM_CONSTANT ( ENV_AMBIENT_SOURCE_COLOR ) ;
BIND_ENUM_CONSTANT ( ENV_AMBIENT_SOURCE_SKY ) ;
BIND_ENUM_CONSTANT ( ENV_REFLECTION_SOURCE_BG ) ;
BIND_ENUM_CONSTANT ( ENV_REFLECTION_SOURCE_DISABLED ) ;
BIND_ENUM_CONSTANT ( ENV_REFLECTION_SOURCE_SKY ) ;
BIND_ENUM_CONSTANT ( ENV_GLOW_BLEND_MODE_ADDITIVE ) ;
BIND_ENUM_CONSTANT ( ENV_GLOW_BLEND_MODE_SCREEN ) ;
BIND_ENUM_CONSTANT ( ENV_GLOW_BLEND_MODE_SOFTLIGHT ) ;
BIND_ENUM_CONSTANT ( ENV_GLOW_BLEND_MODE_REPLACE ) ;
BIND_ENUM_CONSTANT ( ENV_GLOW_BLEND_MODE_MIX ) ;
BIND_ENUM_CONSTANT ( ENV_TONE_MAPPER_LINEAR ) ;
BIND_ENUM_CONSTANT ( ENV_TONE_MAPPER_REINHARD ) ;
BIND_ENUM_CONSTANT ( ENV_TONE_MAPPER_FILMIC ) ;
BIND_ENUM_CONSTANT ( ENV_TONE_MAPPER_ACES ) ;
BIND_ENUM_CONSTANT ( ENV_SSAO_BLUR_DISABLED ) ;
BIND_ENUM_CONSTANT ( ENV_SSAO_BLUR_1x1 ) ;
BIND_ENUM_CONSTANT ( ENV_SSAO_BLUR_2x2 ) ;
BIND_ENUM_CONSTANT ( ENV_SSAO_BLUR_3x3 ) ;
BIND_ENUM_CONSTANT ( ENV_SSAO_QUALITY_LOW ) ;
BIND_ENUM_CONSTANT ( ENV_SSAO_QUALITY_MEDIUM ) ;
BIND_ENUM_CONSTANT ( ENV_SSAO_QUALITY_HIGH ) ;
BIND_ENUM_CONSTANT ( ENV_SSAO_QUALITY_ULTRA ) ;
BIND_ENUM_CONSTANT ( DOF_BLUR_QUALITY_VERY_LOW ) ;
BIND_ENUM_CONSTANT ( DOF_BLUR_QUALITY_LOW ) ;
BIND_ENUM_CONSTANT ( DOF_BLUR_QUALITY_MEDIUM ) ;
BIND_ENUM_CONSTANT ( DOF_BLUR_QUALITY_HIGH ) ;
BIND_ENUM_CONSTANT ( DOF_BOKEH_BOX ) ;
BIND_ENUM_CONSTANT ( DOF_BOKEH_HEXAGON ) ;
BIND_ENUM_CONSTANT ( DOF_BOKEH_CIRCLE ) ;
2017-10-20 00:24:49 +02:00
BIND_ENUM_CONSTANT ( SCENARIO_DEBUG_DISABLED ) ;
BIND_ENUM_CONSTANT ( SCENARIO_DEBUG_WIREFRAME ) ;
BIND_ENUM_CONSTANT ( SCENARIO_DEBUG_OVERDRAW ) ;
BIND_ENUM_CONSTANT ( SCENARIO_DEBUG_SHADELESS ) ;
BIND_ENUM_CONSTANT ( INSTANCE_NONE ) ;
BIND_ENUM_CONSTANT ( INSTANCE_MESH ) ;
BIND_ENUM_CONSTANT ( INSTANCE_MULTIMESH ) ;
BIND_ENUM_CONSTANT ( INSTANCE_IMMEDIATE ) ;
BIND_ENUM_CONSTANT ( INSTANCE_PARTICLES ) ;
BIND_ENUM_CONSTANT ( INSTANCE_LIGHT ) ;
BIND_ENUM_CONSTANT ( INSTANCE_REFLECTION_PROBE ) ;
BIND_ENUM_CONSTANT ( INSTANCE_GI_PROBE ) ;
2017-12-16 20:34:16 +01:00
BIND_ENUM_CONSTANT ( INSTANCE_LIGHTMAP_CAPTURE ) ;
2017-10-20 00:24:49 +02:00
BIND_ENUM_CONSTANT ( INSTANCE_MAX ) ;
BIND_ENUM_CONSTANT ( INSTANCE_GEOMETRY_MASK ) ;
Added all missing VisualServer bindings
- Added bindings for multimesh, immediate, skeleton, light, reflection probe, gi probe, lightmap, particles, camera, environment, scenario, instance
- Removed draw and sync, were duplicates of force_* equivalents
- Bumped binders max arguments from 11 to 13
- Wrote some wrappers as not all methods were variant-friendly
2018-01-20 16:18:51 +01:00
BIND_ENUM_CONSTANT ( INSTANCE_FLAG_USE_BAKED_LIGHT ) ;
2020-02-12 09:59:06 +01:00
BIND_ENUM_CONSTANT ( INSTANCE_FLAG_USE_DYNAMIC_GI ) ;
2018-07-27 13:58:56 +02:00
BIND_ENUM_CONSTANT ( INSTANCE_FLAG_DRAW_NEXT_FRAME_IF_VISIBLE ) ;
Added all missing VisualServer bindings
- Added bindings for multimesh, immediate, skeleton, light, reflection probe, gi probe, lightmap, particles, camera, environment, scenario, instance
- Removed draw and sync, were duplicates of force_* equivalents
- Bumped binders max arguments from 11 to 13
- Wrote some wrappers as not all methods were variant-friendly
2018-01-20 16:18:51 +01:00
BIND_ENUM_CONSTANT ( INSTANCE_FLAG_MAX ) ;
BIND_ENUM_CONSTANT ( SHADOW_CASTING_SETTING_OFF ) ;
BIND_ENUM_CONSTANT ( SHADOW_CASTING_SETTING_ON ) ;
BIND_ENUM_CONSTANT ( SHADOW_CASTING_SETTING_DOUBLE_SIDED ) ;
BIND_ENUM_CONSTANT ( SHADOW_CASTING_SETTING_SHADOWS_ONLY ) ;
2017-10-20 00:24:49 +02:00
BIND_ENUM_CONSTANT ( NINE_PATCH_STRETCH ) ;
BIND_ENUM_CONSTANT ( NINE_PATCH_TILE ) ;
BIND_ENUM_CONSTANT ( NINE_PATCH_TILE_FIT ) ;
2020-02-12 09:59:06 +01:00
BIND_ENUM_CONSTANT ( CANVAS_ITEM_TEXTURE_FILTER_DEFAULT ) ;
BIND_ENUM_CONSTANT ( CANVAS_ITEM_TEXTURE_FILTER_NEAREST ) ;
BIND_ENUM_CONSTANT ( CANVAS_ITEM_TEXTURE_FILTER_LINEAR ) ;
2020-02-20 00:31:43 +01:00
BIND_ENUM_CONSTANT ( CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS ) ;
2020-02-12 09:59:06 +01:00
BIND_ENUM_CONSTANT ( CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS ) ;
2020-02-20 00:31:43 +01:00
BIND_ENUM_CONSTANT ( CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS_ANISOTROPIC ) ;
2020-02-12 09:59:06 +01:00
BIND_ENUM_CONSTANT ( CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC ) ;
BIND_ENUM_CONSTANT ( CANVAS_ITEM_TEXTURE_FILTER_MAX ) ;
BIND_ENUM_CONSTANT ( CANVAS_ITEM_TEXTURE_REPEAT_DEFAULT ) ;
BIND_ENUM_CONSTANT ( CANVAS_ITEM_TEXTURE_REPEAT_DISABLED ) ;
BIND_ENUM_CONSTANT ( CANVAS_ITEM_TEXTURE_REPEAT_ENABLED ) ;
BIND_ENUM_CONSTANT ( CANVAS_ITEM_TEXTURE_REPEAT_MIRROR ) ;
BIND_ENUM_CONSTANT ( CANVAS_ITEM_TEXTURE_REPEAT_MAX ) ;
2017-10-20 00:24:49 +02:00
BIND_ENUM_CONSTANT ( CANVAS_LIGHT_MODE_ADD ) ;
BIND_ENUM_CONSTANT ( CANVAS_LIGHT_MODE_SUB ) ;
BIND_ENUM_CONSTANT ( CANVAS_LIGHT_MODE_MIX ) ;
BIND_ENUM_CONSTANT ( CANVAS_LIGHT_MODE_MASK ) ;
BIND_ENUM_CONSTANT ( CANVAS_LIGHT_FILTER_NONE ) ;
BIND_ENUM_CONSTANT ( CANVAS_LIGHT_FILTER_PCF5 ) ;
BIND_ENUM_CONSTANT ( CANVAS_LIGHT_FILTER_PCF13 ) ;
2020-02-12 09:59:06 +01:00
BIND_ENUM_CONSTANT ( CANVAS_LIGHT_FILTER_MAX ) ;
2017-10-20 00:24:49 +02:00
BIND_ENUM_CONSTANT ( CANVAS_OCCLUDER_POLYGON_CULL_DISABLED ) ;
BIND_ENUM_CONSTANT ( CANVAS_OCCLUDER_POLYGON_CULL_CLOCKWISE ) ;
BIND_ENUM_CONSTANT ( CANVAS_OCCLUDER_POLYGON_CULL_COUNTER_CLOCKWISE ) ;
BIND_ENUM_CONSTANT ( INFO_OBJECTS_IN_FRAME ) ;
BIND_ENUM_CONSTANT ( INFO_VERTICES_IN_FRAME ) ;
BIND_ENUM_CONSTANT ( INFO_MATERIAL_CHANGES_IN_FRAME ) ;
BIND_ENUM_CONSTANT ( INFO_SHADER_CHANGES_IN_FRAME ) ;
BIND_ENUM_CONSTANT ( INFO_SURFACE_CHANGES_IN_FRAME ) ;
BIND_ENUM_CONSTANT ( INFO_DRAW_CALLS_IN_FRAME ) ;
BIND_ENUM_CONSTANT ( INFO_USAGE_VIDEO_MEM_TOTAL ) ;
BIND_ENUM_CONSTANT ( INFO_VIDEO_MEM_USED ) ;
BIND_ENUM_CONSTANT ( INFO_TEXTURE_MEM_USED ) ;
BIND_ENUM_CONSTANT ( INFO_VERTEX_MEM_USED ) ;
BIND_ENUM_CONSTANT ( FEATURE_SHADERS ) ;
BIND_ENUM_CONSTANT ( FEATURE_MULTITHREADED ) ;
2017-11-14 21:25:42 +01:00
2018-07-07 01:21:13 +02:00
ADD_SIGNAL ( MethodInfo ( " frame_pre_draw " ) ) ;
ADD_SIGNAL ( MethodInfo ( " frame_post_draw " ) ) ;
2014-02-10 02:10:30 +01:00
}
2020-03-27 19:21:27 +01:00
void RenderingServer : : _canvas_item_add_style_box ( RID p_item , const Rect2 & p_rect , const Rect2 & p_source , RID p_texture , const Vector < float > & p_margins , const Color & p_modulate ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
ERR_FAIL_COND ( p_margins . size ( ) ! = 4 ) ;
2016-10-03 21:33:42 +02:00
//canvas_item_add_style_box(p_item,p_rect,p_source,p_texture,Vector2(p_margins[0],p_margins[1]),Vector2(p_margins[2],p_margins[3]),true,p_modulate);
2014-02-10 02:10:30 +01:00
}
2020-03-27 19:21:27 +01:00
void RenderingServer : : _camera_set_orthogonal ( RID p_camera , float p_size , float p_z_near , float p_z_far ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
camera_set_orthogonal ( p_camera , p_size , p_z_near , p_z_far ) ;
2014-02-10 02:10:30 +01:00
}
2020-03-27 19:21:27 +01:00
void RenderingServer : : mesh_add_surface_from_mesh_data ( RID p_mesh , const Geometry : : MeshData & p_mesh_data ) {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
Vector < Vector3 > vertices ;
Vector < Vector3 > normals ;
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_mesh_data . faces . size ( ) ; i + + ) {
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
const Geometry : : MeshData : : Face & f = p_mesh_data . faces [ i ] ;
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
for ( int j = 2 ; j < f . indices . size ( ) ; j + + ) {
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
# define _ADD_VERTEX(m_idx) \
vertices . push_back ( p_mesh_data . vertices [ f . indices [ m_idx ] ] ) ; \
normals . push_back ( f . plane . normal ) ;
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
_ADD_VERTEX ( 0 ) ;
_ADD_VERTEX ( j - 1 ) ;
_ADD_VERTEX ( j ) ;
2016-03-09 00:00:52 +01:00
}
2014-02-10 02:10:30 +01:00
}
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
Array d ;
2020-03-27 19:21:27 +01:00
d . resize ( RS : : ARRAY_MAX ) ;
2017-03-05 16:44:50 +01:00
d [ ARRAY_VERTEX ] = vertices ;
d [ ARRAY_NORMAL ] = normals ;
mesh_add_surface_from_arrays ( p_mesh , PRIMITIVE_TRIANGLES , d ) ;
2014-02-10 02:10:30 +01:00
}
2020-03-27 19:21:27 +01:00
void RenderingServer : : mesh_add_surface_from_planes ( RID p_mesh , const Vector < Plane > & p_planes ) {
2014-02-10 02:10:30 +01:00
Geometry : : MeshData mdata = Geometry : : build_convex_mesh ( p_planes ) ;
2017-03-05 16:44:50 +01:00
mesh_add_surface_from_mesh_data ( p_mesh , mdata ) ;
2014-02-10 02:10:30 +01:00
}
2020-03-27 19:21:27 +01:00
void RenderingServer : : immediate_vertex_2d ( RID p_immediate , const Vector2 & p_vertex ) {
2017-03-05 16:44:50 +01:00
immediate_vertex ( p_immediate , Vector3 ( p_vertex . x , p_vertex . y , 0 ) ) ;
2016-11-23 11:04:55 +01:00
}
2020-03-27 19:21:27 +01:00
RID RenderingServer : : instance_create2 ( RID p_base , RID p_scenario ) {
2014-02-10 02:10:30 +01:00
RID instance = instance_create ( ) ;
2017-03-05 16:44:50 +01:00
instance_set_base ( instance , p_base ) ;
instance_set_scenario ( instance , p_scenario ) ;
2014-02-10 02:10:30 +01:00
return instance ;
}
2020-03-27 19:21:27 +01:00
RenderingServer : : RenderingServer ( ) {
2014-02-10 02:10:30 +01:00
2017-01-14 12:26:56 +01:00
//ERR_FAIL_COND(singleton);
2017-03-05 16:44:50 +01:00
singleton = this ;
2017-12-16 21:09:25 +01:00
2019-02-26 22:43:37 +01:00
GLOBAL_DEF_RST ( " rendering/vram_compression/import_bptc " , false ) ;
GLOBAL_DEF_RST ( " rendering/vram_compression/import_s3tc " , true ) ;
GLOBAL_DEF_RST ( " rendering/vram_compression/import_etc " , false ) ;
GLOBAL_DEF_RST ( " rendering/vram_compression/import_etc2 " , true ) ;
GLOBAL_DEF_RST ( " rendering/vram_compression/import_pvrtc " , false ) ;
2017-07-18 02:05:38 +02:00
GLOBAL_DEF ( " rendering/quality/directional_shadow/size " , 4096 ) ;
2017-07-19 22:00:46 +02:00
GLOBAL_DEF ( " rendering/quality/directional_shadow/size.mobile " , 2048 ) ;
2018-10-05 18:43:53 +02:00
ProjectSettings : : get_singleton ( ) - > set_custom_property_info ( " rendering/quality/directional_shadow/size " , PropertyInfo ( Variant : : INT , " rendering/quality/directional_shadow/size " , PROPERTY_HINT_RANGE , " 256,16384 " ) ) ;
2017-07-18 02:05:38 +02:00
GLOBAL_DEF ( " rendering/quality/shadow_atlas/size " , 4096 ) ;
2017-07-19 22:00:46 +02:00
GLOBAL_DEF ( " rendering/quality/shadow_atlas/size.mobile " , 2048 ) ;
2017-07-26 15:03:13 +02:00
ProjectSettings : : get_singleton ( ) - > set_custom_property_info ( " rendering/quality/shadow_atlas/size " , PropertyInfo ( Variant : : INT , " rendering/quality/shadow_atlas/size " , PROPERTY_HINT_RANGE , " 256,16384 " ) ) ;
2017-07-18 02:05:38 +02:00
GLOBAL_DEF ( " rendering/quality/shadow_atlas/quadrant_0_subdiv " , 1 ) ;
GLOBAL_DEF ( " rendering/quality/shadow_atlas/quadrant_1_subdiv " , 2 ) ;
GLOBAL_DEF ( " rendering/quality/shadow_atlas/quadrant_2_subdiv " , 3 ) ;
GLOBAL_DEF ( " rendering/quality/shadow_atlas/quadrant_3_subdiv " , 4 ) ;
2017-07-19 22:00:46 +02:00
ProjectSettings : : get_singleton ( ) - > set_custom_property_info ( " rendering/quality/shadow_atlas/quadrant_0_subdiv " , PropertyInfo ( Variant : : INT , " rendering/quality/shadow_atlas/quadrant_0_subdiv " , PROPERTY_HINT_ENUM , " Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows " ) ) ;
ProjectSettings : : get_singleton ( ) - > set_custom_property_info ( " rendering/quality/shadow_atlas/quadrant_1_subdiv " , PropertyInfo ( Variant : : INT , " rendering/quality/shadow_atlas/quadrant_1_subdiv " , PROPERTY_HINT_ENUM , " Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows " ) ) ;
ProjectSettings : : get_singleton ( ) - > set_custom_property_info ( " rendering/quality/shadow_atlas/quadrant_2_subdiv " , PropertyInfo ( Variant : : INT , " rendering/quality/shadow_atlas/quadrant_2_subdiv " , PROPERTY_HINT_ENUM , " Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows " ) ) ;
ProjectSettings : : get_singleton ( ) - > set_custom_property_info ( " rendering/quality/shadow_atlas/quadrant_3_subdiv " , PropertyInfo ( Variant : : INT , " rendering/quality/shadow_atlas/quadrant_3_subdiv " , PROPERTY_HINT_ENUM , " Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows " ) ) ;
GLOBAL_DEF ( " rendering/quality/shadows/filter_mode " , 1 ) ;
GLOBAL_DEF ( " rendering/quality/shadows/filter_mode.mobile " , 0 ) ;
2020-01-16 01:23:21 +01:00
ProjectSettings : : get_singleton ( ) - > set_custom_property_info ( " rendering/quality/shadows/filter_mode " , PropertyInfo ( Variant : : INT , " rendering/quality/shadows/filter_mode " , PROPERTY_HINT_ENUM , " Disabled (Fastest),PCF5,PCF13 (Slowest) " ) ) ;
2017-07-19 22:00:46 +02:00
2020-03-20 01:32:19 +01:00
GLOBAL_DEF ( " rendering/quality/reflections/roughness_layers " , 8 ) ;
2017-07-19 22:00:46 +02:00
GLOBAL_DEF ( " rendering/quality/reflections/texture_array_reflections " , true ) ;
GLOBAL_DEF ( " rendering/quality/reflections/texture_array_reflections.mobile " , false ) ;
2019-08-26 22:43:58 +02:00
GLOBAL_DEF ( " rendering/quality/reflections/ggx_samples " , 1024 ) ;
GLOBAL_DEF ( " rendering/quality/reflections/ggx_samples.mobile " , 128 ) ;
2020-02-21 00:27:34 +01:00
GLOBAL_DEF ( " rendering/quality/reflections/fast_filter_high_quality " , false ) ;
2020-03-20 01:32:19 +01:00
GLOBAL_DEF ( " rendering/quality/reflection_atlas/reflection_size " , 256 ) ;
2019-09-09 22:50:51 +02:00
GLOBAL_DEF ( " rendering/quality/reflection_atlas/reflection_size.mobile " , 128 ) ;
GLOBAL_DEF ( " rendering/quality/reflection_atlas/reflection_count " , 64 ) ;
2017-07-22 19:07:38 +02:00
2019-10-03 22:39:08 +02:00
GLOBAL_DEF ( " rendering/quality/gi_probes/anisotropic " , false ) ;
2019-10-04 01:15:38 +02:00
GLOBAL_DEF ( " rendering/quality/gi_probes/quality " , 1 ) ;
2020-01-21 18:24:22 +01:00
ProjectSettings : : get_singleton ( ) - > set_custom_property_info ( " rendering/quality/gi_probes/quality " , PropertyInfo ( Variant : : INT , " rendering/quality/gi_probes/quality " , PROPERTY_HINT_ENUM , " Ultra-Low (1 cone - fastest),Medium (4 cones), High (6 cones - slowest) " ) ) ;
2019-10-03 22:39:08 +02:00
2017-07-22 19:07:38 +02:00
GLOBAL_DEF ( " rendering/quality/shading/force_vertex_shading " , false ) ;
GLOBAL_DEF ( " rendering/quality/shading/force_vertex_shading.mobile " , true ) ;
2018-09-23 17:12:30 +02:00
GLOBAL_DEF ( " rendering/quality/shading/force_lambert_over_burley " , false ) ;
GLOBAL_DEF ( " rendering/quality/shading/force_lambert_over_burley.mobile " , true ) ;
GLOBAL_DEF ( " rendering/quality/shading/force_blinn_over_ggx " , false ) ;
GLOBAL_DEF ( " rendering/quality/shading/force_blinn_over_ggx.mobile " , true ) ;
2017-07-22 19:07:38 +02:00
GLOBAL_DEF ( " rendering/quality/depth_prepass/enable " , true ) ;
2019-01-25 15:48:28 +01:00
GLOBAL_DEF ( " rendering/quality/depth_prepass/disable_for_vendors " , " PowerVR,Mali,Adreno,Apple " ) ;
2018-10-24 15:22:50 +02:00
GLOBAL_DEF ( " rendering/quality/filters/use_nearest_mipmap_filter " , false ) ;
2019-07-21 16:31:30 +02:00
GLOBAL_DEF ( " rendering/quality/filters/max_anisotropy " , 4 ) ;
2020-01-16 01:23:21 +01:00
GLOBAL_DEF ( " rendering/quality/filters/depth_of_field_bokeh_shape " , 1 ) ;
ProjectSettings : : get_singleton ( ) - > set_custom_property_info ( " rendering/quality/filters/depth_of_field_bokeh_shape " , PropertyInfo ( Variant : : INT , " rendering/quality/filters/depth_of_field_bokeh_shape " , PROPERTY_HINT_ENUM , " Box (Fastest),Hexagon,Circle (Slowest) " ) ) ;
GLOBAL_DEF ( " rendering/quality/filters/depth_of_field_bokeh_quality " , 2 ) ;
ProjectSettings : : get_singleton ( ) - > set_custom_property_info ( " rendering/quality/filters/depth_of_field_bokeh_quality " , PropertyInfo ( Variant : : INT , " rendering/quality/filters/depth_of_field_bokeh_quality " , PROPERTY_HINT_ENUM , " Very Low (Fast),Low,Medium,High (Slow) " ) ) ;
GLOBAL_DEF ( " rendering/quality/filters/depth_of_field_use_jitter " , false ) ;
2020-01-25 11:18:55 +01:00
GLOBAL_DEF ( " rendering/quality/ssao/quality " , 1 ) ;
ProjectSettings : : get_singleton ( ) - > set_custom_property_info ( " rendering/quality/ssao/quality " , PropertyInfo ( Variant : : INT , " rendering/quality/ssao/quality " , PROPERTY_HINT_ENUM , " Low (Fast),Medium,High (Slow),Ultra (Very Slow) " ) ) ;
GLOBAL_DEF ( " rendering/quality/ssao/half_size " , false ) ;
2020-01-27 00:09:40 +01:00
GLOBAL_DEF ( " rendering/quality/filters/screen_space_roughness_limiter " , 0 ) ;
ProjectSettings : : get_singleton ( ) - > set_custom_property_info ( " rendering/quality/filters/screen_space_roughness_limiter " , PropertyInfo ( Variant : : INT , " rendering/quality/filters/screen_space_roughness_limiter " , PROPERTY_HINT_ENUM , " Disabled,Enabled (Small Cost) " ) ) ;
GLOBAL_DEF ( " rendering/quality/filters/screen_space_roughness_limiter_curve " , 1.0 ) ;
Variant: Added 64-bit packed arrays, renamed Variant::REAL to FLOAT.
- Renames PackedIntArray to PackedInt32Array.
- Renames PackedFloatArray to PackedFloat32Array.
- Adds PackedInt64Array and PackedFloat64Array.
- Renames Variant::REAL to Variant::FLOAT for consistency.
Packed arrays are for storing large amount of data and creating stuff like
meshes, buffers. textures, etc. Forcing them to be 64 is a huge waste of
memory. That said, many users requested the ability to have 64 bits packed
arrays for their games, so this is just an optional added type.
For Variant, the float datatype is always 64 bits, and exposed as `float`.
We still have `real_t` which is the datatype that can change from 32 to 64
bits depending on a compile flag (not entirely working right now, but that's
the idea). It affects math related datatypes and code only.
Neither Variant nor PackedArray make use of real_t, which is only intended
for math precision, so the term is removed from there to keep only float.
2020-02-24 19:20:53 +01:00
ProjectSettings : : get_singleton ( ) - > set_custom_property_info ( " rendering/quality/filters/screen_space_roughness_limiter_curve " , PropertyInfo ( Variant : : FLOAT , " rendering/quality/filters/screen_space_roughness_limiter_curve " , PROPERTY_HINT_EXP_EASING , " 0.01,8,0.01 " ) ) ;
2020-03-30 15:46:03 +02:00
GLOBAL_DEF ( " rendering/quality/glow/upscale_mode " , 1 ) ;
ProjectSettings : : get_singleton ( ) - > set_custom_property_info ( " rendering/quality/glow/upscale_mode " , PropertyInfo ( Variant : : INT , " rendering/quality/glow/upscale_mode " , PROPERTY_HINT_ENUM , " Linear (Fast),Bicubic (Slower) " ) ) ;
GLOBAL_DEF ( " rendering/quality/glow/upscale_mode.mobile " , 0 ) ;
2020-04-02 04:24:52 +02:00
GLOBAL_DEF ( " rendering/quality/screen_space_reflection/roughness_quality " , 1 ) ;
ProjectSettings : : get_singleton ( ) - > set_custom_property_info ( " rendering/quality/screen_space_reflection/roughness_quality " , PropertyInfo ( Variant : : INT , " rendering/quality/screen_space_reflection/roughness_quality " , PROPERTY_HINT_ENUM , " Disabled (Fastest),Low, Medium, High (Slowest) " ) ) ;
2014-02-10 02:10:30 +01:00
}
2020-03-27 19:21:27 +01:00
RenderingServer : : ~ RenderingServer ( ) {
2014-02-10 02:10:30 +01:00
2020-04-02 01:20:12 +02:00
singleton = nullptr ;
2014-02-10 02:10:30 +01:00
}