Cinder 俺俺レファレンス

■drawLineの中身
void drawLine( const Vec3f &start, const Vec3f &end )
{
	float lineVerts[3*2];
	glEnableClientState( GL_VERTEX_ARRAY ); //頂点配列有効
	    glVertexPointer( 3, GL_FLOAT, 0, lineVerts ); //3次元, 型, バイトオフセット, 配列名
	    lineVerts[0] = start.x; lineVerts[1] = start.y; lineVerts[2] = start.z;
	    lineVerts[3] = end.x; lineVerts[4] = end.y; lineVerts[5] = end.z; 
	    glDrawArrays( GL_LINES, 0, 2 ); //0から始まって頂点数2
	glDisableClientState( GL_VERTEX_ARRAY );
}
■直線描画 shaderの影響受ける
gl::pushModelView();
	gl::translate( getWindowCenter() );
	gl::rotate( mRotate );
	glColor4f( 1.0, 0.0, 0.0f, 1.0f );
	gl::drawVector( Vec3f::zero(), Vec3f(500,500,500));
gl::popModelView();
■塗りつぶし
gl::clear(Color(0, 0, 0));
// 徐々に塗りつぶしもできる? gl::clear(Color(1.0f, 0.0f, 0.0f, 0.5f));
■カラー
Color myColor( 1.0f, 0.5f, 0.25f );
console() << "myColor = " << myColor << std::endl;
■円描画
gl::color( mColor );
gl::drawSolidCircle(Vec2f(15.0f, 25.0f), 50.0f);
■円の精度を小さくしてヘキサゴン描画
gl::drawSolidCircle( Vec2f( 15.0f, 25.0f ), 50.0f, 7 );
■四角形描画
Rectf rect( mLoc.x, mLoc.y, mLoc.x + mRadius, mLoc.y + mRadius );
gl::drawSolidRect( rect );
■テクスチャ描画 全画面
gl::Texture image(loadImage(loadResource("image.jpg")));
image.enableAndBind();
gl::draw(image, getWindowBounds());
■テクスチャ読み込み&描画 別方法
gl::Texture texture = loadImage( "image.jpg" );
gl::draw( texture );
gl::draw( texture, getWindowBounds() );
■テクスチャをURLから読み込み
Url url( "http://www.libcinder.org/media/tutorial/paris.jpg" );
mImage = gl::Texture( loadImage( loadUrl( url ) ) );
■マウスイベント時の位置取得
event.getPos()
■コンソール出力
console() << event.getPos() << endl;
■サーフェス 2次元の数値列 2種類の型
Surface8u regularSurface;  // an empty 8 bit surface (Surface8U = Surface)
Surface32f hdrSurface;     // an empty 32 bit high dynamic range surface
Surface mySurface( 640, 480, true ); // width, height, alpha?
Surface mySurface( 640, 480, true, SurfaceChannelOrder::RGBA ); // width, height, alpha?, channel order
■サーフェスをテクスチャに変換 フィルターなどの加工はSurfaceで済ませておく
Surface mySurface; // initialized elsewhere
gl::Texture texture = gl::Texture( mySurface );
■マウスイベント オーバーライドして用いる
void mouseDown(MouseEvent event);
void mouseUp(MouseEvent event);
void mouseDrag(MouseEvent event);
void mouseMove(MouseEvent event);
void mouseWheel(MouseEvent event);
■マウスのボタン 左中右
void TutorialApp::mouseDown( MouseEvent event ) {
    if( event.isRight() && event.isShiftDown() ) {
        console() << "Special thing happened!" << std::endl;
    }
}
■マウス位置
void TutorialApp::mouseMove( MouseEvent event ) {
    mMouseLoc = event.getPos();
}
■マウスムーブ時とマウスドラッグ時の挙動を合わせる
void TutorialApp::mouseMove( MouseEvent event ) {
    mMouseLoc = event.getPos();
}
void TutorialApp::mouseDrag( MouseEvent event ) {
    mouseMove( event );
}
■正規化
normalize()
safeNormalize()
mDirToCursor.safeNormalize();
■ベクターの値変更
mAcc.set( 0, 0 );
■二乗和
dir.lengthSquared();
■矢印描画
Vec3f p1( mLoc, 0.0f );
Vec3f p2( mLoc + mDirToCursor * arrowLength, 0.0f );
float headLength = 6.0f;
float headRadius = 3.0f;
gl::drawVector( p1, p2, headLength, headRadius );
■サーフェスのコピー
newSurface = oldSurface.clone(); (こちらが主流 内部ではshared_ptr)
newSurface = oldSurface;
■サーフェスの一部コピー
Surface newSurface( oldSurface.getWidth() / 2, oldSurface.getHeight(), false );
newSurface.copyFrom( oldSurface, newSurface.getBounds() );
■画像からサーフェス
Surface myPicture = loadImage( "myPicture.png" );
■テクスチャからサーフェス
gl::Texture myTexture; // initialized elsewhere
Surface fromTex( myTexture );
■サーフェスの各ピクセルを処理
Surface bitmap( loadImage( "image.jpg" ) );
Area area( 0, 0, 500, 500 );
Surface::Iter iter = surface->getIter( area );
while( iter.line() ) {
    while( iter.pixel() ) {
        iter.r() = 255 - iter.r();
        iter.g() = 255 - iter.g();
        iter.b() = 255 - iter.b();
    }
}
// iter.r(0,-1)で上のピクセル, iter.r(1,1)で右下のピクセルにアクセスできる
■チャネルとしてロード
Url url( "http://www.flight404.com/_images/paris.jpg" );
mChannel = Channel32f( loadImage( loadUrl( url ) ) ); // 1.0 represents white and 0 represents black.
■チャネルのピクセルからカラー値
void Particle::update( const Channel32f &channel ) {
    float gray = channel.getValue( mLoc );
    mColor = Color( gray, gray, gray );
}
■キーボードイベント
void TutorialApp::keyDown( KeyEvent event ) {
    if( event.getChar() == '1' ){
        mRenderImage = ! mRenderImage;
    } else if( event.getChar() == '2' ){
        mRenderParticles = ! mRenderParticles;
    }
}
■特別なキー arrow keys, shift, esc, ctrl
if( event.getCode() == KeyEvent::KEY_RIGHT ) {
    console() << "Right Arrow pressed" << std::endl;
}
■キーボード 押し続け
void TutorialApp::keyDown( KeyEvent event ) {
    if( event.getChar() == 'w' ) {
        mIsMovingForward = true;
    }
}
void TutorialApp::keyUp( KeyEvent event ) {
    if( event.getChar() == 'w' ) {
        mIsMovingForward = false;
    }
}
■タッチイベント(iPhone, iPad)
void TouchTestApp::touchesBegan(TouchEvent event) {}
void TouchTestApp::touchesMoved(TouchEvent event) {}
void TouchTestApp::touchesEnded(TouchEvent event) {}
■ベクター型
ci::Vec2i
■乱数
Rand::randFloat(8.0f);
Rand::randInt(50, 250);
Rand::randVec2f();
■カラー型
Color(1.0f, 1.0f, 1.0f)
■STL Listで最初から最後まで
for (list<Particle>::iterator iter = particles.begin(); iter != particles.end();) {...}
■Listからの消去
if (iter->isDead()){ iter = particles.erase(iter); }
■Listへの追加
particles.push_back(Particle(mouseLocation));
■マルチタッチ
Settings *settings;
settings->enableMultiTouch();
■Windowサイズ
getWindowWidth(), getWindowHeight()
getWindowSize() // type Vec2i
■サーフェスとチャネルの変換
Surface surface( channel );
Channel channel( surface );
■画像の青チャネルに対してSobelエッジ検出
gl::Texture createEdgeTexture( const Channel &src )
{
    Channel temp( src.getWidth(), src.getHeight() );
    cinder::ip::edgeDetectSobel( src, &temp );
    return gl::Texture( temp );
}
myTexture = createEdgeTexture( simpleSurface.getChannelBlue() );
■画像出力
writeImage( "/path/to/image.png", surfaceToBeWritten );
■画像フォーマット
writeImage( "output.png", loadImage( "input.jpg" ) );
■サーフェスとテクスチャの違い
サーフェスはon CPU
テクスチャはon GPU
加工はサーフェスで行う
■テクスチャのラッピング GL_CLAMP_TO_EDGE, GL_REPEAT
gl::Texture::Format fmt;
fmt.setWrap( GL_REPEAT );
texture = gl::Texture( someSurface, fmt );
■ミップマップ
gl::Texture::Format fmt;
fmt.enableMipmapping( true );
fmt.setMinFilter( GL_LINEAR_MIPMAP_LINEAR );
■ファイルがロードされたら描画
if( myImage )
    gl::draw( myImage, getWindowBounds() );
