-Fixed viewport stretch bugs

-Fixed input in viewport stretch bugs
-Fixed tilemap pixel overlap (really?)
This commit is contained in:
Juan Linietsky 2014-04-18 11:43:54 -03:00
parent b8593c6f3f
commit 0360b454a4
15 changed files with 83 additions and 40 deletions

View File

@ -9,10 +9,16 @@ name_es="Plataformero"
width=800
height=480
stretch_2d=true
stretch_2d=false
stretch_mode="viewport"
stretch_aspect="keep"
[image_loader]
filter=false
gen_mipmaps=false
repeat=false
[input]
move_left=[key(Left), jbutton(0, 14)]

View File

@ -56,7 +56,8 @@ abstract public class ConsumeTask {
protected void onPostExecute(String param){
if(param == null){
success();
success(new PaymentsCache(context).getConsumableValue("ticket", sku));
}else{
error(param);
}
@ -65,7 +66,7 @@ abstract public class ConsumeTask {
}.execute();
}
abstract protected void success();
abstract protected void success(String ticket);
abstract protected void error(String message);
}

View File

@ -28,11 +28,12 @@ abstract public class HandlePurchaseTask {
public void handlePurchaseRequest(int resultCode, Intent data){
// Log.d("XXX", "Handling purchase response");
Log.d("XXX", "Handling purchase response");
// int responseCode = data.getIntExtra("RESPONSE_CODE", 0);
PaymentsCache pc = new PaymentsCache(context);
String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
Log.d("XXX", "Purchase data:" + purchaseData);
// String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE");
if (resultCode == Activity.RESULT_OK) {
@ -61,7 +62,7 @@ abstract public class HandlePurchaseTask {
pc.setConsumableFlag("block", productId, true);
pc.setConsumableValue("token", productId, purchaseToken);
success(purchaseData);
success(productId);
return;
} catch (JSONException e) {
error(e.getMessage());

View File

@ -84,8 +84,25 @@ public class PaymentsManager {
new HandlePurchaseTask(activity){
@Override
protected void success(String ticket) {
godotPaymentV3.callbackSuccess(ticket);
protected void success(final String sku) {
new ConsumeTask(mService, activity) {
@Override
protected void success(String ticket) {
// godotPaymentV3.callbackSuccess("");
godotPaymentV3.callbackSuccess(ticket);
}
@Override
protected void error(String message) {
godotPaymentV3.callbackFail();
}
}.consume(sku);
// godotPaymentV3.callbackSuccess(ticket);
//validatePurchase(purchaseToken, sku);
}
@ -99,7 +116,8 @@ public class PaymentsManager {
protected void canceled() {
godotPaymentV3.callbackCancel();
}}.handlePurchaseRequest(resultCode, data);
}
}.handlePurchaseRequest(resultCode, data);
}
public void validatePurchase(String purchaseToken, final String sku){
@ -112,8 +130,8 @@ public class PaymentsManager {
new ConsumeTask(mService, activity) {
@Override
protected void success() {
godotPaymentV3.callbackSuccess("");
protected void success(String ticket) {
godotPaymentV3.callbackSuccess(ticket);
}

View File

@ -32,7 +32,7 @@ abstract public class PurchaseTask {
private boolean isLooping = false;
public void purchase(final String sku){
// Log.d("XXX", "Starting purchase");
Log.d("XXX", "Starting purchase for: " + sku);
PaymentsCache pc = new PaymentsCache(context);
Boolean isBlocked = pc.getConsumableFlag("block", sku);
// if(isBlocked){
@ -68,7 +68,7 @@ abstract public class PurchaseTask {
new ConsumeTask(mService, context) {
@Override
protected void success() {
protected void success(String ticket) {
// Log.d("XXX", "Product was erroniously purchased!");
if(isLooping){
// Log.d("XXX", "It is looping");

View File

@ -1647,6 +1647,13 @@ void OS_Windows::move_window_to_foreground() {
}
Error OS_Windows::shell_open(String p_uri) {
ShellExecuteW(NULL, L"open", p_uri.c_str(), NULL, NULL, SW_SHOWNORMAL);
return OK;
}
String OS_Windows::get_locale() const {
const _WinLocale *wl = &_win_locales[0];

View File

@ -246,6 +246,8 @@ public:
virtual void make_rendering_thread();
virtual void swap_buffers();
virtual Error shell_open(String p_uri);
void run();
virtual bool get_swap_ok_cancel() { return true; }

View File

@ -1015,6 +1015,11 @@ String OS_X11::get_name() {
return "X11";
}
Error OS_X11::shell_open(String p_uri) {
}
void OS_X11::close_joystick(int p_id) {

View File

@ -188,6 +188,7 @@ public:
virtual void make_rendering_thread();
virtual void swap_buffers();
virtual Error shell_open(String p_uri);
virtual void set_video_mode(const VideoMode& p_video_mode,int p_screen=0);
virtual VideoMode get_video_mode(int p_screen=0) const;

View File

@ -585,8 +585,8 @@ TileMap::TileMap() {
center_x=false;
center_y=false;
fp_adjust=0.4;
fp_adjust=0.4;
fp_adjust=0.01;
fp_adjust=0.01;
}
TileMap::~TileMap() {

View File

@ -645,19 +645,6 @@ void Control::_notification(int p_notification) {
}
Size2 Control::_window_get_pos() const {
if (data.viewport) {
Rect2 r = data.viewport->get_visible_rect();
return r.pos;
} else
return Point2();
//return get_global_transform().get_origin();
}
bool Control::clips_input() const {
return false;
@ -956,12 +943,11 @@ void Control::_window_input_event(InputEvent p_event) {
window->key_event_accepted=false;
Point2 mpos =(get_canvas_transform()).affine_inverse().xform(Point2(p_event.mouse_button.x,p_event.mouse_button.y));
if (p_event.mouse_button.pressed) {
Size2 pos = mpos - _window_get_pos();
Size2 pos = mpos;
if (window->mouse_focus && p_event.mouse_button.button_index!=window->mouse_focus_button) {
//do not steal mouse focus and stuff
@ -1062,7 +1048,7 @@ void Control::_window_input_event(InputEvent p_event) {
if (window->mouse_over && window->drag_data.get_type()!=Variant::NIL && p_event.mouse_button.button_index==BUTTON_LEFT) {
Size2 pos = mpos - _window_get_pos();
Size2 pos = mpos;
pos = window->focus_inv_xform.xform(pos);
window->mouse_over->drop_data(pos,window->drag_data);
window->drag_data=Variant();
@ -1072,7 +1058,7 @@ void Control::_window_input_event(InputEvent p_event) {
break;
}
Size2 pos = mpos - _window_get_pos();
Size2 pos = mpos;
p_event.mouse_button.global_x = pos.x;
p_event.mouse_button.global_y = pos.y;
pos = window->focus_inv_xform.xform(pos);
@ -1103,7 +1089,7 @@ void Control::_window_input_event(InputEvent p_event) {
window->key_event_accepted=false;
Matrix32 localizer = (get_canvas_transform()).affine_inverse();
Size2 pos = localizer.xform(Size2(p_event.mouse_motion.x,p_event.mouse_motion.y)) - _window_get_pos();
Size2 pos = localizer.xform(Size2(p_event.mouse_motion.x,p_event.mouse_motion.y));
Vector2 speed = localizer.basis_xform(Point2(p_event.mouse_motion.speed_x,p_event.mouse_motion.speed_y));
Vector2 rel = localizer.basis_xform(Point2(p_event.mouse_motion.relative_x,p_event.mouse_motion.relative_y));

View File

@ -193,7 +193,6 @@ private:
float _get_parent_range(int p_idx) const;
float _get_range(int p_idx) const;
Point2 _window_get_pos() const;
float _s2a(float p_val, AnchorType p_anchor,float p_range) const;
float _a2s(float p_val, AnchorType p_anchor,float p_range) const;
void _modal_stack_remove();

View File

@ -940,7 +940,6 @@ void SceneMainLoop::_update_root_rect() {
} break;
case STRETCH_MODE_VIEWPORT: {
print_line("VP SIZE: "+viewport_size);
root->set_rect(Rect2(Point2(),viewport_size));
root->set_size_override_stretch(false);
root->set_size_override(false,Size2());

View File

@ -764,13 +764,30 @@ bool Viewport::get_render_target_vflip() const{
}
Matrix32 Viewport::_get_input_pre_xform() const {
Matrix32 pre_xf;
if (render_target) {
ERR_FAIL_COND_V(to_screen_rect.size.x==0,pre_xf);
ERR_FAIL_COND_V(to_screen_rect.size.y==0,pre_xf);
pre_xf.scale(rect.size/to_screen_rect.size);
pre_xf.elements[2]=-to_screen_rect.pos;
} else {
pre_xf.elements[2]=-rect.pos;
}
return pre_xf;
}
void Viewport::_make_input_local(InputEvent& ev) {
switch(ev.type) {
case InputEvent::MOUSE_BUTTON: {
Matrix32 ai = get_final_transform().affine_inverse();
Matrix32 ai = get_final_transform().affine_inverse() * _get_input_pre_xform();
Vector2 g = ai.xform(Vector2(ev.mouse_button.global_x,ev.mouse_button.global_y));
Vector2 l = ai.xform(Vector2(ev.mouse_button.x,ev.mouse_button.y));
ev.mouse_button.x=l.x;
@ -781,7 +798,7 @@ void Viewport::_make_input_local(InputEvent& ev) {
} break;
case InputEvent::MOUSE_MOTION: {
Matrix32 ai = get_final_transform().affine_inverse();
Matrix32 ai = get_final_transform().affine_inverse() * _get_input_pre_xform();
Vector2 g = ai.xform(Vector2(ev.mouse_motion.global_x,ev.mouse_motion.global_y));
Vector2 l = ai.xform(Vector2(ev.mouse_motion.x,ev.mouse_motion.y));
Vector2 r = ai.xform(Vector2(ev.mouse_motion.relative_x,ev.mouse_motion.relative_y));
@ -795,7 +812,7 @@ void Viewport::_make_input_local(InputEvent& ev) {
} break;
case InputEvent::SCREEN_TOUCH: {
Matrix32 ai = get_final_transform().affine_inverse();
Matrix32 ai = get_final_transform().affine_inverse() * _get_input_pre_xform();
Vector2 t = ai.xform(Vector2(ev.screen_touch.x,ev.screen_touch.y));
ev.screen_touch.x=t.x;
ev.screen_touch.y=t.y;
@ -803,7 +820,7 @@ void Viewport::_make_input_local(InputEvent& ev) {
} break;
case InputEvent::SCREEN_DRAG: {
Matrix32 ai = get_final_transform().affine_inverse();
Matrix32 ai = get_final_transform().affine_inverse() * _get_input_pre_xform();
Vector2 t = ai.xform(Vector2(ev.screen_drag.x,ev.screen_drag.y));
Vector2 r = ai.xform(Vector2(ev.screen_drag.relative_x,ev.screen_drag.relative_y));
Vector2 s = ai.xform(Vector2(ev.screen_drag.speed_x,ev.screen_drag.speed_y));
@ -821,13 +838,13 @@ void Viewport::_make_input_local(InputEvent& ev) {
void Viewport::_vp_input(const InputEvent& p_ev) {
if (render_target)
if (render_target && to_screen_rect==Rect2())
return; //if render target, can't get input events
//this one handles system input, p_ev are in system coordinates
//they are converted to viewport coordinates
InputEvent ev = p_ev;
InputEvent ev = p_ev;
_make_input_local(ev);
input(ev);

View File

@ -146,6 +146,7 @@ friend class RenderTargetTexture;
void update_worlds();
_FORCE_INLINE_ Matrix32 _get_input_pre_xform() const;
void _vp_enter_scene();
void _vp_exit_scene();