Batch of Bugfixes
-=-=-=-=-=-=-=-=- -Fixed Export UV XForm (should work now). #923 -Fixed enforcement of limits in property editor. #919 -Fixed long-standing bug of export editings in script inheritance. #914, #859, #756 -Fixed horrible error reporting in shader language. #912 -Added kinematic collision with plane (please test well). #911 -Fixed double animation track insert when using 2D rigs. #904 -VKey updates offset parameter in sprite edition. #901 -Do not allow anymore a script to preload itself. (does not fix #899, but narrows it down) -Avoid connection editor from overriding selected text. #897 -Fixed timer autostart. #876 -Fixed collision layers in 3D physics. #872 -Improved operators in shader #857 -Fixed ambient lighting bug #834 -Avoid editor from processing gamepad input #813 -Added not keyword #752 Please test!
This commit is contained in:
@ -175,7 +175,7 @@ void BodyPairSW::validate_contacts() {
|
||||
bool BodyPairSW::setup(float p_step) {
|
||||
|
||||
//cannot collide
|
||||
if (A->has_exception(B->get_self()) || B->has_exception(A->get_self()) || (A->get_mode()<=PhysicsServer::BODY_MODE_KINEMATIC && B->get_mode()<=PhysicsServer::BODY_MODE_KINEMATIC && A->get_max_contacts_reported()==0 && B->get_max_contacts_reported()==0)) {
|
||||
if ((A->get_layer_mask()&B->get_layer_mask())==0 || A->has_exception(B->get_self()) || B->has_exception(A->get_self()) || (A->get_mode()<=PhysicsServer::BODY_MODE_KINEMATIC && B->get_mode()<=PhysicsServer::BODY_MODE_KINEMATIC && A->get_max_contacts_reported()==0 && B->get_max_contacts_reported()==0)) {
|
||||
collided=false;
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -275,6 +275,44 @@ void CollisionSolverSW::concave_distance_callback(void *p_userdata, ShapeSW *p_c
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool CollisionSolverSW::solve_distance_plane(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,Vector3& r_point_A,Vector3& r_point_B) {
|
||||
|
||||
const PlaneShapeSW *plane = static_cast<const PlaneShapeSW*>(p_shape_A);
|
||||
if (p_shape_B->get_type()==PhysicsServer::SHAPE_PLANE)
|
||||
return false;
|
||||
Plane p = p_transform_A.xform(plane->get_plane());
|
||||
|
||||
static const int max_supports = 16;
|
||||
Vector3 supports[max_supports];
|
||||
int support_count;
|
||||
|
||||
p_shape_B->get_supports(p_transform_B.basis.xform_inv(-p.normal).normalized(),max_supports,supports,support_count);
|
||||
|
||||
bool collided=false;
|
||||
Vector3 closest;
|
||||
float closest_d;
|
||||
|
||||
|
||||
for(int i=0;i<support_count;i++) {
|
||||
|
||||
supports[i] = p_transform_B.xform( supports[i] );
|
||||
real_t d = p.distance_to(supports[i]);
|
||||
if (i==0 || d<closest_d) {
|
||||
closest=supports[i];
|
||||
closest_d=d;
|
||||
if (d<=0)
|
||||
collided=true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
r_point_A=p.project(closest);
|
||||
r_point_B=closest;
|
||||
|
||||
return collided;
|
||||
}
|
||||
|
||||
bool CollisionSolverSW::solve_distance(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,Vector3& r_point_A,Vector3& r_point_B,const AABB& p_concave_hint,Vector3 *r_sep_axis) {
|
||||
|
||||
if (p_shape_A->is_concave())
|
||||
@ -282,7 +320,11 @@ bool CollisionSolverSW::solve_distance(const ShapeSW *p_shape_A,const Transform&
|
||||
|
||||
if (p_shape_B->get_type()==PhysicsServer::SHAPE_PLANE) {
|
||||
|
||||
return false; //unsupported
|
||||
Vector3 a,b;
|
||||
bool col = solve_distance_plane(p_shape_B,p_transform_B,p_shape_A,p_transform_A,a,b);
|
||||
r_point_A=b;
|
||||
r_point_B=a;
|
||||
return !col;
|
||||
|
||||
} else if (p_shape_B->is_concave()) {
|
||||
|
||||
|
||||
@ -42,6 +42,7 @@ private:
|
||||
static bool solve_ray(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result);
|
||||
static bool solve_concave(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result,float p_margin_A=0,float p_margin_B=0);
|
||||
static void concave_distance_callback(void *p_userdata, ShapeSW *p_convex);
|
||||
static bool solve_distance_plane(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,Vector3& r_point_A,Vector3& r_point_B);
|
||||
|
||||
public:
|
||||
|
||||
|
||||
@ -79,7 +79,7 @@ RID Rasterizer::_create_shader(const FixedMaterialShaderKey& p_key) {
|
||||
if (texcoords_used&(1<<VS::FIXED_MATERIAL_TEXCOORD_UV_TRANSFORM)) {
|
||||
|
||||
code+="uniform mat4 fmp_uv_xform;\n";
|
||||
code+="vec2 uv_xform = fmp_uv_xform * UV;\n";
|
||||
code+="vec2 uv_xform = (fmp_uv_xform * vec4(UV,0,1)).xy;\n";
|
||||
}
|
||||
|
||||
/* HANDLE NORMAL MAPPING */
|
||||
|
||||
@ -436,7 +436,10 @@ ShaderLanguage::Token ShaderLanguage::read_token(const CharType* p_text,int p_le
|
||||
return Token(TK_INDENTIFIER,str);
|
||||
}
|
||||
|
||||
return Token(TK_ERROR,"Unknown character");
|
||||
if (GETCHAR(0)>32)
|
||||
return Token(TK_ERROR,"Tokenizer: Unknown character #"+itos(GETCHAR(0))+": '"+String::chr(GETCHAR(0))+"'");
|
||||
else
|
||||
return Token(TK_ERROR,"Tokenizer: Unknown character #"+itos(GETCHAR(0)));
|
||||
|
||||
} break;
|
||||
}
|
||||
@ -463,9 +466,9 @@ Error ShaderLanguage::tokenize(const String& p_text,Vector<Token> *p_tokens,Stri
|
||||
if (t.type==TK_ERROR) {
|
||||
|
||||
if (r_error) {
|
||||
return ERR_COMPILATION_FAILED;
|
||||
*r_error=t.text;
|
||||
*r_err_line=line;
|
||||
return ERR_COMPILATION_FAILED;
|
||||
}
|
||||
}
|
||||
|
||||
@ -952,10 +955,16 @@ const ShaderLanguage::OperatorDef ShaderLanguage::operator_defs[]={
|
||||
{OP_ASSIGN_ADD,TYPE_VOID,{TYPE_VEC2,TYPE_VEC2}},
|
||||
{OP_ASSIGN_ADD,TYPE_VOID,{TYPE_VEC3,TYPE_VEC3}},
|
||||
{OP_ASSIGN_ADD,TYPE_VOID,{TYPE_VEC4,TYPE_VEC4}},
|
||||
{OP_ASSIGN_ADD,TYPE_VOID,{TYPE_VEC2,TYPE_FLOAT}},
|
||||
{OP_ASSIGN_ADD,TYPE_VOID,{TYPE_VEC3,TYPE_FLOAT}},
|
||||
{OP_ASSIGN_ADD,TYPE_VOID,{TYPE_VEC4,TYPE_FLOAT}},
|
||||
{OP_ASSIGN_SUB,TYPE_VOID,{TYPE_FLOAT,TYPE_FLOAT}},
|
||||
{OP_ASSIGN_SUB,TYPE_VOID,{TYPE_VEC2,TYPE_VEC2}},
|
||||
{OP_ASSIGN_SUB,TYPE_VOID,{TYPE_VEC3,TYPE_VEC3}},
|
||||
{OP_ASSIGN_SUB,TYPE_VOID,{TYPE_VEC4,TYPE_VEC4}},
|
||||
{OP_ASSIGN_SUB,TYPE_VOID,{TYPE_VEC2,TYPE_FLOAT}},
|
||||
{OP_ASSIGN_SUB,TYPE_VOID,{TYPE_VEC3,TYPE_FLOAT}},
|
||||
{OP_ASSIGN_SUB,TYPE_VOID,{TYPE_VEC4,TYPE_FLOAT}},
|
||||
{OP_ASSIGN_MUL,TYPE_VOID,{TYPE_FLOAT,TYPE_FLOAT}},
|
||||
{OP_ASSIGN_MUL,TYPE_VOID,{TYPE_VEC2,TYPE_VEC2}},
|
||||
{OP_ASSIGN_MUL,TYPE_VOID,{TYPE_VEC2,TYPE_FLOAT}},
|
||||
@ -2485,6 +2494,9 @@ Error ShaderLanguage::compile(const String& p_code,ShaderType p_type,CompileFunc
|
||||
uint64_t t = OS::get_singleton()->get_ticks_usec();
|
||||
|
||||
Error err = tokenize(p_code,&tokens,r_error,r_err_line,r_err_column);
|
||||
if (err!=OK) {
|
||||
print_line("tokenizer error!");
|
||||
}
|
||||
|
||||
double tf = (OS::get_singleton()->get_ticks_usec()-t)/1000.0;
|
||||
//print_line("tokenize time: "+rtos(tf));
|
||||
|
||||
Reference in New Issue
Block a user