기본적인 기능은 완성..

이제 슬슬 OpenGL 에 대해서 감이오기 시작한다..
먼저 프레림은 Tcl/Tk로 잡아보았다..
Tcl/Tk는 아무래도 빠른시간안에 GUI를 만들수 있다는 장점이.. 있기에..
OpenGL draw 퍼포먼스를 올리기위해..
GPU 메모리에 올리는 코드로 수정해보니.. 상당히 빨라졌다..
물론 백만개의 정점정도는.. 무난하다..
라이팅도 추가하고.. 여러 샘플의 obj 파일중 노말 정보가 없는 놈들은..
각 정점에 대한 노말을 계산해주니.. 이젠 그럴싸 하게 출력이된다..
또 페이스 선택기능도 이제 어느정도 되었고..
아직 정점, edge 선택 기능이 필요하긴하다..
또 캐드 파일도 불어와야 할텐데.. 이것도 좀 시간을 두고 봐야겠다..

카테고리: Programming, Talk | 댓글 남기기

FEM Pre 프로세싱 프로그램

현재 FEM Pre 프로세싱 프로그램을 만들고 있다..
물론 쉽지 많은 않은것 같다..
수학에도 워낙 잼병이고.. 그렇다고.. 외부 라이브러리를 끌어다 쓸려고 하니..
그것도 수학을 잘 모르니.. 힘들고..
그렇다고 쉽게 포기해서도 안되는 법.. ㅎㅎ

현재는 Tcl/Tk 프레임에.. OpenGL, GLM, GLFW, GLEW, CGAL 기반으로 작성중이다..
물론 개발 환경은 Msys2 이다.. 이건 정말 쓸수록 물건이다..
비쥬얼 스튜디오 같은 통합 개발환경보단.. 콘솔 기반의 리눅스 개발 환경에 익숙한..
나로서는 Msys2 가 정말딱이다..
Msys2 내에서는 왠만한 라이브러리는 따로 컴파일할 필요도 없고..
pacman 으로 의존성 검사와 함께 설치까지 되니 정말 .. 말 다했다..

OpenGL을 하면 할수록.. 왜 이걸 이제서야 관심을 가졌을까 생각이든다..
이걸 할줄 알았다면.. 지금의 포지션이 달라지지 않았을까..

GLSL 도 새롭고.. 문법이야 C와 비슷하다지만.. 쉐이더라는게 참 잘 쓰면 약이고..
모르면.. 구리해지고.. 적절한 쉐이더 트라이가 필요한것 같다..

처음 몇만개의 삼각요소를 그리는데 출력 속도가 너무 버벅거렸다..
구글링을 해보니.. GPU 메모리에 올려놓고 쓰란다..
그래서 그런 식으로 node, line index 정보를 올려놓으니.. 오호라.. 정말 빨라졌다..

현재까지 구현된 항목은..
트랙볼 트랙킹.. 피봇 로테이션.. Zoom, Pan, 요소 선택.. Obj 로딩 정도만 구현해보았다..
이정도까지 하는데만 해도.. 몇개월은 걸린듯..
새로운 분야이고.. 시간도 짬 나는 시간에 조금씩 하다보니.. 맥이 끊기는 이유도 있겠지..

일단 목표는.. step이나 obj 같은.. 지오메트리 파일로부터
surface 메쉬나.. solid 메쉬까지 쳐보는것까지 해볼 생각이다..
메쉬 라이브러리는 좀더 조사해봐야 하겠지만..
CGAL 도 잘 되는듯 한데.. 암튼.. 이건 좀 시간을 두고.. 해볼생각이다..

아래는 그간 구현된 화면..

카테고리: Talk | 태그: , , , , , , | 댓글 남기기

msys2 – gcc/g++ 업데이트 및 설치

msys2 를 처음 설치하고 아래와 같이 기본 gcc/g++ 컴파일러와 필요한 유용한 라이브러리들을 설치한다.

pacman -Syu

pacman -S base-devel
pacman -S gcc
pacman -S development
pacman -S compression

pacman -S mingw-w64-i686-toolchain mingw-w64-x86_64-toolchain

pacman -Sy git
pacman -Sy cmake

아래와 같이 설치된 컴파일러를 확인한다.

