'프로그래밍'에 해당되는 글 17건

  1. 2011/01/02 늅늅 CAANOO 개발기 #2 - 개발보드 사용하기
  2. 2010/09/07 늅늅 CAANOO 개발기 #1
  3. 2010/05/18 늅늅 삼성 바다 개발자 챌린지 시작 (2)
  4. 2010/05/07 늅늅 바다 SDK & IDE 일반 공개
  5. 2010/03/17 늅늅 bada IDE & SDK 1.0.0b1 릴리즈
  6. 2010/03/09 늅늅 삼성 바다 SDK & IDE 1.0.0b1-rc3 릴리즈
  7. 2009/10/17 늅늅 WM 응용 개발도구 세미나 (2)
  8. 2009/10/07 늅늅 KGC 2009 참관기 (4)
  9. 2009/10/05 늅늅 T store 모바일 어플리케이션 공모전 (2)
  10. 2009/09/13 늅늅 Mantis + SVN 연동

지난글에서 만들었던 libirrlicht.a를 이용해서 안드로이드 irrlicht 프로젝트를 만드는 과정을 정리한다.

0. 먼저 이클립스에서 Android 프로젝트를 하나 생성한다. 이름같은건 적당히 지어주고, 사용 SDK 버전은 8이상으로 해줘야 한다(irrlicht 빌드할때 사용한 버전과 맞추는게 좋다)

사용자 삽입 이미지


1. 지난글에서 사용했던 프로젝트를 재활용할 것이다.(새로 예제 만들긴 귀찮...;;;) 다음 소스들을 프로젝트 폴더로 복사해온다. 복사할때는 그냥 탐색기로 해당 폴더로 이동한 다음 드래그&드롭으로 이클립스 프로젝트에 떨구고 대화상자에서 copy를 선택하면 된다.
 
 . irrlicht 폴더의 include 폴더를 복사해온다.
 . jni폴더를 생성하고 irrlicht/jni 폴더안의 다음 파일들을 복사해온다.
  - android-activity.cpp
    : JNI 함수 이름들을 변경해야 한다. 정석대로라면 javah로 생성하는게 맞는거겠지만.. 그냥 find&replace로 바꿔버리겠다.
함수이름의 앞부분이 "Java_com_ellismarkov_irrlicht_" 이런식으로 되있을텐데 본인이 생성한 프로젝트의 패키지 이름으로 변경하면 된다. 예를들어 패키지 이름이 kr.newbie.irrlichtTest 라면
Java_kr_newbie_irrlichtTest_ 라고 변경하면 된다.
     nativeInitGL 함수에서 createDevice 함수를 호출하는 부분을 보면 irrlicht 엔진을 OpenGL ES2로 생성하게 되어있는데 ES1으로 바꾸자(irrlicht를 ES1으로만 컴파일 해놔서리... ㅡㅅㅡ;;)
  - android-receiver.cpp
  - android-receiver.h
  - app-android.cpp
    : app-android.cpp 파일의 앞부분에서 다음 네 라인을 찾아서 주석처리하고,
#include <android-logger.h>
#include <importgl.h>
#include <os.h>
using namespace os;
      line. 161의
Printer::Logger = new CAndroidLogger();
      이 부분도 주석처리한다.

  . src 폴더에 IrrlichtGLView.java, IrrlichtTest.java, Utils.java 파일을 복사해온다.

2. src 폴더에 java 파일들을 복사해넣으면 아마 에러가 뜰 것이다. 소스 제일 앞부분의 package를 새로 만든 프로젝트의 패키지 이름과 맞춰준다. 패키지 이름을 잊었다면 AndroidManifest.xml 파일을 참고.

3. 새로생성된 프로젝트의 액티비티는 사용하지 않을 것인다. AndroidManifest.xml 파일을 열어서

<activity android:name=".IrrlichtTestActivity"
                  android:label="@string/app_name">

   android:name <- 이부분의 값을 .IrrlichtTest로 바꾸자.

4. irrlicht/obj/local.armeabi 폴더에 가면 libirrlicht.a 파일이 있다. jni 폴더로 복사해온다.

5. 중요한걸 하나 뻬먹었다. irrlicht/jni폴더의 Android.mk 파일도 복사해온다. ㅋㅋ;
   그리고 Android.mk 파일을 다음과 같이 수정한다.

#
# COSOperator.cpp was removed from IRROTHEROBJ
LOCAL_PATH := $(call my-dir)
#
# 1. Load Static library (.a)
#
include $(CLEAR_VARS)
LOCAL_MODULE := static_irrlicht
LOCAL_SRC_FILES = ./libirrlicht.a
include $(PREBUILT_STATIC_LIBRARY)
#
# 2. Build Shared library (.so)
#
include $(CLEAR_VARS)
LOCAL_STATIC_LIBRARIES := static_irrlicht
ANDROID = android-activity.cpp android-receiver.cpp app-android.cpp
LOCAL_MODULE := irrlicht
LOCAL_ARM_MODE   := arm
LOCAL_CFLAGS := -O3 -DANDROID_NDK -I./../include/
LOCAL_SRC_FILES := $(ANDROID)
LOCAL_LDLIBS := -ldl -llog -lGLESv1_CM -lGLESv2
include $(BUILD_SHARED_LIBRARY)


