summaryrefslogtreecommitdiff
path: root/servers
diff options
context:
space:
mode:
Diffstat (limited to 'servers')
-rw-r--r--servers/visual/rasterizer.h1
-rw-r--r--servers/visual/visual_server_raster.cpp33
-rw-r--r--servers/visual/visual_server_raster.h10
-rw-r--r--servers/visual/visual_server_wrap_mt.h2
-rw-r--r--servers/visual_server.h2
5 files changed, 42 insertions, 6 deletions
diff --git a/servers/visual/rasterizer.h b/servers/visual/rasterizer.h
index e3d1b14835..f1ad685879 100644
--- a/servers/visual/rasterizer.h
+++ b/servers/visual/rasterizer.h
@@ -542,6 +542,7 @@ public:
RID skeleton;
RID material_override;
RID sampled_light;
+ Vector<RID> materials;
Vector<RID> light_instances;
Vector<float> morph_values;
BakedLightData *baked_light;
diff --git a/servers/visual/visual_server_raster.cpp b/servers/visual/visual_server_raster.cpp
index 6b5f1ba353..b3721268bf 100644
--- a/servers/visual/visual_server_raster.cpp
+++ b/servers/visual/visual_server_raster.cpp
@@ -398,7 +398,7 @@ void VisualServerRaster::mesh_add_custom_surface(RID p_mesh,const Variant& p_dat
void VisualServerRaster::mesh_add_surface(RID p_mesh,PrimitiveType p_primitive,const Array& p_arrays,const Array& p_blend_shapes,bool p_alpha_sort) {
VS_CHANGED;
- _dependency_queue_update(p_mesh,true);
+ _dependency_queue_update(p_mesh,true,true);
rasterizer->mesh_add_surface(p_mesh,p_primitive,p_arrays,p_blend_shapes,p_alpha_sort);
}
@@ -452,6 +452,7 @@ VisualServer::PrimitiveType VisualServerRaster::mesh_surface_get_primitive_type(
void VisualServerRaster::mesh_remove_surface(RID p_mesh,int p_surface){
rasterizer->mesh_remove_surface(p_mesh,p_surface);
+ _dependency_queue_update(p_mesh,true,true);
}
int VisualServerRaster::mesh_get_surface_count(RID p_mesh) const{
@@ -480,6 +481,8 @@ void VisualServerRaster::mesh_clear(RID p_mesh) {
while(rasterizer->mesh_get_surface_count(p_mesh)) {
rasterizer->mesh_remove_surface(p_mesh,0);
}
+
+ _dependency_queue_update(p_mesh,true,true);
}
@@ -2038,7 +2041,7 @@ Variant VisualServerRaster::environment_fx_get_param(RID p_env,EnvironmentFxPara
/* SCENARIO API */
-void VisualServerRaster::_dependency_queue_update(RID p_rid,bool p_update_aabb) {
+void VisualServerRaster::_dependency_queue_update(RID p_rid,bool p_update_aabb,bool p_update_materials) {
Map< RID, Set<RID> >::Element * E = instance_dependency_map.find( p_rid );
@@ -2051,17 +2054,19 @@ void VisualServerRaster::_dependency_queue_update(RID p_rid,bool p_update_aabb)
while(I) {
Instance *ins = instance_owner.get( I->get() );
- _instance_queue_update( ins , p_update_aabb );
+ _instance_queue_update( ins , p_update_aabb, p_update_materials );
I = I->next();
}
}
-void VisualServerRaster::_instance_queue_update(Instance *p_instance,bool p_update_aabb) {
+void VisualServerRaster::_instance_queue_update(Instance *p_instance,bool p_update_aabb,bool p_update_materials) {
if (p_update_aabb)
p_instance->update_aabb=true;
+ if (p_update_materials)
+ p_instance->update_materials=true;
if (p_instance->update)
return;
@@ -2273,6 +2278,7 @@ void VisualServerRaster::instance_set_base(RID p_instance, RID p_base) {
}
instance->data.morph_values.clear();
+ instance->data.materials.clear();
}
@@ -2286,6 +2292,7 @@ void VisualServerRaster::instance_set_base(RID p_instance, RID p_base) {
if (rasterizer->is_mesh(p_base)) {
instance->base_type=INSTANCE_MESH;
instance->data.morph_values.resize( rasterizer->mesh_get_morph_target_count(p_base));
+ instance->data.materials.resize( rasterizer->mesh_get_surface_count(p_base));
} else if (rasterizer->is_multimesh(p_base)) {
instance->base_type=INSTANCE_MULTIMESH;
} else if (rasterizer->is_immediate(p_base)) {
@@ -2510,6 +2517,16 @@ float VisualServerRaster::instance_get_morph_target_weight(RID p_instance,int p_
return instance->data.morph_values[p_shape];
}
+void VisualServerRaster::instance_set_surface_material(RID p_instance,int p_surface, RID p_material) {
+
+ VS_CHANGED;
+ Instance *instance = instance_owner.get( p_instance );
+ ERR_FAIL_COND( !instance);
+ ERR_FAIL_INDEX( p_surface, instance->data.materials.size() );
+ instance->data.materials[p_surface]=p_material;
+}
+
+
void VisualServerRaster::instance_set_transform(RID p_instance, const Transform& p_transform) {
VS_CHANGED;
Instance *instance = instance_owner.get( p_instance );
@@ -3046,6 +3063,7 @@ void VisualServerRaster::_update_instance(Instance *p_instance) {
}
+
if (p_instance->aabb.has_no_surface())
return;
@@ -3301,10 +3319,17 @@ void VisualServerRaster::_update_instances() {
if (instance->update_aabb)
_update_instance_aabb(instance);
+ if (instance->update_materials) {
+ if (instance->base_type==INSTANCE_MESH) {
+ instance->data.materials.resize(rasterizer->mesh_get_surface_count(instance->base_rid));
+ }
+ }
+
_update_instance(instance);
instance->update=false;
instance->update_aabb=false;
+ instance->update_materials=false;
instance->update_next=0;
}
}
diff --git a/servers/visual/visual_server_raster.h b/servers/visual/visual_server_raster.h
index 5abad863ee..39ea2f55e6 100644
--- a/servers/visual/visual_server_raster.h
+++ b/servers/visual/visual_server_raster.h
@@ -160,6 +160,7 @@ class VisualServerRaster : public VisualServer {
Scenario *scenario;
bool update;
bool update_aabb;
+ bool update_materials;
Instance *update_next;
InstanceType base_type;
@@ -317,6 +318,8 @@ class VisualServerRaster : public VisualServer {
draw_range_end=0;
extra_margin=0;
visible_in_all_rooms=false;
+ update_aabb=false;
+ update_materials=false;
baked_light=NULL;
baked_light_info=NULL;
@@ -583,8 +586,8 @@ class VisualServerRaster : public VisualServer {
void _portal_disconnect(Instance *p_portal,bool p_cleanup=false);
void _portal_attempt_connect(Instance *p_portal);
- void _dependency_queue_update(RID p_rid,bool p_update_aabb=false);
- _FORCE_INLINE_ void _instance_queue_update(Instance *p_instance,bool p_update_aabb=false);
+ void _dependency_queue_update(RID p_rid, bool p_update_aabb=false, bool p_update_materials=false);
+ _FORCE_INLINE_ void _instance_queue_update(Instance *p_instance,bool p_update_aabb=false,bool p_update_materials=false);
void _update_instances();
void _update_instance_aabb(Instance *p_instance);
void _update_instance(Instance *p_instance);
@@ -1083,6 +1086,9 @@ public:
virtual void instance_set_morph_target_weight(RID p_instance,int p_shape, float p_weight);
virtual float instance_get_morph_target_weight(RID p_instance,int p_shape) const;
+ virtual void instance_set_surface_material(RID p_instance,int p_surface, RID p_material);
+
+
virtual void instance_set_transform(RID p_instance, const Transform& p_transform);
virtual Transform instance_get_transform(RID p_instance) const;
diff --git a/servers/visual/visual_server_wrap_mt.h b/servers/visual/visual_server_wrap_mt.h
index 6a42fcc8a6..80cf43d572 100644
--- a/servers/visual/visual_server_wrap_mt.h
+++ b/servers/visual/visual_server_wrap_mt.h
@@ -525,6 +525,8 @@ public:
FUNC3(instance_set_morph_target_weight,RID,int, float);
FUNC2RC(float,instance_get_morph_target_weight,RID,int);
+ FUNC3(instance_set_surface_material,RID,int, RID);
+
FUNC2(instance_set_transform,RID, const Transform&);
FUNC1RC(Transform,instance_get_transform,RID);
diff --git a/servers/visual_server.h b/servers/visual_server.h
index 750c090bbe..f32e976b57 100644
--- a/servers/visual_server.h
+++ b/servers/visual_server.h
@@ -919,6 +919,8 @@ public:
virtual void instance_set_morph_target_weight(RID p_instance,int p_shape, float p_weight)=0;
virtual float instance_get_morph_target_weight(RID p_instance,int p_shape) const=0;
+ virtual void instance_set_surface_material(RID p_instance,int p_surface, RID p_material)=0;
+
virtual void instance_attach_skeleton(RID p_instance,RID p_skeleton)=0;
virtual RID instance_get_skeleton(RID p_instance) const=0;