2D в D3D

Тема в разделе "WASM.DirectX", создана пользователем _220, 29 июн 2006.

  1. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    В общем мне надо нарисовать интерфес и курсор, можо было бы сделать и в 3д, но тогда всю эту многовертексную махину пришлось бы крутить, а у меня и без того код корявый, нельзя ли как-нибудь в задний буфер просто рисовать? Кстати, как можно немедленно узнать позицию мыши(что-нибудь вроде invoke MouseGetPoint,add point), без собщений, а то мне надо всего 1 раз в начале узнать где ента мышь, а потом неохота каждый раз вынимать ненужные сообщения.
     
  2. LocTb

    LocTb New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2004
    Сообщения:
    54
    1. Используй D3DFVF_XYZRHW

    2. IDirectInputDevice8::GetDeviceState
     
  3. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    Можно получить указатель на бэкбуфер с помощью GetBackBuffer и писать туда напрямую, правда тормоза будут



    Лучше квадами выводит по два треугольника с текстурой при формате вершины XYZRHW



    Методы SetCursor,SetCursorProperties,ShowCursor интерфейса IDirect3DDevice9 якобы эмулируют отображение курсора в приложение d3d но я никогда ими не пробовал пользоваться
     
  4. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    А че за формат такой, ентот ваш D3DFVF_XYZRHW? Если выводить квадами, то их крутить надо будет, или это формат такой особенный? Кстати, причем тут GetDeviceState? Нет, ведь рисуют же как-то интерфейс в 3D играх, такая неизученная область что-ли?
     
  5. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    Формат D3DFVF_XYZRHW представляет собой набор параметеров вершины, таких как: X,Y и Z координата, причем HRW указывает на то, что вершины уже трансформированы (т.е к ним не нужно применять матрицы проекции и вида). x,y содержат числа в пикселях, а z требуется устанавливать в 1.0. Итогом является то, что выводимые треугольники (два треугольника -> квадрат) будут иметь размеры в точности такие какие были описаны и натянутая на них текстура не будет искажена. таким образом выводятся составляющие интерфейса в подавляющем большинстве приложений.



    Есть вариант вывода интерфейса через спрайты. Но это имхо как кому удобнее.



    GetDeviceState в DirectInput возвращает в буфер состояние клавиш и курсора мыши или клавиатуры в момент вызова. Но чтобы воспоспользоваться этим методом требуется создать устройство directinput, что не есть лучший выход для того чтобы один раз узнать где находится мышь перед запуском.



    Почему нельзя вызвать winapi GetCursorPos?
     
  6. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    Вау, мне бы такого учителя блин в школке. Ну да ладно, короче говоря D3DFVF_XYZRHW - это фактически 2D вершина, как я понял, все ясно. С DirectInput я работаю в относительном режиме, мне для этого и надо узнать начальную позицию, хотелось бы, чтобы мой новый курсор появлялся на месте старого, т.к. моё приложение может работать и в окне.GetCursorPos вроде поможет, а параметры там какие?
     
  7. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    GetCursorPos передается один параметр, указатель на структуру Point, в которую и будут размещены координаты после вызова этой функции. Координаты будут экранные.
     
  8. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    ОК, все ясно как никогда.
     
  9. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    Практика обнаружила отклонение от теории(в моем ее понимании).Пишу так:



    INTERFACE_VERTEX equ D3DFVF_XYZRHW or D3DFVF_TEX1

    InterfaceVertex struc

    x dd ?

    y dd ?

    z dd ?

    tx dd ?

    ty dd ?

    InterfaceVertex ends

    <...........................................>

    ivb dd 0; Interface vertex buffer

    mpvs InterfaceVertex <100.0f,100.0f,1.0f,0.0f,0.0f>

    InterfaceVertex <131.0f,100.0f,1.0f,1.0f,0.0f>

    InterfaceVertex <131.0f,131.0f,1.0f,1.0f,1.0f>

    InterfaceVertex <100.0f,100.0f,1.0f,0.0f,0.0f>

    InterfaceVertex <131.0f,131.0f,1.0f,1.0f,1.0f>

    InterfaceVertex <100.0f,131.0f,1.0f,0.0f,1.0f>

    <...........................................>

    d3dev8 CreateVertexBuffer,g_pd3ddev,(6)*(type InterfaceVertex),D3DUSAGE_WRITEONLY,INTERFACE_VERTEX,D3DPOOL_MANAGED,a ddr ivb

    d3dvb8 Lock1,ivb,0,6,addr mpbuf,0

    lea esi,mpvs

    mov edi,mpbuf

    mov ecx,6 * (type InterfaceVertex)/4

    rep movsd

    d3dvb8 Unlock,ivb

    <...........................................>

    d3dev8 SetStreamSource,g_pd3ddev,0,ivb,type InterfaceVertex

    d3dev8 SetVertexShader,g_pd3ddev,INTERFACE_VERTEX

    d3dev8 SetTexture,g_pd3ddev,0, ptex

    d3dev8 DrawPrimitive,g_pd3ddev,D3DPT_TRIANGLELIST,0,2



    Рисуется все где надо, но текстура как-то совсем не так отображается, причем по-разному в обоих треугольниках(хотя сама в порядке)
     
  10. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    Разобрался. Я забыл про само поле RHW. Сейча не могу понять только почему у меня раньше воообще что-то работало.