瀏覽代碼

EPA & some windows bits

Panagiotis Christopoulos Charitos 11 年之前
父節點
當前提交
bc53cc7ed6

+ 2 - 2
include/anki/collision/GjkEpa.h

@@ -46,8 +46,8 @@ public:
 		ContactPoint& contact);
 
 private:
-	static const U MAX_SIMPLEX_COUNT = 20;
-	static const U MAX_FACE_COUNT = 50;
+	static const U MAX_SIMPLEX_COUNT = 50;
+	static const U MAX_FACE_COUNT = 100;
 
 	class Face
 	{

+ 3 - 0
include/anki/gl/GlCommon.h

@@ -18,6 +18,9 @@
 #include <string>
 
 #if ANKI_GL == ANKI_GL_DESKTOP
+#	if ANKI_OS == ANKI_OS_WINDOWS && !defined(GLEW_STATIC)
+#		define GLEW_STATIC
+#	endif
 #	include <GL/glew.h>
 #	if !defined(ANKI_GLEW_H)
 #		error "Wrong GLEW included"

+ 5 - 0
include/anki/util/File.h

@@ -193,6 +193,11 @@ extern void removeDirectory(const char* dir);
 /// Equivalent to: mkdir dir
 extern void createDirectory(const char* dir);
 
+/// Get the home directory
+/// Write the home directory to @a buff. The @a buffSize is the size of the 
+/// @a buff. If the @buffSize is not enough the function will throw exception
+extern void getHomeDirectory(U32 buffSize, char* buff);
+
 /// @}
 
 } // end namespace anki

+ 16 - 12
src/CMakeLists.txt

@@ -1,16 +1,6 @@
 #
-# Add anki sub libraries
+# Set platform specific 
 #
-set(ANKI_SUB_DIRS script renderer scene event input physics resource core misc gl collision math util)
-
-set(ANKI_LIBS "")
-
-foreach(TMP ${ANKI_SUB_DIRS})
-	add_subdirectory(${TMP})
-	set(ANKI_LIBS ${ANKI_LIBS} anki${TMP})
-endforeach()
-
-# Set the platform libraries
 if(LINUX)
 	set(_SYS GL ankiglew pthread)
 elseif(MACOS)
@@ -21,11 +11,25 @@ elseif(ANDROID)
 	include_directories("${ANDROID_NDK}/sources/android/native_app_glue")
 	set(_SYS_SRC "${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c")
 elseif(WINDOWS)
-	set(_SYS GL ankiglew)
+	set(_SYS ankiglew opengl32 version)
+
+	add_definitions("-DGLEW_STATIC")
 else()
 	message(FATAL_ERROR "Unhandled case")
 endif()
 
+#
+# Add anki sub libraries
+#
+set(ANKI_SUB_DIRS script renderer scene event input physics resource core misc gl collision math util)
+
+set(ANKI_LIBS "")
+
+foreach(TMP ${ANKI_SUB_DIRS})
+	add_subdirectory(${TMP})
+	set(ANKI_LIBS ${ANKI_LIBS} anki${TMP})
+endforeach()
+
 if(${ANKI_WINDOW_BACKEND} STREQUAL "SDL")
 	SET(ANKI_LIBS ${ANKI_LIBS} ankisdl)
 endif()

+ 22 - 7
src/collision/GjkEpa.cpp