$ pacman -Ss gcc
mingw32/mingw-w64-i686-gcc 9.1.0-3 (mingw-w64-i686-toolchain)
GNU Compiler Collection (C,C++,OpenMP) for MinGW-w64
mingw32/mingw-w64-i686-gcc-ada 9.1.0-3 (mingw-w64-i686-toolchain)
GNU Compiler Collection (Ada) for MinGW-w64
...
mingw64/mingw-w64-x86_64-gcc 9.1.0-3 (mingw-w64-x86_64-toolchain) [설치함]
GNU Compiler Collection (C,C++,OpenMP) for MinGW-w64
mingw64/mingw-w64-x86_64-gcc-ada 9.1.0-3 (mingw-w64-x86_64-toolchain) [설치함]
GNU Compiler Collection (Ada) for MinGW-w64
...
msys/mingw-w64-cross-gcc 9.1.0-1 (mingw-w64-cross-toolchain mingw-w64-cross)
Cross GCC for the MinGW-w64

내가 자주사용하는 개발 패키지들도 설치한다.

pacman -Sy mingw-w64-i686-fontconfig mingw-w64-x86_64-fontconfig
pacman -Sy mingw-w64-i686-freeimage mingw-w64-x86_64-freeimage
pacman -Sy mingw-w64-i686-gl2ps mingw-w64-x86_64-gl2ps
pacman -Sy mingw-w64-i686-freetype mingw-w64-x86_64-freetype
pacman -Sy mingw-w64-i686-libpng mingw-w64-x86_64-libpng
pacman -Sy mingw-w64-i686-libtiff mingw-w64-x86_64-libtiff

pacman -Sy mingw-w64-i686-tcl mingw-w64-x86_64-tcl
pacman -Sy mingw-w64-i686-tk mingw-w64-x86_64-tk
pacman -Sy mingw-w64-i686-python2 mingw-w64-x86_64-python2
pacman -Sy mingw-w64-i686-python3 mingw-w64-x86_64-python3

pacman -Sy mingw-w64-i686-qt-creator mingw-w64-x86_64-qt-creator
pacman -Sy mingw-w64-i686-qtbinpatcher mingw-w64-x86_64-qtbinpatcher
# dynamic 버전이 필요하면 아래를 설치..
pacman -Sy mingw-w64-i686-qt5 mingw-w64-x86_64-qt5
# static 버전이 필요하면 아래를 설치..
pacman -Sy mingw-w64-i686-qt5-static mingw-w64-x86_64-qt5-static

pacman -Sy mingw-w64-i686-mpfr mingw-w64-x86_64-mpfr
pacman -Sy mingw-w64-i686-gmp mingw-w64-x86_64-gmp

pacman -Sy mingw-w64-i686-SDL2 mingw-w64-x86_64-SDL2
pacman -Sy mingw-w64-i686-allegro mingw-w64-x86_64-allegro

pacman -Sy mingw-w64-i686-boost mingw-w64-x86_64-boost
pacman -Sy mingw-w64-i686-cgal mingw-w64-x86_64-cgal
pacman -Sy mingw-w64-i686-freeglut mingw-w64-x86_64-freeglut
pacman -Sy mingw-w64-i686-glm mingw-w64-x86_64-glm
pacman -Sy mingw-w64-i686-glfw mingw-w64-x86_64-glfw
pacman -Sy mingw-w64-i686-oce mingw-w64-x86_64-oce
pacman -Sy mingw-w64-i686-glew mingw-w64-x86_64-glew

pacman -Sy mingw-w64-i686-ffmpeg mingw-w64-x86_64-ffmpeg

pacman -Sy mingw-w64-i686-zlib mingw-w64-x86_64-zlib
pacman -Sy mingw-w64-i686-readline mingw-w64-x86_64-readline
pacman -Sy mingw-w64-i686-pdcurses mingw-w64-x86_64-pdcurses

pacman -Sy mingw-w64-i686-libmariadbclient mingw-w64-x86_64-libmariadbclient

참고로 저장소에서 제공하는 패키지는 무엇이 잇는지는 아래의 싸이트에서 검색..
https://packages.msys2.org/search?t=binpkg

만약 옛 버전을 설치 해야 하는 경우는 pacman 은 버전을 지정하여 설치를 할 수 없다.
아래의 페이지에서 옛 버전을 받아서..
http://repo.msys2.org/mingw/x86_64/
다음과 같이 설치한다.

pacman -U mingw-w64-x86_64-qt5-5.10.0-1-any.pkg.tar.xz

이미 상위 버전이 설치되어 있는 경우 자동으로 다운그레이드를 함.. 굿!!

참고로 설치된 패키지의 정보들은 아래의 폴더에 위치해있음.

/var/lib/pacman/local

