Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
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-winehq
Commits
70bbf734
Commit
70bbf734
authored
Oct 10, 2006
by
Ivan Gyurdiev
Committed by
Alexandre Julliard
Oct 11, 2006
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wined3d: Merge LIGHT types into one type in WINED3D namespace.
parent
fea4495a
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
62 additions
and
19 deletions
+62
-19
device.c
dlls/d3d8/device.c
+4
-2
device.c
dlls/d3d9/device.c
+4
-0
device.c
dlls/ddraw/device.c
+5
-2
device.c
dlls/wined3d/device.c
+11
-12
wined3d_interface.h
include/wine/wined3d_interface.h
+0
-3
wined3d_types.h
include/wine/wined3d_types.h
+38
-0
No files found.
dlls/d3d8/device.c
View file @
70bbf734
...
@@ -724,14 +724,16 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetMaterial(LPDIRECT3DDEVICE8 iface,
...
@@ -724,14 +724,16 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetMaterial(LPDIRECT3DDEVICE8 iface,
static
HRESULT
WINAPI
IDirect3DDevice8Impl_SetLight
(
LPDIRECT3DDEVICE8
iface
,
DWORD
Index
,
CONST
D3DLIGHT8
*
pLight
)
{
static
HRESULT
WINAPI
IDirect3DDevice8Impl_SetLight
(
LPDIRECT3DDEVICE8
iface
,
DWORD
Index
,
CONST
D3DLIGHT8
*
pLight
)
{
IDirect3DDevice8Impl
*
This
=
(
IDirect3DDevice8Impl
*
)
iface
;
IDirect3DDevice8Impl
*
This
=
(
IDirect3DDevice8Impl
*
)
iface
;
TRACE
(
"(%p) Relay
\n
"
,
This
);
TRACE
(
"(%p) Relay
\n
"
,
This
);
/* FIXME: Verify that D3DLIGHT8 ~= WINED3DLIGHT */
/* Note: D3DLIGHT8 is compatible with WINED3DLIGHT */
return
IWineD3DDevice_SetLight
(
This
->
WineD3DDevice
,
Index
,
(
const
WINED3DLIGHT
*
)
pLight
);
return
IWineD3DDevice_SetLight
(
This
->
WineD3DDevice
,
Index
,
(
const
WINED3DLIGHT
*
)
pLight
);
}
}
static
HRESULT
WINAPI
IDirect3DDevice8Impl_GetLight
(
LPDIRECT3DDEVICE8
iface
,
DWORD
Index
,
D3DLIGHT8
*
pLight
)
{
static
HRESULT
WINAPI
IDirect3DDevice8Impl_GetLight
(
LPDIRECT3DDEVICE8
iface
,
DWORD
Index
,
D3DLIGHT8
*
pLight
)
{
IDirect3DDevice8Impl
*
This
=
(
IDirect3DDevice8Impl
*
)
iface
;
IDirect3DDevice8Impl
*
This
=
(
IDirect3DDevice8Impl
*
)
iface
;
TRACE
(
"(%p) Relay
\n
"
,
This
);
TRACE
(
"(%p) Relay
\n
"
,
This
);
/* FIXME: Verify that D3DLIGHT8 ~= WINED3DLIGHT */
/* Note: D3DLIGHT8 is compatible with WINED3DLIGHT */
return
IWineD3DDevice_GetLight
(
This
->
WineD3DDevice
,
Index
,
(
WINED3DLIGHT
*
)
pLight
);
return
IWineD3DDevice_GetLight
(
This
->
WineD3DDevice
,
Index
,
(
WINED3DLIGHT
*
)
pLight
);
}
}
...
...
dlls/d3d9/device.c
View file @
70bbf734
...
@@ -504,12 +504,16 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetMaterial(LPDIRECT3DDEVICE9 iface
...
@@ -504,12 +504,16 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetMaterial(LPDIRECT3DDEVICE9 iface
static
HRESULT
WINAPI
IDirect3DDevice9Impl_SetLight
(
LPDIRECT3DDEVICE9
iface
,
DWORD
Index
,
CONST
D3DLIGHT9
*
pLight
)
{
static
HRESULT
WINAPI
IDirect3DDevice9Impl_SetLight
(
LPDIRECT3DDEVICE9
iface
,
DWORD
Index
,
CONST
D3DLIGHT9
*
pLight
)
{
IDirect3DDevice9Impl
*
This
=
(
IDirect3DDevice9Impl
*
)
iface
;
IDirect3DDevice9Impl
*
This
=
(
IDirect3DDevice9Impl
*
)
iface
;
TRACE
(
"(%p) Relay
\n
"
,
This
);
TRACE
(
"(%p) Relay
\n
"
,
This
);
/* Note: D3DLIGHT9 is compatible with WINED3DLIGHT */
return
IWineD3DDevice_SetLight
(
This
->
WineD3DDevice
,
Index
,
(
const
WINED3DLIGHT
*
)
pLight
);
return
IWineD3DDevice_SetLight
(
This
->
WineD3DDevice
,
Index
,
(
const
WINED3DLIGHT
*
)
pLight
);
}
}
static
HRESULT
WINAPI
IDirect3DDevice9Impl_GetLight
(
LPDIRECT3DDEVICE9
iface
,
DWORD
Index
,
D3DLIGHT9
*
pLight
)
{
static
HRESULT
WINAPI
IDirect3DDevice9Impl_GetLight
(
LPDIRECT3DDEVICE9
iface
,
DWORD
Index
,
D3DLIGHT9
*
pLight
)
{
IDirect3DDevice9Impl
*
This
=
(
IDirect3DDevice9Impl
*
)
iface
;
IDirect3DDevice9Impl
*
This
=
(
IDirect3DDevice9Impl
*
)
iface
;
TRACE
(
"(%p) Relay
\n
"
,
This
);
TRACE
(
"(%p) Relay
\n
"
,
This
);
/* Note: D3DLIGHT9 is compatible with WINED3DLIGHT */
return
IWineD3DDevice_GetLight
(
This
->
WineD3DDevice
,
Index
,
(
WINED3DLIGHT
*
)
pLight
);
return
IWineD3DDevice_GetLight
(
This
->
WineD3DDevice
,
Index
,
(
WINED3DLIGHT
*
)
pLight
);
}
}
...
...
dlls/ddraw/device.c
View file @
70bbf734
...
@@ -4154,9 +4154,11 @@ IDirect3DDeviceImpl_7_SetLight(IDirect3DDevice7 *iface,
...
@@ -4154,9 +4154,11 @@ IDirect3DDeviceImpl_7_SetLight(IDirect3DDevice7 *iface,
HRESULT
hr
;
HRESULT
hr
;
TRACE
(
"(%p)->(%08x,%p): Relay!
\n
"
,
This
,
LightIndex
,
Light
);
TRACE
(
"(%p)->(%08x,%p): Relay!
\n
"
,
This
,
LightIndex
,
Light
);
/* Note: D3DLIGHT7 is compatible with WINED3DLIGHT */
hr
=
IWineD3DDevice_SetLight
(
This
->
wineD3DDevice
,
hr
=
IWineD3DDevice_SetLight
(
This
->
wineD3DDevice
,
LightIndex
,
LightIndex
,
Light
);
(
WINED3DLIGHT
*
)
Light
);
return
hr_ddraw_from_wined3d
(
hr
);
return
hr_ddraw_from_wined3d
(
hr
);
}
}
...
@@ -4183,9 +4185,10 @@ IDirect3DDeviceImpl_7_GetLight(IDirect3DDevice7 *iface,
...
@@ -4183,9 +4185,10 @@ IDirect3DDeviceImpl_7_GetLight(IDirect3DDevice7 *iface,
HRESULT
rc
;
HRESULT
rc
;
TRACE
(
"(%p)->(%08x,%p): Relay!
\n
"
,
This
,
LightIndex
,
Light
);
TRACE
(
"(%p)->(%08x,%p): Relay!
\n
"
,
This
,
LightIndex
,
Light
);
/* Note: D3DLIGHT7 is compatible with WINED3DLIGHT */
rc
=
IWineD3DDevice_GetLight
(
This
->
wineD3DDevice
,
rc
=
IWineD3DDevice_GetLight
(
This
->
wineD3DDevice
,
LightIndex
,
LightIndex
,
Light
);
(
WINED3DLIGHT
*
)
Light
);
/* Translate the result. WineD3D returns other values than D3D7 */
/* Translate the result. WineD3D returns other values than D3D7 */
return
hr_ddraw_from_wined3d
(
rc
);
return
hr_ddraw_from_wined3d
(
rc
);
...
...
dlls/wined3d/device.c
View file @
70bbf734
...
@@ -38,7 +38,7 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d_shader);
...
@@ -38,7 +38,7 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d_shader);
/* Define the default light parameters as specified by MSDN */
/* Define the default light parameters as specified by MSDN */
const
WINED3DLIGHT
WINED3D_default_light
=
{
const
WINED3DLIGHT
WINED3D_default_light
=
{
D3DLIGHT_DIRECTIONAL
,
/* Type */
WINED3DLIGHT_DIRECTIONAL
,
/* Type */
{
1
.
0
,
1
.
0
,
1
.
0
,
0
.
0
},
/* Diffuse r,g,b,a */
{
1
.
0
,
1
.
0
,
1
.
0
,
0
.
0
},
/* Diffuse r,g,b,a */
{
0
.
0
,
0
.
0
,
0
.
0
,
0
.
0
},
/* Specular r,g,b,a */
{
0
.
0
,
0
.
0
,
0
.
0
,
0
.
0
},
/* Specular r,g,b,a */
{
0
.
0
,
0
.
0
,
0
.
0
,
0
.
0
},
/* Ambient r,g,b,a, */
{
0
.
0
,
0
.
0
,
0
.
0
,
0
.
0
},
/* Ambient r,g,b,a, */
...
@@ -154,7 +154,7 @@ const float identity[16] = {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}; /* When needed
...
@@ -154,7 +154,7 @@ const float identity[16] = {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}; /* When needed
/**********************************************************
/**********************************************************
* Utility functions follow
* Utility functions follow
**********************************************************/
**********************************************************/
/* Convert the D3DLIGHT properties into equivalent gl lights */
/* Convert the
WINE
D3DLIGHT properties into equivalent gl lights */
static
void
setup_light
(
IWineD3DDevice
*
iface
,
LONG
Index
,
PLIGHTINFOEL
*
lightInfo
)
{
static
void
setup_light
(
IWineD3DDevice
*
iface
,
LONG
Index
,
PLIGHTINFOEL
*
lightInfo
)
{
float
quad_att
;
float
quad_att
;
...
@@ -207,7 +207,7 @@ static void setup_light(IWineD3DDevice *iface, LONG Index, PLIGHTINFOEL *lightIn
...
@@ -207,7 +207,7 @@ static void setup_light(IWineD3DDevice *iface, LONG Index, PLIGHTINFOEL *lightIn
checkGLcall
(
"glLightf"
);
checkGLcall
(
"glLightf"
);
switch
(
lightInfo
->
OriginalParms
.
Type
)
{
switch
(
lightInfo
->
OriginalParms
.
Type
)
{
case
D3DLIGHT_POINT
:
case
WINE
D3DLIGHT_POINT
:
/* Position */
/* Position */
glLightfv
(
GL_LIGHT0
+
Index
,
GL_POSITION
,
&
lightInfo
->
lightPosn
[
0
]);
glLightfv
(
GL_LIGHT0
+
Index
,
GL_POSITION
,
&
lightInfo
->
lightPosn
[
0
]);
checkGLcall
(
"glLightfv"
);
checkGLcall
(
"glLightfv"
);
...
@@ -216,7 +216,7 @@ static void setup_light(IWineD3DDevice *iface, LONG Index, PLIGHTINFOEL *lightIn
...
@@ -216,7 +216,7 @@ static void setup_light(IWineD3DDevice *iface, LONG Index, PLIGHTINFOEL *lightIn
/* FIXME: Range */
/* FIXME: Range */
break
;
break
;
case
D3DLIGHT_SPOT
:
case
WINE
D3DLIGHT_SPOT
:
/* Position */
/* Position */
glLightfv
(
GL_LIGHT0
+
Index
,
GL_POSITION
,
&
lightInfo
->
lightPosn
[
0
]);
glLightfv
(
GL_LIGHT0
+
Index
,
GL_POSITION
,
&
lightInfo
->
lightPosn
[
0
]);
checkGLcall
(
"glLightfv"
);
checkGLcall
(
"glLightfv"
);
...
@@ -230,7 +230,7 @@ static void setup_light(IWineD3DDevice *iface, LONG Index, PLIGHTINFOEL *lightIn
...
@@ -230,7 +230,7 @@ static void setup_light(IWineD3DDevice *iface, LONG Index, PLIGHTINFOEL *lightIn
/* FIXME: Range */
/* FIXME: Range */
break
;
break
;
case
D3DLIGHT_DIRECTIONAL
:
case
WINE
D3DLIGHT_DIRECTIONAL
:
/* Direction */
/* Direction */
glLightfv
(
GL_LIGHT0
+
Index
,
GL_POSITION
,
&
lightInfo
->
lightPosn
[
0
]);
/* Note gl uses w position of 0 for direction! */
glLightfv
(
GL_LIGHT0
+
Index
,
GL_POSITION
,
&
lightInfo
->
lightPosn
[
0
]);
/* Note gl uses w position of 0 for direction! */
checkGLcall
(
"glLightfv"
);
checkGLcall
(
"glLightfv"
);
...
@@ -2644,7 +2644,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_MultiplyTransform(IWineD3DDevice *iface
...
@@ -2644,7 +2644,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_MultiplyTransform(IWineD3DDevice *iface
/*****
/*****
* Get / Set Light
* Get / Set Light
* WARNING: This code relies on the fact that D3DLIGHT8 == D3DLIGHT9
*****/
*****/
/* Note lights are real special cases. Although the device caps state only eg. 8 are supported,
/* Note lights are real special cases. Although the device caps state only eg. 8 are supported,
you can reference any indexes you want as long as that number max are enabled at any
you can reference any indexes you want as long as that number max are enabled at any
...
@@ -2665,7 +2664,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLight(IWineD3DDevice *iface, DWORD I
...
@@ -2665,7 +2664,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLight(IWineD3DDevice *iface, DWORD I
if
(
NULL
==
object
)
{
if
(
NULL
==
object
)
{
return
WINED3DERR_OUTOFVIDEOMEMORY
;
return
WINED3DERR_OUTOFVIDEOMEMORY
;
}
}
memcpy
(
&
object
->
OriginalParms
,
pLight
,
sizeof
(
D3DLIGHT9
));
memcpy
(
&
object
->
OriginalParms
,
pLight
,
sizeof
(
WINED3DLIGHT
));
object
->
OriginalIndex
=
Index
;
object
->
OriginalIndex
=
Index
;
object
->
glIndex
=
-
1
;
object
->
glIndex
=
-
1
;
object
->
changed
=
TRUE
;
object
->
changed
=
TRUE
;
...
@@ -2733,10 +2732,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLight(IWineD3DDevice *iface, DWORD I
...
@@ -2733,10 +2732,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLight(IWineD3DDevice *iface, DWORD I
TRACE
(
"... Range(%f), Falloff(%f), Theta(%f), Phi(%f)
\n
"
,
pLight
->
Range
,
pLight
->
Falloff
,
pLight
->
Theta
,
pLight
->
Phi
);
TRACE
(
"... Range(%f), Falloff(%f), Theta(%f), Phi(%f)
\n
"
,
pLight
->
Range
,
pLight
->
Falloff
,
pLight
->
Theta
,
pLight
->
Phi
);
/* Save away the information */
/* Save away the information */
memcpy
(
&
object
->
OriginalParms
,
pLight
,
sizeof
(
D3DLIGHT9
));
memcpy
(
&
object
->
OriginalParms
,
pLight
,
sizeof
(
WINED3DLIGHT
));
switch
(
pLight
->
Type
)
{
switch
(
pLight
->
Type
)
{
case
D3DLIGHT_POINT
:
case
WINE
D3DLIGHT_POINT
:
/* Position */
/* Position */
object
->
lightPosn
[
0
]
=
pLight
->
Position
.
x
;
object
->
lightPosn
[
0
]
=
pLight
->
Position
.
x
;
object
->
lightPosn
[
1
]
=
pLight
->
Position
.
y
;
object
->
lightPosn
[
1
]
=
pLight
->
Position
.
y
;
...
@@ -2746,7 +2745,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLight(IWineD3DDevice *iface, DWORD I
...
@@ -2746,7 +2745,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLight(IWineD3DDevice *iface, DWORD I
/* FIXME: Range */
/* FIXME: Range */
break
;
break
;
case
D3DLIGHT_DIRECTIONAL
:
case
WINE
D3DLIGHT_DIRECTIONAL
:
/* Direction */
/* Direction */
object
->
lightPosn
[
0
]
=
-
pLight
->
Direction
.
x
;
object
->
lightPosn
[
0
]
=
-
pLight
->
Direction
.
x
;
object
->
lightPosn
[
1
]
=
-
pLight
->
Direction
.
y
;
object
->
lightPosn
[
1
]
=
-
pLight
->
Direction
.
y
;
...
@@ -2756,7 +2755,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLight(IWineD3DDevice *iface, DWORD I
...
@@ -2756,7 +2755,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLight(IWineD3DDevice *iface, DWORD I
object
->
cutoff
=
180
.
0
f
;
object
->
cutoff
=
180
.
0
f
;
break
;
break
;
case
D3DLIGHT_SPOT
:
case
WINE
D3DLIGHT_SPOT
:
/* Position */
/* Position */
object
->
lightPosn
[
0
]
=
pLight
->
Position
.
x
;
object
->
lightPosn
[
0
]
=
pLight
->
Position
.
x
;
object
->
lightPosn
[
1
]
=
pLight
->
Position
.
y
;
object
->
lightPosn
[
1
]
=
pLight
->
Position
.
y
;
...
@@ -2816,7 +2815,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetLight(IWineD3DDevice *iface, DWORD I
...
@@ -2816,7 +2815,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetLight(IWineD3DDevice *iface, DWORD I
return
WINED3DERR_INVALIDCALL
;
return
WINED3DERR_INVALIDCALL
;
}
}
memcpy
(
pLight
,
&
lightInfo
->
OriginalParms
,
sizeof
(
D3DLIGHT9
));
memcpy
(
pLight
,
&
lightInfo
->
OriginalParms
,
sizeof
(
WINED3DLIGHT
));
return
WINED3D_OK
;
return
WINED3D_OK
;
}
}
...
...
include/wine/wined3d_interface.h
View file @
70bbf734
...
@@ -191,21 +191,18 @@ DEFINE_GUID(IID_IWineD3DQuery,
...
@@ -191,21 +191,18 @@ DEFINE_GUID(IID_IWineD3DQuery,
/* TODO: remove the d3d8/d3d9 dependencies by making a all inclusive WINED3D version */
/* TODO: remove the d3d8/d3d9 dependencies by making a all inclusive WINED3D version */
#if defined( __WINE_D3D9_H )
#if defined( __WINE_D3D9_H )
/* Identical: */
/* Identical: */
# define WINED3DLIGHT D3DLIGHT9
# define WINED3DMATERIAL D3DMATERIAL9
# define WINED3DMATERIAL D3DMATERIAL9
# define WINED3DVIEWPORT D3DVIEWPORT9
# define WINED3DVIEWPORT D3DVIEWPORT9
# define WINED3DGAMMARAMP D3DGAMMARAMP
# define WINED3DGAMMARAMP D3DGAMMARAMP
#elif defined( __WINE_D3D8_H )
#elif defined( __WINE_D3D8_H )
/* Identical: */
/* Identical: */
# define WINED3DLIGHT D3DLIGHT8
# define WINED3DMATERIAL D3DMATERIAL8
# define WINED3DMATERIAL D3DMATERIAL8
# define WINED3DVIEWPORT D3DVIEWPORT8
# define WINED3DVIEWPORT D3DVIEWPORT8
# define WINED3DGAMMARAMP D3DGAMMARAMP
# define WINED3DGAMMARAMP D3DGAMMARAMP
#else
/* defined (__WINE_D3D_H ) */
#else
/* defined (__WINE_D3D_H ) */
/* Identical: */
/* Identical: */
# define WINED3DLIGHT D3DLIGHT7
# define WINED3DMATERIAL D3DMATERIAL7
# define WINED3DMATERIAL D3DMATERIAL7
# define WINED3DVIEWPORT D3DVIEWPORT7
# define WINED3DVIEWPORT D3DVIEWPORT7
# define WINED3DGAMMARAMP DDGAMMARAMP
# define WINED3DGAMMARAMP DDGAMMARAMP
...
...
include/wine/wined3d_types.h
View file @
70bbf734
...
@@ -30,6 +30,44 @@
...
@@ -30,6 +30,44 @@
# error You must include d3d.h, d3d8.h or d3d9.h header to use this header
# error You must include d3d.h, d3d8.h or d3d9.h header to use this header
#endif
#endif
typedef
enum
_WINED3DLIGHTTYPE
{
WINED3DLIGHT_POINT
=
1
,
WINED3DLIGHT_SPOT
=
2
,
WINED3DLIGHT_DIRECTIONAL
=
3
,
WINED3DLIGHT_PARALLELPOINT
=
4
,
/* D3D7 */
WINED3DLIGHT_GLSPOT
=
5
,
/* D3D7 */
WINED3DLIGHT_FORCE_DWORD
=
0x7fffffff
}
WINED3DLIGHTTYPE
;
typedef
struct
_WINED3DCOLORVALUE
{
float
r
;
float
g
;
float
b
;
float
a
;
}
WINED3DCOLORVALUE
;
typedef
struct
_WINED3DVECTOR
{
float
x
;
float
y
;
float
z
;
}
WINED3DVECTOR
;
typedef
struct
_WINED3DLIGHT
{
WINED3DLIGHTTYPE
Type
;
WINED3DCOLORVALUE
Diffuse
;
WINED3DCOLORVALUE
Specular
;
WINED3DCOLORVALUE
Ambient
;
WINED3DVECTOR
Position
;
WINED3DVECTOR
Direction
;
float
Range
;
float
Falloff
;
float
Attenuation0
;
float
Attenuation1
;
float
Attenuation2
;
float
Theta
;
float
Phi
;
}
WINED3DLIGHT
;
#define WINED3D_VSHADER_MAX_CONSTANTS 96
#define WINED3D_VSHADER_MAX_CONSTANTS 96
#define WINED3D_PSHADER_MAX_CONSTANTS 32
#define WINED3D_PSHADER_MAX_CONSTANTS 32
...
...
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