@@ -299,7 +299,9 @@ Bool GjkEpa::intersect(const ConvexShape& shape0, const ConvexShape& shape1,
 		F32 d = p.dot(normal);
 
 		// Check new distance
-		if(d - distance < 0.00001)
+		if(d - distance < 0.001 
+			|| m_faceCount == m_faces.size() - 2
+			|| m_count == m_simplex.size() - 1)
 		{
 			contact.m_normal = normal;
 			contact.m_depth = d;
@@ -309,30 +311,43 @@ Bool GjkEpa::intersect(const ConvexShape& shape0, const ConvexShape& shape1,
 		{
 			// Create 3 new faces by adding 'p'
 
+			// Search if the simplex is there
+			U i;
+			for(i = 0; i < m_count; i++)
+			{
+				if(p == m_simplex[i])
+				{
+					break;
+				}
+			}
+
+			if(i == m_count)
+			{
+				// Add p
+				m_simplex[m_count++] = p;
+			}
+
 			Array<U32, 3> idx = face->m_idx;
 
 			// Canibalize existing face
 			face->m_idx[0] = idx[0];
 			face->m_idx[1] = idx[1];
-			face->m_idx[2] = m_count;
+			face->m_idx[2] = i;
 			face->m_normal[0] = -100.0;
 
 			// Next face
 			face = &m_faces[m_faceCount++];
 			face->m_idx[0] = idx[1];
 			face->m_idx[1] = idx[2];
-			face->m_idx[2] = m_count;
+			face->m_idx[2] = i;
 			face->m_normal[0] = -100.0;
 
 			// Next face
 			face = &m_faces[m_faceCount++];
 			face->m_idx[0] = idx[2];
 			face->m_idx[1] = idx[0];
-			face->m_idx[2] = m_count;
+			face->m_idx[2] = i;
 			face->m_normal[0] = -100.0;
-
-			// Add p
-			m_simplex[m_count++] = p;
 		}
 	}
 

+ 3 - 1
src/core/App.cpp

@@ -67,7 +67,9 @@ void App::initDirs()
 {
 #if ANKI_OS != ANKI_OS_ANDROID
 	// Settings path
-	settingsPath = String(getenv("HOME")) + "/.anki";
+	Array<char, 512> home;
+	getHomeDirectory(sizeof(home), &home[0]);
+	String settingsPath = String(&home[0]) + "/.anki";
 	if(!directoryExists(settingsPath.c_str()))
 	{
 		ANKI_LOGI("Creating settings dir: %s", settingsPath.c_str());

+ 18 - 0
src/util/FilePosix.cpp

@@ -110,4 +110,22 @@ void createDirectory(const char* dir)
 	}
 }
 
+//==============================================================================
+void getHomeDirectory(U32 buffSize, char* buff)
+{
+	const char* home = getenv("HOME");
+	if(home == nullptr)
+	{
+		throw ANKI_EXCEPTION("HOME environment not set");
+	}
+
+	U len = strlen(home);
+	if(len + 1 > buffSize)
+	{
+		throw ANKI_EXCEPTION("buffSize too small");
+	}
+
+	memcpy(buff, home, len + 1);
+}
+
 } // end namespace anki

+ 35 - 4
src/util/FileWindows.cpp

@@ -45,12 +45,12 @@ void removeDirectory(const char* dirname)
 {
 	ANKI_ASSERT(dirname);
 
-	SHFILEOPSTRUCTW fileOperation;
+	SHFILEOPSTRUCTA fileOperation;
 	fileOperation.wFunc = FO_DELETE;
 	fileOperation.pFrom = dirname;
 	fileOperation.fFlags = FOF_NO_UI | FOF_NOCONFIRMATION;
 
-	I result = SHFileOperationW(&fileOperation);
+	I result = SHFileOperationA(&fileOperation);
 	if(result != 0) 
 	{
 		throw ANKI_EXCEPTION("Could not delete directory %s", dirname);
@@ -62,11 +62,42 @@ void createDirectory(const char* dir)
 {
 	ANKI_ASSERT(dir);
 
-	if(CreateDirectory(dir, NULL) 
-		|| GetLastError() == ERROR_ALREADY_EXISTS)
+	if(CreateDirectory(dir, NULL) == 0)
 	{
 		throw ANKI_EXCEPTION("Failed to create directory %s", dir);
 	}
 }
 
+//==============================================================================
+void getHomeDirectory(U32 buffSize, char* buff)
+{
+	const char* homed = getenv("HOMEDRIVE");
+	const char* homep = getenv("HOMEPATH");
+
+	if(homed == nullptr || homep == nullptr)
+	{
+		throw ANKI_EXCEPTION("HOME environment variables not set");
+	}
+
+	U len0 = strlen(homed);
+	U len1 = strlen(homep);
+	if(len0 + len1 + 1 > buffSize)
+	{
+		throw ANKI_EXCEPTION("buffSize too small");
+	}
+
+	memcpy(buff, homed, len0);
+	memcpy(buff + len0, homep, len1 + 1);
+
+	// Convert to Unix path
+	while(*buff != '\0')
+	{
+		if(*buff == '\\')
+		{
+			*buff = '/';
+		}
+		++buff;
+	}
+}
+
 } // end namespace anki

+ 1 - 1
testapp/Main.cpp

@@ -614,7 +614,7 @@ void initSubsystems(int argc, char* argv[])
 	nwinit.m_minorVersion = glminor;
 	nwinit.m_depthBits = 0;
 	nwinit.m_stencilBits = 0;
-	nwinit.m_fullscreenDesktopRez = true;
+	nwinit.m_fullscreenDesktopRez = false;
 	nwinit.m_debugContext = ANKI_DEBUG;
 	win = new NativeWindow;	
 	win->create(nwinit);