또.. 다운 받아진 원본 패키지들은 아래에 있음.

/var/cache/pacman/pkg

msys2 개발 환경으로 인해서 개발이 편해지고 개발 비용도 줄일수있긴하지만..
편해진 만큼 개발자들이 게을러지지 않을까.. 생각이든다. -_-;;

카테고리: Programming | 태그: , , , | 댓글 남기기

git 삭제된 파일 복구하기

물론.. commit 전인 파일이 삭제된거면.. 안됨..

git ls-files -d | xargs git checkout --
카테고리: Programming | 태그: | 댓글 남기기

가우 0.2

황치덕님이 개발한 리눅스 PC통신 프로그램.. 가우..
당시 소스코드를 올려본다.. 정말 추억이다..

gau-0.2.7z

카테고리: Linux, Programming | 댓글 남기기

CentOS 6 에서 php 5.6으로 업그레이드하기

dokuwiki 를 설치하는데 install.php 가 505 에러가 뜨면서 안된다..
확인해보니.. php 버전이 낮더라..
기본 CentOS 6 에는 php 5.3.3이 깔려있음.

# lsb_release -a
LSB Version:	:base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
Distributor ID:	CentOS
Description:	CentOS release 6.9 (Final)
Release:	6.9
Codename:	Final

# php -v
PHP 5.3.3 (cli) (built: Mar 22 2017 12:27:09) 
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
[root@olddos-bbs html]# yum --enablerepo=remi-php56 install php
Loaded plugins: fastestmirror, refresh-packagekit, security

아래와 같이 업그레이드..

# rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm
# yum remove php-common php php-gd php-xml
# yum install -y php56w php56w-xml php56w-mcrypt php56w-gd php56w-devel php56w-mysql php56w-intl php56w-mbstring
# service httpd restart

단 yum install 중에.. 아래와 같이 에러가 뜨면..

Error: php56w-common conflicts with php-common-5.3.3-49.el6.x86_64
Error: Package: libmcrypt-2.5.8-13.el7.x86_64 (epel)
           Requires: libc.so.6(GLIBC_2.14)(64bit)

php56w-mcrypt 빼고 설치할것.

카테고리: Linux | 댓글 남기기

PCSX2 + SSX3 의 빨간줄 현상

pcsx2 로 ssx3 를 즐기는데.. 아래와 같이 빨간줄 현상이 생긴다면..

glitch

아래와 같이 해결.

Go to Config > Video (GS) > Plugin Settings, set Renderer to OpenGL (Hardware) and turn on Hardware Depth.

For DX11 you can remove the red lines by setting the CRC Hack Level(in the same Plugin Settings menu) to "Aggressive".

해보니 잘됨. 간만에 ssx3 나 한판!!!

카테고리: Emulator | 태그: , , | 댓글 남기기

DJGPP 크로스 컴파일러 설치

DJGPP는 도스용 32비트 C/C++ 컴파일러임.
그렇다고 무작정 도스에서 이 djgpp 를 사용해서 도스용 프로그램을 개발하자니..
컴파일 속도도 암울하고.. 하여..
개발은 윈도우에서 코드도 작성도하고.. 컴파일도하여.. 도스 실행파일도 생성하고..
실행은 도스박스나 Pcem 에서.. 하면 제일 좋을것임.

아래의 링크에서..
https://github.com/andrewwutw/build-djgpp/releases
djgpp-mingw-gcc494-standalone.zip 을 받아서 대충 PATH를 잡아서 사용하면됨.

카테고리: Dos | 태그: | 댓글 남기기

C용 List/Hash 라이브러리 테스트

Collections-C 라는 라이브러리가 있음. (https://github.com/srdja/Collections-C)
이 라이브러리는 hash, list등.. 유용한 C용 함수를 제공하는 꽤 괜찮은 라이브러리라 생각됨.

아래는 list를 테스트 해봄.

#include "src/common.c"
#include "src/list.c"

static List *list1;

typedef struct var_t {
    int id;
    char *name;
} var;

int main()
{
	var *v;

	list_new(&list1);

	v = malloc(sizeof(var));
	v->id = 1;
	v->name = strdup("abc");
	list_add(list1, v);

	v = malloc(sizeof(var));
	v->id = 2;
	v->name = strdup("def");
	list_add(list1, v);

	int i;
	for(i=0; i< list_size(list1); i++) {
		void *f;
        list_get_at(list1, i, &f);
		printf("%d\n", ((var*)f)->id);
		printf("%s\n", ((var*)f)->name);
	}
	
	for(i=0; i< list_size(list1); i++) {
		void *f;
        list_get_at(list1, i, &f);
		free(((var*)f)->name);
	}

	list_destroy(list1);
}
$ ./a.exe
1
abc
2
def

double 값을 넣는 두번째 테스트..

#include "src/common.c"
#include "src/list.c"
 
static List *list1;
 
int main()
{
    list_new(&list1);
 
    double v = 1.0;
    list_add(list1, &v);
 
    double v2 = 2.0;
    list_add(list1, &v2);
 
    int i;
    for(i=0; i< list_size(list1); i++) {
        double *f;
        list_get_at(list1, i, (void*)&f);
        printf("%llf\n", *f);
    }
     
    list_destroy(list1);
}

아래는 Hash 를 테스트..

#include "src/common.c"
#include "src/hashset.c"
#include "src/hashtable.c"
#include "src/array.c"

HashTable *hash;

typedef struct var_t {
    int id;
    char *name;
} var;

int main()
{
	var *v;

	int stat = hashtable_new(&hash);

	v = malloc(sizeof(var));
	v->id = 1;
	v->name = strdup("abc");
	hashtable_add(hash, "key1", v);
	
	v = malloc(sizeof(var));
	v->id = 2;
	v->name = strdup("def");
	hashtable_add(hash, "key2", v);
	
	v = malloc(sizeof(var));
	v->id = 3;
	v->name = strdup("ghi");
	hashtable_add(hash, "key3", v);

	// query
	var *v2;
	if (hashtable_get(hash, "key1", (void*) &v2) == CC_OK) {
		printf("id: %d, name: %s\n", ((var*)v2)->id, ((var*)v2)->name);
	}

	// remove key
	hashtable_remove(hash, "key1", NULL);

	// check removed
	if (hashtable_get(hash, "key1", (void*) &v2) != CC_OK) {
		printf("removed key1\n");
	}

	// size check
	size_t size = hashtable_size(hash);
	printf("hash size: %d\n", size);

	// free element for memory allocation
	Array *keys;
	hashtable_get_keys(hash, &keys);
	for (int i=0; i<array_size(keys); i++) {
		void *key;
		array_get_at(keys, i, &key);
	
		if (hashtable_get(hash, (char*)key, (void*) &v2) == CC_OK) {
			free(((var*)v2)->name);
			printf("free name of %s\n", (char*)key);
		}
	}

	// destroy 
	hashtable_destroy(hash);
}
$ ./a.exe
id: 1, name: abc
removed key1
hash size: 2
free name of key3
free name of key2
카테고리: Talk | 댓글 남기기

get keyboard inputs without blocking

블럭킹없이 키보드 입력 받는 코드..

#include <ros/ros.h>
#include <termios.h>

char getch()
{
	fd_set set;
	struct timeval timeout;
	int rv;
	char buff = 0;
	int len = 1;
	int filedesc = 0;
	FD_ZERO(&set);
	FD_SET(filedesc, &set);
	
	timeout.tv_sec = 0;
	timeout.tv_usec = 1000;

	rv = select(filedesc + 1, &set, NULL, NULL, &timeout);

	struct termios old = {0};
	if (tcgetattr(filedesc, &old) < 0)
		ROS_ERROR("tcsetattr()");
	old.c_lflag &= ~ICANON;
	old.c_lflag &= ~ECHO;
	old.c_cc[VMIN] = 1;
	old.c_cc[VTIME] = 0;
	if (tcsetattr(filedesc, TCSANOW, &old) < 0)
		ROS_ERROR("tcsetattr ICANON");

	if(rv == -1)
		ROS_ERROR("select");
	else if(rv == 0)
		ROS_INFO("no_key_pressed");
	else
		read(filedesc, &buff, len );

	old.c_lflag |= ICANON;
	old.c_lflag |= ECHO;
	if (tcsetattr(filedesc, TCSADRAIN, &old) < 0)
		ROS_ERROR ("tcsetattr ~ICANON");
	return (buff);
}


int main(int argc, char **argv)
{
	ros::init(argc, argv, "key_input_node");
	ros::NodeHandle n;

	ros::Rate loop_rate(10);
	while (ros::ok())
	{
		int c = 0;
		c=getch();
		ROS_INFO("%c", c);

		ros::spinOnce();

		loop_rate.sleep();
	}

	return 0;
}
카테고리: Linux, Programming | 태그: , , | 댓글 남기기