■時間の経過
getElapsedSeconds()
getElapsedFrames()
■コンストレイン
template<typename T>
T constrain( T val, T minVal, T maxVal )
{
	if( val < minVal ) return minVal;
	else if( val > maxVal ) return maxVal;
	else return val;
}
■STL Listからの削除
p = mParticles.erase( p ); // pはイテレータ
■パーリンノイズ 緩やかに変わるノイズ
#include "cinder/Perlin.h"
mPerlin = Perlin();
■ブラウン運動
float noise = perlin.fBm( Vec3f( mLoc * 0.005f, app::getElapsedSeconds() * 0.1f ) ); // return -1.0f ~ 1.0f
■連番保存 QuickTimeなどで動画に変換
if( mSaveFrames ){
    writeImage( getHomeDirectory() + "image_" + toString( getElapsedFrames() ) + ".png",
                    copyWindowSurface() );
}
■数字などを文字列に
toString()
■
■
■
■
■
■各パーティクルで相互作用
void ParticleController::repulseParticles() {
    for( list<Particle>::iterator p1 = mParticles.begin(); p1 != mParticles.end(); ++p1 ) {
        list<Particle>::iterator p2 = p1;
        for( ++p2; p2 != mParticles.end(); ++p2 ) {
            Vec2f dir = p1->mLoc - p2->mLoc;
            float distSqrd = dir.lengthSquared();          
            if( distSqrd > 0.0f ){
                dir.normalize();
                float F = 1.0f/distSqrd;
                    
                p1->mAcc += dir * ( F / p1->mMass );
                p2->mAcc -= dir * ( F / p2->mMass );
            }
        }
    }
}
■画像ファイルをユーザーが選択
try {
    std::string p = getOpenFilePath( "", ImageIo::getLoadExtensions() );
    if( ! p.empty() ) { // an empty string means the user canceled
        myImage = gl::Texture( loadImage( p ) );
    }
}
catch( ... ) {
    console() << "Unable to load the image." << std::endl;
}
■エッシャー ??
void TwirlSampleApp::twirl( Surface *surface, Area area, float maxAngle )
{
    // make a clone of the surface
    Surface inputSurface = surface->clone();
 
    // we'll need to iterate the inputSurface as well as the output surface
    Surface::ConstIter inputIter( inputSurface.getIter() );
    Surface::Iter outputIter( surface->getIter( area ) );
 
    float maxDistance = area.getSize().length() / 2;
    Vec2f mid = ( area.getUL() + area.getLR() ) / 2;
 
    while( inputIter.line() && outputIter.line() ) {
        while( inputIter.pixel() && outputIter.pixel() ) {
            Vec2f current = inputIter.getPos() - mid;
            float r = current.length();
            float twirlAngle = r / maxDistance * maxAngle;
            float angle = atan2( current.y, current.x );
            Vec2f outSample( r * cos( angle + twirlAngle ), r * sin( angle + twirlAngle ) );
            Vec2i out = outSample - current;
 
            outputIter.r() = inputIter.rClamped( out.x, out.y );
            outputIter.g() = inputIter.gClamped( out.x, out.y );
            outputIter.b() = inputIter.bClamped( out.x, out.y );
        }
    }
}
■追加ライブラリ?
CinderISO
■Cinderについて有用なサイト
http://www.creativeapplications.net/tutorials/images-in-cinder-tutorials-cinder/
http://research.preferred.jp/2010/11/cinder-on-ipad/

writing...