6. cygwin 에서 jni 폴더로 이동한 다음에 ndk-build 커맨드를 실행한다.

7. 이클립스 패키지 익스플로러를 새로고침하면 obj 폴더가 추가된것이 보일것이다. F11키를 눌러서 Debug Run을 실행시키면 짜잔~! 열심히 뛰고 있는 시드니가 보인다 ^0^/

사용자 삽입 이미지


2011/12/04 21:50 2011/12/04 21:50

JNI를 이용하면 C++로 작성된 irrlicht 엔진을 Android 플랫폼에서도 돌아가게 할 수 있다.

인터넷 검색 및 삽질(-_-)끝에 알아낸 것들을 정리해둔다.

--------------------------------------------------------------

1. 프로그램 및 SDK 준비
 . Cygwin 설치
  - http://www.cygwin.com/
  - 설치시 git 플러그인을 같이 설치하는게 좋다.
    git를 이용해서 android로 포팅된 irrlicht 엔진 소스를 얻어오는데
    외부 프로그램으로 하려면 좀 귀찮아서... ㅡ,.ㅡ;
 . JDK 설치
  - http://www.oracle.com/technetwork/java/javase/downloads/index.html
 . Android SDK 설치
  - http://developer.android.com/sdk/index.html
 . Android NDK 설치
  - http://developer.android.com/sdk/ndk/index.html
  - NDK 설치 후 설치 경로를 시스템 환경변수 PATH에 추가시키자. 나중에 커맨드 칠때 편하다;

2. Android Irrlcht 소스 받기
 . Cygwin을 실행시킨 후 소스를 받을 디렉토리로 이동 후에 다음 커맨드를 입력한다.

git clone git://gitorious.org/irrlichtandroid/irrlichtandroid.git

 좀 기다리면 irrlichtandroid란 폴더에 소스가 다운받아져 있을 것이다.


3. Static Library로 빌드
 . irrlichtandroid/project/include/IrrCompileConfig.h 파일을 열어서 102번째 줄의 선언문을 다음같이 변경한다.

//++ ellis ++ // ANDROID NDK CAUSES TO BE HERE
//++ ellis ++ #define _IRR_POSIX_API_
//++ ellis ++ #define _IRR_COMPILE_WITH_X11_DEVICE_
//++ ellis ++ // Three lines added for android
#define _IRR_ANDROID_PLATEFORM_
#define _IRR_COMPILE_WITH_ANDROID_DEVICE_
#define _IRR_COMPILE_WITH_OGLES1_
// #define _IRR_COMPILE_WITH_OGLES2_  // <- 주석처리!
#define _DEBUG

  - OpenGL ES1 이나 ES2중 하나만 선택해야 빌드가 될텐데 일단 ES1으로 선택한다.
    (나중에 CreateDevice 함수로 Irrlicht Device를 만들때도 이때 선택한 그래픽옵션으로 만들어야 한다)

. irrlichtandroid/project/jni/Android.mk 파일을 다음과 같이 수정한다.

