static MRESULT EXPENTRY AttribSelectProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) { PATTRIBSELECTDATA pWinData = WinQueryWindowPtr(hwnd, QWL_USER); switch(msg) { case WM_CREATE: return (MRESULT) CreateWindow(hwnd, (PCREATESTRUCT) mp2); case WM_DESTROY: DestroyWindow(pWinData); break; case WM_HELP: /* Weiterleiten mit eigener ID */ mp1 = MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)); break; case ATTSM_SETATTRIB: return (MRESULT) SetAttrib(hwnd, pWinData, (ULONG) mp1, (ULONG) mp2); case ATTSM_QUERYATTRIB: return (MRESULT) QueryAttrib(pWinData); case WM_CONTROL: if (SHORT1FROMMP(mp1) == ATTSID_VALUE) { switch(SHORT2FROMMP(mp1)) { case VN_ENTER: AttribClicked(hwnd, pWinData, SHORT1FROMMP(mp2), SHORT2FROMMP(mp2)); break; case VN_HELP: #if 0 WinPostMsg(WinQueryWindow(hwnd, QW_OWNER), WM_HELP, MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)), mp2); #endif break; } } break; case WM_DRAWITEM: if (SHORT1FROMMP(mp1) == ATTSID_VALUE) return (MRESULT) DrawItem(pWinData, (POWNERITEM) mp2); else break; case WM_QUERYDLGCODE: return WinSendMsg(pWinData->hwndValueSet, msg, mp1, mp2); default: break; } return WinDefWindowProc(hwnd, msg, mp1, mp2); }
bool RenderEngine::SetAttributes(VertexFormats * vertType, GLsizei stride) { glDisableVertexAttribArray(0); glDisableVertexAttribArray(1); glDisableVertexAttribArray(2); glDisableVertexAttribArray(3); // pre-define some constants values to make the function calls slightly more readable const GLint positionQuantity = 3; // positions need 3 floats, XYZ const GLint colorQuantity = 3; // colors need 3 floats, RGB -- TODO: Handle 4 floats RGBA ?? const GLint textureQuantity = 2; // textures need 2 floats, UV const GLint normalQuantity = 3; // normals need 3 floats, XYZ //const GLsizei vertexStride = stride; // example: 36 for position, color, normal = (3 + 3 + 3) * sizeof(float) GLuint attribIndex = 0; // the current attrib GLsizei currentOffset = 0; // NOTE: YOU MUST USE THE CORRECT VALUE HERE ...!?!?!?!?!?!, GLsizei formatOffset = 0; // an offset into the current vertex format, always starts at 0 // NOTE: attribIndex and formatOffset are modified by SetAttrib()!!! if ((int)(*vertType) & (int)VertexFormats::HasPosition) SetAttrib(attribIndex, positionQuantity, stride, currentOffset, formatOffset); if ((int)(*vertType) & (int)VertexFormats::HasColor) { SetAttrib(attribIndex, colorQuantity, stride, currentOffset, formatOffset); } if ((int)(*vertType) & (int)VertexFormats::HasTexture) { SetAttrib(attribIndex, textureQuantity, stride, currentOffset, formatOffset); } if ((int)(*vertType) & (int)VertexFormats::HasNormal) SetAttrib(attribIndex, normalQuantity, stride, currentOffset, formatOffset); //currentOffset += gob->GetNumVerts() * gob->GetStride; // you will need to update your own structure with this new offset // Other code goes here return true; }
void glutInitDisplayString(const char *string) { const char *p = string; int val; while(*p) { if(*p == ' ') p++; else if(memcmp(p, "acca", 4) == 0) { p = GetStrVal(p+4, &AccumSize, 1, 32); SetAttrib(AccumSize, GLUT_ACCUM); } else if(memcmp(p, "acc", 3) == 0) { p = GetStrVal(p+3, &AccumSize, 1, 32); SetAttrib(AccumSize, GLUT_ACCUM); } else if(memcmp(p, "depth", 5) == 0) { p = GetStrVal(p+5, &DepthSize, 12, 32); SetAttrib(DepthSize, GLUT_DEPTH); } else if(memcmp(p, "double", 6) == 0) { val = 1; p = GetStrVal(p+6, &val, 0, 1); SetAttrib(val, GLUT_DOUBLE); } else if(memcmp(p, "index", 5) == 0) { val = 1; p = GetStrVal(p+5, &val, 0, 1); SetAttrib(val, GLUT_INDEX); } else if(memcmp(p, "stencil", 7) == 0) { p = GetStrVal(p+7, &StencilSize, 0, 1); SetAttrib(StencilSize, GLUT_STENCIL); } else if(memcmp(p, "samples", 7) == 0) { NumSamples = 1; p = GetStrVal(p+7, &NumSamples, 0, 16); SetAttrib(NumSamples, GLUT_MULTISAMPLE); } else if(p = strchr(p, ' ')) p++; else break; } }
void DeferredRenderer::SetCommonLightQuadDraw(Shader &shader) { Device *dev = Device::GetInstance(); RenderState &render_state = dev->render_state(); const mat4 &projection_mat = render_state.GetProjection3D(); const mat4 &view_mat = render_state.view_mat(); const mat4 &model_mat = render_state.model_mat(); mat4 modelview = view_mat * model_mat; //벡터방향만 잇으면 되니까 이동관련속성은 날리기 for(int i = 0 ; i < 3 ; ++i) { modelview[3][i] = 0; } vec4 viewport(0, 0, render_state.win_width(), render_state.win_height()); float pixels[4][2] = { { 0, 0 }, { viewport[2], 0 }, { viewport[2], viewport[3] }, { 0, viewport[3] }, }; vec3 view_vec_list[4]; for(int i = 0 ; i < 4 ; i++) { vec3 win_coord(pixels[i][0], pixels[i][1], 10); vec3 obj = glm::unProject(win_coord, modelview, projection_mat, viewport); vec3 &view_vec = view_vec_list[i]; view_vec = obj; vec3 cam_pos = MatrixHelper::ViewPos(view_mat); view_vec -= cam_pos; view_vec = glm::normalize(view_vec); mat3 modelview_mat3(modelview); view_vec = modelview_mat3 * view_vec; view_vec.z *= -1; //픽셀에서 cam_pos로 들어오는 방향으로 만들기 위해서 z뒤집음 } //fragment마다 view vector를 계산하기 위해서 계산에 필요한 정보까지 넣기 //4군데만 넣어주면 나머지는 알아서 적절히 보간될것이다 struct LightQuadVertex { LightQuadVertex(float x, float y, float s, float t, const vec3 &view_vec) : pos(x, y), texcoord(s, t), view_vec(view_vec) {} vec2 pos; vec2 texcoord; vec3 view_vec; }; vector<LightQuadVertex> vert_list; vert_list.push_back(LightQuadVertex(-1, -1, 0, 0, view_vec_list[0])); vert_list.push_back(LightQuadVertex(1, -1, 1, 0, view_vec_list[1])); vert_list.push_back(LightQuadVertex(1, 1, 1, 1, view_vec_list[2])); vert_list.push_back(LightQuadVertex(-1, 1, 0, 1, view_vec_list[3])); ShaderVariable pos_var = shader.attrib_var(kPositionHandleName); ShaderVariable texcoord_var = shader.attrib_var(kTexcoordHandleName); ShaderVariable view_vec_var = shader.attrib_var("a_viewVector"); { SR_ASSERT(pos_var.location != kInvalidShaderVarLocation); AttribBindParam param; param.dim = 2; param.normalize = false; param.offset = offsetof(LightQuadVertex, pos); param.var_type = GL_FLOAT; param.vert_size = sizeof(LightQuadVertex); void *ptr = &vert_list[0]; SetAttrib(pos_var, param, (char*)ptr); } { SR_ASSERT(texcoord_var.location != kInvalidShaderVarLocation); AttribBindParam param; param.dim = 2; param.normalize = false; param.offset = offsetof(LightQuadVertex, texcoord); param.var_type = GL_FLOAT; param.vert_size = sizeof(LightQuadVertex); void *ptr = &vert_list[0]; SetAttrib(texcoord_var, param, (char*)ptr); } if(view_vec_var.location != kInvalidShaderVarLocation) { AttribBindParam param; param.dim = 3; param.normalize = true; param.offset = offsetof(LightQuadVertex, view_vec); param.var_type = GL_FLOAT; param.vert_size = sizeof(LightQuadVertex); void *ptr = &vert_list[0]; SetAttrib(view_vec_var, param, (char*)ptr); } shader.DrawArrays(kDrawTriangleFan, vert_list.size()); /* vector<Vertex2D> vert_list; vert_list.push_back(CreateVertex2D(-1, -1, 0, 0)); vert_list.push_back(CreateVertex2D(1, -1, 1, 0)); vert_list.push_back(CreateVertex2D(1, 1, 1, 1)); vert_list.push_back(CreateVertex2D(-1, 1, 0, 1)); shader.DrawArrays(kDrawTriangleFan, vert_list); */ }
int WindowLister( int x, int y, int xx, int yy, int CharToExitOn, int *NumItems, int NumToStartWith, int (*CharHandler)(int ch, int Index), void (*ScreenClearer)( void ), void (*DisplayLineFunction)(int Index) ) { register int i; register int CurrLine = 0; int PrevLine; int NumLines = yy - y; int Top = NumToStartWith; int OldTop; int RefreshScreen = 1; int ch; union REGS regs, regs2; int Index; regs.x.cx = ( (y-1) << 8 ) + x-1; regs.x.dx = ( (yy-1) << 8 ) + xx-1; regs.x.ax = 0; regs.h.bh = A_NORMAL; regs.h.ah = 0x06; regs.x.ax = 1; for (;;) { if ( RefreshScreen ) { ScreenClearer(); ChangeBlock( x, y, xx, yy, A_NORMAL ); RefreshScreen = 0; PrevLine = 500; OldTop = -500; for (i=0; i<=NumLines; ++i) { gotoxy( x, i+y ); if ( i+Top <= *NumItems ) DisplayLineFunction( i+Top ); } } Index = CurrLine + Top; if ( PrevLine != CurrLine || OldTop != Top ) { SetAttrib( A_REVERSE ); gotoxy( x, y + CurrLine ); DisplayLineFunction( Index ); SetAttrib( A_NORMAL ); } HideCursor(); PrevLine = CurrLine; OldTop = Top; ch = GComm(); if ( ch == CharToExitOn ) return( Index ); switch( ch ) { case ESC: return( -1 ); case DOWN: CurrLine++; if (CurrLine > NumLines) { CurrLine = NumLines; if ( Top < *NumItems - NumLines ) { Top++; ChangeBlock( x, y, xx, yy, A_NORMAL ); regs.h.ah = 0x06; int86( 0x10, ®s, ®s2 ); gotoxy( x, yy ); } } break; case UP: CurrLine--; if (CurrLine < 0) { CurrLine=0; if ( Top > 0 ) { Top--; ChangeBlock( x, yy, xx, yy, A_NORMAL ); regs.h.ah = 7; int86( 0x10, ®s, ®s2 ); gotoxy( x, y ); } } break; case END: Top = *NumItems - NumLines; if ( Top < 0 ) { Top = 0; } CurrLine = NumLines; if ( CurrLine > *NumItems ) { CurrLine = *NumItems; } RefreshScreen++; break; case PGDN: Top += NumLines; if (Top > *NumItems - NumLines) { Top = *NumItems - NumLines; if ( Top < 0 ) Top = 0; CurrLine = NumLines; if ( CurrLine > *NumItems ) { CurrLine = *NumItems; } } RefreshScreen++; break; case PGUP: Top -= NumLines; if (Top < 0) { Top = 0; CurrLine = 0; } RefreshScreen++; break; case HOME: Top = CurrLine = 0; RefreshScreen++; break; default: gotoxy( x, CurrLine + y ); ReverseText(); DisplayLineFunction( Index ); NormalText(); /*HideCursor();*/ RefreshScreen++; CurrLine = CharHandler( ch, Index ); RefreshScreen = 1; if ( CurrLine - Top <= NumLines && CurrLine - Top >= 0 ) CurrLine -= Top; else { Top = CurrLine - 1; CurrLine = 1; if ( Top < 0 ) { Top = CurrLine = 0; } } break; } if ( Top < 0 ) { Top = 0; CurrLine = 0; } if ( Top + CurrLine > *NumItems ) { CurrLine = *NumItems - Top; } if ( PrevLine != CurrLine || Top != OldTop ) { ChangeBlock( x, y, xx, yy, A_NORMAL ); } if ( RefreshScreen > 1 ) { Top = CurrLine = 0; } } }