summaryrefslogtreecommitdiff
path: root/servers
diff options
context:
space:
mode:
Diffstat (limited to 'servers')
-rw-r--r--servers/visual/rasterizer.h6
-rw-r--r--servers/visual/visual_server_raster.h5
-rw-r--r--servers/visual/visual_server_scene.cpp84
-rw-r--r--servers/visual_server.cpp2
-rw-r--r--servers/visual_server.h6
5 files changed, 70 insertions, 33 deletions
diff --git a/servers/visual/rasterizer.h b/servers/visual/rasterizer.h
index 0f70b036a6..08d1995725 100644
--- a/servers/visual/rasterizer.h
+++ b/servers/visual/rasterizer.h
@@ -261,17 +261,15 @@ public:
virtual RID multimesh_create()=0;
- virtual void multimesh_allocate(RID p_multimesh,int p_instances,VS::MultimeshTransformFormat p_transform_format,VS::MultimeshColorFormat p_color_format,bool p_gen_aabb=true)=0;
+ virtual void multimesh_allocate(RID p_multimesh,int p_instances,VS::MultimeshTransformFormat p_transform_format,VS::MultimeshColorFormat p_color_format)=0;
virtual int multimesh_get_instance_count(RID p_multimesh) const=0;
virtual void multimesh_set_mesh(RID p_multimesh,RID p_mesh)=0;
- virtual void multimesh_set_custom_aabb(RID p_multimesh,const AABB& p_aabb)=0;
virtual void multimesh_instance_set_transform(RID p_multimesh,int p_index,const Transform& p_transform)=0;
virtual void multimesh_instance_set_transform_2d(RID p_multimesh,int p_index,const Matrix32& p_transform)=0;
virtual void multimesh_instance_set_color(RID p_multimesh,int p_index,const Color& p_color)=0;
virtual RID multimesh_get_mesh(RID p_multimesh) const=0;
- virtual AABB multimesh_get_custom_aabb(RID p_multimesh) const=0;
virtual Transform multimesh_instance_get_transform(RID p_multimesh,int p_index) const=0;
virtual Matrix32 multimesh_instance_get_transform_2d(RID p_multimesh,int p_index) const=0;
@@ -280,7 +278,7 @@ public:
virtual void multimesh_set_visible_instances(RID p_multimesh,int p_visible)=0;
virtual int multimesh_get_visible_instances(RID p_multimesh) const=0;
- virtual AABB multimesh_get_aabb(RID p_mesh) const=0;
+ virtual AABB multimesh_get_aabb(RID p_multimesh) const=0;
/* IMMEDIATE API */
diff --git a/servers/visual/visual_server_raster.h b/servers/visual/visual_server_raster.h
index 4e9110445b..675e2d4aef 100644
--- a/servers/visual/visual_server_raster.h
+++ b/servers/visual/visual_server_raster.h
@@ -707,17 +707,16 @@ public:
BIND0R(RID,multimesh_create)
- BIND5(multimesh_allocate,RID,int,MultimeshTransformFormat,MultimeshColorFormat,bool)
+ BIND4(multimesh_allocate,RID,int,MultimeshTransformFormat,MultimeshColorFormat)
BIND1RC(int,multimesh_get_instance_count,RID)
BIND2(multimesh_set_mesh,RID,RID)
- BIND2(multimesh_set_custom_aabb,RID,const AABB&)
BIND3(multimesh_instance_set_transform,RID,int,const Transform&)
BIND3(multimesh_instance_set_transform_2d,RID,int,const Matrix32& )
BIND3(multimesh_instance_set_color,RID,int,const Color&)
BIND1RC(RID,multimesh_get_mesh,RID)
- BIND1RC(AABB,multimesh_get_custom_aabb,RID)
+ BIND1RC(AABB,multimesh_get_aabb,RID)
BIND2RC(Transform,multimesh_instance_get_transform,RID,int )
BIND2RC(Matrix32,multimesh_instance_get_transform_2d,RID,int)
diff --git a/servers/visual/visual_server_scene.cpp b/servers/visual/visual_server_scene.cpp
index 74d77c5262..f25e5bc943 100644
--- a/servers/visual/visual_server_scene.cpp
+++ b/servers/visual/visual_server_scene.cpp
@@ -562,6 +562,11 @@ void VisualServerScene::instance_set_base(RID p_instance, RID p_base){
InstanceGeometryData *geom = memnew( InstanceGeometryData );
instance->base_data=geom;
} break;
+ case VS::INSTANCE_MULTIMESH: {
+
+ InstanceGeometryData *geom = memnew( InstanceGeometryData );
+ instance->base_data=geom;
+ } break;
case VS::INSTANCE_REFLECTION_PROBE: {
InstanceReflectionProbeData *reflection_probe = memnew( InstanceReflectionProbeData );
@@ -764,8 +769,19 @@ void VisualServerScene::instance_attach_skeleton(RID p_instance,RID p_skeleton){
Instance *instance = instance_owner.get( p_instance );
ERR_FAIL_COND( !instance );
+ if (instance->skeleton==p_skeleton)
+ return;
+
+ if (instance->skeleton.is_valid()) {
+ VSG::storage->instance_remove_dependency(p_skeleton,instance);
+ }
+
instance->skeleton=p_skeleton;
+ if (instance->skeleton.is_valid()) {
+ VSG::storage->instance_add_dependency(p_skeleton,instance);
+ }
+
_instance_queue_update(instance,true);
}
@@ -1125,12 +1141,13 @@ void VisualServerScene::_update_instance_aabb(Instance *p_instance) {
new_aabb = VSG::storage->mesh_get_aabb(p_instance->base,p_instance->skeleton);
} break;
-#if 0
+
case VisualServer::INSTANCE_MULTIMESH: {
- new_aabb = rasterizer->multimesh_get_aabb(p_instance->base);
+ new_aabb = VSG::storage->multimesh_get_aabb(p_instance->base);
} break;
+#if 0
case VisualServer::INSTANCE_IMMEDIATE: {
new_aabb = rasterizer->immediate_get_aabb(p_instance->base);
@@ -2238,39 +2255,64 @@ void VisualServerScene::_update_dirty_instance(Instance *p_instance) {
can_cast_shadows=VSG::storage->material_casts_shadows(p_instance->material_override);
} else {
- RID mesh;
- if (p_instance->base_type==VS::INSTANCE_MESH) {
- mesh=p_instance->base;
- } else if (p_instance->base_type==VS::INSTANCE_MULTIMESH) {
- }
+ if (p_instance->base_type==VS::INSTANCE_MESH) {
+ RID mesh=p_instance->base;
- if (mesh.is_valid()) {
+ if (mesh.is_valid()) {
+ bool cast_shadows=false;
- bool cast_shadows=false;
+ for(int i=0;i<p_instance->materials.size();i++) {
- for(int i=0;i<p_instance->materials.size();i++) {
+ RID mat = p_instance->materials[i].is_valid()?p_instance->materials[i]:VSG::storage->mesh_surface_get_material(mesh,i);
- RID mat = p_instance->materials[i].is_valid()?p_instance->materials[i]:VSG::storage->mesh_surface_get_material(mesh,i);
+ if (!mat.is_valid()) {
+ cast_shadows=true;
+ break;
+ }
- if (!mat.is_valid()) {
- cast_shadows=true;
- break;
+ if (VSG::storage->material_casts_shadows(mat)) {
+ cast_shadows=true;
+ break;
+ }
}
- if (VSG::storage->material_casts_shadows(mat)) {
- cast_shadows=true;
- break;
+ if (!cast_shadows) {
+ can_cast_shadows=false;
}
}
- if (!cast_shadows) {
- can_cast_shadows=false;
+ } else if (p_instance->base_type==VS::INSTANCE_MULTIMESH) {
+ RID mesh = VSG::storage->multimesh_get_mesh(p_instance->base);
+ if (mesh.is_valid()) {
+ bool cast_shadows=false;
+
+ int sc = VSG::storage->mesh_get_surface_count(mesh);
+ for(int i=0;i<sc;i++) {
+
+ RID mat =VSG::storage->mesh_surface_get_material(mesh,i);
+
+ if (!mat.is_valid()) {
+ cast_shadows=true;
+ break;
+ }
+
+ if (VSG::storage->material_casts_shadows(mat)) {
+ cast_shadows=true;
+ break;
+ }
+ }
+
+ if (!cast_shadows) {
+ can_cast_shadows=false;
+ }
}
}
+
+
}
if (can_cast_shadows!=geom->can_cast_shadows) {
@@ -2335,9 +2377,9 @@ bool VisualServerScene::free(RID p_rid) {
instance_set_scenario(p_rid,RID());
instance_set_base(p_rid,RID());
instance_geometry_set_material_override(p_rid,RID());
+ instance_attach_skeleton(p_rid,RID());
- if (instance->skeleton.is_valid())
- instance_attach_skeleton(p_rid,RID());
+ update_dirty_instances(); //in case something changed this
instance_owner.free(p_rid);
memdelete(instance);
diff --git a/servers/visual_server.cpp b/servers/visual_server.cpp
index 267a87930a..30d6b76b8e 100644
--- a/servers/visual_server.cpp
+++ b/servers/visual_server.cpp
@@ -1282,7 +1282,7 @@ Array VisualServer::_get_array_from_surface(uint32_t p_format,DVector<uint8_t> p
for(int j=0;j<p_vertex_len;j++) {
const uint16_t *v = (const uint16_t*)&r[j*total_elem_size+offsets[i]];
- w[j]=Vector3(Math::halfptr_to_float(&v[0]),Math::halfptr_to_float(&v[1]),Math::halfptr_to_float(&v[1]));
+ w[j]=Vector3(Math::halfptr_to_float(&v[0]),Math::halfptr_to_float(&v[1]),Math::halfptr_to_float(&v[2]));
}
} else {
diff --git a/servers/visual_server.h b/servers/visual_server.h
index e9e4bd074f..7d561bee38 100644
--- a/servers/visual_server.h
+++ b/servers/visual_server.h
@@ -285,7 +285,6 @@ public:
virtual RID multimesh_create()=0;
enum MultimeshTransformFormat {
- MULTIMESH_TRANSFORM_NONE,
MULTIMESH_TRANSFORM_2D,
MULTIMESH_TRANSFORM_3D,
};
@@ -296,17 +295,16 @@ public:
MULTIMESH_COLOR_FLOAT,
};
- virtual void multimesh_allocate(RID p_multimesh,int p_instances,MultimeshTransformFormat p_transform_format,MultimeshColorFormat p_color_format,bool p_gen_aabb=true)=0;
+ virtual void multimesh_allocate(RID p_multimesh,int p_instances,MultimeshTransformFormat p_transform_format,MultimeshColorFormat p_color_format)=0;
virtual int multimesh_get_instance_count(RID p_multimesh) const=0;
virtual void multimesh_set_mesh(RID p_multimesh,RID p_mesh)=0;
- virtual void multimesh_set_custom_aabb(RID p_multimesh,const AABB& p_aabb)=0;
virtual void multimesh_instance_set_transform(RID p_multimesh,int p_index,const Transform& p_transform)=0;
virtual void multimesh_instance_set_transform_2d(RID p_multimesh,int p_index,const Matrix32& p_transform)=0;
virtual void multimesh_instance_set_color(RID p_multimesh,int p_index,const Color& p_color)=0;
virtual RID multimesh_get_mesh(RID p_multimesh) const=0;
- virtual AABB multimesh_get_custom_aabb(RID p_multimesh) const=0;
+ virtual AABB multimesh_get_aabb(RID p_multimesh) const=0;
virtual Transform multimesh_instance_get_transform(RID p_multimesh,int p_index) const=0;
virtual Matrix32 multimesh_instance_get_transform_2d(RID p_multimesh,int p_index) const=0;