#
# COSOperator.cpp was removed from IRROTHEROBJ
LOCAL_PATH := $(call my-dir)
#
# 1. Build Static library (.a)
#
include $(CLEAR_VARS)
IRRMESHLOADER = CBSPMeshFileLoader.cpp CMD2MeshFileLoader.cpp CMD3MeshFileLoader.cpp CMS3DMeshFileLoader.cpp CB3DMeshFileLoader.cpp C3DSMeshFileLoader.cpp COgreMeshFileLoader.cpp COBJMeshFileLoader.cpp CColladaFileLoader.cpp CCSMLoader.cpp CDMFLoader.cpp CLMTSMeshFileLoader.cpp CMY3DMeshFileLoader.cpp COCTLoader.cpp CXMeshFileLoader.cpp CIrrMeshFileLoader.cpp CSTLMeshFileLoader.cpp CLWOMeshFileLoader.cpp CPLYMeshFileLoader.cpp
IRRMESHWRITER = CColladaMeshWriter.cpp CIrrMeshWriter.cpp CSTLMeshWriter.cpp COBJMeshWriter.cpp CPLYMeshWriter.cpp
IRRMESHOBJ = $(IRRMESHLOADER) $(IRRMESHWRITER) CSkinnedMesh.cpp CBoneSceneNode.cpp CMeshSceneNode.cpp CAnimatedMeshSceneNode.cpp CAnimatedMeshMD2.cpp CAnimatedMeshMD3.cpp CQ3LevelMesh.cpp CQuake3ShaderSceneNode.cpp
IRROBJ = CBillboardSceneNode.cpp CCameraSceneNode.cpp CDummyTransformationSceneNode.cpp CEmptySceneNode.cpp CGeometryCreator.cpp CLightSceneNode.cpp CMeshManipulator.cpp CMetaTriangleSelector.cpp COctreeSceneNode.cpp COctreeTriangleSelector.cpp CSceneCollisionManager.cpp CSceneManager.cpp CShadowVolumeSceneNode.cpp CSkyBoxSceneNode.cpp CSkyDomeSceneNode.cpp CTerrainSceneNode.cpp CTerrainTriangleSelector.cpp CVolumeLightSceneNode.cpp CCubeSceneNode.cpp CSphereSceneNode.cpp CTextSceneNode.cpp CTriangleBBSelector.cpp CTriangleSelector.cpp CWaterSurfaceSceneNode.cpp CMeshCache.cpp CDefaultSceneNodeAnimatorFactory.cpp CDefaultSceneNodeFactory.cpp
IRRPARTICLEOBJ = CParticleAnimatedMeshSceneNodeEmitter.cpp CParticleBoxEmitter.cpp CParticleCylinderEmitter.cpp CParticleMeshEmitter.cpp CParticlePointEmitter.cpp CParticleRingEmitter.cpp CParticleSphereEmitter.cpp CParticleAttractionAffector.cpp CParticleFadeOutAffector.cpp CParticleGravityAffector.cpp CParticleRotationAffector.cpp CParticleSystemSceneNode.cpp CParticleScaleAffector.cpp
IRRANIMOBJ = CSceneNodeAnimatorCameraFPS.cpp CSceneNodeAnimatorCameraMaya.cpp CSceneNodeAnimatorCollisionResponse.cpp CSceneNodeAnimatorDelete.cpp CSceneNodeAnimatorFlyCircle.cpp CSceneNodeAnimatorFlyStraight.cpp CSceneNodeAnimatorFollowSpline.cpp CSceneNodeAnimatorRotation.cpp CSceneNodeAnimatorTexture.cpp
IRRDRVROBJ = CNullDriver.cpp COGLESDriver.cpp COGLESTexture.cpp COGLESExtensionHandler.cpp
IRRDRVOBJ2 = COGLES2Driver.cpp COGLES2FixedPipelineShader.cpp COGLES2ParallaxMapRenderer.cpp COGLES2SLMaterialRenderer.cpp COGLES2ExtensionHandler.cpp COGLES2NormalMapRenderer.cpp COGLES2Renderer2D.cpp COGLES2Texture.cpp
IRRIMAGEOBJ = CColorConverter.cpp CImage.cpp CImageLoaderBMP.cpp CImageLoaderJPG.cpp CImageLoaderPCX.cpp CImageLoaderPNG.cpp CImageLoaderPSD.cpp CImageLoaderTGA.cpp CImageLoaderPPM.cpp CImageLoaderWAL.cpp CImageLoaderRGB.cpp CImageWriterBMP.cpp CImageWriterJPG.cpp CImageWriterPCX.cpp CImageWriterPNG.cpp CImageWriterPPM.cpp CImageWriterPSD.cpp CImageWriterTGA.cpp
IRRVIDEOOBJ = CVideoModeList.cpp CFPSCounter.cpp $(IRRDRVROBJ) $(IRRIMAGEOBJ)
IRRSWRENDEROBJ = CSoftwareDriver.cpp CSoftwareTexture.cpp CTRFlat.cpp CTRFlatWire.cpp CTRGouraud.cpp CTRGouraudWire.cpp CTRTextureFlat.cpp CTRTextureFlatWire.cpp CTRTextureGouraud.cpp CTRTextureGouraudAdd.cpp CTRTextureGouraudNoZ.cpp CTRTextureGouraudWire.cpp CZBuffer.cpp CTRTextureGouraudVertexAlpha2.cpp CTRTextureGouraudNoZ2.cpp CTRTextureLightMap2_M2.cpp CTRTextureLightMap2_M4.cpp CTRTextureLightMap2_M1.cpp CSoftwareDriver2.cpp CSoftwareTexture2.cpp CTRTextureGouraud2.cpp CTRGouraud2.cpp CTRGouraudAlpha2.cpp CTRGouraudAlphaNoZ2.cpp CTRTextureDetailMap2.cpp CTRTextureGouraudAdd2.cpp CTRTextureGouraudAddNoZ2.cpp CTRTextureWire2.cpp CTRTextureLightMap2_Add.cpp CTRTextureLightMapGouraud2_M4.cpp IBurningShader.cpp CTRTextureBlend.cpp CTRTextureGouraudAlpha.cpp CTRTextureGouraudAlphaNoZ.cpp CDepthBuffer.cpp CBurningShader_Raster_Reference.cpp
IRRIOOBJ = CFileList.cpp CFileSystem.cpp CLimitReadFile.cpp CMemoryFile.cpp CReadFile.cpp CWriteFile.cpp CXMLReader.cpp CXMLWriter.cpp CZipReader.cpp CPakReader.cpp CNPKReader.cpp CTarReader.cpp CMountPointReader.cpp irrXML.cpp CAttributes.cpp lzma/LzmaDec.c
IRROTHEROBJ = CIrrDeviceConsole.cpp CIrrDeviceStub.cpp CLogger.cpp Irrlicht.cpp os.cpp
IRRGUIOBJ = CGUIButton.cpp CGUICheckBox.cpp CGUIComboBox.cpp CGUIContextMenu.cpp CGUIEditBox.cpp CGUIEnvironment.cpp CGUIFileOpenDialog.cpp CGUIFont.cpp CGUIImage.cpp CGUIInOutFader.cpp CGUIListBox.cpp CGUIMenu.cpp CGUIMeshViewer.cpp CGUIMessageBox.cpp CGUIModalScreen.cpp CGUIScrollBar.cpp CGUISpinBox.cpp CGUISkin.cpp CGUIStaticText.cpp CGUITabControl.cpp CGUITable.cpp CGUIToolBar.cpp CGUIWindow.cpp CGUIColorSelectDialog.cpp CDefaultGUIElementFactory.cpp CGUISpriteBank.cpp CGUIImageList.cpp CGUITreeView.cpp
ZLIBOBJ = zlib/adler32.c zlib/compress.c zlib/crc32.c zlib/deflate.c zlib/inffast.c zlib/inflate.c zlib/inftrees.c zlib/trees.c zlib/uncompr.c zlib/zutil.c
JPEGLIBOBJ = jpeglib/jcapimin.c jpeglib/jcapistd.c jpeglib/jccoefct.c jpeglib/jccolor.c jpeglib/jcdctmgr.c jpeglib/jchuff.c jpeglib/jcinit.c jpeglib/jcmainct.c jpeglib/jcmarker.c jpeglib/jcmaster.c jpeglib/jcomapi.c jpeglib/jcparam.c jpeglib/jcprepct.c jpeglib/jcsample.c jpeglib/jctrans.c jpeglib/jdapimin.c jpeglib/jdapistd.c jpeglib/jdatadst.c jpeglib/jdatasrc.c jpeglib/jdcoefct.c jpeglib/jdcolor.c jpeglib/jddctmgr.c jpeglib/jdhuff.c jpeglib/jdinput.c jpeglib/jdmainct.c jpeglib/jdmarker.c jpeglib/jdmaster.c jpeglib/jdmerge.c jpeglib/jdpostct.c jpeglib/jdsample.c jpeglib/jdtrans.c jpeglib/jerror.c jpeglib/jfdctflt.c jpeglib/jfdctfst.c jpeglib/jfdctint.c jpeglib/jidctflt.c jpeglib/jidctfst.c jpeglib/jidctint.c jpeglib/jmemmgr.c jpeglib/jmemnobs.c jpeglib/jquant1.c jpeglib/jquant2.c jpeglib/jutils.c jpeglib/jcarith.c jpeglib/jdarith.c jpeglib/jaricom.c
LIBPNGOBJ = libpng/png.c libpng/pngerror.c libpng/pngget.c libpng/pngmem.c libpng/pngpread.c libpng/pngread.c libpng/pngrio.c libpng/pngrtran.c libpng/pngrutil.c libpng/pngset.c libpng/pngtrans.c libpng/pngwio.c libpng/pngwrite.c libpng/pngwtran.c libpng/pngwutil.c
LIBAESGM = aesGladman/aescrypt.cpp aesGladman/aeskey.cpp aesGladman/aestab.cpp aesGladman/fileenc.cpp aesGladman/hmac.cpp aesGladman/prng.cpp aesGladman/pwd2key.cpp aesGladman/sha1.cpp aesGladman/sha2.cpp
BZIP2OBJ = bzip2/blocksort.c bzip2/huffman.c bzip2/crctable.c bzip2/randtable.c bzip2/bzcompress.c bzip2/decompress.c bzip2/bzlib.c
ANDROID = importgl.cpp CIrrDeviceAndroid.cpp
LOCAL_MODULE := irrlicht
LOCAL_ARM_MODE   := arm
LOCAL_CFLAGS := -O3 -DANDROID_NDK -DDISABLE_IMPORTGL -I./../include/ -I./include/
LOCAL_SRC_FILES := \
     $(ANDROID) \
     $(IRRVIDEOOBJ) $(IRRDRVOBJ2) \
     $(IRRMESHOBJ) $(IRROBJ) $(IRRPARTICLEOBJ) $(IRRANIMOBJ) \
     $(IRRSWRENDEROBJ) $(IRRIOOBJ) $(IRROTHEROBJ) \
     $(IRRGUIOBJ) $(ZLIBOBJ) $(JPEGLIBOBJ) $(LIBPNGOBJ) $(LIBAESGM) \
     $(BZIP2OBJ)
LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog -lGLESv2
include $(BUILD_STATIC_LIBRARY)
#
# 2. Build Shared library (.so)
#
include $(CLEAR_VARS)
LOCAL_MODULE    := fakeIrrlicht
LOCAL_STATIC_LIBRARIES := irrlicht
include $(BUILD_SHARED_LIBRARY)

 . irrlichtandroid/project/jni 폴더로 이동한 후 ndk로 빌드하면 .a 파일이 생성!

ndk-bulid --jobs <CPU 코어수>

  - 멀티코어를 이용해서 빌드하면 빌드속도가 꽤 많이 단축되니 꼭 멀티코어 빌드로 하자.
    다만, 멀티코어 빌드시 별 이유없이 실패할 때가 있는데 그땐 그냥 obj 폴더를 지우고
    다시 빌드하면 된다. (아마도 버그인듯;)
 
 . 빌드가 성공하면 irrlichtandroid/project/obj/local/armeabi 폴더에 libirrlicht.a 파일이 생성되있을것이다.
   같이 생성된 so파일(libfakeIrrlicht.so)는 사용하지 않으니 무시할 것! (어차피 빈 껍데기 ㅋ)
 
 . irrlicht 프로젝트에서 사용하는 방법은 다음글에 계속.. 

2011/11/20 21:57 2011/11/20 21:57

