Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
d637aa35
Commit
d637aa35
authored
Jul 21, 2006
by
Stefan Dösinger
Committed by
Alexandre Julliard
Jul 21, 2006
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wined3d: Move vertex fixups into their own function.
parent
0c453bc7
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
66 additions
and
61 deletions
+66
-61
vertexbuffer.c
dlls/wined3d/vertexbuffer.c
+66
-61
No files found.
dlls/wined3d/vertexbuffer.c
View file @
d637aa35
...
...
@@ -98,8 +98,70 @@ static DWORD WINAPI IWineD3DVertexBufferImpl_GetPriority(IWineD3DVertexBuffer
return
IWineD3DResourceImpl_GetPriority
((
IWineD3DResource
*
)
iface
);
}
static
void
fixup_vertices
(
BYTE
*
src
,
BYTE
*
dst
,
int
stride
,
int
num
,
BYTE
*
pos
,
BOOL
haspos
,
BYTE
*
diffuse
,
BOOL
hasdiffuse
,
BYTE
*
specular
,
BOOL
hasspecular
)
{
int
i
;
float
x
,
y
,
z
,
w
;
for
(
i
=
num
-
1
;
i
>=
0
;
i
--
)
{
if
(
haspos
)
{
float
*
p
=
(
float
*
)
(((
int
)
src
+
(
int
)
pos
)
+
i
*
stride
);
/* rhw conversion like in drawStridedSlow */
if
(
p
[
3
]
==
1
.
0
||
((
p
[
3
]
<
eps
)
&&
(
p
[
3
]
>
-
eps
)))
{
x
=
p
[
0
];
y
=
p
[
1
];
z
=
p
[
2
];
w
=
1
.
0
;
}
else
{
w
=
1
.
0
/
p
[
3
];
x
=
p
[
0
]
*
w
;
y
=
p
[
1
]
*
w
;
z
=
p
[
2
]
*
w
;
}
p
=
(
float
*
)
((
int
)
dst
+
i
*
stride
+
(
int
)
pos
);
p
[
0
]
=
x
;
p
[
1
]
=
y
;
p
[
2
]
=
z
;
p
[
3
]
=
w
;
}
if
(
hasdiffuse
)
{
DWORD
srcColor
,
*
dstColor
=
(
DWORD
*
)
(
dst
+
i
*
stride
+
(
int
)
diffuse
);
srcColor
=
*
(
DWORD
*
)
(
((
int
)
src
+
(
int
)
diffuse
)
+
i
*
stride
);
/* Color conversion like in drawStridedSlow. watch out for little endianity
* If we want that stuff to work on big endian machines too we have to consider more things
*
* 0xff000000: Alpha mask
* 0x00ff0000: Blue mask
* 0x0000ff00: Green mask
* 0x000000ff: Red mask
*/
*
dstColor
=
0
;
*
dstColor
|=
(
srcColor
&
0xff00ff00
)
;
/* Alpha Green */
*
dstColor
|=
(
srcColor
&
0x00ff0000
)
>>
16
;
/* Red */
*
dstColor
|=
(
srcColor
&
0x000000ff
)
<<
16
;
/* Blue */
}
if
(
hasspecular
)
{
DWORD
srcColor
,
*
dstColor
=
(
DWORD
*
)
(
dst
+
i
*
stride
+
(
int
)
specular
);
srcColor
=
*
(
DWORD
*
)
(
((
int
)
src
+
(
int
)
specular
)
+
i
*
stride
);
/* Simmilar to diffuse
* TODO: Write the alpha value out for fog coords
*/
*
dstColor
=
0
;
*
dstColor
|=
(
srcColor
&
0xff00ff00
)
;
/* Alpha Green */
*
dstColor
|=
(
srcColor
&
0x00ff0000
)
>>
16
;
/* Red */
*
dstColor
|=
(
srcColor
&
0x000000ff
)
<<
16
;
/* Blue */
}
}
}
static
void
WINAPI
IWineD3DVertexBufferImpl_PreLoad
(
IWineD3DVertexBuffer
*
iface
)
{
IWineD3DVertexBufferImpl
*
This
=
(
IWineD3DVertexBufferImpl
*
)
iface
;
BYTE
*
data
;
UINT
start
=
0
,
end
=
0
,
stride
=
0
;
BOOL
useVertexShaderFunction
=
FALSE
,
fixup
=
FALSE
;
TRACE
(
"(%p)->()
\n
"
,
This
);
if
(
This
->
Flags
&
VBFLAG_LOAD
)
{
...
...
@@ -114,10 +176,6 @@ static void WINAPI IWineD3DVertexBufferImpl_PreLoad(IWineD3DVertexBuffer *if
if
(
This
->
vbo
)
{
WineDirect3DVertexStridedData
strided
;
IWineD3DDeviceImpl
*
device
=
This
->
resource
.
wineD3DDevice
;
BOOL
useVertexShaderFunction
=
FALSE
,
fixup
=
FALSE
;
BYTE
*
data
;
UINT
i
;
UINT
start
=
0
,
end
=
0
,
stride
=
0
;
if
(
This
->
Flags
&
VBFLAG_DIRTY
)
{
/* Update the old buffer on unlock, use the old desc */
...
...
@@ -237,63 +295,10 @@ static void WINAPI IWineD3DVertexBufferImpl_PreLoad(IWineD3DVertexBuffer *if
}
memcpy
(
data
,
This
->
resource
.
allocatedMemory
+
start
,
end
-
start
);
for
(
i
=
0
;
i
<
(
end
-
start
)
/
stride
;
i
++
)
{
if
(
strided
.
u
.
s
.
position_transformed
)
{
float
*
p
=
(
float
*
)
(((
int
)
This
->
resource
.
allocatedMemory
+
(
int
)
strided
.
u
.
s
.
position
.
lpData
)
+
start
+
i
*
stride
);
float
x
,
y
,
z
,
w
;
/* rhw conversion like in drawStridedSlow */
if
(
p
[
3
]
==
1
.
0
||
((
p
[
3
]
<
eps
)
&&
(
p
[
3
]
>
-
eps
)))
{
x
=
p
[
0
];
y
=
p
[
1
];
z
=
p
[
2
];
w
=
1
.
0
;
}
else
{
w
=
1
.
0
/
p
[
3
];
x
=
p
[
0
]
*
w
;
y
=
p
[
1
]
*
w
;
z
=
p
[
2
]
*
w
;
}
p
=
(
float
*
)
((
int
)
data
+
i
*
stride
+
(
int
)
strided
.
u
.
s
.
position
.
lpData
);
p
[
0
]
=
x
;
p
[
1
]
=
y
;
p
[
2
]
=
z
;
p
[
3
]
=
w
;
}
if
(
strided
.
u
.
s
.
diffuse
.
dwType
==
WINED3DDECLTYPE_SHORT4
||
strided
.
u
.
s
.
diffuse
.
dwType
==
WINED3DDECLTYPE_D3DCOLOR
)
{
DWORD
srcColor
,
*
dstColor
=
(
DWORD
*
)
(
data
+
i
*
stride
+
(
int
)
strided
.
u
.
s
.
diffuse
.
lpData
);
srcColor
=
*
(
DWORD
*
)
(
((
int
)
This
->
resource
.
allocatedMemory
+
(
int
)
strided
.
u
.
s
.
diffuse
.
lpData
)
+
start
+
i
*
stride
);
/* Color conversion like in drawStridedSlow. watch out for little endianity
* If we want that stuff to work on big endian machines too we have to consider more things
*
* 0xff000000: Alpha mask
* 0x00ff0000: Blue mask
* 0x0000ff00: Green mask
* 0x000000ff: Red mask
*/
*
dstColor
=
0
;
*
dstColor
|=
(
srcColor
&
0xff00ff00
)
;
/* Alpha Green */
*
dstColor
|=
(
srcColor
&
0x00ff0000
)
>>
16
;
/* Red */
*
dstColor
|=
(
srcColor
&
0x000000ff
)
<<
16
;
/* Blue */
}
else
if
(
strided
.
u
.
s
.
diffuse
.
lpData
!=
NULL
)
{
FIXME
(
"Type is %ld
\n
"
,
strided
.
u
.
s
.
diffuse
.
dwType
);
}
if
(
strided
.
u
.
s
.
specular
.
dwType
==
WINED3DDECLTYPE_SHORT4
||
strided
.
u
.
s
.
specular
.
dwType
==
WINED3DDECLTYPE_D3DCOLOR
)
{
DWORD
srcColor
,
*
dstColor
=
(
DWORD
*
)
(
data
+
i
*
stride
+
(
int
)
strided
.
u
.
s
.
specular
.
lpData
);
srcColor
=
*
(
DWORD
*
)
(
((
int
)
This
->
resource
.
allocatedMemory
+
(
int
)
strided
.
u
.
s
.
specular
.
lpData
)
+
start
+
i
*
stride
);
/* Color conversion like in drawStridedSlow. watch out for little endianity
* If we want that stuff to work on big endian machines too we have to consider more things
*/
*
dstColor
=
0
;
*
dstColor
|=
(
srcColor
&
0xff00ff00
)
;
/* Alpha Green */
*
dstColor
|=
(
srcColor
&
0x00ff0000
)
>>
16
;
/* Red */
*
dstColor
|=
(
srcColor
&
0x000000ff
)
<<
16
;
/* Blue */
}
}
fixup_vertices
(
data
,
data
,
stride
,
(
end
-
start
)
/
stride
,
strided
.
u
.
s
.
position
.
lpData
,
strided
.
u
.
s
.
position_transformed
,
strided
.
u
.
s
.
diffuse
.
lpData
,
strided
.
u
.
s
.
diffuse
.
dwType
==
WINED3DDECLTYPE_SHORT4
||
strided
.
u
.
s
.
diffuse
.
dwType
==
WINED3DDECLTYPE_D3DCOLOR
,
strided
.
u
.
s
.
specular
.
lpData
,
strided
.
u
.
s
.
specular
.
dwType
==
WINED3DDECLTYPE_SHORT4
||
strided
.
u
.
s
.
specular
.
dwType
==
WINED3DDECLTYPE_D3DCOLOR
);
}
else
{
data
=
This
->
resource
.
allocatedMemory
+
start
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment