summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2014-05-24 01:35:47 -0300
committerJuan Linietsky <reduzio@gmail.com>2014-05-24 01:35:47 -0300
commit1cad087969efefa401a11051343cd0689f660770 (patch)
tree1595dd049bdb7289752012dca4398b2251fb08fa /drivers
parentf9ff086235cd4ff406b136f62fff77b85c0873f9 (diff)
Making Godot Easier to Use..
-=-=-=-=-=-=-=-=-=-=-=-=-=-= -Auto indenter in code editor, this makes it much easier to paste external code. -Zoom in 2D viewport now uses the mouse pointer as reference. -Obscure hack to see where code/line of GDScript in C++ backtrace. -Fixed a bug where keys would get stuck on X11 if pressed simultaneously -Added Api on IP singleton to request local IPs. -Premultiplied alpha support when importing texture, editing PNGs and as a blend mode.
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gles2/rasterizer_gles2.cpp5
-rw-r--r--drivers/gles2/shaders/canvas.glsl3
-rw-r--r--drivers/unix/ip_unix.cpp99
-rw-r--r--drivers/unix/ip_unix.h2
4 files changed, 108 insertions, 1 deletions
diff --git a/drivers/gles2/rasterizer_gles2.cpp b/drivers/gles2/rasterizer_gles2.cpp
index f43b43bd77..472e92f23a 100644
--- a/drivers/gles2/rasterizer_gles2.cpp
+++ b/drivers/gles2/rasterizer_gles2.cpp
@@ -6436,7 +6436,10 @@ void RasterizerGLES2::canvas_set_blend_mode(VS::MaterialBlendMode p_mode) {
case VS::MATERIAL_BLEND_MODE_MUL: {
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-
+ } break;
+ case VS::MATERIAL_BLEND_MODE_PREMULT_ALPHA: {
+ glBlendEquation(GL_FUNC_ADD);
+ glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);
} break;
}
diff --git a/drivers/gles2/shaders/canvas.glsl b/drivers/gles2/shaders/canvas.glsl
index 66bdf15db4..f36741d586 100644
--- a/drivers/gles2/shaders/canvas.glsl
+++ b/drivers/gles2/shaders/canvas.glsl
@@ -64,6 +64,9 @@ void main() {
highp float enc32 = dot( color,highp vec4(1.0 / (256.0 * 256.0 * 256.0),1.0 / (256.0 * 256.0),1.0 / 256.0,1) );
color = vec4(vec3(enc32),1.0);
#endif
+
+// color.rgb*=color.a;
gl_FragColor = color;
+
}
diff --git a/drivers/unix/ip_unix.cpp b/drivers/unix/ip_unix.cpp
index c11426d356..18b19ca095 100644
--- a/drivers/unix/ip_unix.cpp
+++ b/drivers/unix/ip_unix.cpp
@@ -30,12 +30,24 @@
#if defined(UNIX_ENABLED) || defined(WINDOWS_ENABLED)
+
#ifdef WINDOWS_ENABLED
+#define WINVER 0x0600
#include <ws2tcpip.h>
#include <winsock2.h>
#include <windows.h>
+#include <stdio.h>
+#include <iphlpapi.h>
#else
#include <netdb.h>
+#ifdef ANDROID_ENABLED
+#include "platform/android/ifaddrs_android.h"
+#else
+#include <ifaddrs.h>
+#endif
+#include <arpa/inet.h>
+#include <sys/socket.h>
+
#endif
IP_Address IP_Unix::_resolve_hostname(const String& p_hostname) {
@@ -52,6 +64,93 @@ IP_Address IP_Unix::_resolve_hostname(const String& p_hostname) {
}
+#if defined(WINDOWS_ENABLED)
+
+void IP_Unix::get_local_addresses(List<IP_Address> *r_addresses) const {
+
+ ULONG buf_size = 1024;
+ IP_ADAPTER_ADDRESSES* addrs;
+
+ while (true) {
+
+ addrs = (IP_ADAPTER_ADDRESSES*)memalloc(buf_size);
+ int err = GetAdaptersAddresses(AF_INET, GAA_FLAG_SKIP_ANYCAST |
+ GAA_FLAG_SKIP_MULTICAST |
+ GAA_FLAG_SKIP_DNS_SERVER |
+ GAA_FLAG_SKIP_FRIENDLY_NAME,
+ NULL, addrs, &buf_size);
+ if (err == NO_ERROR) {
+ break;
+ };
+ memfree(addrs);
+ if (err == ERROR_BUFFER_OVERFLOW) {
+ continue; // will go back and alloc the right size
+ };
+
+ ERR_EXPLAIN("Call to GetAdaptersAddresses failed with error " + itos(err));
+ ERR_FAIL();
+ return;
+ };
+
+
+ IP_ADAPTER_ADDRESSES* adapter = addrs;
+
+ while (adapter != NULL) {
+
+ IP_ADAPTER_UNICAST_ADDRESS* address = adapter->FirstUnicastAddress;
+ while (address != NULL) {
+
+ char addr_chr[INET_ADDRSTRLEN];
+ SOCKADDR_IN* ipv4 = reinterpret_cast<SOCKADDR_IN*>(address->Address.lpSockaddr);
+
+ IP_Address ip;
+ ip.host= *((unsigned long*)&ipv4->sin_addr);
+
+
+ //inet_ntop(AF_INET, &ipv4->sin_addr, addr_chr, INET_ADDRSTRLEN);
+
+ r_addresses->push_back(ip);
+
+ address = address->Next;
+ };
+ adapter = adapter->Next;
+ };
+
+ memfree(addrs);
+};
+
+
+#else
+
+void IP_Unix::get_local_addresses(List<IP_Address> *r_addresses) const {
+
+ struct ifaddrs * ifAddrStruct=NULL;
+ struct ifaddrs * ifa=NULL;
+
+ getifaddrs(&ifAddrStruct);
+
+ for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) {
+ if (ifa ->ifa_addr->sa_family==AF_INET) { // check it is IP4
+ // is a valid IP4 Address
+
+ IP_Address ip;
+ ip.host= *((unsigned long*)&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr);
+
+ r_addresses->push_back(ip);
+ }/* else if (ifa->ifa_addr->sa_family==AF_INET6) { // check it is IP6
+ // is a valid IP6 Address
+ tmpAddrPtr=&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
+ char addressBuffer[INET6_ADDRSTRLEN];
+ inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
+ printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer);
+ } */
+ }
+
+ if (ifAddrStruct!=NULL) freeifaddrs(ifAddrStruct);
+
+}
+#endif
+
void IP_Unix::make_default() {
_create=_create_unix;
diff --git a/drivers/unix/ip_unix.h b/drivers/unix/ip_unix.h
index ec2d42c837..2fd5cf964b 100644
--- a/drivers/unix/ip_unix.h
+++ b/drivers/unix/ip_unix.h
@@ -41,6 +41,8 @@ class IP_Unix : public IP {
static IP* _create_unix();
public:
+ virtual void get_local_addresses(List<IP_Address> *r_addresses) const;
+
static void make_default();
IP_Unix();
};