날자고도의 탄막슈팅 사이트를 운영하고 계시는 날자고도님이 GameCodi에서

"60분 걸리는 빌드를 1분대로" 라는 모임을 여서서 참가하였다.



장소는 강남 토즈라는데 뭐 세미나실 빌려주고 이런 곳인듯.

강남이랑 인연이 없다보니 그동넬 첨가봤는데

토욜이라 그런지 더운날씨에도 거리에 사람들이 바글바글하다=_=;;

그런데 거리의 여자들이 하나같이 선글라스를 쓰고 있는건 좀 웃겼다 ㅋㅋㅋ


각설하고, 토즈에 가보니 아무도 없음... -_-;

시작 20분전인데! 나 혼자! ㅠㅠ


한 10분전쯤 되니까 슬슬 사람들이 들어온다.

게임코디에선 서로 댓글도 달아주는 사이지만

오프라인에선 처음 보는 사람들이라 어색어색... 서먹서먹...


여기서 잠깐 게임 코디 인물평

게임코디님 : 날자고도님 오시기 전에 분위기 메이커 해주심 ㅎㅎ
                  예상외로 훈남이셨음 ㅋㅋ

날자고도님 : 차가 막혀서 지각-_-; 잠시나마 횡령설이 돌았음 ㅋ

포인트님 : 포인트님이 좋아합니다! 바로 앞자리에 계셔서 얼굴을 제대로 못봄.
               후덕하신 등짝만 기억...



간략히 강의 내용을 요약하면..

. 코드가 많아질수록 빌드 타임이 증가 -> 대략 지수함수 그래프의 모양을 띔 ㅋ

. 컴파일이 오래 걸리는 이유
 - 게임엔진, 표준 라이브러리, 내가 만든 소스가 어우러져서
    별다른 수정이 없어도 모든 코드가 매번 재컴파일 되기 때문

. VC의 해법 : 미리 컴파일 된 헤더  -> 의외로 안쓰는 사람이 많다! (나도 포함-.-;;;)
 - 절대 바뀌지 않는 헤더만 첨부 (회사의 코어 라이브러리 등)

. 코드의 종속성 없애기
 - 프로그래머 종속성 (사람 종속성)
  : A가 만들어야 B가 작업가능 (보통 따로 작업 가능하지 않음?)
    혹은 그래픽 리소스가 있어야 작업가능
    이건 PM의 능력이 좋으면 해결되지 않을까??
    약간 설명이 부족한 듯...
 - 헤더 안에 헤더를 넣지 말자 (코드 종속성)
  : 모든 헤더를 cpp에?
 - 멤버 클래스는 포인터로 관리
  : 전방 선언을 할 클래스를 모은다(클래스 선언을 모은다) -> 미리 컴파일된 헤더 이용
    Effective C++에 나오는 방법과 유사...
    관련 질문으로 이렇게 전방선언으로 처리하면 Debug할떄 Heap 덤프에서 제대로 확인하기
    어렵다고 하는데(질문자 내공이 있어보였음 ㄷㄷ) 관련 내용 확인 필요
  - 멀티코어 빌드
   : 프로젝트의 멀티코어 옵션을 On 해주는 것만으로 빌드속도 향상!
     /MP 플래그 + 최소 빌드 가능 : 아니오
     VS2005에선 멀티코어 빌드관련 버그가 있음.. 2008이상부터 추천


샘플 예제로는 날자고도의 탄막슈팅에 가보면 예제프로젝트들이 모두 위의 기법을 이용해서

제작되었다고 한다.. 이거슨 고도의 사이트 광고 ㅋㅋㅋ;;


어떻게보면 기본적인 사항들인데 실무에서 하다보면

여러가지 이유로(귀찮다거나, 귀찮을거 같거나, 귀찮아서) 안하게 되는 사항들이 있다..

대표적인게 미리컴파일된 헤더 ㅋㅋ;;

한번쯤 내가 만든 소스들을 점검해보고 앞으로 만들 소스들에도 적용할 수 있도록 해야겠다.

2011/09/03 18:59 2011/09/03 18:59
아이폰4의 레티나 디스플레이의 해상도는 아이폰3gs의 딱 두배인 640*960이다.

따라서 아이폰4용으로 Irrlicht 디바이스를 생성하려면 보통 다음같은 코드를 작성하게 된다.

SIrrlichtCreationParameters params;
   
params.DriverType = video::EDT_OGLES1;
params.WindowSize = core::dimension2d<u32>(640,960);
params.WindowId   = appDelegate.window;
params.Bits          = 32;
   
device = createDeviceEx((const SIrrlichtCreationParameters)params);


하지만 컴파일 후 실행시켜보면 화면이 제대로 표시가 안된다.

사용자 삽입 이미지

아이폰 3gs 화면


사용자 삽입 이미지

아이폰 4 화면



캡쳐화면을 보면 화면이 확대되어진 것처럼 보이는데 레티나 디스플레이에서의

OpenGL-ES 뷰 설정이 제대로 되어 있지 않기 때문에 발생하는 현상이다.


CIrrDeviceIPhone.m의 소스 중 displayCreateInWindow 메소드 구현부를 다음과 같이 수정한다.

- (void) displayCreateInWindow: (UIWindow**) window Width: (int) w Height: (int) h

    // Create the GL context now, so that the driver initializetion
    // can make OpenGL calls.
    context = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES1];
    [EAGLContext setCurrentContext: context];
    // Create our view.
    CGRect rect;
    rect.origin.x = 0;
    rect.origin.y = 0;
   
    bool isIphone4 = false;
   
    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
        CGFloat scale = [[UIScreen mainScreen] scale];
        if (scale == 2.0f) {
            isIphone4 = true;
        }
        rect.size.width = w / scale;
        rect.size.height = h / scale;
    }
    else  {
        rect.size.width = w;
        rect.size.height = h;
    }
    view = [[IrrIPhoneView alloc] initWithFrame: rect];
    view.layer.opaque = YES;
   
    if (isIphone4) {
        view.layer.contentsScale = 2;   
        view.contentScaleFactor = 2.0;
    }
   
    if (nil != *window)
    {
        [(*window) addSubview: view];
    }
   
    // Create the GL context now, so that the driver initializetion
    // can make OpenGL calls.
    context = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES1];
    [EAGLContext setCurrentContext: context];
}


소스 중간에 mainscreen의 스케일값을 얻어오는 부분이 있는데 이 값이 2.0이면 레티나 디스플레이다.

레티나 디스플레이라면 뷰 생성후 레이어의 contentsScale의 값을 2,

뷰의 contentScaleFactor의 값을 2.0으로 지정해줘야 된다.

또 한가지 유의해야 할 점은 화면 해상도는 640*960 이지만 프레임 사이즈는 3gs와 동일한

320*480이기 때문에 scale값이 2.0이라면 뷰 생성시 initWithFrame에 넘겨주는 프레임의 크기를

scale값으로 나눠주었다.


다시 컴파일해보면 화면이 제대로 나온다.

사용자 삽입 이미지


마지막 한가지! 화면 해상도가 늘어났다고 터치 해상도까지 늘어난 것은 아니다.

터치 이벤트를 찍어보면 알겠지만 가로세로 최대 320*480으로

아이폰4나 3gs나 동일한 터치 해상도를 가지고 있다.

레티나 터치 스크린까지 만들기엔 무리였는듯(터치 해상도가 민감해야될 이유도 없고..).

입력값 처리할 땐 알아서 2배로 뻥뛰기해서 써야된다.
2011/03/12 12:08 2011/03/12 12:08
 irrlicht OpenGL-ES branch(이하 irrlicht)의 iPhone 포팅에 대해선 도플갱어님의 블로그

잘 설명되어 있으나 글이 올라온 시점이 오래되서 최신버전의 irrlicht에선 적용할 수 없었다.

지난 한주간 최신버전의 irrlicht에서 컴파일하는 방법에 대해서 알아낸 것들을 정리해본다.


1) irrlicht 의 최신 SVN 버전을 체크아웃 받는다. SVN 주소는 다음과 같다.

- http://irrlicht.svn.sourceforge.net/svnroot/irrlicht/branches/ogl-es
 (이 글을 쓰는 시점에서 최신버전은 Rev. 3584으로 2011년 2월 4일에 커밋된 것이다.)


2) 체크아웃받은 폴더의 source/Irrlicht/MacOSX 에 보면 xcode 프로젝트 파일이 있다.
더블클릭하여 실행한 후 다음 파일을 프로젝트에서 제외시킨다.

(프로젝트상의 경로)
- MacOSX/Irrlicht/libraries/zlib/gzio.c
- MacOSX/Irrlicht/libraries/libpng/pngcrcd.c


사용자 삽입 이미지

소스 탐색창에서 빨갛게 표시된 파일들을 찾아 제거하면 된다.



위 파일들은 프로젝트에 포함되어 있으나 실제로는 존재하지 않는 파일이다.

iPhone에서는 사용하지 않는 파일인 OSXClipboard.mm도 찾아서 제거한다.


- MaxOSX/Irrlicht/irr/device/MacOSX/OSXClipboard.mm



3) 프로젝트에 다음 파일들을 추가한다.

(실제 파일 경로)
- source/Irrlicht/wglext.h
- source/Irrlicht/eglext.h
- source/Irrlicht/gles-ext.h
- source/Irrlicht/COGLESDriver.h
- source/Irrlicht/COGLESDriver.cpp
- source/Irrlicht/COGLESExtensionHandler.h
- source/Irrlicht/COGLESExtensionHandler.cpp
- source/Irrlicht/COGLESMaterialRenderer.h
- source/Irrlicht/COGLESTexture.h
- source/Irrlicht/COGLESTexture.cpp
- source/Irrlicht/CIrrDeviceIPhone.h
- source/Irrlicht/CIrrDeviceIPhone.cpp
- source/Irrlicht/CIrrDeviceIPhone.m

추가 위치는 아무곳에나 해도 상관없지만 기존 irrlicht와의 일관성을 유지하려면

GLES관련 파일은 MaxOSX-Irrlicht-Engine-irr-video-OpenGL에,

iPhone Device관련 파일은 MaxOSX-Irrlicht-Engine-irr-device-MacOSX에 추가하는게 보기 좋다(...고 생각함ㅡㅡ;)

사용자 삽입 이미지


사용자 삽입 이미지



4) MacOSX-include-IrrCompileConfig.h 파일을 열고 다음 전처리기 명령어를 추가한다.
추가 위치는 대략 #include <stdio.h> 아랫줄 쯤.


#define NO__IRR_COMPILE_WITH_WAD_ARCHIVE_LOADER_
#define NO_IRR_COMPILE_WITH_HALFLIFE_LOADER_
#define NO_IRR_COMPILE_WITH_BURNINGSVIDEO_
#define NO_IRR_COMPILE_WITH_CONSOLE_DEVICE_
#define NO_IRR_COMPILE_WITH_OGLES2_


사용자 삽입 이미지



5) 빌드한다.

!!팁!! - "error:There is no SDK with the name or path..." 에러가 발생할 경우



6) source/Irrlicht/MacOSX/build/Debug-iphonesimulator 폴더의 irrlicht.a 파일을 사용하려는 프로젝트 폴더에 복사해서 넣고 개발 프로젝트에서 추가한 후 씐나게 개발하면 된다 유후 >_<b

사용자 삽입 이미지



2011/02/26 13:23 2011/02/26 13:23
개발자 세미나 가서 개발보드를 얻어온지도 한달여가 지났는데

그동안 방구석에 방치만 해두었다가 새로 노트북 구입하고

한번 개발보드를 셋팅해보았다. 하드웨어쪽으론 경험이 부족해서

셋팅하면서 좀 뻘짓을 많이 했는데 혹시나 나같은 뻘짓을 할 다른 분들을 위해

셋팅 및 사용법을 간단히 적어보겠다.


----------------------------------------------------------------------

사용자 삽입 이미지

이것이 개발 보드를 셋팅할 노트북.. 지난번에 뽑기 실패한 한성 놋북에서

MSI로 갈아탔다. 이건 다행히 불량화소도 없고 윈도우도 바로 깔리고 별 문제가 없는듯.

사용자 삽입 이미지

개발자 보드 구성품은 지난 게시물을 참고하기로 하고.. 먼저 하드웨어 셋팅부터 살펴보자.

보드 좌측에 20pin 케이블을 꼿아서 카누와 연결해주고

보드 상단의 시리얼 포트를 컴퓨터와 연결해준다.
(노트북에 시리얼 포트가 없어서 USB2Serial 젠더를 사용했다)

또, 보드 상단의 파워포트를 개발보드에 첨부된 파워 케이블을 사용하여 컴퓨터USB포트와

연결해주면 하드웨어 셋팅은 끝!


이제 카누 콘솔에 접속할 프로그램을 셋팅해야 되는데 나는 무료 공개프로그램인

Putty를 사용하겠다. 개발자 세미나에서 보니 GPH 에선 SecureCRT을 사용하고 있는듯

했는데 이건 무료가 아니라서... ㅠㅠ


사용자 삽입 이미지

Putty를 실행한 후 Session에서 Connection type을  Serial로 선택하고

Speed를 115200으로 변경한다. Serial line은 개발자 보드가 연결된 COM포트 이름을 적어주면 된다.

사용자 삽입 이미지

Window-Translation 탭으로 이동해서  Character set을 UTF-8로 변경한다.

사용자 삽입 이미지

Connection-Serial 탭을 선택하고 Parity 값을 None으로 변경한다. 그리고 Open 버튼을

클릭하면 콘솔창으로 윈도우가 바뀌는데 이때 카누의 전원을 켠다.
(전원을 켠 상태에서 접속할 수도 있는데 이러면 키보드 입력이 먹지 않는다... 이유는 모름
ㅠㅜ)

사용자 삽입 이미지

카누 부팅 메세지들이 막 출력된다.

사용자 삽입 이미지

부팅이 완료되고 'Ctrl+C'를 누르면 카누의 화면이 꺼지고 쉘로 접근할 수 있다.

사용자 삽입 이미지

리눅스 명령어들도 잘 된다. 카누 쉘에서 컴파일도 가능하다는데 이건 테스트 못해봄.. 나중에 해봐야지 ㅋ

사용자 삽입 이미지

다시 카누메뉴로 돌아가려면 gp2xmenu를 실행하면 된다. 실행하면 카누 화면이 다시 켜진다.

이제 개발만 하면 된다. 유후~
2011/01/02 13:36 2011/01/02 13:36

CAANOO 개발기 #1

프로그래밍 RSS Icon ATOM Icon 2010/09/07 11:52 늅늅
휴가때 할일도 없고...

소위 '명텐도'라고 불리는 GPH의 CAANOO가 발매되었다는 소식을 듣고

본체 구입과 함께 게임 개발을 해보기로 했다.

사용자 삽입 이미지

이렇게 생긴 녀석임..



뭐, SDK도 공개한다고 하고

OpenGL도 쓸 수 있다고 하니 공부도 할 겸 겸사겸사 일석이조 아닌가?

라는 생각이었는데. 막상 개발을 하려고 보니 정작 Windows용 SDK는 아직 공개가 안됬다;
(정확하게 말하면 Windows용 크로스 컴파일러가 공개가 안되거지만;)

사용자 삽입 이미지

쿨한 관리자의 답변



난 그것도 모르고 컴파일도 되고 실행파일도 만들었는데 왜 실행이 안되는겨!!

라며 하룻동안 고민했었는데.... ㅡ.ㅜ;;



에고, 일단 리눅스를 버츄얼 박스로 깔던지.. 맥OS에서 돌아갈지 모르겠는데

그쪽으로 깔던지 좀 해봐야 할 듯. 이거 휴가기간내 그럭저럭 돌아가게 만들려고 했는데

생각보다 셋팅시간이 오래걸리네-_-;;
2010/09/07 11:52 2010/09/07 11:52
TAG

사용자 삽입 이미지

국내에선 그닥 관심을 끌지 못하고 있는 삼성 바다 개발자 챌린지가 시작됬다.

상금이 30만 달러나 한다는데 과연 어떤 소프트가 받게될지..

일단 큰 상금을 걸었으니 개발자들이 많이 참여할 것 같다.

그런데 역시 삼성이라고 해야할 지,

우리나라 개발자들을 높게 쳐서 세계인과 경쟁하라는 것인지

지역 개발자 챌린지 국가에 한국은 쏙~ 빠져있다-.-;

사용자 삽입 이미지

아니, 아예 안중에도 없는건가 ㅡㅡ;

2010/05/18 10:00 2010/05/18 10:00

소리 소문없이(?) 바다 SDK와 IDE가 일반인도 다운받을 수 있게 공개되었다.

http://developer.bada.com/

사이트 가입하고 Development Tools 메뉴로 들어가면 다운받을 수 있는데

일반 공개용과 파트너 공개용으로 나뉘어 있다.
(사실 둘의 차이점은 그냥 버전 차이.. 일반은 1.0.0b2, 파트너는 1.0.0b2-rc7이다)


슬슬 개발자 챌린지를 시작하려는 듯?

이미 아오안이 되버린것 같은 느낌이지만,
 
웨이브 폰 출시되고 언론에서 좀 띄워주면 분위기 탈 수 있으려나...;;


흠.. 하지만 개발자 포럼이 전부 영어인건 뷁!

한국 사이트도 만들란 말야~~~

2010/05/07 08:23 2010/05/07 08:23
사용자 삽입 이미지

불과 2주전에 업뎃한거 같은데 잠깐 사이에 또 버전업;;

중간에 rc4도 나왔던데(1주일에 하나씩 나오나-_-;)
 
일단 건너가고 최신버전인 1.0.0b1으로 바꿨다.


이번엔 에뮬레이터 스킨도 바뀌고 네임스페이스를 더 철저하게 사용하도록 바뀌게 된 듯..

그리고, 2-Phase Construction 이라며 클래스 생성시

new -> Construct() -> Initialize()순으로 호출하라고 했었는데

이제는 new -> Initialize() -> (event 발생) OnInitialize() 로 바뀌었다;;

뭥미.. 일관성이 없구먼-_-;

뭐, 기존 코드도 그냥 돌아가긴 하는데.. 바꾸긴 바꿔놔야 할 듯.
2010/03/17 17:57 2010/03/17 17:57